〜2010年11月中旬〜
なつかしい アイデアが採用された。
% make miniruby compiling ../ruby/trunk/main.c compiling ../ruby/trunk/dmydln.c compiling ../ruby/trunk/dmyencoding.c compiling ../ruby/trunk/version.c compiling ../ruby/trunk/dmyversion.c compiling miniprelude.c compiling ../ruby/trunk/array.c compiling ../ruby/trunk/bignum.c compiling ../ruby/trunk/class.c compiling ../ruby/trunk/compar.c compiling ../ruby/trunk/complex.c compiling ../ruby/trunk/dir.c compiling ../ruby/trunk/dln_find.c compiling ../ruby/trunk/enum.c compiling ../ruby/trunk/enumerator.c compiling ../ruby/trunk/error.c compiling ../ruby/trunk/eval.c <以下省略>
のような表示になる。
V=1で今までのように表示する。
% make V=1 miniruby \ gcc -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -include ruby/config.h -include ruby/missing.h -fvisibility=hidden -DRUBY_EXPORT -I. -I.ext/include/x86_64-linux -I../ruby/trunk/include -I../ruby/trunk -o main.o -c ../ruby/trunk/main.c \ gcc -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -include ruby/config.h -include ruby/missing.h -fvisibility=hidden -DRUBY_EXPORT -I. -I.ext/include/x86_64-linux -I../ruby/trunk/include -I../ruby/trunk -o dmydln.o -c ../ruby/trunk/dmydln.c <以下省略>
\とかインデントとかちょっとうるさい感じかな。
なぜか各曜日の後に空白が1個。これが結構曲者。結構奥が深い。
PCが再起動されてて変だと思ったら、今朝瞬間停電があった模様。
なぜかここ数ヶ月タイムアウト頻発していたネットワークの調子がよくなった。
でもPCはつい2,3日前にも再起動したのでこれが原因ではない。
そうか、ルータかと思い至る。交換したやつはだめだめだな、SBよ。
まあ、でもルータをリセットすればいいとわかっただけもうけものと考えよう。
嘘だった。fri/2としても1,3,5週目の金曜日にはならない。
そもそも曜日のところで*/2としてもsun,tue,thu,satという意味なので隔週どころじゃない。
でしかもfri/2としてもfriと指定したのと同じで/2は無視される。
無視されるというか/はrangeかlistにしか効かない。
なんか自分に都合よく解釈していたようで。
変遷。最初は素直に。38Bだが、これ以上縮みそうもない。
$<.map{|x|i=1;0while x.to_i>=i*=2;p i}
次にwikipediaかどこかに載ってたCでビット操作する方法をRubyへ移植。
要するに2進数で考えてbitの0を全部1にして+1すればいい。
$<.map{|x|p 1+x.to_i.to_s(2).tr("0","1").to_i(2)} $<.map{|x|p 1+("%b"%x.to_i).tr("0","1").to_i(2)} $<.map{|x|p 1+("%b"%x).tr("0","1").to_i(2)} $<.map{|x|p 1<<("%b"%x).tr("0","1").size} $<.map{|x|p 2<<Math.log(x)/0.693} $<.map{|x|p 1<<("%b"%x).size}
29Bになった。途中でlog2で考えればいいと気づきそっち方面へ。
28Bは/$/を使うんだろうなというのまでは気づいたが、.<<とのからみまでは思い付かなかった。
1.9だとMath::log2が存在するので
$<.map{|x|p 2<<Math.log2(x.to_i)}
でいける。って、1.8のMath::logはなんで文字列を受け付けるんだ?
- Description:
- LRZIP is a compression program that can achieve very high compression ratios and speed when used with large files using unlimited sized compression windows. It uses the combined compression algorithms of zpaq and lzma for maximum compression, lzo for maximum speed, and the long range redundancy reduction of rzip. It is designed to scale with increases with RAM size, improving compression further. A choice of either size or speed optimizations allows for either better compression than even lzma can provide, or better speed than gzip, but with bzip2 sized compression levels.
Sorobanとか最近この手の問題が多いな。まずはバイナリに逃げずに解いてみる。
まさかこんなところが違うとは思わなかった。
% bash -c 'a=(0 1 2); echo ${a[1]}' 1 % zsh -c 'a=(0 1 2); echo ${a[1]}' 0
ゴルフ的には-1の有無で2B違う。それ以前にzshでは$a[1]でもいいというのがあるが。
strftimeに気づけばあとはどこから1週間表示するかだけだけど、
yvlさんの解は一瞬悩んだ。
loop{puts Time.gm($$+$.+=12).strftime'%A '}
ゴルフ場では
pidを自由に設定できるという、とんでもない機能があるから成立する解ではある。
たぶんオーバーフローするぎりぎりのあたりにpidを設定すれば、
7回表示してout of rangeで落ちるんだと思う。
わかりやすく直近であてはまる年を例に挙げると
7.times{puts Time.gm(2005+$.+=12).strftime'%A '}
となる。$.はスクリプトを読み込んだときに1行しかないので1になる。
最初はTime.gm(2018)となるが、これは2018-01-01を意味する。
% cal 1 2018 January 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
つまり2018, 2030, 2042, ...のように1月1日の曜日を12年ごとに順に表示すると、
うまいこと月曜日から日曜日までそろうことになる。
日付をインクリメントするんじゃなくて年を使うというのはすごい発想だ。
1.9だと$.の初期値が0なのはまあいいとして、Timeがout of rangeにならないのでこの手は使えない。
今日も凝りもせずにweekday names。Bash編:
printf "%s " {Mon,Tues,Wednes,Thurs,Fri,Satur,Sun}day printf "%sday " Mon Tues Wednes Thurs Fri Satur Sun for i in {4..10} { date -d1/$i +%A\ } for i in {1..7} { date -d2/$i +%A\ } seq -f"date -d2/%g +%%A\ " 7|sh
printf(1)のフォーマット文字列は引数のほうが多い場合は必要な分だけ再利用される。
2/1は2月1日を意味するので今年限定の解となる。
% cal 2 2010 February 2010 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
これ以上は無理かと思ったら1B更新された。となると{1..7}しかないと思ってevalを思いついた。
eval "date +%A\ -d2/"{1..7}\;
それにしても、 awkの解は全然違うのにサイズが同じなのは笑った。