naiの日記

ソフトウェアエンジニアから放射線科診断医にジョブチェンジしました。趣味のことを書きます。

309. Not Random

まず、終了後にPerlで同じコードを二回Submitしてしまい申し訳ございません。


擬似乱数の生成規則に基づいて文字列を出力させる問題です。
私は数字をいじくり回している間に偶然気付きましたが、やはり参加者は少なかったようです。
言語によってはそもそも擬似乱数を生成せずembedによって出力しているコードもありました。

C

残念ながら、参加者は私一人でした。

main(n,i){for(scanf("%d,%d,%s",&n,&i,i);i--;printf("%*.s%s\n",n=n*8%13));}

printfの引数が二つほど少ないのですが、足りない分はscanfに渡した引数が用いられます。なので第四引数にはちゃんと元々のiの値が渡され、入力した文字列を出力するという寸法。
第三引数にはiへのポインタが渡るのでそのままだとゴミを出力してしまうのですが、printfの書式に"."をつけて精度を0にすることでこれを回避しています。

ちなみに、

main(_,n,i){for(scanf("%d,%d,%s",&n,&i);i--;printf("%*.s%s\n",n=n*8%13));}

これは通りますが、

main(n,i){for(scanf("%d,%d,%s",&n,&i);i--;printf("%*.s%s\n",n=n*8%13));}

これは通りません。scanfで文字列をmainの第一引数へのポインタに入力しているようです。

Perl

コマンドラインオプションを4つもつけて相当縮めたと思ったら、コマンドラインオプションを使わない方が短くなるとは完全に予想外でした。
例の「トップになるとあまり考えなくなる症」が発動してしまったようです。やはりもう少し考えなくては。
冒頭でも書きましたが、同じコードを誤って違う名前で送ってしまいすみませんでした。