naiの日記

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

390. Heavy Rotation

strncatを使うことに気付いたらかなり短くなりました。
コード自体はShifting Pattern Fixedとかなり似ています。strncatは割と応用範囲が広く、好きな関数です。

それにしても、一人で素振りしてた問題を除くと、Cで単独トップを取ったのは物凄く久しぶりな気がします。
data orderぶりかな?


ところで、Perl Golfは少しかじった程度だったのですが、せっかくなのでtoggleCASEHeavy RotationPerlのコードを読んで勉強してみました。
試しに昔のendless問題をPerlで解いてみたのですが、勉強の成果か、judge Jankenでトップに並び、transpose linesでトップを更新するなど、かなり調子がいいです。だんだん慣れてきたのかもしれません。
C Golfと違ってPerl Golfは日本語のドキュメントがほとんどないのが問題なので、上達するには実際にやってみるしかなさそうですね。


その他、Active Problemsについて。

Yes

簡単な問題なので、BrainfuckとBefungeで解いてみました。Befungeは面白いですね。

ON bit fixed

この手のPermutation系の問題はよくわかりません。
いいアルゴリズムを模索中です。

Number guess 1000

簡単な二分探索かと思いましたが、guessする数字の決め方がよくわかりません。
四捨五入で整数に丸めるなら、938・969の次は953ではなく954ではないかと思うのですが、何か問題を読み間違えているのでしょうか……


追記
notがショートコーディング攻略wikiを始めました。一応こっちにも貼っておきます。
http://w.livedoor.jp/short_coding/

379. Borderizing Texts

終了しました。
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日のエントリーになってしまっていたため再投稿しました。

334. Sokoban

Sorobanの直後に投稿された問題で、問題名と内容を見てちょっと笑ってしまいました。
下から3ビット目をへし折るだけの簡単な問題ですが、42Bの投稿者で-5との論理積を取っているのは自分だけで、他の方はみな~4との論理積を取っていました。
この辺の書き方の違いは面白いですね。自分は~4を瞬時に-5と解釈してしまったのでこうなったようです。

336. C style constants

チートくさいのでもう書いてしまいますが、38Bはsystem("perl")です。というか、perlの最短コードをそのままsystemの中に書いただけです。
これだけ単純な問題なので、execを許すならもっと縮むのではないかと思いましたが、自分はCとPerl以外は門外漢なので……

332. Soroban Fixed

終了しました。


ループカウンタをどのように設定するかが一番のポイントだったようです。
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止まりでした。悔しいので後でまた挑戦します。