ichirin2501's diary

いっちりーん。

またgとオイラー

Project Euler164を解いた。これで解いた問題数は計89問になる。Lv3まであと11問かー、地道に解いていくことにする。
〜通りあるか数えろ系の問題は大の苦手というより数学が苦手wだから問題を見たときに敬遠しようかと思ったのだけど、
普通に動的計画法だった。スレッドで公開されてる鮮やかなコードと醜い自分のコードを比較して泣いたw


またanarchy golfしようと適当に問題を開いたら、他の方のコードが見れたので誘惑に負けて見てしまったw

今回開いた問題:anarchy golf - count down


上位陣のコードが芸術的すぎる。
C言語1位の7gyou氏のコードがこれなのだけど、

main(){char*a=gets();for(;2<puts(a)>--*a-48?*++a/=.83:1;);}

まず char*a=gets(); この書き方にびっくりした。gets()のように引数を与えなくても動作するのは知ってたけど、バッファリングした文字を格納する場所?を指定してないから一度入力した文字列に対して読み書きは出来ないと思ってた。
char*a=gets();だから、文字列定数扱いになって書き込みは出来ないのでは?と考えたのだけど、バッファリングされたchar型へのアドレスを格納してるだけだから参照後書き込み可能みたい。
putsの戻り値なんて使う機会がなかったから調べてみると、
#include
int puts(const char*s);
戻り値は成功時に負ではない値、失敗時にEOF
負でない値だからforループの継続条件の 2--*a-48 は偽、文字'1'のときに真になり、アドレスを進めて文字'0'に対して0.83で割る→文字'9'にして循環させる…これすげぇ…、何がすごいって *++a+=9 でも'0'〜'9'の循環は出来るけどこの処理だとループが終わらない。

char*a=gets();の前にてきとーな処理を入れるとバグった。バッファリングのアドレス位置の関係だろうか?


今回知ったこと
・char*a=gets(); が読み書き可
・'0'〜'9'循環が0.83で割っても可
・putsの戻り値
・自分は動的計画法が下手糞w
・自分は解説が下手糞orz


他人様のコードを読むことはすごく勉強になる。