あなごる
最近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にゴー。