ネタばらし(e.ml)
e の 79B はあまりにインチキなので,公開してしまうことにします.
まず,以前紹介した方法の復習.String.iter
を使えば,
String.iter(fun c->print_int(Char.code c))"\027\182\081\082\084\059..." (* 文字列部分は省略.27,182,81,82,84,59,... と対応する整数を出力しているだけ. *)と書くことができます.ここからアレをつかえば83Bまで縮むと書きましたが,アレというのはお察しの通り例の魔法
Obj.magic
です.
jijixiさんが85Bまで縮めたというのは,おそらくこんなコードでしょう*1.String.iter(Obj.magic print_int)"\027\182\081\082\084\059..."
'\027'
は内部では整数の 27
と同じですが,print_int
の型と合わないので魔法を使って無理矢理あわせます.
元のプログラムが,
型が合わないのは,入力が文字列だからだとの考えで整数に変換しているのに対し,後のプログラムは
型が合わないのは,print_int
が文字型を受け取らないからだ
との考えで print_int
の型を変えているというわけです.
しかし,他の考え方もあります.
型が合わないのは,String.iter
が文字型を受け取る関数しか受け取らないからだ
こう考えれば,83B のObj.magic String.iter print_int"\027\182\081\082\084\059..."がめでたく得られます.この考え方は他の問題にもいろいろ使えます.
さて,問題の 79B ですが,ちょっと(かなり?)荒技です.配列 [|271828182;845904523;...|]
を無理矢理文字列で表現してしまう方法です.
Obj.magic Array.iter print_int"\173\137g \023\245\214d\151L\230\\147\255\031\016K=y\\\238\233p\000o\153\138DY\158\212J\023\221$K\237\224\224F\221'H\021e!\000"詳しくは解説しませんが,後ろの文字列は
Obj.magic
で配列から文字列に変換したりすることで得られます*2.
なお,バイトオーダなどの環境によって正しい答え(?)が得られないことがありますのでご注意ください.
また,しつこいようですが Obj.magic
はゴルフなどの特定の目的以外では使ってはいけません.念のため.