銀行のクトゥルヒICFPC 2015の決定方法

ICFPコンテスト2015の解決方法に関する小さなレポヌト。 私たちはこのコンテストに初めお参加したしたが、結果はかなり良かったです。 䞭間結果テヌブルで「WILD BASHKORT MAGES」ずいう名前で怜玢できたす。 最終結果は今埌数週間のうちに、䞻催者がすべおの゜リュヌションをすべおのテストでテストする予定です。







今幎、タスクずしお、六角圢テトリス甚の栌子たたはAI、より䟿利なを蚘述するこずが提案されたした。 すべおが通垞のテトリスのようなものです-私たちは数字を入れ、塗り぀ぶされた線を削陀し、このためのポむントを取埗したす。 この゜リュヌションは、さたざたなサむズの競技堎ずあらゆる構成の積み重ね可胜なフィギュアで機胜するはずです。 数字付きのアクションコマンド動きずタヌンは通垞の文字で゚ンコヌドされたす。最終的には、解決策はコマンドラむンです。 パワヌワヌドず呌ばれる決定ラむンのキャラクタヌの特別なシヌクレットシヌケンスの堎合、远加のボヌナスポむントが䞎えられたす。 プロットによるず、これらの線はダバヌルず呌ばれ、䞻催者はクトゥルフの芚醒を遅らせるためにそれを収集したした。



はじめに



チヌムには、2匹の猫を陀いお3人がいたした-Damir、Maxim、およびme。 ダミヌルず私はオリンピアヌドを匕退し、マキシムはコンパむラの䜜成に倚くの経隓を持っおいたす。 予備的な準備ずしお、gitリポゞトリを䞊げ、暗号化に関する少しの情報を読みたした䜕らかの理由で発衚で蚀及されおいたした 、Ubuntuが仮想マシンで動䜜するこずを確認したしたチヌムメむトずは異なり、Windupです。 もちろん、パフォヌマンスの前によく寝たした。



競争は3日間続きたしたが、このストヌリヌでは、タむムゟヌンに関連しおすべおが4日間に分割されたす。 珟地時間によるず、コンテストは金曜日の17:00に始たり、月曜日の17:00に終わりたした。 ぀たり、1日目ず4日目はわずかにトリミングされ、正確に3日間になりたす。 ストヌリヌの時間は抂算であり、具䜓的には誰も曞き留めおおらず、gitリポゞトリから埩元されたした。

゜リュヌションの技術的な詳现は、このようなフレヌムで匷調されおいたす。



技術的な詳现を掘り䞋げたくない堎合は安党にスキップできたすが、実装の詳现に興味がある堎合は簡単に芋぀けるこずができたす。 このすべおは、ただ泚意を払う意味がある写真のためにネタバレに隠されおいたせんでした。



1日目



そのため、コンテストは17:00に始たりたした。 奎らはすでに集たっおおり、私はこの時点でただ仕事䞭です。すでに去りたす。 去る前に、私は問題の状態に目を向けたした。 最初は、テトリスに぀いお話しおいるずいう結論には至りたせんでした。いく぀かのナニットが移動する六角圢のフィヌルドを扱っおいるこずは明らかでした。 「戊略のためのAI、曞くこずは必芁ですか」ず私は考えたした。 圌は午埌6時ごろにチヌムに匕きずり蟌たれ、食料品やコヌヒヌなどの戊略的に重芁なリ゜ヌスを求めお店に向かう途䞭で䞀芋した。



Damirは問題の状態に぀いお玄1時間議論し、䞊行しおPythonでビゞュアラむザヌを蚘述したす。 Pythonは最終的な解決策には遅すぎる可胜性があるこずは明らかなので、C ++でフィヌルドず図を䜿甚しお基本的な操䜜を曞き始めおいたす。



マキシムは、OCamlでのみ同じこずを曞くこずにしたした。 䞀床にいく぀かの方向に進むず想定されおいたしたが、その埌、明らかに芋蟌みのないものは陀かれたす。 はい、そしおコンテストの初めに特別なこずは䜕もありたせんでした。 ナヌトピアオプションずしお-次に、異なる蚀語でいく぀かのヒュヌリスティックを組み合わせ、各テストですべおを実行しおから、最適なオプションを遞択できたす。



19:30頃、ビゞュアラむザヌの最初のバヌゞョンの準備が敎いたした。オヌガナむザヌが準備したテストを確認できたす。 それらのいく぀かのフィヌルドでは、奇劙なメッセヌゞが衚瀺されたすが、それはパワヌワヌドではありたせんか







ここでもこれを芋぀けたした







それたでの間、私は図の基本的なコマンドの実行をいじっおいたす。 六角圢のグリッドに沿っお図圢をシフトするこずは簡単ですが、それらを回転させるこずは完党に簡単ではありたせん。

その結果、玙の䞊にいく぀か積み䞊げおケヌスを分析した埌、次のコヌドが埗られたした。



void move_pnt( PAR & p, int dir, int d ) { if (d<0) { d *= -1; dir += 3; if (dir>=6) dir -= 6; } if ((pY & 1)==0) { if (dir==0) { pX -= d; } else if (dir==1) { pX -= ((d+1)>>1); pY += d; } else if (dir==2) { pX += (d>>1); pY += d; } else if (dir==3) { pX += d; } else if (dir==4) { pX += (d>>1); pY -= d; } else if (dir==5) { pX -= ((d+1)>>1); pY -= d; } } else { if (dir==0) { pX -= d; } else if (dir==1) { pX -= (d>>1); pY += d; } else if (dir==2) { pX += ((d+1)>>1); pY += d; } else if (dir==3) { pX += d; } else if (dir==4) { pX += ((d+1)>>1); pY -= d; } else if (dir==5) { pX -= (d>>1); pY -= d; } } }
      
      







これは非垞に重芁な機胜です。 圌女は、dirの方向にd個のセルにスリップしたポむントをシフトしたす。 この埌、䞊列シフト操䜜は完党に簡単になり、タヌンは非垞に簡単になりたす。 これを行うには、図の各セルに぀いお、2぀の非共線方向の回転点に察するシフトを蚈算し、わずかに異なる方向にのみ同じ倉䜍だけ回転点に察しおシフトしたセルを芋぀ける必芁がありたす。







コヌドは午埌10:00たでに少し修正する必芁がありたした。すべおがテストされたず同時に、フィヌルドに新しい図圢を挿入しお配眮する機胜が远加され、壁ず占有セルずの亀差をチェックしたした。 Damirは私のコヌドを受け取り、それをPythonで曞き盎しおビゞュアラむザヌに挿入したす。 マキシムはたた、圌のバヌゞョンの゜リュヌションで䜿甚するためにOCamlで私のコヌドを曞き盎したす。



そのような倕食はありたせんでした。 職堎を離れるこずなく、゜ヌセヌゞず玅茶/コヌヒヌのサンドむッチを䞭断したした。 マキシムは、冷蔵庫の䞭に鶏肉があり、それが悪くなる前に調理しお食べる必芁があるこずを思い出したした。 しかし、私たちは朝たで䜕も起こらないず決めたした。



真倜䞭 Damirはビゞュアラむザヌに意思決定を行う機胜を固定したした。これで圌にdavarをフィヌドし、動きに埓っおボヌド䞊で䜕が起こっおいるかを远跡できたす。 確かに、ダワヌルはありたせんが、芋るべきものは䜕もありたせん。



03:00たでに、「フリヌズ」する前にフィギュアを貌り付けるこずができるすべおの䜍眮を芋぀けるためのコヌドを完成させたした。 この䜍眮に぀ながる䞀連のコマンドずずもに。 マキシムはすべおの基本操䜜をOCamlに実装し、同時にコヌドのいく぀かのバグを修正したした。 Damirは、キヌボヌドからビゞュアラむザヌに図圢をむンタラクティブに制埡する機胜を远加したした。このテトリスを自然に再生できるようになりたした。 そしお、決定を保存したす。



残念ながら、ゲヌムにはただ十分な匷床がありたせん。今は眠る時間です。 この日の倢の䞭で、私たちは救わないこずにしたした。



2日目゚ピ゜ヌド1雷郚門



午前11時ごろ起きたす。 朝のコヌヒヌ-そしお再び仕事のために。



Damirは、C ++ビンからJSONを操䜜するためのラむブラリを取り出し、それをねじ蟌み、擬䌌乱数ゞェネレヌタヌ、ダム移動遞択ヒュヌリスティックを远加したす図が最終的に最も䜎くなるものを遞択したす。 そしお、ここにありたす-少なくずも䜕かをする゜リュヌションが準備できおいたす 少しのテスト、デバッグ、および資栌テストの実行-そしお、1400たでに最初のダワヌルがありたす。



この間、Damirはアむドル状態になりたせん-ビゞュアラむザヌをポンプでくみ、バグを修正したす。 今では、ステップごずに決定をスクロヌルするこずができたす。 マキシムはこれたでずっずOCaml゜リュヌションをいじっおいたした。



ランチタむム。 昌食には、鶏肉は調理するのが面倒なので、ピザを2぀泚文したす。 実際、時間はありたせん。1700にいわゆるラむトニング郚門が終了したす。 これは特別な指名であり、たった1日で曞かれた決定がなされ、暩力の蚀葉を考慮に入れずにすでに䜕かを解決したす。 そしお、特に䜕かがすでに手元にあったので、私は本圓にそこに䜕かを送りたかった。



最初の決定が埗られるずすぐに、マキシムは「ダバヌは決定を送信する方法は」ずいう質問を敎理し始めたした。そしお、ダミヌルず私は、私たちの愚かな゜ルバヌが私たちのために解決したビゞュアラむザヌを芋おいたす。 原則ずしお、それはかなり適切に動䜜し、いく぀かのポむントを獲埗したす。 䞀郚のテストでは、ピボットポむントがフィギュア自䜓から遠く離れおいるフィギュアに察しお、面癜い量子トンネル効果が瀺されおいたす。







午埌3時45分たでに、ピザの吞収ず䞊行しお、解決策が远加されたした。゜リュヌションにヒュヌリスティックを远加したしたが、これは行方䞍明の行を远加で考慮し、Damirは仕様に応じたコマンドラむンの䜜業を゜リュヌションにねじ蟌みたした。



それでは、Lightning Divisionのアヌカむブを準備したす。 マキシムはMakefileずREADMEを䜜成し、tarballを収集したす。 ダミヌルず私は、最埌の決定から受け取ったダワヌルを芋おいたす。 ゚ラヌはなく、tarballが組み立おられ、テストされおいるようです。1647に、アヌカむブを最新の゜リュヌションずずもにオヌガナむザヌサヌバヌに送信したす。



ここで、ダミヌルは明らかに䞍十分なダワヌルを芋぀けたす。 ある時点から始たっお、決定は非垞に奇劙に振る舞い始めたす-穎を逃し、倩井に数字を圫る。 そしお、この䞍名誉は、2぀の隣接する行が完党に埋められお削陀された埌に発生したす すぐに、これは、塗り぀ぶされた行が削陀された堎所のC ++コヌドのバグに過ぎないこずが明らかになりたした。 ぀たり、ビゞュアラむザヌではすべおの行が正しく削陀されたすが、私の実装では行の1぀が残っおいるため、非同期です。



その埌、ハリりッド映画のようにすべおが起こりたすタむミングは抂算です

16:50すぐにですが、バグを慎重に修正し、すべおのタスクを新しいバヌゞョンでテストしたす。

16:54 gitでkommichuが倉曎され、Damirは私の修正をドラッグしおビゞュアラむザヌでチェックしようずしたす。 しかし、圌はいく぀かの倉曎を行い、駐車堎でそれらをコミットするのを忘れたした。その結果、匕っ匵った埌、圌は䜕らかの混乱を起こし、ひどいマヌゞを解決する必芁がありたす。 ダミヌルは生涯にわたっおhgに座っおいお、gitで手を満たしおいないだけです。

16:55マキシムは急いでダミヌルを助け、圌が䜕らかの錫を持っおいるこずに気付き、圌のコンピュヌタヌに急いで戻りたす。 それたでの間、私は問題テストを自分で実行したす-これ以䞊グリッチはありたせん。

16:56マキシムは線集内容をドラッグアりトし、新しいtarballをすばやく収集したす。

16:58はスクリプトを開始しお、最埌の決定をサヌバヌに送信したす。

16:59はtarballをサヌバヌにアップロヌドしたすが、その間、 ここの時間に埓いたす 。 ダバヌルを送信するためのスクリプトでは、個々のテストの間に遅延があるため、䞍泚意で犁止されないようになっおいたす神経を台無しにしたした。したがっお、送信は遅くなりたす。 スコアはすでに数秒間続いおいたす5、4、3 ...


わあ、時間がある 締め切りの3秒前。 道埳なじみのないツヌルを䜿甚するず、重倧な瞬間に突然問題が発生する可胜性がありたす。



少し埌、䞻催者に時間があるかどうかを尋ねたした。 答えが来たした

<galois_kiniry>チヌムから11:47および11:59に2぀のtarballが送信されたこずがわかりたす。 䞡方ずも敎圢匏です。

<galois_kiniry>しかし、C ++は本圓にハッカヌを識別するためのプログラミング蚀語ずしお最適ですか ;




2日目゚ピ゜ヌド2ヘビ、シリンダヌ、およびステヌトマシン



さお、最も緊匵した瞬間の1぀、通垞の解決策を考え出す時です。 たずえば、パワヌワヌドの䜿甚を考慮に入れおいたす。 実際、このアむデアはコンテストのほが最初の数時間に長い間空䞭にありたしたが、ラむトニングラりンドの埌に開発するこずを決めたした。そのため、パワヌワヌドの䜿甚は必芁ありたせんでした。 私たちは1時間座っおアむデアを圢匏化し、結果は次のようになりたした。

どういうわけか図を最終的な䜍眮に眮いお、「フリヌズ」したしょう。 非垞に倚くの方法でこの䜍眮に来るこずができたす-最初にフィヌルド党䜓にフィギュアをドラッグし、適切な堎所に眮く前にパワヌワヌドを詰め蟌むこずさえできたす。 動的蚈画法を䜿甚しお、この最適なパスを怜玢できたす 。



フィギュアの䜍眮に関するすべおの情報をダむナミクスの状態に抌し蟌む必芁がありたす。 ぀たり、転換点の䜍眮、珟圚の回転、および䞀連のコマンドで新しいパワヌワヌドの出珟をキャッチするためにすでに入力したコマンドに関する情報。



状態の2番目の郚分では、次のように構築された有限状態マシンが優れた仕事をしたす。 n個のべき乗語があり、オヌトマトンの状態は長さnのベクトルずしお衚すこずができたす。そのi番目の芁玠は、すでに入力したi番目のべき語の接頭蟞の長さを瀺したす。 状態遷移は、コマンドラむンに新しい文字を远加するず発生したす。 同時に、すでにダむダルされたプレフィックスの䞀郚は1぀拡匵され、他のプレフィックスは短瞮されるか、長されロにリセットされたす。 パワヌワヌドが完党に入力されるず、この情報をマシンでマヌクし、プレフィックスずしお最長を瀺したす。これはサフィックスず䞀臎したす。



オヌトマトンを構築する䟋は、䞋の写真で芋るこずができたす。 ここでは、 aba 、 acacおよびbcの 3぀の単語が䜿甚されたす。 ゚ッゞは私たちがたどる文字を瀺し、括匧内に入力した単語の番号が瀺されおいたす。







私たちにはパワヌワヌドがほずんどなく、その䞭の文字もあたり倚くないので、マシンを額の䞊に構築するこずができ、゜リュヌションの有効性を本圓に心配するこずはありたせん-それでも高速です。



ダむナミクスの状態の最初の郚分で汗をかかなければならなかった。 実際のずころ、図を目的地に移動するずき、同じ状態になっおはいけたせん。 合蚈で、図のアクションには6぀のオプションがありたす巊に移動、右に移動、䞊䞋に移動、巊右に移動、時蚈回りに回転、反時蚈回りに回転。 「䞊䞋に移動」ず「巊右に移動」を䜿甚するず、すべおが明確になりたす-フィギュアを䞋に移動するずすぐに、ドラッグしお䞊に戻すこずはできたせん。 繰り返しは、フィギュアを同じラむンで巊右に動かし、回転させるずきに起こりたす。



次のこずがわかりたす。 行の図のすべおの䜍眮は、長方圢の衚ずしお衚すこずができたす。 その幅はフィヌルドの幅であり、その高さは可胜なタヌン数です1、2、3たたは6-図圢の察称性に応じお。 同時に、テヌブルの䞊偎が底に接着されたす-䞀皮のシリンダヌが埗られたす。 そしお、゚ッゞに沿っお隣接するセルから自分の動きで動きたす。 その結果、競技堎の1行でのすべおの動きは、シリンダヌに沿っおい、尟を噛たないようにしようずする蛇ずしお衚すこずができたす。







残念ながら、このアプロヌチでは、各シリンダヌのすべおの蚪問枈みセルをダむナミクスの状態に維持する必芁がありたす。 この堎合、状態の総数は指数関数的に増加したす。 私たちはそれに぀いお䜕かをしなければなりたせんでした。 次のようにヘビの動きを制限するこずにしたした。ラむンを離れた堎合、二床ずそのヘビを蚪れるこずはありたせん。 その埌、あらゆる皮類の蛇行が瞮退しお、次の圢匏の波状になりたす。







すでに蚪れたすべおのラむンは、特定のセグメントを圢成したすヘビは、たずえばラむンを通しおテレポヌトできたせん。 ここから-蚪れた行を芚えおおくために、最倧36の州が必芁です。 パラメヌタヌをもう1぀远加したす。どこから来たのか—巊偎、右偎、たたは競技堎の䞊郚/例郹/ c-another-line-で-これは、ヘビが尻尟を切り萜ずさないようにするのに十分です。



もちろん、コマンドの可胜なすべおのシヌケンスからはほど遠いので、すべおの可胜な単語を考慮するこずはできたせん。 しかし、私たちはこれたでに発芋された朜圚的な力の蚀葉をすべお匕き出し、「 スむカ」ずいう蚀葉だけを入力できないこずを芋たした。 今のずころ、それなしで実行できるず刀断したした。



ダむナミクスの合蚈状態

x、y //図圢の䜍眮、たたはむしろその回転点

回転//珟圚の回転

rot_seg_left、rot_seg_right //すでに蚪れたタヌンのセグメント

from //元の堎所left、rightたたはtop / bottom / c-another-line-of-the-board-field

ノヌド//ステヌトマシンからの頂点番号




各状態で、3぀のパラメヌタヌ、぀たり、図を「フリヌズ」するずきの運動堎の評䟡、䜿甚されるパワヌワヌドの最倧長、および䜿甚されるすべおのワヌドの合蚈に埓っお、重み付け評䟡関数を考慮したした。 将来のために2番目のパラメヌタヌが远加されたしたダむナミクスで以前に䜿甚されおいない単語を含むパスを遞択するために䞻催者は各パワヌワヌドに300ポむントを䞎え、それが少なくずも1回発生するず远加のポむントワヌド内の文字数を2倍に、繰り返し。



ダむナミクスの本質各状態に぀いお、珟圚の状態からある皮の「凍結」状態に移動するこずで埗られる評䟡関数の最倧倀を考慮したす。 あらゆる皮類の動きを䜜り、再垰的に凊理し、珟圚の動きで単語が終わったら評䟡関数を曎新し、最倧倀を遞択しお保存しようずしたす。 熟考のための非垞に埮劙な瞬間どの単語が再垰を介した盎接の通過から終了したかに぀いおの情報を埗るように思えたすが、実際には、ダむナミクスの状態自䜓がすべおの必芁な情報を保存したす。 たあ、私たちはそれらの終わりの逆の順序で芋぀かったすべおの単語を考慮したす。



ダむナミクスは、 メモ化を䜿甚しお怠 consideredず芋なすこずができたす最埌に、少なくずも機胜䞻矩のヒントがありたす。 図圢の最初の䜍眮から開始するだけで... ...その埌、図圢のすべおの䜍眮を蚈算し、そこで「凍結」するこずができたす。 最適な状態を達成するために必芁なシンボルを各状態に远加するず、目的のコマンドシヌケンスを簡単に埩元できたす。



19:00のどこかで決定は正匏になりたしたが、それを曞くだけです。 ダミヌルは座っお有限状態マシンを蚘述し、ダむナミクス自䜓を蚘述したすより正確には、ダむナミクスの状態が䞎える制限を考慮しおほずんどの時間を費やしたした。 マキシムはOCamlでの実装を匕き続き遞択したす。



20:45たでに、Damirはマシンを远加し、数分埌にダむナミクスを远加したす。 コヌドを保持しお、䜕が起こったのか芋おみたしょう。 スタックオヌバヌフロヌが刀明したした。 たあ、私はダむナミクスのどこかで台無しにしたので、サむクルしたす。 バグを探すためにかなり倚くの時間が殺されたしたそれは銬鹿げたタむプミスであるこずが刀明したした。 その埌、あらゆる皮類のテストを実行し始め、゜リュヌションがどこでもクラッシュしないこずを確認したした。 23:45に修正された゜リュヌションをテスト0のdavarずずもにコミットしたす。サヌバヌに送信し、このテストの最初の行に移動したす。



この時点で、チヌムの名前を倉曎したす。 実際、元々はチヌムバシコルトスタンず呌ばれおいたした。 そしお、テスト0の最初の行に達したずき、その名前はなんずなく創造的ではないず考えたした。 WILD BASHKORT MAGESに名前が倉曎されたした。 私たちは鶏肉を思い出したした、それをどうするかを考えたす。 圌らが決めたのは、明日それを捚おないなら、明埌日に捚おるずいうこずです。



私はダむナミクスのバグを芋぀けるこずに愚かだったが、ダミヌルは怠idleではなかった私はオヌトマトンの構築を少しねじり、ビゞュアラむザヌにパワヌワヌドのサポヌトを远加し、ダバヌに䞎えられるべきポむント数を蚈算するためのモゞュヌルを曞いたこのモゞュヌルはビゞュアラむザヌでさらに䜿甚された、および倖郚から自動的にポむントを蚈算し、比范甚のプレヌトを生成したす。 ビゞュアラむザヌでこれ以䞊快適に䜜業できる堎所はありたせん。







マキシムは、テスト0をサヌバヌに送信する瞬間たで、OCamlの決定に悩たされ続けたした。 その埌、圌は開発にスコアを付け、゜リュヌションのテスト「改善」の埌に゜リュヌションを壊したかどうかを远跡するために集䞭し、新しいパワヌワヌドを怜玢するずいう匷い意思を決定したした。 OCamlで゜リュヌションを䜜成するこずは時間の浪費であるずは蚀えたせん-むしろ、C ++での゜リュヌションに困った堎合の保険でした。



00:15のどこかで、評䟡関数に別のヒュヌリスティックを远加したした。 すなわち-フィヌルドの塗り぀ぶされた郚分に「穎」を䜜成するための眰金。 ヒュヌリスティックの本質は非垞に単玔です。そのような隣接セルの数を考慮し、それらの1぀が満たされ、もう1぀は空です。 その埌、フィヌルドに残った「穎」が1぀あれば、6のペナルティが䞎えられたす。その埌、決定はより良くなり始めたした。



゜リュヌションはテスト0には適しおいたしたが、他のテストにはいく぀かの困難がありたした。 事実は、珟圚の解決策が抑制されたずいうこずです。 テスト14では、3時間働きたした。 おかしい瞬間私は実際にテスト13の゜リュヌションを立ち䞊げたいず思っおいたしたが、これははるかに小さく、100の動きしかありたせん14のテストは500の動きで䞊の写真の五gram星ですが、テスト番号を少し混ぜたした。 たあ、私はそれがカりントされるのを埅っお座っおいたす。 しかし、それはすべおを数えるわけではありたせん。 プログラムの30分埌、完了を埅぀こずはすでに原則の問題になっおいたす。 そしお打ち䞊げの1時間埌、13ではなく14回目のテストを実行したこずがようやくわかりたした。明らかに、疲劎はすでに圱響を及がしおいたした。 03:45たでにカりントされたした。



䞍運な14回目のテストの終了を埅っおいる間にもう埅぀こずはできたせんでしたが、眠りに぀くこずはできたせんでした、マキシムは正しい゜リュヌションでさらにいく぀かのテストを実行し、サヌバヌに送信しようずしたした。 圌らはカップルをチェックするこずができたしたが、埌者はチェックするこずを望んでいたせん。 より正確には、圌に䜕が起こっおいるのか明確ではありたせん-結果テヌブルは単に曎新されたせん。 さらに、すでに行われたいく぀かのテストによるず、結果テヌブルず私たち自身のスコアは少し䞀臎したせんでした。 Damirはアカりント評䟡モゞュヌルの゚ラヌを探しおいたす。 すでにすべおをダブルチェックしたようです-゚ラヌはありたせん。 その埌、結果の衚は完党に萜ちたす-誰かが間違ったダワヌルをサヌバヌに送信し悪いダワヌル、䜎品質、それによっおテストシステムを壊したこずが刀明したした。 䞻催者はすぐにバグを修正し、テヌブルを埩元し、参加者は送信しないようにもっず悪いず蚀われたした。







テヌブルのバグは、14回目のテストがカりントされたのずほが同時に修正されたした。 曎新された衚では、各テストのスコアはロヌカルで蚈算されたものず䞀臎したした。 バグは私たちのものではなく、私たちはそれを無駄に探しおいたした。



14回目のテストが送信され、非垞に良い結果が埗られたした。 その埌、0600に蚈算されたばかりのダバヌルを送信するたで、マキシムは手で新しいパワヌワヌドをチェックしお怜玢しようずしたした。 残念ながら、新しいものはありたせんでしたが、テストで芋぀かったすべおの単語「Ei」、「IaIa」、「R'lyeh」、「Yuggoth」は、本圓にパワヌワヌドであるこずが刀明したした。



明日の目暙が明確になりたした珟圚の゜リュヌションをスピヌドアップしたす。 幞いなこずに、最適化の䜙地はかなりありたした。



3日目。最適化ず改善



15:30頃に目が芚めたした。 マキシムは少し早く起きお、぀いに鶏肉を調理したした。 ゞャガむモ入り。 ダミヌルず私が目を芚たすのにちょうど間に合いたす。 私たちは朝食をずりたしたただし、おそらく昌食をずったたたは倕食をずった方がいいでしょう。



16:00に決定に戻りたす。 ダミヌルは昚日眠れず、朝6時に寝なかったこずが刀明した。 この間、圌は私の゜リュヌションを最適化したした。 評䟡関数は、倀の蚈算を別の手順に取り出しおキャッシュしたしたこれにより、同じ蚈算が倧幅に削枛されたした。構造の比范を高速化するおよびstd :: mapで怜玢するために、すべおを1぀のint64に圧瞮したした。ダむナミクスにヒュヌリスティックを実装しお、以前に䜿甚されおいないパワヌワヌドを優先するようにしたした。圌はたた、最適化のために私のダむナミクスを曞き盎したしたが、そこで䜕かを壊したした。結果は、昚日よりもはるかに高速に動䜜する゜リュヌションですが、ポむントははるかに少なくなりたす。



ダむナミクスを最適化した埌に正確に壊れたものは、ただ理解できおいたせんでした。すべおの新しい最適化に加えお、叀いコヌドからダむナミクスを単玔に取埗しお慎重に転送したした。修正は17:00たでに完了したした。そしお今、昚日3時間を数えた同じ14のテストが5分で数えられたす



すべおのテストの実行を開始したす。この倧量のテストは、タグ「apocalypse_1」の䞋に衚瀺されたした。



この頃、Gitを介しおカりントされたダバヌルを運ぶこずは非垞に䟿利ではないずいう理解が埗られたす。毎回、珟圚の倉曎をコミットしおプッシュし、残りをリポゞトリから残りにプルする必芁がありたす。そしお、珟時点ではすでに䞍安定な倉曎があり、リポゞトリにプッシュしないようにする必芁がありたす。芁するに、面倒です。したがっお、ドナのストレヌゞをgitからDropboxに転送するこずにしたした。2日前に䜕らかの圢ですでに自然発生的に発生したした。蚈算されたドナは「solution_PROBLEM_IDタグ互いのdavarを䞊曞きしないようにするため。 1時間、すべおが再構成されたした。そしお突然、それはすぐにもっず䟿利になりたした。あなたは座っお静かにコヌドを曞き、その時にDropboxはコヌナヌに「そのようなドナヌが数えられた」ず曞いお、察応するパパに入れたした。䜙分なゞェスチャヌはありたせん



Dropboxを支持するもう䞀぀の小さなこず。私たちはどういうわけか、コンテスト期間䞭はクラスタヌを借りるこずを考えず、3台のラップトップを䜿甚したした。私はi5で、ダミヌルはi3で、マキシムには別の叀代のものがありたす。そしお、マキシムが圌の゜リュヌションを開始したずき、他のすべおが枛速し始めたした。そしお、ここでマキシムはビンからリモヌトサヌバヌを取り出したす。もちろん、圌はクラスタヌではありたせんが、自分のマシンの速床を萜ずすこずなく、珟圚の゜リュヌションのテストを組織化するこずができたした。さお、競合が発生するリスクがあるリモヌトサヌバヌをプルおよびプッシュするこずはお勧めできたせんタヌミナルで解決する必芁がありたす。そしお、Dropboxはすでにそこにありたした。すぐに蚀っおやった。短いセットアップの埌、リモヌトサヌバヌはフルセットのテストで゜リュヌションのテストを開始し、生成されたDavarをDropbox経由でマシンに自動的にドロップしたした。矎人



この時点で、完党なテストスむヌトでのテストは完了です。ダワヌルをサヌバヌに送信し、䞊䜍3䜍に入りたす。 Fhtagn



それたでの間、私たちの゜リュヌションで改善できるこずはただたくさんありたす。䞻に2぀の方向がありたすstd :: mapをハッシュテヌブルに眮き換え、評䟡関数の蚈算を高速化したすOフィヌルドサむズに察しお蚈算されたしたが、O図の芁玠数に察しお蚈算できたす。ハッシュテヌブルを䜜成し、゜リュヌションに固定したす。たた、評䟡関数に4番目のパラメヌタヌ、いわゆる「ポテンシャル」を远加したす。これは、未完成のパワヌワヌドのプレフィックスの党長です。これにより、移動の間に単語をさらに収集できたす。22:30にすべおが準備できたようです。ハッシュテヌブルでは、テスト14は3分の分ず芋なされたす。



この間、マキシムはオヌガナむザヌのサヌバヌの「ハンマヌ」を䜜成しお、新しいパワヌワヌドを決定したした。その原理は非垞に簡単です。





䞀方、Damirは、ビゞュアラむザヌで以前に取埗したdavarを調べたした。結局のずころ、倚くの空きスペヌスが私たちにずっお良いテストでした-私たちのダむナミクスはそれを最倧限に䜿っおパワヌワヌドを埋めたした。しかし、テストは悪いこずが刀明したした。十分なスペヌスがなく、フィギュアはあらゆる皮類の耇雑な圢状であり、配眮する必芁があるフィギュアの総数は倚かったです。私たちの愚かな評䟡関数は、どういうわけかそこにそれらを入れお、フィヌルドがかなり早く詰たったので、これらのテストでいく぀かのポむントを埗たした。特に、このようなテストは、4、9、13、および23番のテストでした。2回の小さな動きに察しお誀算を固定するこずにしたした。



新しいダワヌルを送信する過皋で、トップ5の「プヌルをハックする」ず「ルヌプをハックする」ずいう2぀のチヌムに気付きたす。そしお少し決めるいたずらをするために ...私たちは「Hoop the poop」に改名されたした。ここに、私たちのフヌリガニズムの神栌化がありたす。







公匏のircチャットで、管理者の1人は「どのような䞍名誉ですか」ずinしおいたすが、犁止されおいたせん。数時間埌、それらはWILD BASHKORT MAGESに名前が倉曎されたした。圌らは笑った-それで十分だ。



午前03:00 2぀の前進を実装したした。実際、かなり早く曞かれおいたしたが、い぀ものようにバグが発生したした。それらの最初の-今ではすべおが動䜜しおいるように芋えたすが、動䜜したせん最初、圌らは䞀般的にある皮の悪魔だず思っおいたした。それから、私たちはばかだずいうこずに気付きたした-2番目の動きのために、フィヌルドの䞊郚に新しいフィギュアを䜜成する必芁がありたした。このバグが修正されたずき、動䜜しおいるように芋えたした。

しかし、それは䜕ずかこのように機胜したした







: « , — ...». . : « , — ...». . , : « , !». , power-word'. « »: , - , , .



新しい゜リュヌションは、4぀のテストでさらに良くなりたした。しかし、残念ながら、ただ完党ではありたせん。 Damirは、ビゞュアラむザヌで初期ランダムシヌドのさたざたな倀をチェックむンするず、「ここでも、フィヌルドが詰たっおいたす」ず蚀いたす。私は確認したす「はい、フィヌルドは隅に散らばっおおり、そこから抜け出すこずを恐れおいたす。」私たちはただ3぀の手先をチェックするこずを決めたした。残念なこずに、2歩先ぞのバスティングは既に決定を倧幅に遅らせおいるため、さらに加速する必芁がありたす。しかし、もう1぀アむデアが残っおいたす。評䟡関数の蚈算の高速化です。



私が2手先に進んでいる間に、Damirはテスト9を克服するためにヒュヌリスティックを思い぀きたした。このテストの本質は、安定しおラむンを収集し、可胜であれば倱敗しないレベルでより倚くのスティックを投げるこずでした。私たちの゜リュヌションは次のようなものでした







同時に、可胜性のある400のうち35回目の移動で厩壊したした。残念なこずに、Damirはその倜遅くに機胜するものを思い぀きたせんでした。



マキシムは、これたで、疑わしい単語を収集し、それらがパワヌワヌドであるずいう事実に぀いおテストしたした。 03:00たでに、6個たたは8個のそのような単語が芋぀かりたした以前に芋぀けた4個ずずもに。䞊行しお、圌はより倚くの「魔法」の蚀葉を芋぀けお私たちの゜リュヌションを立ち䞊げ、受け取ったダワヌルをサヌバヌに送りたした。したがっお、さらに3぀の黙瀺録が合栌したした。最埌の倧量テストタグは「apocalypse_4」でした。



午前3時の倕食埌今回は冷凍野菜+キノコ+粉砕された゜ヌセヌゞがあり、すべおフラむパンで䞀緒に加熱されおいたしたDamirは就寝したした前倜はあたり眠りたせんでしたそしお、評䟡機胜を高速化するために座った。



評䟡関数は、5時頃にOフィヌルドサむズからO図の芁玠数に曞き換えられたした。Chased-より速いように芋えるので、すでに3タヌンでスむングを詊みるこずができたす。今日、私はもはや手を振る力がなくなり、3〜4時間寝たす。



4日目。最終スパヌト



私は午前9時から10時のどこかで目を芚たしたす。



マキシムは倜眠れたせんでしたそしお、コンテストが終わるたで起きおいる぀もりでした。倜䞭に、圌はさらにいく぀かの「魔法の」蚀葉を芋぀け、クトゥルフに䜕らかの関係があるりィキペディアの蚘事党䜓をほが解析したした。芋぀かったpower-words'ovの総数は10になりたした。

えヌい

ダゎト

iaia

r'lyeh

ネクロノミコン

プラネット10

モンキヌボヌむ

ゞョンbigboote r'lyeh

で圌の家で死んだクトゥルフは倢を埅っおいたす。

ペヌペヌダむン


残念ながら、コンテスト埌に刀明したように、これらの単語を芋぀けるアプロヌチは最埌たで完璧ではありたせんでした。たずえば、「Yog-Sothoth」ずいう単語はハむフンが含たれおいたため削陀されたした。 「YogSothoth」ハむフンなしがパワヌワヌドであるこずが刀明したした䞀般に、マキシムは䜙分なハむフンを単に投げるこずに気づきたせんでした。別のポむントマキシムは「ランドリヌ」ずいう単語をチェックしたしたが、「ランドリヌ」ずいう行には力がありたした。たた、「ph'nglui mglw'nafh cthulhu r'lyeh wgah'nagl fhtagn」で誀解が起こりたした。このフレヌズは「魔法のような」ものでしたが、䜕らかの理由でこの手順はこれを確認したせんでした。



倜でさえ、マキシムは5぀の黙瀺録を費やしお、10個の「魔法の」蚀葉を芋぀けたした。



朝、ダミヌルず私が目を芚たしおいる間、マキシムはパワヌ゚ンゞニアのために店に駆け蟌み新鮮な空気の䞭を散歩したした、最終的なゞャヌクに十分な匷さを持っおいたした。



䜜業は3぀の方向に進みたした私はブルヌトフォヌス3の動きを曞き始め、ダミヌルは9回目のテストのためにヒュヌリスティックで遊び続け圌はいく぀かの新しいアむデアがありたした、マキシムは以前のダバヌルをすべお解析し、各テストを遞択するスクリプトを曞き始めたした/シヌド最倧倀ずそれをすべお䞀緒にもたらしたす。



12:30頃に、Damirは最終的に評䟡関数の通垞のヒュヌリスティックを䜜成したした。これはテスト9で非垞によく機胜したす。さらに、Damirは゜リュヌションの怜玢を2回開始するコヌドを䜜成したした。最初は新しい評䟡関数で、次に叀い評䟡関数で。どちらの堎合も、ポむントの数をカりントし、それに応じお、より倚くのポむントがあるオプションを衚瀺したす。その埌、DamirずMaximは最終的なtarballのレむアりトに切り替え、審査員向けのREADMEをゆっくりず曞きたす。



3ムヌブの怜玢を14:00たでに終了したす。私はそれをいじらなければなりたせんでしたプロセスをスピヌドアップするために、いく぀かの最適化を远加したす。さらに、3番目の移動の怜玢を少しカットする必芁がありたしたそれ以倖の堎合は完党に犁止されおいたため。぀たり、最も有望なブランチに぀いおのみ3番目の移動をチェックしたす。぀たり、最初に2番目の移動怜玢「アむドル」を開始し、3番目の移動を開始せずに評䟡関数の倀を蚈算したす。埗られた倀のうち、最倧10個をふるいにかけ、すでに「戊闘䞭」の2番目の動きの゜ヌトを開始したす。同時に、同じ玄10個の最適な状態からのみ3番目の動きを詊みたす。



起こったこずは、4番目のテストを非垞にクヌルに解決したす。ほがすべおのオプションに぀いお、ランダムシヌドは200から200の動きで解決策を芋぀けたす。同時に、ビゞュアラむザヌで受信したダバヌルを远跡するこずは非垞に興味深い







ものでした。すべおがそれほど困難なく進むようです。マキシムはスクリプトを完成させお、最適なダバヌルを構築したす。結合された最適なdavarはタグ「panopticum」の䞋に眮かれ、サヌバヌに送信されたす。



フルセットの最埌の゜リュヌションを開始したす。締め切り17:00は玄2時間です。



ここでいく぀かの議論がありたす実際には、どの゜リュヌションをtarballに詰めるべきですかあなたが今手に入れたものか、私たちが朝持っおいたものですか事実、新しい゜リュヌションはただテストされおいないため、朝の゜リュヌションずは異なり、+新しい゜リュヌションは朝の゜リュヌションよりも著しく遅くなっおいたす。぀たり、正垞にテストし、最終的に仲良くなる時間がないずいうリスクがありたす。そしお、私たちが午前䞭に持っおいたものは、すでにテスト枈みの安定したリリヌスのようなものです。それでも、新しいオプションを甚意するこずにしたした。



それたでの間、新しい゜リュヌションはテストされおおり、そのパフォヌマンスから刀断するず、期限たでに解決しない可胜性があるこずが明らかになりたした。急いで、さたざたなマシンでさたざたなテストの蚈算をばらたきたす。その結果、締め切りの1時間半前に、4、6、24を陀くすべおのテストがカりントされたした。実際、4ず6のテストはフィヌルドサむズが小さいため、3タヌン先に怜玢を開始したす。さらに、それぞれに150たたは200の移動に察しお50のサブテストさたざたなランダムシヌドがありたす。 3手前の怜玢には1タヌンあたり玄1秒かかるため、たずえば、4回目のテスト党䜓で玄3時間かかるこずがわかりたす。そしお、私たちには3時間の時間がありたせん 24のテストでは、状況はわずかに異なりたす。テストは1぀しかありたせんが、非垞に倧きなフィヌルドがあり、1620が凊理に移動したす。これも玄3時間かかりたす。



その結果、テスト6ず24でスコアを付け、4番目のテストを5぀のサブタスクそれぞれ10個のサブテストに䞊列化し、異なるマシンで数え、すべおを接着するこずにしたした。すぐに蚀っおやった。数えたす。午埌4時頃終了の1時間前、Damir は過熱によりラップトップで死亡したす。たあ、完党に死ぬこずはなく、再起動するだけなので、5぀の䞊列ブランチのうち2぀が倱われたす。さお、䜕もするこずはありたせん-ダミヌルは新たに枝を数え始めたす。考慮されおいる間、Damirはラップトップを2぀のメガネに眮き、熱攟散を良くするために気流を䜜り出したす。16時20分たでに、すべおが私たちのために数えられたした、そしお同時に。たあ、私たちにできるこずは、私たちの゜リュヌションにはint64で倚くの操䜜があり、Damirは64ビットLinuxを持ち、32ビットWindowsを持っおいたす。



最埌のdavarを送信し、tarballを完成させお送信したす。数分埌、マキシムはREADMEファむルで文法゚ラヌを芋぀けお修正し、修正されたtarballを終了の1分前に送信したす最埌に䜕かがありたす。



゚ピロヌグ



最埌のdavarを送信したずき、資栌衚の2行目にありたした。圌らのダバヌルがりナギを送っお少し埌に私たちを䞉行目に移動させたした。



コンテスト終了埌すぐに、そば鍋をシチュヌで調理したしたこのレポヌトでは、コンテスト䞭の食べ物のトピックは完党に公開されおいるず思いたすが、写真が十分でないこずを陀きたす。



リポゞトリはgithubで芋぀けるこずができたすコンテスト䞭、圌は別のプラむベヌトな堎所にいたので、今はgithubに転送されたした。私たちの゜リュヌション/ビゞュアラむザヌを運転/研究するこずができたす。䞋の衚では、コンテスト終了埌に知られるようになった18のすべおのパワヌワヌドで実行されおいる゜リュヌションの䞀郚を芋るこずができたす。







最埌たで読んでくれたみんなに感謝したす



All Articles