Hello broken keyboardがすごかったので一年半ぶりに日記を書いてみる。
というか一年半も経つとさすがにはてな記法とかほとんど忘れてますね……それはさておき。
続きを読むstrncatを使うことに気付いたらかなり短くなりました。
コード自体はShifting Pattern Fixedとかなり似ています。strncatは割と応用範囲が広く、好きな関数です。
それにしても、一人で素振りしてた問題を除くと、Cで単独トップを取ったのは物凄く久しぶりな気がします。
data orderぶりかな?
ところで、Perl Golfは少しかじった程度だったのですが、せっかくなのでtoggleCASEとHeavy RotationのPerlのコードを読んで勉強してみました。
試しに昔のendless問題をPerlで解いてみたのですが、勉強の成果か、judge Jankenでトップに並び、transpose linesでトップを更新するなど、かなり調子がいいです。だんだん慣れてきたのかもしれません。
C Golfと違ってPerl Golfは日本語のドキュメントがほとんどないのが問題なので、上達するには実際にやってみるしかなさそうですね。
その他、Active Problemsについて。
簡単な問題なので、BrainfuckとBefungeで解いてみました。Befungeは面白いですね。
この手のPermutation系の問題はよくわかりません。
いいアルゴリズムを模索中です。
簡単な二分探索かと思いましたが、guessする数字の決め方がよくわかりません。
四捨五入で整数に丸めるなら、938・969の次は953ではなく954ではないかと思うのですが、何か問題を読み間違えているのでしょうか……
(追記)
notがショートコーディング攻略wikiを始めました。一応こっちにも貼っておきます。
http://w.livedoor.jp/short_coding/
終了しました。
Cは最終的に155Bになりましたが、161Bのコードは以下のようなものでした。
i;char*p;main(k,s){for(p=s;printf(gets(s)?" ":!*p?p=s,"__\n| \0 |\n| \0 |\n|_\0_|"+i++*6:*p++<33?k="___\0 | \0_|_\0 "-~i/2*4:i-2?"|\0"+~i*(i?i/2+k++&1:4):"%c",*p)-2;);}
このコードで、
"|\0"+~i*(i?i/2+k++&1:4)
の部分は、直前の文字列リテラルも利用して、iとkの値によって"|"," ","_"のどれかを出力しています。
~i*(i?i/2+k++&1:4)は常に0以下なので"|\0"の\0は必要ないように思えます。
ですが、これを消してしまうと何故か後の"%c"が"|"より前に来てしまい、前の文字列にアクセスできなくなってしまいうまくいきませんでした。
文字列リテラルの配置については、ソースコードに書いてある順番にならないことも多く以前から疑問に思っていましたが、ヌル文字を挿入することで順番がまったく変わってしまうというのは驚きでした。
内部でどのような処理が行われているのか気になります。
#できるだけ4バイトずつ配置する、とか?
明けましておめでとうございます。
まず、このブログを三ヶ月以上放置していてすみません。
更新できなかったのは忙しいというのもあるのですが、Golfに対するモチベーションが下がってきていたというのがあります。いろいろと他にやることが出てきたので。
(その他に、私が不特定多数の方に向けて文章を書くのが苦手、というのもあります;)
ですがやはりGolfは楽しいですし、新しい年を迎えたので心機一転頑張ろうと思います。それと同時に、このブログもできるだけ更新できるように頑張ります。多分月一ぐらいのまったりペースになると思いますが。
さて、年末の力試しということで27c3_Generate Cに挑戦してみましたが、頑張って縮めましたがnnさんに惨敗しました。
出力にprintfとputsを使うと負けだったようです。確かにputcharを使ったコードを見ると納得ですが、もっとよく考えないとですね。
それにしても、何かのイベントだったようですが、これを契機にあなごる民が増えたりしないものでしょうか。
とまれ、今年も宜しくお願いいたします。
(※追記)「日付の変わる時間」がデフォルト設定だったため、12月31日のエントリーになってしまっていたため再投稿しました。
終了しました。
ループカウンタをどのように設定するかが一番のポイントだったようです。
1・4・10回目のループは珠でなくそろばんの枠を出力しなければならないので、1・4・10回目が簡単な条件式で判定できなければなりません。
自分は1から2ずつ増やしてi=1,7,19のときに枠を出力するようにしました。7と19が素数のため133%iで判定できます。
ところがnnさんのコードはi=9からのカウントダウン方式。判定はi%9%6で私のコードと同じく5Bとできるし、iの値がそのままforの条件式に使えるなど、さまざまな利点があります。言われてみれば納得ですが、こういうのを思いつけるのはすごいです。
その他、珠を出力するところでも自分のコードはやや冗長だったようです。うーん、やっぱりもっと考えないとな。
唯一自分が勝っていたのは"=*="を出力するところでstrlenを使っていないところだけでした。
実はかなり後半までstrlenを使っていたのですが、ある程度縮んだにも関わらずalnumがダントツのトップだったので、これは皆さんstrlenは使っていないに違いないと考え最終コードに到達しました。
なので半分カンニングのようなものです……
さて、post mortemで自分が130BをSubmitしたわけですが、コードをご覧になれば分かる通り私はほとんど何もしていません。
なのでこのまま終わるのもアレかと思いどうにか縮まないかいろいろ試してみたのですが、やはり難しいですね……。
実は改行にputsを用いたコードが思いの外縮んだのですが、惜しくも130B止まりでした。悔しいので後でまた挑戦します。