c

与えられたぷよぷよフィールドが19連鎖であることを証明する

c

とあるHP*1にて発見した問題。 久しぶりにCで書いたらSEGVで落ちまくり結局1時間弱かかってしまった。。。問題 ゲーム「ぷよぷよ」で、フィールドの状態がテキストで与えられたとき、消える「ぷよ」を消して次のフィールドの状態を出力するプログラムを書け…

C言語でKaratsuba開平を利用して整数の平方根と余りを求める

math.hのsqrt(f)を使わずに整数の平方根を求めてみた。(intが4byteであるマシンでのみ動作) sqrtmod0はアルゴリズム上0x40000000以上の値の平方根を計算でようなので、0x40000000以上の値はKaratsuba開平を利用して求めている。↓は乱数で平方根と余りを求め…

ASCIIコード表見て今頃気づいたこと

toupperとtolowerって、cが英字であることが担保されていればこれでいい #define TOUPPER(c) ((c) & ~0x20) #define TOLOWER(c) ((c) | 0x20)

Brainfuckインタプリタを作った

Brainfuckという難解言語はご存じだろうか? '>', ' チューリング完全なチューリングマシンである。 Brainfuckの言語仕様 > ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。 C言語の「ptr--;」に相当。 + ポインタが指…

UTF-9への道のりと教訓

anarchy golfでやっているショートコーディングのお題のUTF-9でようやくC言語でトップが取れたのでその道のりを公開。 かなり69バイトをさまよっていますwww ポイント 変数iで連結したビット数をカウント 0の場合は次の1バイトを連結しても出力はできな…

setjmpを呼びたすための関数を作ってはならない!

以前に「C言語でJavaと同等程度の例外処理をやってみる - ほんまの走り書き技術メモ」でC言語でも例外処理っぽいこと出来るんやぞってのを書きました。今日その辺をいじっていて気付いたことがあったのでメモ。 jmp_bufとはなんぞや? 以前にも説明したが、j…

yacc&lexでJSONパーサを作る

yacc&lexの練習のために作ったJSONパーサです。 一通り、JSONのBNF*1には従ったつもりです。 また、ソースには以前「C言語で文字列を簡単にかつ少し高速に操作する - ほんまの走り書き技術メモ」で紹介したMyStringを使用しています。 object {} { members }…

C言語で文字列を簡単にかつ少し高速に操作する

c

C言語では文字列を連結していくと、メモリの再確保とかしなくてはならないのでとても面倒です。さらに、strcatを利用すると、 以下のように文字列連結をした場合。 strcat(str1, str2); char *strcat(char *s1, const char *s2) { int len = strlen(s1); str…

ちゃらっと書いてみたBase64エンコードのソース(C言語)

とりあえずまともに書いたらこんな感じかな??プログラム引数に文字列を指定すると、Base64文字列を出力してくれる。 ソース #include <stdio.h> #include <string.h> int main(int argc, char **argv) { char *w = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123</string.h></stdio.h>…

何も見ないで書いてみた(マージソート)(2007/07/23(月) 23:57:46)

何も見ないでマージソートを書いてみた。 初め int *tmp = new int[num]; で、マージするための領域用意したのに if(j >= num || (i < left && array[i] < array[j]))array[k++] = array[i++]; else array[k++] = array[j++]; と書いていて、tmpのコピーも開…

何も見ないで書いてみた(クイックソート)(2007/07/23(月) 23:55:28)

何も見ないでクイックソートを書いてみた(汗 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言語でJavaと同等程度の例外処理をやってみる

ご存じの通りC言語には例外処理という立派なものは搭載されていない。 そこで、C言語でsetjmpという関数を使ってJavaと同等の例外処理をやってみる。 JavaとCでmy_divという関数を作って例外処理をする int型の引数を2つ持つ関数(メソッド)を定義して割り…

C言語のプログラム終了時に呼ばれる関数

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デコードのソース(C言語)

とりあえずまともに書いたらこんな感じかな??プログラム引数にBase64文字列を指定すると、文字列を出力してくれる。 ソース #include <stdio.h> #include <string.h> int main(int argc, char **argv){ char b64[128], *w = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu</string.h></stdio.h>…

strncatを使って自分自身に連結

c

今頃気づいたこと strcatは文字列を連結するC言語の標準関数。 でも、自分自身を連結することができない。。。だから今までは、 int main(int argc, char **argv) { char str1[255] = "ABCDEFG"; char tmp[255]; strcpy(tmp, str1); strcat(str1, tmp); prin…

CでHashを扱う便利(?)なのを作ってみた

CだとC++と違ってが使えないので、別のデータを格納するハッシュを利用するには、それ専用のソースを用意する必要がある。 そこで、Ruby等で使われているst_tableを参考に、柔軟なHashを自分なりに一から作ってみた。突っ込み、機能拡張大歓迎。一応一通りメ…