c
とあるHP*1にて発見した問題。 久しぶりにCで書いたらSEGVで落ちまくり結局1時間弱かかってしまった。。。問題 ゲーム「ぷよぷよ」で、フィールドの状態がテキストで与えられたとき、消える「ぷよ」を消して次のフィールドの状態を出力するプログラムを書け…
math.hのsqrt(f)を使わずに整数の平方根を求めてみた。(intが4byteであるマシンでのみ動作) sqrtmod0はアルゴリズム上0x40000000以上の値の平方根を計算でようなので、0x40000000以上の値はKaratsuba開平を利用して求めている。↓は乱数で平方根と余りを求め…
toupperとtolowerって、cが英字であることが担保されていればこれでいい #define TOUPPER(c) ((c) & ~0x20) #define TOLOWER(c) ((c) | 0x20)
Brainfuckという難解言語はご存じだろうか? '>', ' チューリング完全なチューリングマシンである。 Brainfuckの言語仕様 > ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。 C言語の「ptr--;」に相当。 + ポインタが指…
anarchy golfでやっているショートコーディングのお題のUTF-9でようやくC言語でトップが取れたのでその道のりを公開。 かなり69バイトをさまよっていますwww ポイント 変数iで連結したビット数をカウント 0の場合は次の1バイトを連結しても出力はできな…
以前に「C言語でJavaと同等程度の例外処理をやってみる - ほんまの走り書き技術メモ」でC言語でも例外処理っぽいこと出来るんやぞってのを書きました。今日その辺をいじっていて気付いたことがあったのでメモ。 jmp_bufとはなんぞや? 以前にも説明したが、j…
yacc&lexの練習のために作ったJSONパーサです。 一通り、JSONのBNF*1には従ったつもりです。 また、ソースには以前「C言語で文字列を簡単にかつ少し高速に操作する - ほんまの走り書き技術メモ」で紹介したMyStringを使用しています。 object {} { members }…
C言語では文字列を連結していくと、メモリの再確保とかしなくてはならないのでとても面倒です。さらに、strcatを利用すると、 以下のように文字列連結をした場合。 strcat(str1, str2); char *strcat(char *s1, const char *s2) { int len = strlen(s1); str…
とりあえずまともに書いたらこんな感じかな??プログラム引数に文字列を指定すると、Base64文字列を出力してくれる。 ソース #include <stdio.h> #include <string.h> int main(int argc, char **argv) { char *w = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123</string.h></stdio.h>…
何も見ないでマージソートを書いてみた。 初め int *tmp = new int[num]; で、マージするための領域用意したのに if(j >= num || (i < left && array[i] < array[j]))array[k++] = array[i++]; else array[k++] = array[j++]; と書いていて、tmpのコピーも開…
何も見ないでクイックソートを書いてみた(汗 while(i < num && array[i] < s)i++; while(j >= 0 && array[j] >= s)j--; の、各whileの1つ目の条件抜けてて、結構ハマった。。。。 ソース void quickSort(int *array, int num){ if(num < 2)return; int i = …
ご存じの通りC言語には例外処理という立派なものは搭載されていない。 そこで、C言語でsetjmpという関数を使ってJavaと同等の例外処理をやってみる。 JavaとCでmy_divという関数を作って例外処理をする int型の引数を2つ持つ関数(メソッド)を定義して割り…
atexitを使うとプログラム終了時に呼ばれる関数を登録できる。(void (*)()の関数) atexitは複数登録(スタックとして積まれる?)できるようで、後入れ先出しで実行される。 また、終了時の関数は少なくともATEXIT_MAX個(32個?)登録できるらしい。 使い…
大分前の話だが、赤黒木の削除もできたのでそのうちソース公開
挿入はできたが、削除がまだ。。。 参考 http://www.geocities.jp/h2fujimura/mutter/tree/red-black-tree.html http://ja.wikipedia.org/wiki/%E5%88%A9%E7%94%A8%E8%80%85:Yutaochi/translating/%E8%B5%A4%E9%BB%92%E6%9C%A8 http://www.ececs.uc.edu/~fra…
とりあえずまともに書いたらこんな感じかな??プログラム引数にBase64文字列を指定すると、文字列を出力してくれる。 ソース #include <stdio.h> #include <string.h> int main(int argc, char **argv){ char b64[128], *w = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu</string.h></stdio.h>…
今頃気づいたこと strcatは文字列を連結するC言語の標準関数。 でも、自分自身を連結することができない。。。だから今までは、 int main(int argc, char **argv) { char str1[255] = "ABCDEFG"; char tmp[255]; strcpy(tmp, str1); strcat(str1, tmp); prin…
CだとC++と違ってが使えないので、別のデータを格納するハッシュを利用するには、それ専用のソースを用意する必要がある。 そこで、Ruby等で使われているst_tableを参考に、柔軟なHashを自分なりに一から作ってみた。突っ込み、機能拡張大歓迎。一応一通りメ…