ICFP Programming Contest 2016 参戦記

今年も*1チームUnagiで参加しました。チームメイトの日記:

開始前

Unagiは例年iwi家に集まって戦っているのだが,残念ながら私は海外出張が重なってしまい,iwi家にいられるのは最初の1日ちょっとになってしまった。

公式ツイートのうちhttps://twitter.com/ICFPContest2016/status/757792006345150464の出題者が中野圭介先生だと予想。根拠:

In this talk, I introduce an interesting property of B-terms, that is, whether repetitive right applications of a B-term circulates or not.

http://www.njpls.org/may16.html#keisuke

Unagiを倒しにくるという噂もあったけど,ICFPらしく関数型言語で倒しにきた?

1日目 (Lightning)

朝〜昼

‥‥と思いきや,関数型言語ということもなく,折り紙だった。ICFP 2016が奈良開催のため日本人ジャッジによる出題で,なるほど日本らしい。

最初は,時間が無限にあれば解ける方法を話し合っていた。「合計面積1をナップサックすれば,何重に折られているかが分かる」みたいなことを言った気がする。実は「合計長1をたどると元の折り紙の1辺が分かる」ということの方がずっと大事だった。

折り紙についての論文を調べる。検索の結果,Erik Demaineが折り紙理論の権威っぽかったので,講義資料を読んだりするものの,今回の問題に直接つかえる内容はあまりなかった。(例えば,与えられた「骨格」に上手く肉付けして折り紙にする話題があったが,厳密に折りたい図形を作ることには応用できそうにない。)

chokudai, wataがソルバーを組みはじめる一方,手動でジャッジ出題の問題(「古事記」に載っている折り方という設定だった)を解いていた。問題番号30から33はI, C, F, Pの文字に折られていて,I(上下のserifつき)とかFとかは手動でも難しかった。後で振り返ると,このときに直角二等辺三角形のタイル張りに沿って折ることが分かっていても十分難しいという知見を得た。

昼〜夜

Lightning終了時から提出が始まる「折り紙の問題を(コンテスト参加チームが)出題する」パートに取り組むことにした。

折った結果の図形だけでなく,元の折り紙の4辺や折り線が問題のヒントとして与えられてしまうので,線を重ねると難しくなるのではと最初は考えていた。たとえば,同じ頂点を通る直線で何十回も折る作戦を思いついたが,

  • 座標が有理数という制約により角の2等分線が必ずしも折れないこと
  • 座標の分母の大きさを見ると何回目に折ったかのヒントになってしまいそうなこと
  • 結局凸多角形になってしまいそうなこと

などの対策を思いつかずに断念。

「1辺1の正方形をタイリングできるパーツがあるとそれだけで全部埋めようとして探索失敗する」という感じの内容をwataが言っていたので,普通に手動が難しかった問題がプログラミングで解くのも難しいらしいと予想し,45度単位でしか折らない作戦に切り替え。その制約の中でなるべく気持ち悪い折り方をする方法を考えることにする。

折り紙の「展開図」から平面的な折り紙が可能か(以下,「有効な展開図」と呼ぶ)は各頂点のまわりを調べるだけで判定できるので*2,現実的な折り手順があるかは完全に無視できる。また,どのように折った状態からも(少なくとも)全部まとめて折ることができるのと同様に,有効な展開図であることを保ったまま折り線を書き加えることは難しくない。

実際の出題データ生成は次のようなプログラムを書いた。

  1. N×Nのグリッドを準備。次をM回繰り返す
  2. 折り線がまだない格子点をランダムに選択した後,その点から折り線を適切に4本のばす。新しく書く折り線はすでに書かれた折り線にあたるたびに屈折させれば*3有効な展開図を維持できる。
  3. グリッドで作業していたので,多角形のデータに直して出力。


「点から折り線を4本のばす」ときに,90度+45度+90度+135度にわけるパターンが選ばれると「気持ち悪い折り方」になるというつもり。2日目以降に自分がいなくなっても最低限の編集(パラメータ調整とかデバッグとか)ができるようにC++で書いた。

夜〜朝

ジャッジに提出するデータは,

  • 折る前の頂点たちの座標
  • 多角形たち(何番目の頂点を用いるかで表す)
  • 折った後の頂点たちの座標

からなる。実は,上で生成した出題データはこのうち最初2パートしか作っていない。折った結果は展開図から(合同変換を除き)一意に定まるので,データの最初2パートから最後のパートを自動生成できる。iwiがソルバーに共通となる前処理・後処理を作っていたのだが,折った後の座標の自動生成はソルバーには必要なかったらしく自分が実装することになった。(冷静に考えれば,ソルバーは折った後の図形から解くわけで当然だった。)

「折り線は45度単位だけど,念のため任意の有理直線に対応しておこう」と思ったものの,C++の多倍長ライブラリを使った経験がほとんどなかったため,(こっそり*4Haskellで書いた。折るだけなのでoru.hs命名

oru.hsの完成により「出題」準備がととのう。imos, sulumeによるビジュアライザに投げると狙い通り気持ち悪い折り紙ができていたので一安心。

2日目

朝〜昼

出題データ生成プログラムに直書きしていたパラメータを引数で与えるようにしたり,ランダムで一度書いた折り線をちょっと消すこともする改造をしたりした。(gen3.cc)

出題データは多めに作って,チームメイトたちによる目視で難しそうなものが選ばれた。パラメータはひとまず N=24, M=7 としたが,他チームに解かれる気配はなく,最後までその設定で乱数のseedだけ変えたものを提出していた。

ちょっと余った時間で実物の折り紙を折って解いていた問題の展開図を入力し,oru.hsを通して提出可能なデータにした。

その後

飛行機。

3日目

「国際会議の発表がひかえているからあまり参加できないかもしれない」と言っていたものの,

  • 経由地の空港で,古事記の22, 24番を手動で解く。(24番を解いていた唯一のチームが24番を回転させただけの問題を出題していた。)
  • 着いたホテルで,ソルバー用手動ヒントを作成。

後日

出題データに生成途中のものも追加してビジュアライズした*5出題データ | Unagi | ICFPC2016。動画版(imos):

他チームの参戦記より(追記)

fixstars(tomerunさん)

Unagiの問題が強そうなので方針をパクる。折るのは90度か45度の線のみで、skeltonの線がたくさん重なっているような非凸の図形だったら良い。

ICFP Programming Contest 2016 - TopCoderの学習のお時間 - TopCoder部
天羽々斬(osa_kさん)

Unagiが提出している問題を見ると、そもそも折っていくにしろ開いていくにしろダントツで難しい。そこで、Unagiは古事記くらいは解けるにしても、彼らが自分自身で出している問題は解けないんじゃないかという仮説を立て、同じような問題を作ることにする。が、そもそもUnagiの問題が手動でも解けない。

ICFPC2016 Team 天羽々斬 - osa_k’s diary

*1:去年の自分の日記:ICFP Contest 2015 参戦記 - tosの日記

*2:角度の交代和を見るだけ。現実の折り紙では,山折りと谷折りを適切に選んで紙が重ならないようにする必要があるが,このコンテストの設定ではそれは要求されない。

*3:屈折率は -1 で,すなわち,折って重なっている紙を同じ直線にそってまとめて折る操作に対応する。

*4:お風呂休憩時に「今回は自分がいなくなっても大丈夫なようにC++で書いてる」と言ったばかりだった……。

*5:滑らかに折っている雰囲気だけど,実はちょっとだけズルしてる。

音ソシャゲーの比較

配信開始日順に並べましたが,現状で比較します。主観を多分に含みます。加点要素減点要素は色で示しました。

ラブライブ!スクールアイドルフェスティバルスクフェス

  • 配信開始:2013/4/15
  • ボタン配置:半円形9ボタン(maimaiを下半分に詰め込んだ感じ)。多くの指を使うメリットがカーブのせいで小さく,持ちプレーと置きプレーの難易度差が減っている。
  • 判定幅:やや甘い(最良判定Perfectは体感40msくらい)。上位2判定でコンボがつながる。
  • 判定ズレ:ズレていると認識できる曲は1割くらい。(早ズレ曲と遅ズレ曲両方ある。15msくらいはズレてそう。)
    • 自動ズレ調節機能が用意されているが,それで調節すると早ズレ設定になる印象。
  • ノーツの種類:通常,ロング
    • ロングの終点は始点と同じ判定の厳しさ。*1
  • 譜面:親指2本でのプレーに配慮された譜面。(「思い切り」指を伸ばす必要のある譜面が1つだけあるが*2,そういう歌詞ネタ。)
    • 担当パート:伴奏にあわせていることが多い印象。
    • 難易度:難しい譜面が不足。しかも最高難度は常設されていない。全曲フルコン目標がちょうど良いくらい。(現在は1曲4難易度だが,この上に新難易度が設置される予定。)
    • 譜面表示:とても素直。同時押し表示があるものの,同心円の配置は認識しにくく,自然な難易度増加に貢献している。最近ハイスピード設定ができるようになった。
  • 得点計算:(音ゲー点)×(キャラステータス)+(キャラ特技)と考えて良い。
    • 音ゲー点については,コンボボーナスあり。最初と最後以外でコンボを切るとハイスコア更新はまずない。
  • 曲傾向:擬J-POP,擬懐メロ(「まきちゃんがテレビを観て『アイドルソング』を勉強している」設定だと思うことにした)。作詞が畑亜貴でややワンパターン(「うみちゃんが恋愛の歌詞が恥ずかしくて適当に書いたり,そもそも恋愛じゃない歌詞を書くことにしたりしている」設定だと思うことにした)。
  • ガチャ:URは1%しかない。高レアリティ確率上昇のイベントなしカード重複で進化できる仕組み。
  • その他:みんなかわいい

CROSS×BEATS(クロビ)

  • 配信開始:2013/12/2
  • ボタン配置:画面全体にノーツが来る(実は主に格子点に来る)。
  • 判定幅:最良判定Flawlessはやや辛い(体感20msくらい)。コンボ継続のための判定は激甘。
  • 判定ズレ:(気付ける範囲では)なし。判定音の遅れは気になるので,判定音の方でタイミングあわせをしてしまう人には厳しい。
    • ズレ調節機能はms単位で親切。
  • ノーツの種類:通常,ロング,フリック
    • ロング終点で離す必要なし。フリックは押し直す必要なし。
  • 譜面:音ゲーらしいと思う。タブレットを置いてのプレー前提で3つ以上の同時押しあり。
    • 担当パート:高難易度は混フレ楽しい。
    • 難易度:高難易度まで揃っている。ただし,譜面ごとの解禁作業が必要。
    • 譜面表示:慣れが必要*3手で隠れたり連打もある中で見やすく設計しようとした努力はうかがえる。ハイスピード設定可能。ただし,速度BPM依存。当然,BPM変化のある曲では見難くなるし,ランダム選曲も困る。
  • 得点計算:スコア自体は上位3判定の個数のみ(コンボボーナスなし)*4。これについてはFlawlessの個数が重要。
    • ただし,S+等で表される達成度については上位2判定の合計数とコンボが重要。フルコンのみで良ければ4番目までの判定で許される。「判定幅」の好み(というかプレーヤースキル)によっていろんな目標を設定できる。
  • 曲傾向:Cool
  • ガチャ:曲の入手が実質的にガチャ*5
  • その他:曲プレビューがちゃんとループしている

アイドルマスター シンデレラガールズ スターライトステージデレステ

  • 配信開始:2015/9/4
  • ボタン配置:画面下1列5ボタン
  • 判定幅:激甘(最良判定が60msくらいはありそう)。適当プレーでもPerfectの個数はMiss以外の判定個数と2桁違う。ただし,コンボに必要な判定は狭い*6。苦労した初フルコンが同時に初エクセのこともある。
  • 判定ズレ:ズレてる気がする譜面もあるが,判定幅広すぎでよく分からない。
    • ズレ調節は勘でやるしかない。
  • ノーツの種類:通常,ロング,フリック(左右)
    • フリックはロング終点のものと独立のものがある。独立したフリックは押し直す必要なし。(ロング終点のものは押し直すとミスになる。)
    • フリックに関して裏技が多数存在する*7。ここで裏技とは「あんみつ」のように譜面の指示通りに叩かないことを指すが,たとえば,
      • フリックは早めにとった方がコンボが繋がりやすい
      • 連続フリックは譜面上でもつながって表示されるが無視してよく,左右の手で分けるとやりやすい。
      • 「単押しの後の同じ位置から始まるフリック」はロングとその終端フリックのように扱ったほうが簡単。*8
  • 譜面:親指2本でのプレーに配慮しているようで,そうではない。同時押しは2つまでに制限されているが,暗記しなければ親指プレーのフルコンは不可能な譜面がある。
    • 担当パート:ボーカルの存在するところはボーカル。しかも歌詞の文字数を正確に守る*9
    • 難易度:限定イベントでそれなりに難しい譜面(MASTER+)が配信される。常設の高難易度譜面はクリアは簡単。フルコンはフリックが運ゲーになる。
    • 譜面表示:同時押しの表示がいわゆる「横認識」の助けになっている。それ以外は意図的に譜面認識を難しくしている要素あり。一部のノーツが斜めに降ってくる*10。譜面が3Dなのでノーツは加速している。
  • 得点計算:複雑
  • 曲傾向:キャラソン。ネタ多め。
  • ガチャ:キャラ多すぎで推し*11がいる人には厳しい。逆に各キャラについてSSRは1種しかないので,手に入れれば終わりにできるかもしれない(たった今,期間限定で身代金3000円にサービスされている)。1枚引けばアイテム進化可能。
  • その他:MVに力が入っている(キャラの3Dモデルが踊る)。一度曲をクリアしておくと,MV鑑賞のみも可能。
  • その他:判定音が4種類から選べるが,どれを選んでも,(スクフェスの自然なタンバリン音と比べて,)高音を盛っている感じでうるさい。*12

これらの共通点

  • 判定音あり。判定音は曲の音ではない。(設定で消音可能。)
    • ロング終端も判定音あり。
  • スタミナ制。フレンド要素あり。ギルド要素なし(?)

スクフェスデレステのカードについて

  • 判定をPerfectにする特技も存在
  • イベントSRくらいで得点評価Sをとることは可能。スコアランキングは最高レアを必要個数揃えるのがスタートラインと思われる。

まとめ

現状,「これがイチオシの音ソシャゲー」とは言えない一長一短で,

その中でも,

  • スクフェス:もうすぐ来る大型アップデートでかなり改善されるかも。
  • クロビ:やりこめば楽しくなるし,課金さえすれば快適。
  • デレステ:フルコンを目指さずにクリアだけで満足できるなら。

*1:「ロングノーツは音をのばすことを表す」解釈では理不尽だが,スクールアイドルがしゃがんだり立ったりすることを表す解釈だとまあ良いかなという感じ。

*2:Music S.T.A.R.T!! [HARD]

*3:「クロビの譜面形式慣れても,ある程度曲ごとに譜面を覚える必要がある」という声は聞く

*4:IIDXのEXスコアに似ている。

*5:レアドロップという方が正確かもしれない

*6:キャラスキルなしでは上位2判定でコンボ継続だが,(jubeatの全Great以上と同様に)80msから90msくらいしか許されない印象。

*7:フリックの仕様変更が一度あったが,仕様変更以前の状況は知らない。

*8:デレステはロング終端フリックが仕様にあるので譜面作者の意図に反する。クロビにはロング終端フリックの概念がないが,その代わりに「ロングの終端時刻に,フリックがロング判定位置限界あたりに配置されている」ことがあり,これはそんなに悪くない。

*9:拗音や英語をフリックにしている疑いすらある

*10:垂直方向の速度が一定な分,reflec beatよりもましか……。

*11:im@sの世界では「推し」ではなく「担当」プロデューサーと言う。

*12:アーケードのコイン投入音みたいな「あざとさ」がある。

詐欺師になるしくみ

数学科の院生の進路として詐欺師という選択肢があるという噂を聞いたことがある。確かに,頭の良さを活かせる職業ではあるし,「社会の役に立つ」ことにこだわらない面でも数学科(のステレオタイプなイメージ)っぽい。まあ,そんな風に噂を聞いたときには感じたものだが,別の理由を思いついてしまった:「純粋な(社会)貢献をすることを諦めるなら,純粋な詐欺をしたくなるのではないか。」

ところで,仕組債というものがあることを最近知った。例えば,「年利3パーセント,2年契約,円・豪ドル・NZドルのいずれかでお受け取り」みたいなやつ。当然ながら,受け取る通貨を選ぶ権利はない。線形論理のresource interpretationで「100円⊕1ドル」の方。

経緯はというと,海外出張する予定があり,その前に外貨口座を開設してSony Bank WALLETを使おうとかいう感じ。私の場合は手数料が安いことが目的だけど,「外貨預金といえば資産運用」みたいなノリを感じたし,普通の銀行でも色んな取引ができるらしい。近況報告はおしまい。

話を戻すと,いかなる手口で素人にオプション取引させていたかを知った。金融のことは素人だが簡単に解説すると,大きな価格変動のリスクを負担することを見返りに支払われるオプション料を「金利」にすれば,「リスクはあるけど高金利」みたいに宣伝できるらしい。定期預金との違いが分からない人が大損したりして社会問題になるのも納得だった。確率論はそれなりに勉強して,確率過程の簡単な計算ができるようになっている目でオプション取引を眺めると,「こんなの素人に見積もれるわけがあるか」って思う。確率が直感にあわないことは結構あるし,確率論を完全に理解していても経済の知識がないから更なる落とし穴もきっとある。

すでに述べたようにプレミアは難しい。難しいものと関わりあいたがる人は少ないが,難しさを隠してしまえば売りやすい。別の例を挙げよう。

ある種のPCゲームは発売から1週間もたたないうちに中古品が半値で出回っていたりする。そうなってしまうと新品の売り上げが落ちるということで,メーカーはいかに予約購入してもらうかということに力をかけているらしい。ここで売りにくいのは新品プレミアであって,これに予約購入するリスクと予約特典を加えると,一層複雑になるにもかかわらず最難所の「新品か」の部分からは意識がそれるので簡単に見える。

難しさを解決するために,いろいろ加えて難しさを薄めるというのが常套手段なのだろう。まったく気に入らないことだが。別に,「困難に立ち向かえ」という言葉で指し示される内容のことを言いたいのではなく,ただ,「難しいものは嫌い」と言っている人たちが,実は,より難しいものを好き,ということが残念だ。「本当に難しいものはどこにもない」と言いたいのでもない。何かを足して解決することがあるとすれば,難しさを閉じ込めて管理することだという思いがあるだけだ。

きのう,生活圏,コヒーレンス

気付くと,暗い建物の廊下のようなところにいる。
「気付いたから,」と説明した方が正確か。
いずれにせよ,視界は一面の黒に染まり,両足が地面についている感覚だけがある。


この消え入りそうな世界の中でも,体はいたって普通に動くはずだ。
だらんと下がっていた右腕を,ほら,前方に。
ただし,視界に変化はなく,腕が風をきった感覚もない。


そのまま右腕で,何も見えていない両目を覆い,擦るようにしてから腕を下ろす。
残念ながら,まるで目を閉じているままのように変化はない。
おまじないとはいえ,これで結構見えるようになったりすることもあるんだけど。


歩き出すことはできるが,上げた足が再びつく保証はない。
経験則として,世界が不確かなときは,まず私が確かになるべきだ。
私は世界。世界は私。


左の手首を右手で掴んでみる。
掴む感触,掴まれる感触。
足の裏に加えて新しく2箇所,存在感が得られた。


ブラックアウトの危険は減ったと考えてよい。
この存在感を頼りに,一歩ずつ進んでいく。
言葉通りの意味で世界に奥行きが出る。


……。
……。
……。


かすかに明るくなる。
外から光がさしてきたようだ。
いや,私は外に出ていた。


そのとき,ふわっとして,右足は宙を蹴り,左足もつかなくなった。
見えるのは人のいない住宅街。背中が暖かい。
右手で左手を掴んでいる感覚はそのまま。


最初から重力がおかしかったような気がする。
世界に身をゆだねる。夜明けのようだと思っていたのに,嘘みたいに明るくなった。
風景がゆっくりと流れ,遠ざかる。

ICFP Contest 2015 参戦記

今年は海外出張中だったのですが,去年,一昨年と同じメンバー iwiwi, imos, sulume, wata, chokudai と参加していました(チーム Unagi)。

開始前

  • 量子チューリングマシンという話に期待が高まる。
  • 暗号は解けない。
  • Cthulhu ということなので『這いよれニャル子さん』で予習しようとするも,アニメの第2期第1話を観たくらいしかできず。なぜ第2期かって,第1期はcrunchyrollになかったから。
  • コンピュータを新しくして,開発環境が入っていなかったので,Java と Mono をインストール。
  • 開始時刻の直前に8時間眠るように睡眠を調整。

1日目 (Lightning)

  • 正六角形タイルでテトリスをしろという問題のようだ。量子はどこへ?
  • 移動のさせかたが特定の列(以下,「呪文」と呼ぶ)になっていると,得点が入る。呪文リストは隠されていて,呪文の得点は Lightning では関係ないが,Lightning 中からスコアボードには影響していて,でも,Final Round ではプログラムに呪文リストを貰える。でも,スコアボードである程度勝っていないと,Final Round に進めない。呪文にどのタイミングで取り組むかは謎だった。
    • 呪文に取り組むかは謎だったのだが,いろいろな事情で,早めに呪文当てをすることになる。
  • 開始直後,コンテストサーバー側での採点にバグがあり,早くも優勝ペース(参考: http://twitter.com/imos/status/629653593532928000)。
    • このバグに気づいていたチームは Unagi と Rabbit House だけだった気がする。
  • 例年の通り,wata, chokudai がマラソンマッチ的なことを担当し,imos, sulume がチーム内スコアボードとか複数のソルバーの統合とかの環境を担当。
  • ゲームの仕様で与えられる座標系がやばいので,まともな座標系に直す。ただし,ゲーム中で列を消したときの落下処理はやばい座標系に従うので,整合性をとる必要がある。仕様の (x,y) を (2*x+y%2,y) にうつすと直交座標になり(正規直交座標ではない),上記の問題とも相性が良さそうなので,それを使うことにした。
    • この判断が正しかったかは自信ないが,チームメンバーはあまり混乱してなかったようなので良しかな。変なルールがなければ,60度の斜交座標を用いるのが普通だと思う。
    • しかし,上のコードでは y が負のときにバグ。Haskell で rem, quot; div, mod が分けられてることへの感謝の気持ちを忘れてしまっていた。
  • 早くも自分の仕事がなくなりつつあるが,Lightning 後のために,呪文の詰め込みかたなどを考えることにする。
    • ルールでは同じテトを過去と同じ位置にするような移動が禁止。降ってくる個数が決まっているため,下(というか,Hex なので左下60度と右下60度)にあまり移動しないことが大事なので,左右で戻りたいときは回転してから戻すとか。
  • やはり仕事がなくなりつつあるので,imos, sulume がまだ手をつけていない visualizer を作りはじめる。
  • 勉強もかねて,GLUT か GLFW の Haskell 用バインドを使おうとしたが,無駄にコピペコードになりそうなのと,他の人が使うときに cabal でハマったりする可能性が怖かったのであきらめて,JavaScriptCanvas でやる。
    • JavaScript はそれなりに書いていた時期があったが, .length() でエラーが出て「これだから配列かどうかすら分からない言語は」と腹を立てたり(.length が正しいので筋違い),それを直したら,今度は Math.cos(i*Math.pi/3) などと書いていたところでエラーが出て,「Math.PI が正しいとか馬鹿じゃないの? なんで関数が副作用がないかには気にしないくせに,double型が定数かどうかにはこだわるんだよ」と腹を立てたりした(これは C言語で PI だったレガシーを背負ってしまったとしか理解できていない)。
  • 遠隔参加なので,起きていても全部の会話が拾えていることもないし(ネット回線やマイクの位置の問題),オンサイトだった去年までと比べるとチームの状況があまり把握できない。
    • 「スコアボードが修正されてから,Unagi はなかなか解答を送信しないな。潜伏戦略なのかな」と思って聞いたら,「1位です」と返ってきて,自分がスコアボードの更新をしてなかっただけだと気づいたり。
  • 今年も wata, chokudai の力が発揮され,割と良い感じの成績っぽい。1位のチームは Lightning で得点にならない呪文で稼いでいるっぽいし,Lightning 部門勝利もあるな,という感じで初日は終了。

2日目

  • 日本にいるチームメンバーとの睡眠のタイミングを合わせられなくなってくる。
  • iwiwi 呪文の解析を頑張っていたので実際の呪文がいくつか特定されている。
  • 呪文まわりの戦略について chokudai と話す。"ia! ia!" は重複させられるので強そうに見えるが,"r'lyeh" の方が下への操作をあまり入れないので強い。ただし(60度対称で)回転できないテトだと結局 "ia! ia!" するしかない。
  • imos, sulume が書いている C++ シミュレーターを少し改造するが,どうビルドすれば良いのか分からない。GitHub の更新を検知して自動ビルドの結果が Slack に流れてくる仕組みがあったので,一発書きを commit, push した。
    • あまり良くないんだけど,担当の2人は寝ているし,破壊的に変更していないはずだし,push したらビルド通ったっぽいしまあいっか,みたいな。
  • JavaScript で書いたビジュアライザを,ゲームプレイに対応させていなかったところ,C++ シミュレーターの側にゲームプレイのアスキーアート出力がついた。自分がこれ以上 JavaScript で何かしようという気がなくなる。
  • テキスト表示を見ていると正六角形で美しく出力する意味があまりないことに気付く。テトが連結とかいう制約もないしグラフィカルにやるにしても円で十分では? wata, chokudai が自前のテキスト出力で大丈夫そうにしていたのも納得。
  • 呪文候補のローマ字列を入れると,対応する操作を矢印(←→↙↘↻↺)の列で出力するだけの簡単なプログラムを書く。矢印の列を Slack に貼ったら斜め矢印だけ絵文字に化けた(斜め下移動がある意味目立つべきといえばそうなので,偶然だが分かりやすかったとも言える)。
    • 例:↙↘↘↙↙↺↘↙↘↺↺→↘↙↺↘↻←↘→→↙↘↻→↙↻↘→↺↙↺↘↙↺↘↺↙↙↺↺↘↻↻→↙↘↙↘↙←
  • スコアボードで呪文を18個中9個も使えているチームがいることに驚く。
  • iwiwi が取り組んでいた呪文当てがツール化されて,誰でも使えるようになった。呪文を含む死なないようなプレイを適切な問題番号で探し,それを submit する仕組み。
  • ICFP 2015 accepted papers のタイトルに含まれる単語を iwiwi ツールにどんどん貼り付け。しかし,当たらない。
  • 呪文当てをする唯一の手段が公式スコアボードだったし,分かっている呪文の範囲での点数は自己採点できるため,必然的に「潜伏」戦略になる。
    • AIと自前のシミュレーターの採点が同時にバグっているという可能性を排除するために,「潜伏解除」もした。
  • どうせ "2015" とか "icfp" とか入っているんじゃないの? と思うものの,どちらも左右に行って戻る連続した移動があり,そこでテトを切り替えないと反則なので,死なない手順を自動で見つけるのは難しい。手作業で手順を作ったが,呪文ではなかった。残念。
  • 日本にいるチームメンバーとの睡眠のタイミングを全然合わせられなくなってくる。

3日目

  • 寝ている間に,結構,呪文が判明している。Twitter でヒント祭りがあったらしい。
  • 寝ている間に「全完」目標になっていた。
  • 内部スコアボードでは圧勝しているが,全問題で1位にする気らしい。
  • AI の動作をながめて「複数列消しを狙う方が良いのでは?」と言ってみたが,見当外れらしい。
    • そのときはあまり構ってもらえなかったが,冷静に考えて Lightning でないと本当にそう。盤の横幅が広くなっても,列を消す得点は変化しないし,複数列消しを待つために積むと呪文があまり入らなくなる。
  • web と twitter しか見ていなかったものの,IRC にもヒントが結構流れているらしいという話。IRC は入っていないとログが見れない。ログが置かれている場所があるらしいがつながらない。
    • それもそのはず,去年の ICFP Contest で使ったときのままの channel topic に「ログが置かれている場所」情報が放置されていたため,つながったとしても1年前のログだったのだ。
  • 公式 twitter 初期の謎の文字列をプロットしてみると,やたらなめらか。楽譜っぽい,というところから解けた。というか,テトリスであることを知っていたので,解けた。解答を確信したのち,文字の選び方を合理化するためには rot13 するんだな,と分かった。順番が逆。
    • 解けてしまったことで,これはテトリスである情報しかないことが判明。呪文探しには役に立たない。(それでも,rot13 とか Ceaser とかを iwiwi ツールに投げていた。)
  • 「Problem 24 の街があやしい,本当に Vancouver(注:ICFP 2015 開催地)か? クトゥルフ的な街でないのか?」という疑問があったため,Vancouver の名所を画像検索。一番あやしげな塔に似た建物は発見。おそらく海側からの写真をもとに Problem 24 を描いているのだが,ちょうどその向きの写真は見つけられなかった。
  • 「全完」を諦め,浮上。Twitter でも報告,を自分だけしそこねた。スコアボードで圧勝しているので,IRC でも話題になるかと期待したが,そのころの IRC は過疎っていた。
  • そういうことで,呪文探しは18個中16個見つけた時点で終了。自分の戦果は,"cthulhu fhtagn!"(チームメンバーは感嘆符を入れては試していなかった)と,最大51文字とアナウンスされていたやつのもう1つの方。どちらも51文字なのはちょっと驚き。
  • あと2時間くらいで終了というところで眠くなって脱落。日本の音声をイヤホンに入れたまま寝るみたいなことをしていたので,なんか終了直前に起きた。

終了後

  • チームメンバーの打ち上げ映像。いいなあ。
  • 未発見の呪文の片方は謎解き力が足りなかったが,もう片方は完全に無理だった。意味不明な 10^63 は調べるべきだった(2^63の誤植だと思ったのが運のつき感もある)。

気づいたら末法だった日の記憶(異世界edit)


――やっぱり,何かおかしくて,こういうのって普通2,3日もすればすぐ気にならなくなるのに。はあ。なんか,どうしても許せない人がいるんですよね……。

で,どうすんの? やっぱ,殺しちゃう?

――え,そんな物騒な話じゃないんですけど。

待って,物騒って?

――だから,「殺す」とか。最初から,そんな最終手段みたいなのって,いきなりすぎません?

その「許せない人」って1人じゃない? ん? あれ? もしかして,君,人殺したこと,ない?

――ないですよ,そんなの。そもそも犯罪ですよ。

ええっ,その年になってまだ誰も殺したことないの? いや,おかしいっしょ。
っていうか,犯罪だからしないって,ふ,ふははっ,あー,ウケるわー。社会人ならニュースくらい見ようぜ。

――あ,あの,そんな簡単に言うことじゃないと思うんですけど。ましてや殺人とか。

君さあ,今まで,「こいつ,目の前から消えてくれないかなー」とか思ったとき,どうしてたの?

――普通に我慢するんですけど。うーん,何か変ですか? 他のことに目を向けたりしてたら,割とすぐ気にならなくなりますよ。あー,気にならなくなって「いました」ですね,最近まで。

「我慢」って。そんな,何もしないで逃げていても,あんまり成長しないよ。

まあ,何かするっていうのは多少のリスクを伴うけどね,もちろん。人を殺して,それが見つかったら捕まる。こればっかりはどうしようもない。

そりゃあ,学校では「人を殺してはいけません」って教わるけど,それ,そっくりそのまま信じてたの? 社会人になるまで? もしかして,まわりで誰も殺されたりしない,めっちゃ良い地区の出身?

――え,嘘,死んでるんですか。いや,まあ,違和感はあったんですが。急にクラスメートが「転校」してどこに行ったか分からなかったりというのも何回か。家庭の事情が複雑だったりするんだろうなあとか,そういう感じに自分の中で説明つけてました。

ああ,それ絶対,殺されてるやつだ。どこの学校でもそうだよなあ。

――そうなんです? ああ,そっか,「自分以外の人が『人を殺してはいけません』って信じてなさそう」という意味での違和感,なのか?

まあ,うちのところもそうだったんだけど,「人を殺してはいけません」と教えている以上,たくさん殺された年でも全部「転校」扱いとか,まったく馬鹿じゃないのかって。そう思ってたのに,君に対しては意味があったってこと? はあ,まったく……。

それにしても,後先考えずに同級生を殺す奴らは気に入らんよなあ。そういう奴って塾にも通わない,習い事もしてない,そういう狭い世界で生きてるから短絡的な発想になるんじゃないかって。

そうそう,刺殺とか絞殺とか簡単そうに見えて,ちゃんと普段から練習しておかないとできないから,早めに鍛えておいた方が良いんじゃない? だいたいさー,君みたいなガリガリの体型だとナメられるって。道歩いててすれちがう人には「あーあ,この人,努力とかできなそう。社会で生きていく気あるの? 人を殺すっていう初歩的な選択肢にすら辿りつけてないんじゃない?」って思われてるって,きっと。

ごめん,話がそれた。

――あっ,はい。あの……

他にも「何かおかしい」とかなかった?

――あと,そうですね,スポーツとか全然興味なさそうな友達がやたら筋トレしてたのも――ボディービルディングって言うんでしたっけ――あれも自分には良く分からない趣味だなあとか思ってました。

そりゃあ,もちろん必要だからだよ。すぐに誰か殺す計画がなくてもそういう時は来るものだし,あと,さっきも言ったけど,「人を殺せない奴」っていうレッテルを貼られるのは避けたいからねえ。

じゃあ,君は別に何も気づいてないってわけじゃないじゃん。殺人に興味ない奴って「自分の趣味のことしか考えてない馬鹿」ばかりじゃないのか。でさー,それなら聞くけど,それだけ見えてても「人を殺す選択もある」って考えにはいたらないわけ?

――そう言われても殺人に「興味」とかいう以前の問題で……。あと,そういう人を馬鹿呼ばわりって自分は「馬鹿」未満ですか。だいたい,答えを知っていたら簡単ですよ。でも,まさか,そんな根本的なところに違和感の原因があるとか難しすぎません? 自分が誰かを本当に殺したいと思うことなんてなかったですし。

例えば,サンタクロースがいないってある程度の年で気づくよね。「煙突もないのにどうやって入るんだ」とか「世界の人口を考えて配りきれるはずがない」とか。

それと同じで,誰も犯罪行為をしない世界って,どう考えても無理があると思うな。しかも,実際に身の回りで人が消えていく。

――うーん,いじめは暴力だから犯罪だし,そういうのがなくせないって話なら分かりますけど,殺人とか,一大事ですよ。殺人事件って数えるほどしか起きないんじゃ。

この国の人口ピラミッドが綺麗なピラミッド型をしているのを見て,それを言う? つまらない殺人は報道されないだけだし,現代で子供が病気で死ぬとかそっちの方がありえないって。

君の主張が良く分かんないんだけど,サンタクロースも,子供にとってのクリスマスの「根本的なところ」だし,実は親がプレゼントを買っているとなっては「一大事」では?

――いや,それは……。あっ,言い方を変えれば良いのか? 子供同士はサンタクロースの話をしますけど,一度も殺人の話とかしませんでしたよ,全国ニュースのやつとかを除いては。これでも普通の友達付き合いをしていたつもりですけど。

あー,それねー。確かに理解できなくもないかなあ。殺人はプライベートな話題だからねえ。

逆に,やっぱり親じゃない? 最初に詳しく話を聴くのは親の若い頃の殺人談というのはよくあると思う。……思うけど,人に聞いて回ったわけでもないから根拠ないな。

――これまで,人を平気で殺す人がいるって知らずに生きてきて,ちょっと全然分からないんですが,自分みたいに非力でも殺人とかできるんですか? 毒殺,とか?

えー,毒殺かあ。簡単そうに見える? そうでもないけど。少なくとも,あまり毒殺は楽しくないよ。今回は,仕事じゃなくて自分のために,その誰かを殺そうって話でしょ。

――そうですね。いや,そこまでは言ってないですけど。

まあまあ。とにかく「自分のために」って場合は,相手が死ぬ瞬間を見てないとつまらない。あと,毒殺は,やりかたによっては無関係の人を殺しちゃう失敗とかあるでしょ。

――そ,そうですよね。やっぱり殺人には抵抗ありますよね。

あの,君分かってる? 無関係の人なのが問題だからね。

これは経験則でしかないんだけど,仕事で結果的に殺人という手段をとるときは,個人的な殺人と比べて,どういう訳か捕まりそうになることが多い。これって,逆に考えれば,相手に恨みがあって殺している場合は結構見逃されてるんじゃないかって。その意味で,ターゲット以外を殺してしまう可能性は避けるべき。

――それで,どうすると良いって話なんですか?

非力でも実行できるという点では毒殺は分からなくもないけど,どうせなら薬漬けにするとか面白いよ。生物学的な死にこだわらないならね。いや,生物学的な死に至ることも多いか。何にせよ,初心者で,か。ツテがないと準備が面倒になるかもしれないから,そこらへんは経験豊富なお兄さんが手伝ってあげよう。

筋力より器用さに振ったビルドだと,銃殺っていうのがスタンダードなんだけど,いまだに刀剣文化なこの国では難しいんだよね。洋画でさ,「ゾンビに襲われた。大量発生しててヤバい」ってなった後でも,店に駆け込むと余裕で重火器が手に入るし,そういうのよくある展開じゃん。君みたいな仕事は海外出張が多いし,生活の拠点を海外に移してしまうっていうのも一案だね。筋トレするのが嫌だっていうなら,これも良い。良いじゃん,海外。

――ちょっと,さっきから話が難しいんですが。

ていうか,最近ゲームにハマったとか言ってたけど,あれFPSだよね。

――いや,あれは伝統的なFPSと違ってイカスミだから,グロくなくて,自分でも――

で,ゲームの中だけなら銃はかなり慣れてるでしょ。

――そうかもしれませんけど,ゲームと現実を混同するのやめた方がよくないですか?

むしろ,人を殺したことないのに,殺人がモチーフのゲームに熱中しているのってどうなのよ。

――だから,あれは人じゃないんですって。

別に人殺しもイカ殺しも変わらないって。すぐ慣れるよ。君は観察力もあるんだし。

――えっと,あのー,殺人という選択肢を持っているのが普通,というのは分かりました。けど,やっぱりその,実際の殺人なんて自分にできる気がしないですよ……,「普通」の人みたいには。射殺とか,人をあんな簡単に――というか,あっけなく――殺せてしまって良いのかとか。

そこから? そこに戻るの? あー,もう,君,めんどくさいなあ。「どうしても許せない」んじゃないの?

君が,「初心者の自分でもできる殺し方は?」みたいに聞くから,人生の先輩としていろいろ言えることがあるかと思ったのにさあ。

証明を求む

箱根駅伝2区,「権太坂を上りきった後,下りと平坦な場所で勝負をかけます」のように話していた選手の映るテレビを観ていた私は,一昨年に読んだ文章をしっかり覚えていることに気付いた。

その文章とは,村上春樹が2013年ボストンマラソンテロをうけて書いたもの(Boston, from One Citizen of the World Who Calls Himself a Runner)。「ボストンマラソンについて,難所として有名な坂を走っているときが苦しいと思われるのに反して,その後の平坦な区間を走り始めた時に本当の苦しさに襲われる」という話がたとえとして出てくる。

テロのような激しい例に限らずとも,トラウマとなる事件を「乗り越える」のではなく「受け入れる」*1ことを勧める小説や評論は頻繁に見かけていたのだが,この文章に出会う前は言葉遊びにすぎないと思っていたはずだ。なぜか。

  • 登場人物が決め台詞として「乗り越えるんじゃなくて受け入れるんだ!」と叫び,それによって困難があっさり解決してしまう。あるいは,
  • インタビューの長い回答のうち「その事故を受け入れるまで時間がかかりましたが,そうしないと前に進めないのですね」のような部分だけ載せる。

こういう説明不足が多い。考えたことを最もよく表す単語を1つ選ぶだけで考えが伝わると勘違いしているのだろうか。しかも,結論のみで理由が理解されると読者を過信しているのだろうか。

すなわち,《定理》を《定式化》*2して《証明》をつけることをしていない文章が多いように思う。

すでに挙げた村上春樹の文章では,《定式化》については,事件に向きあうことが何にまさるのか(“[h]iding the wounds”, “searching for a dramatic cure”, “[s]eeking revenge” が本当の解決にならない)や,時間がかかることの「時間」とは何なのかに言及がある*3。そして何より,《証明》として,「傷はすぐに消えないし,見かけより後に困難がある」という《補題》を経由しマラソン自体にたとえているのが素晴らしい。長距離走が学校の体育以外に経験ない私が納得するくらいに,たとえは機能している。

ところで,「私と仕事のどっちが大事なの」に対する正しい応答が「そんなこと言わせてごめんな(ぎゅっ)」であるという《定理》はあまりに有名だが,ステートメントが面白おかしいせいで,《定理》だけ(いくつものパロディによって)有名となり,《証明》の議論はめったに見られない*4。念のため証明のスケッチを書いておこう。

  • 「疑問文に形式的に答える必要はないし,答えないことが相手との対話の拒絶を意味するとも限らない」のような基本定理があって,その系としてだいたい示せる。とくに,「君」とか「仕事」とか答える必要はない。(ちなみに,「学会発表では yes/no 疑問文には yes/no で答えましょう」と言われて,「なぜ大学生にもなってそんな自明な注意をされないといけないんだ」と不思議に思うとこの基本定理に気付くことができる。手遅れ感にあふれる気付き方だが。)
  • このケースで「私と仕事」の二分法は悪い手法の用いられた疑問文だ。しかし,それ以上に相手を信頼しているのであれば,悪い手法に走った相手の心情を考えるべき。つまり,普通の信念*5のもとでは「罪を憎んで人を憎まず」を適用すべき事例だ。とくに,相手に腹を立ててはいけない。
  • 相手は「私」と「仕事」のどちらも大切であることを分かった上で言っているので疑問文の形式的な回答を求めていない。
  • 回答を求めていない疑問文を発するほどに相手は錯乱しているので論理的な説得は無意味。とくに,(ぎゅっ)


うーん,飽きてきた。でも,最初にこの《定理》を知った人にはこれくらいの《証明》が必要だと思う。《証明》を書けば,用いた仮定も分かるし。さて,この《定理》の《証明》を綺麗な物語として書けるかというと,今のところ私には無理だ。

実際,《定式化》や《証明》を文章の格好良さと両立させるのは難しい。これが第1の「《定理》だけ書かれる」理由。第2の理由は,《定式化》しなければ細かな宗派争いを回避できて共感を得やすいため(もちろん《定式化》できてないせいで《証明》に書くことも無くなってしまう)。第3の理由は,他人から《定理》を教えてもらったが《定式化》も《証明》も理解していないから。

私の場合は,理解できていない《定理》を持ち出されると結構つらい気分になる。だからといって,一度《証明》を理解した《定理》については,《証明》の省かれた文章を許せるかというと,そうでもない。別の《証明》も知りたいし,漏れも無駄もない《定式化》をしたい。そんなときに《定理》だけが書かれていると――文章としていくら格好良くても――「分かっている人同士の答え合わせ」になるか「絵に描いた餅」になるか「張子の虎」になるかだった。その3つのうちどれであるかの分類までもできるような気もするが,はたして。

《定理》をちゃんと理解していないであろう第3の理由はかなり罪深いように見えるものの,ありふれた現象らしい。そして力を持つ。差し障りの少ない例を1つ挙げると,「べ,別にあんたのことなんか興味ないんだからね」と言うヒロインは主人公に興味あるという《定理》は有名になりすぎて《公理》になってしまった。《定理》だった頃には,ちゃんと《定式化》すると「『ツンデレ』とは何か」のような複雑な条件が課されていたかもしれないが,《公理》となった今は無条件で「そう言う人は相手が気になっている」と見なされている*6

*1:「受容」を意識して「受け容れる」と書くのはあまり趣味じゃない。

*2:formalize

*3:とはいえ,《定式化》できているかは足切りでしかないとも思う。

*4:あまりにも具体的な《定理》なので《定式化》に問題はないだろう。

*5:《証明》などのシリーズにあわせると「一般的な《公理系》」と書くべきか。

*6:ツンデレ」の公理化により特定の文「勘違いしないで」などを言いにくくなった問題に対し,望公太『異能バトルは日常系の中で』2巻21ページでは,例えば「思い上がらないで」と言うという手法が提案されている……ように見えるが,(メタには)語彙によらないツンデレ像が追求されている気がする。