ようやく何かがつかめてきたOCaml。ここでホッとして次に行くと、あっという間に忘れてしまう。
そんな気がしたのでもう少し問題を解いて たたきこんでみることにしました。
4年ぐらい前に別の言語で解いた問題を解析しながら、
Don't Panic - Episode 1
何をしているかというと、ロボットがフラフラと上に移動するために
各フロアの上に向かうポータルの位置と違った方向に向かっている時にBLOCKしています。
各ターン、フロアと方向を入力され、あらかじめ作っていたフロアガイドにしたがって誘導します。
ハッシュテーブルで各階をキーにポータルの位置を値として設定しています。
フラフラしているのは銀河系ヒッチハイク・ガイドに登場する ゆううつなロボットさんです。
復習ポイントは1行目ハッシュテーブル作成 9行目追加 17行目検索といった所でしょうか。
There is no Spoon - Episode 1
マップ上に存在するグリッドを無駄なくつないでいきます。
マップは一行の文字列に展開して解いています。
プログラムで間違った出力をしたさい、こちらの戦闘ロボは巨大な戦闘機群に足場以外ふっとばされます。
2行目のsearchもう少しなんとかしたかった所です。
The Fall - Episode 1
まず、迷路のデータがタイル番号で渡され(チクタクバンバンの下のようなものです)
各ターン 現在の座標、移動している向きが渡されます。
迷路をタイル番号を取得して、そのタイルの形式から、移動している向きから次の座標をかえします。
過去のプログラムはタイル情報をなんらかのデータ化しているようですが意味がよくわからなかったので、
新たに作り直しました。
タイルデータははベタにコーディングしてみました。
あと彼の名前はインディです。
2行目でリストを参照型で定義して、5行目で文字列をスペースで分割してリストに結合しています。10行目でリストの(x+y*w)番目を取得しています。
異世界に転生してプログラムチートをされたい方でML系言語をやったことのない方は
この言語をやってみると異世界に転生したぐらいのカルチャーショックを受けられるかもしれません。
コンピュータ業界のパラダイムシフトの訓練に向いています。
<ポイント>
定義系は最期 in その他は;
for ifはbasic系
if thenで複数実行したいときは()で括りカッコ内の最期の命令は;が不要
関数の定義読み出しで引数などは " "スペースで区切る。全体の()は不要、ただし1つの引数に計算などがある場合にその引数に()が必要
refの再代入は := ref変数の取得時は前に!マークが必要
コメントは (* *)のみ
少数系の計算式 + - * /には後ろに小数点が必要 +. -. *. /.
パターンマッチングが強力らしいという噂
int_of_string float_of_string 型変換はこんな感じ
最初の頃は何を言っているのかさっぱりわからなかったのですが、慣れてくると ocaml.orgが最強です。
<参考文献>
https://ocaml.org/api/List.html
https://ocaml.org/api/String.html
https://ocaml.org/api/Hashtbl.html
https://www.codingame.com/training/medium
最初の頃は一問も解けないと思っていたOCaml
CodinGameで5番目に問題数を多く解いた言語になりました。