ゴルフ飽きてきたけど、微妙に、はすけるごるふぁーが増えてきたのは嬉しい。問題は一日一問くらいがいいな。別に律儀に全部やる必要もないが。まあ、Haskellだけはとりあえずやっておくかとか。以下、感想とか、メモとか、一部ネタばれ

問題は詳しくは
http://shinh.org:81/
楽しいのは、smileys triangle、permutaterあたりかな〜。あと意外性でecho。というか、echoできないと、他でも苦しい


トップじゃないやつ:99shinh、example_com、Dance、e、smiley、permutater
まだ縮みそうなやつ:tennis、ボーリング、Hamming numbers、Hole in one、card


・99shinh
99 bottles of beerみたいなやつ。普通に4人中最下位なんだよなorz多分、minimalなのは、systemでPerlRuby呼んじゃうのだけど、どうなんだろうな〜。systemだったら、どうでもいいんだけど、正攻法で負けてるとなると、どこを1ブロックと見るかの違いかな〜

・example_com
www.example.comに繋いでindex.html取って来いという問題。なんだけど、ネットワーク使えない。これもsystemでperlruby呼ぶのがminimalなんだろうけど、わかんねー。登録してないけど、現在451B。最下位

・Dancing Kids
102Bでminimalだろうと思ったら、一晩であっさり抜かれたという。systemではないよな〜。import System;main=system""だけで27Bだし。あと2B縮みそうにない

・e
ネイピア数を小数点以下100桁まで求める問題。最初、多倍長整数除算(の一部)を自力で実装して142B。それ、printした方が短いやん!という話。よく考えたらHaskell多倍長整数があるのだった。とはいえ、46Bってどうなってんだ?

・Hamming numbers
Hamming数は、2^a*3^b*5^c(a,b,c=0..)という形の数らしい。で、これを小さい順に列挙していく問題。Wikipediaにlazyな言語の力を示すのに使われる的なことが書いてあるけど、関係ない気が。上限決まってなければ、filterで、2,3,5以外で割り切れる数を落とせばいいだけだし。ゴルフは上限が決まってるので、別のアルゴリズムの方が短い

・Hole in one
ひたすらだるい。よく頑張ったな自分。抜かれても、やる気しない


以下ネタばれ含む

・echo
interactという関数の発見に全てがかかってるという。てか、よく見つけたな
interact f = getContents>>=(putStr.f)
みたいな感じの関数。ゴルフは、標準入力に、適当な処理を施して、標準出力に出すというパターンが多いので重要

・smileys triangle
色んな書き方ができて楽しめる問題。57Bは割とすぐできたけど、凡ミスで1Bの削り方が長い間分からなかった。やっと56Bに達したと思ったら、あっさり55Bに抜かれる。わけわかんね〜

main=putStr$unlines$take 33$":\n:-":iterate(++"))")":-)"

が私のコード。これはもう縮まんよな〜。別の方向からいくしかないかな


・permutater
入力文字列の全ての置換を出力する問題。72Bで終わりだろうと思ったら、67Bとかだしてる人が。

main=interact$unlines.p;p[]=[[]];p l=concat[map(x:)$p$filter(x/=)l|x<-l]

テストケースの文字列は重複がないので、filterを利用。重複を含む場合は、deleteとか使うべき


・delete blank lines
37Bはsystem使っただけ。system使うなら、awkの2Bコードがあるらしいので、35Bまではいくはず。正攻法なら、普通に書けば、40Bになる。以下正攻法コード

main=interact$unlines.filter(""/=).lines