ショートコーディング「世界を革命する力を」
ふとしたツイートからコードゴルフ大会が勃発
もくし
くしも
しもく
くもし
もしく
しくも
という6行(UTF-8を想定)を出力するCプログラムって最短何バイトまで縮められるだろうか
— naoya t (@naoya_t) 2013, 7月 2
元ネタはご存知「少女革命ウテナ」の挿入歌「絶対運命黙示録」の歌詞。
@naoya_t CodeIQ用の問題ですかね?
— ぷるうぬす (@Prunus1350) 2013, 7月 2
@Prunus1350 著作権的にCodeIQの法務さんがNG出しそう #マジレス
— naoya t (@naoya_t) 2013, 7月 2
@naoya_t @Prunus1350 世界を革命する力があれば…
— CodeIQ [コードアイキュー] (@codeiq) 2013, 7月 3
CodeIQの中の人ノリノリですね…
さて。
{も,く,し} のpermutation全てが使われているので、next_permutation() を使って
#include <algorithm> #include <cstdio> main() { char *c[3]={"も","く","し"}; int m[]={0,1,2}; do { printf("%s%s%s¥n",c[m[0]],c[m[1]],c[m[2]]); } while (std::next_permutation(m,m+3)); }
みたいに書けるんじゃないか(※C++だけど)と一瞬思ったものの、
012→120→201→102→021→210
の順なのでこれを実現しようとすると
#include <algorithm> #include <cstdio> main() { char *c[3]={"も","く","し"}; int m[]={0,1,2,3,1,4,5,4,0}; for (int i=3; i<9; ++i) { printf("%s%s%s¥n", c[m[0]], c[m[1]], c[m[2]]); for (int j=m[i]; j; --j) std::next_permutation(m,m+3); } }
的な事になってしまう。という以前に長すぎる*1。
出力テキストをコードに埋め込んだ
main(){puts("もくし\nくしも\nしもく\nくもし\nもしく\nしくも");}
でも81バイトなので、これより長いコードには(コードゴルフ的に)存在価値がない。
以下ツイートの抜粋。
@naoya_t ゴルフ力は低いですがチャレンジしてみました。これで 125b https://t.co/x9Kf7qP79n
— Nozomu Kaneko (@knzm2011) 2013, 7月 2
d[]={0x8282e3,0x8f81e3,0x9781e3,10};long long s=0x31b63874b2790;main(){s/=4,s&&main(printf(d+s%4));}//100バイト。出力全文を文字列として埋め込んだ時の81バイトに太刀打ちできず
— naoya t (@naoya_t) 2013, 7月 2
char*d[]={"も","く","し","\n"};long long s=0x31b63874b2790;main(){s/=4,s&&main(printf(d[s%4]));}//99バイト。文字列で書いた方がちょっと短い
— naoya t (@naoya_t) 2013, 7月 3
@naoya_t 83バイトになりました
long long s=0x31b63874b2790;main(){s/=4,s&&main(printf(&"も\0く\0し\0\n"[s%4*3]));}
— Masa-Y (@hogeover30) 2013, 7月 3
@naoya_t #define P(X,Y)puts(#X#Y"し\n"#Y"し"#X"\nし"#X#Y); main(){P(も,く)P(く,も)}も81Bでした。意外と難しいですねー
— Ushioda (@ushjp) 2013, 7月 3
@naoya_t 80バイト切りました
long long s=0xc6d8e1d2c9e4;main(){for(;s;s/=4)printf("も\0く\0し\0\n"+s%4*3);}
— Masa-Y (@hogeover30) 2013, 7月 3
カエルさんとホゲオーバー30さんがツイッター上でコードゴルフやってる
— Hiroko In Networks (@millionsmile) 2013, 7月 3
@millionsmile 140字も書き込めるツイッターはコードゴルフにおあつらえ向きの場所ですね!
— naoya t (@naoya_t) 2013, 7月 3
@naoya_t 73Bになりました。main(i){while(i<25)printf("も\0く\0し\0\n"+(0xc6d8e1d2c9e40>>2*i++&12));}
— Ushioda (@ushjp) 2013, 7月 3
コードゴルフ、ツイッターでみんなでやると縮むの速いなあー
— naoya t (@naoya_t) 2013, 7月 3
特に期限も設けていないので、もっと短くできた人は @naoya_t までご一報ください!
*1:スペース等省いても215バイト。そしてツイートできる上限の140字を大きく上回る