トップ «前の日(02-14) 最新 次の日(02-16)» 追記

U-memo

2006|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|
2009|08|10|
2010|02|03|
2011|11|12|
2012|04|
2016|02|
All= / Today= / Yesterday=

2007-02-15

_ [Golf][OCaml] あなごる

何か突然 OCaml で盛り上がりだしたような。

いちおう斜壊社会人の身としては、フルに時間を使えないというのはあるけど、ゴルフ本職の人らも含めてみんなに付いていけるのだろうかという感じ。

触発されていくつかは記録を更新したけど、ダメだなー。でも面白いぞー。

みなさんに習っていくつかのノウハウを出しておこう。

OCaml のパーサの癖を読む

最初の時期の smiley triangle (82B)から。

let b=ref"\n:-)";;print_string":\n:-";for i=0to 31do print_string!b;b:=!b^"))"done
  • 「文字 記号」もしくは「記号 文字」と来る場合はスペースは省略できる
  • 「数字 文字」と来る場合もスペースは省略できる。逆は一つのトークンになるのでダメ。
  • 「演算記号 演算記号」は詰められない。ひとつの別の演算子と思われてしまう。特に参照を条件節で使うときにはまる。!a>!b は >! が一つの演算と思われてしまうわけだ。

どっちが得か

マッチ構文が出てくるなら後者。

f x=match x with hoge->fuga|...
f=function hoge->fuga|...

副作用と括弧

条件の中などに出力があるときはどこかに詰め込めるかを考える

... then(print_string"hoge";f(n+1))else....
... then f(print_string"hoge";n+1)else....

ネタばれがあるような例はもう少し様子を見よう。

ライブラリロード

幸いなことにゴルフ場は toplevel 環境で実行されるので ライブラリの読み込みが必要な場合でも実行できる。 extLib があるかどうかは知らないけれど。

初期の bowling scorer の例:

#load"str.cma"open Printf let rec s f t r=match f with
h::i::j::k->let p=t+h+i+if h+i>9then j else 0in
printf"%d "p;s(if h=10then i::j::k else
j::k)p(r+1)|h::i::j->if r<10then
printf"%d"(t+h+i);;s(List.map
int_of_string(Str.split(Str.regexp" ")(read_line())))0 0

ただし当然 #load ディレクティブがいるし、そもそも Num と Str 以外は用が無い気はするけれど。

ゴルフサーバの癖

出力は、いちばん最後の改行、空白についてはあってもなくても通るので、最後のつじつま合わせは不要。だから上の bowling の例は後ろの printf も "%d " にして問題ない。 また、前にも書いたとおり stderr に何を出してもいいのでファイルの読み込みの例外の後始末は不要。

複数行出力

print_int の出番が無いような感じ。 改行のためだけに print_endline"" とか print_newline() とするのはあまりにも無駄過ぎるので、

Printf.printf"%d\n"i

になってしまう。改行コードは jijixi さんの技 (というか他の言語のゴルフでは有名な話か?)により

Printf.printf"%d
"i

とできる。

複数の束縛

関数では無いものの束縛は tupple を使いまくれる。

let p,q=ref 0,ref 0
let a,b,c,d=read_line(),[|"Ace";"2";"3";"4";"5";"6";"7";"8";"9";"10";"Jack"|],[|"Queen"|],[|"King"|]

ネタばれか?

割り切れるかどうかの判定のためだけに mod なんて演算は長いんですよ。

if i mod j=0then ...
if i/j*j=i then ...

割り切れなきゃ切り捨てられるんで掛けても元に戻らない。 これでも長いけどどうにかならんかねぇ。

本日のツッコミ(全3件) [ツッコミを入れる]

_ shinh [おお、 mod の代替は気付いてませんでした。まだ他の部分でも縮むかなーと思うので口惜しいので他で探します。]

_ ukai [あらら、本当にネタばれになってしまったとは申し訳ないです。]

_ うかい [確かに縮みました。これのネタばれは当分やめておきます。]


2008-02-15

_ [雑記] GPCC2008問題 発表

  • Celtis改
    • 対戦は現在は予定されていないとのこと
  • ブロックスデュオ(続)
  • 固定ピースヘキソミノ

_ [雑記] ブロックスデュオのプログラム

三輪さん(二位)も公開されている