ふとしたツイートからコードゴルフ大会が勃発
もくし
くしも
しもく
くもし
もしく
しくも
という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月 3CodeIQの中の人ノリノリですね…
さて。
{も,く,し} の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月 2d[]={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月 2char*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字を大きく上回る