Turing Complete FMはRui Ueyamaによるプログラミングについてのポッドキャストです。
コードゴルフ
Rui 浜地さんといえばゴルフの第一人者だったんじゃないかなっていう。
Hamaji 多分10年くらい前はそうだったんじゃないかなと思いますね。今は全然真面目にやってる人達とたまにちょっと勝負してみたら全然勝てない、というかもうかなり大差を付けられる感じになってます。
Rui いまでもゴルフはアクティブに行われているんですか?
Hamaji 結構すごいですよ。僕のゴルフサーバみたいなのはだいたい常に1問か3問ぐらいはみんながやっている問題みたいなのがあって。
Rui ゴルフ場って投稿サイトなんでしたっけ?
Hamaji 問題を誰でも好き勝手投稿して、みんな好き勝手解くっていうようなサイトですね。ちょうど今見たら972問とかでそろそろ1000問に達する。結構な問題数ですよね。
Rui ほう。ゴルフ場っていうのは、一応コンテキストを説明しておくと、浜地さんが自分でやっているサイトがあって、そこはお題を出して答えをサブミットできるサイトになっていてるんですよね。自分の好きな言語を選んで、その言語で可能な限り短いプログラムを書いて、お題を達成するっていうことを競うってやつなんですけど。一番短いストローク数を狙うっていう意味でゴルフって呼ばれている。というわけで浜地さんがそのゴルフ場を運営していてゴルフが好きな人がそこに集っているというわけなんですよね。1000問くらい集まってるって結構凄いですね。
Hamaji そうですね。今見たら1日に10とか20くらいは解答が投稿されているのかなという。
Rui どういう人がゴルフをやるんですか?
Hamaji 暇な人でしょうね。間違いなく。
Rui 間違いなく暇な人でしょうね(笑)。
Hamaji アクティブに問題を出している人とかは相当暇なんだろうなって思いますね。出されている問題を解くだけでも僕としては結構うんざりするのに、わざわざ自分で出して他の人と競う人達が複数いるので、ゴルフ場が成り立っています。
Rui ゴルフが強い弱いっていうのは何なんですか? 最近は強くてっていうのは、一体何が強くなってるんですか?
Hamaji 単純にあの人達が今までに使った時間が僕が今までに使った時間より圧倒的に多いということだと思いますね。
Rui つまりゴルフといえば時間?
Hamaji 基本的には。頭の良さとかもちょっとは関係あるでしょうけど、基本的には総当たりしているだけですからね。経験とかはもちろんあるでしょうけど、経験とは結局時間を使うってことだから。
Rui ゴルフの時間の使い方というのは、何をどう使えば短くなるのか。
Hamaji 基本的には、頭のいい人とかは違うのかもしれないけども、僕の場合は完全に総当たり。
Rui 完全に総当たりといっても、例えばランダムなバイトを生成してプログラムとして実行してみるとかではないですよね。
Hamaji そこまでじゃないけど、見込みがなさそうなアプローチとかも片っ端から試していく。例えばRubyとかでループを書くとして、ループを書く方法っていろいろあって、for文っていうのはどうしても長くなるから使わないとしても……。
Rui for文はなぜ長くなるんですか。
Hamaji endを書かなければいけないし、endのあと改行なりセミコロンが必要とか、いろいろ長くなりがちですね。ループとかする時はArrayに対してmapというメソッドを呼ぶなり、整数に対してtimesっていうメソッドを呼ぶなりする。あとは後置while。whileってwhile、文、endみたいな感じで書くとendが必要になっちゃうけど、式、というかRubyでは文も式なわけですけど、式に対して後置でwhileって書くとendが要らない。あとは文字列に掛け算して、Rubyのスクリプトが入った文字列を例えば10倍して、10回同じRubyスクリプトが繰り返された状態にしてからevalするとか、そういう方法でループを実現したりとかもします。だから結局試してみるべきことが多くて。
Rui なるほど。
Hamaji その4つか5つくらいは大体ループとなるとどれが良いかなととりあえず考えてみる。
Rui 昔浜地さんが言ってたと思うんですけど、ゴルフは、短く書けるというのが証明されただけで短く書けるという現象があるらしいですが。
Hamaji それはもう本当にそうですね。
Rui 信じるところから始まるみたいなこと言ってませんでしたっけ?
Hamaji 最高記録を出す人はとりあえず俺はやれるって信じないと絶対に縮まない感じはありますね。
Rui (笑) 何でなんですかね?
Hamaji それはやっぱり人間できないと思ってやってモチベーションが湧かないんじゃないですか。
Rui みんなで1バイトずつ頑張って削っていって最終的には思っていたよりも全然縮んだりとかするわけでしょ?
Hamaji そうですね。競争相手が居ると居ないで大分やっぱり最短記録とか違う気がしますね。
Rui 伝説的にはFizzBuzzとか。
Hamaji あれとか凄い時間がかかってます。
Rui 今は何バイトまでいってるんですか?
Hamaji FizzBuzzというとRubyのやつが結構時間かかったので僕は好きなエピソードなんですけど、最終的には50バイトになってます。2〜3年くらい56バイトが最短だと思われてて、その後55バイトを出した人がいて。
Rui (笑)
Hamaji あればバグかなんかだろうと思われていたんだけど、その1年後ぐらいに僕があの55というのは本当の記録なんじゃないかと思って一生懸命考えてたら53ぐらいまで縮んだのかな。それを見てみんなわれもわれもと縮めていって、すごい人が50バイトというのを出して今に至る。これはさすがに最短だと思いますね。
Rui それも本当に最短なのかわからないですけど。
Hamaji 証明はできないですけど、いくらなんでもこれ以下は無いっていう雰囲気が漂いすぎている。
Rui 探索空間は有限だから、論理的には全探索することはできる。
Hamaji よくそういうこと考えるんですけど、8ビットが50個並ぶと400ビットあるからちょっと探索できない。
Rui 宇宙規模くらい。
Hamaji (笑) 宇宙でも全然駄目ですね。
Rui (笑)
Hamaji 宇宙の粒子全部とか100ビットくらいしか無いんじゃないですか。確か。
Rui そもそもFizzBuzzをちょっと説明しておくと、浜地さんから説明してもらったほうが良いか。
Hamaji 1から100まで表示するんだけど、3の倍数の時はFizzって出して、5の倍数の時はBuzzと出す。3の倍数でも5の倍数でもある、つまり15の倍数の時はFizzBuzzと出すというすごい簡単な問題で、なんでこんな問題が流行ったかというと、昔こんな簡単な問題も面接で解けない人がいるみたいな海外の記事がバズって、なんでこんな奴らがプログラマと呼ばれているんだみたいな話が盛り上がって、みんなブログでFizzBuzzを解くみたいなことが流行りました。解けて当たり前って話をしてるんだけど、みんな頑張って解くみたいなのが2007年くらいに流行して、多分そのときに出題されたんだと思いますね。
Rui FizzBuzz書けないプログラマ、普通にいそうな気もしますけどね。
Hamaji そうですね。僕もバイトしていたとき見た気がしますね。
Rubyの文法 »