あなごる

最近http://shinh.org:81/で遊んでます。
test.rb orzとか,delete_blank_line.diとか、
色々アホなことして楽しんでます。
前者はともかく後者は、
人様のサーバーに意図的に負荷を掛けるコードを送ってました。
だってD言語コンパイルが早すぎで唯一の入力が...(略


まぁ、それは置いといて、
dance.d(http://shinh.org:81/p.rb?Dancing+Kids)の
コードがそろそろ自分的に短縮の限界なので公開してみました。
激しくネタバレ注意


この問題はそれぞれの入力に対して0,1,2を返す式と、
それを元に文字列を構成する問題と考えると比較的短くなります。


まず、簡単に思いつくのは文字列の長さで判断する方法です。
長さを数えるとleftは4,rightは5,right&leftは10です。
ここで4で剰余を取ると0,1,2と綺麗に分かれます。
あとは、ここから出力を構成するだけです。

import std.cstream;void main(){printf("%.13s
  | |",&` ('-')/
 /|_|\('-')
  |_|\\('-')/
  |_|`[din.toString.length%4*13]);}

このコードで123Bなわけですが、id:nazodane氏が更に短い記録を出した(122B!)ので更に考えてみた。
まず .length%4が長いです。これを別の方法に置き換えましょう。
で、うーんと考えた結果、私は[$/2]%3になりました。
つまり真ん中の文字を3で割った余りですね

入力 真ん中の文字 余り
left f 102 0(mod 3)
right g 103 1(mod 3)
right&left & 38 2(mod 3)

で、これを適用するとこう。

import std.cstream;void main(){printf("%.13s
  | |",&` ('-')/
 /|_|\('-')
  |_|\\('-')/
  |_|`[din.toString[$/2]%3*13]);}

なんか無駄があるかもしれんので、
思いついた人はhttp://shinh.org:81/p.rb?Dancing+Kidsにゴー。