λx. x K S K @はてな

このブログ内に記載された文章およびコードの著作権は,すべて Keisuke Nakano に帰属します.

ネタばらし(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 はゴルフなどの特定の目的以外では使ってはいけません.念のため.

*1:と思ったら知らない間に 84B になってました.

*2:正確には「配列を分割してそれぞれを文字列に変換して"\000"で繋ぐ」という作業が必要かもしれません.