Derive Your Dreams

Twitter: @kinaba

23:24 07/10/23

はすける

昨日の id:MaDさんの発表、 直線距離にして10mくらいのとこでやってたはずなのに行けなかったよ残念。まったく、 「ドラスはアイアンヘッド出にくすぎだろ」とか「さすが締切前はゴルフがはかどるなあ」とか 言っている場合ではなかった。いやそんなこと決して言ってませんが。

パラメトリシティ

Parametricity(住井さんの記事に詳しいです)を最初に知ったときに面白いなーと思った記憶について徒然なるままに。

# let rec my_reverse lst = ... ;;
- : 'a list -> 'a list = <fun>

「なんかリストのreverseする関数を自前で実装したんだけど正しく実装できたか自信がない。とりあえず型は合った」 というときに、1個具体例を喰わせてみて

# my_reverse [0; 1; 2; 3; 4];;
- : int list = [4; 3; 2; 1; 0]

「よし!ちゃんと逆になってる!」 …… と、安心するのはまだ早いわけです。たまたまこの入力だとうまく 動いたけど、他の入力与えるとバグがわいてくるかもしれない。具体例を並べてテストするだけじゃ、 まあ合ってそうな気はすると思うことはできても、絶対100%正しいという保証にはならない。 そう思っていた時期が私にもありました。

けどまあ実はパラメトリシティが成り立っていると、さっきの例1つだけで

    my_reverse [A;B;C;D;E]
==  my_reverse (map (fun i -> nth i [A;B;C;D;E]) [0;1;2;3;4])
    'a list -> 'a list という型がついているということは、mapを後回ししても結果は変わらない
==  map (fun i -> nth i [A;B;C;D;E]) (my_reverse [0;1;2;3;4])
==  map (fun i -> nth i [A;B;C;D;E]) [4;3;2;1;0]
==  [E;D;C;B;A]

my_reverseは長さ5のリストなら絶対100%正しく逆転する、ことが多分(実はあまり自信ない)言えます。 もちろんこれだと「どんなリストも正しく逆転する」まで保証できたわけではなくて長さ5の場合に過ぎないんですけど、 それでも、具体例1個テストすれば長さ5の場合全ての動作が保証される、というのは面白いなーと。 プログラムの側が抽象的に書かれていればいるほど、具体例によるテストだけで広い範囲の正しさを保証できる ようになるみたいな。

18:56 07/10/17

fib

フィボナッチ数列を小さい方から順に出力しようと普通に考えると、3項間の漸化式を使って

a,b = 1,1
loop{
  puts a
  a,b = a+b,a
}

こんな風に、一つ前と二つ前の値の足し算で新しい値を作っていくと思います。 これを主としてゴルフ的な都合により 2項間の漸化式にしたくなりました。つまりフィボナッチ数とわかってる値aが与えられたときに次の フィボナッチ数を求める式が書けたら短くなるかも…などと考えていて

a = 1
loop{
  puts a
  a = (a*1.61803398874989).round
}

これに思い至りました。途中の怪しげな定数は黄金比ですね。 2項間の比の極限をとったら黄金比になるという知識はあったんですが、 余分な項 ((1-√5)/2)^n / √5 って常に0.5より小さいので、そもそも 毎回整数に丸めてたら最初っから全部黄金比の等比数列みたいなもんではないか … と今まで全然考えてなかったのが情けない感じです。むむむ。

まあしかしどう見ても2変数使った方が短いのであった。 〆切までにもう一回flagitiousさん抜けたら抜き返して110バイト台に突入してくれると思うので 頑張りたいんですけどねえ。Elias delta to Fibonacci 面白いです。

19:53 07/10/14

2進数 (10)

テンプレートでやるヤツが色々流行ってるみたいで。 id:ntnekさんの 、 10進か8進か、ちゃんと1と0の列になってる方で解釈すればいいじゃない、 っていう考え方は巧いですね。プリプロセッサ持ち出さなくていいのは便利。 id:yotto-kさんのコレは 流石というか、同じくその発想はなかった…。

17:16 07/10/11

2進数

C/C++で2進数値を記述同(2) という記事をはてブ経由で見ました。(2) のプリプロセッサのやつ格好いい!

3つめのテンプレートでやる方法なんですが、 flipcodeの記事 でちょっと議論されてるように、10進表記じゃなくて8進表記のリテラルを 受け取ることを前提にした方がベターなんじゃないかと思います。利点は2つ。

もちろんこのままだとうっかり

  ...
  FLAG_H = binary<10000000>::value,
};

ここまで行ったときに逆にバグるので、実際に使うときはテンプレートを直接使うのではなくて

#define B(n) binary<0 ## n>::value

マクロでラップすると良い案配に。

というバッドノウハウのお話でした。

22:36 07/10/10

kinaba 1.0

リファラにこんなページが 残っててちょっと面白かった。誰か kinaba 2.0 を!はやく!

で、早速ダウンロードしてみようとしたんですが、どこも404みたい。残念。 英語に自動翻訳してみたら"game"やら"amusing time"やら出てくるのでゲームっぽいのだけど。 どういう意味の名前なんだろ。InterTran で Turkish→English したら "allusion, hint" (暗示, ほのめかし) と 出てきたけど、これは 別の単語 が中途半端にヒットしてるだけのようにも見える。

20:29 07/10/07

乗り換え

突然ですが、近日中にここ kmonos.net のレンタルサーバを さくらの に移ることにしました。

ドメインごと移すつもりなので、見てくださってる方は多分何も気にしなくてもOKなはずです。 ただ、何かの拍子に私がミスった時は一応 http://kinaba.sakura.ne.jp/ でも新しい方が見えるので…って、ここに書いても仕方ない気がしてきたぞ。まあいいや。 メールもあれなので、もし (略)@kmonos.net が通じてないみたいだったら、なにか他の適当な伝達手段で 伝えていただけると助かります。

さてとりあえず Diki を gdc 0.24 でコンパイル通す作業…

D入門

ちょっと前にDスレで知った D言語入門講座 というサイト、"プログラミング初心者向けの" とのこと。 Dのちゃんとした入門記事で、他の言語(特にJavaやC++)の知識を全く前提としないものは 初めてなんじゃないかと思います。素敵だ。超応援。⑨の方もよさげ。

20:26 07/10/03

まだまだ

日本にいるよ。いつ出発できるのか自分でもわからんという。

ICFPコンテスト

United Coding Team の方によるレポート。 Smartass 連覇! と、3位の Celestial Dire Badger も shinh さんと同じように一から絵を描く方式 だったらしい! というのが驚き。kokorush は予想通り 15位 だったそうで。うーむ来年は頑張ろう。

Herbert

LV 15, 24, 25 が解けない…。その、こう、去年ほとんどやらなかったのでブランクが(←言い訳。 なんというか日本の高校生ゴルファー達が ランキング 上位を埋めすぎていて壮観ですね。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0