少し前に、私はHackerRankで単純なタスクを解決することに決めましたが、OCamlとCoreを使ってそれらを学びました。タスクの一つで、私は、標準入力からデータを読みになってる:stdinから簡単に行を読み込むには?
最初の行には、電話帳のエントリ の数を表す、整数が含まれています。後続の各行には、 のエントリが1行の空白で区切られた値の形式で記述されています。最初の値 は友人の名前で、2番目の値は数字の電話番号です。
電話帳エントリの行の後に、 のクエリ行が不明です。それぞれの行(照会)には、検索する項目が含まれており、入力がなくなるまで は行を読み取る必要があります。
主な問題:
- は私が
- 最終行が改行でない端をそこに行いますどのように多くの行を知らないので、私はちょうど
End_of_file
まで
scanf "%s\n"
を読み取ることができません
そして、私のコードを乱雑になった:
open Core.Std
open Printf
open Scanf
let read_numbers n =
let phone_book = String.Table.create() ~size:n in
for i = 0 to (n - 1) do
match In_channel.input_line stdin with
| Some line -> (
match (String.split line ~on:' ') with
| key :: data :: _ -> Hashtbl.set phone_book ~key ~data
| _ -> failwith "This shouldn't happen"
)
| None -> failwith "This shouldn't happen"
done;
phone_book
let() =
let rec loop phone_book =
match In_channel.input_line stdin with
| Some line -> (
let s = match Hashtbl.find phone_book line with
| Some number -> sprintf "%s=%s" line number
| None -> "Not found"
in
printf "%s\n%!" s;
loop phone_book
)
| None ->()
in
match In_channel.input_line stdin with
| Some n -> (
let phone_book = read_numbers (int_of_string n) in
loop phone_book
)
| None -> failwith "This shouldn't happen"
私はPythonでこのタスクを解決した場合、コードは次のようになります。
n = int(input())
book = dict([tuple(input().split(' ')) for _ in range(n)])
while True:
try:
name = input()
except EOFError:
break
else:
if name in book:
print('{}={}'.format(name, book[name]))
else:
print('Not found')
これはOCamlのコードよりも短く、明確です。自分のOCamlコードを改善する方法についてのアドバイスは?そして、2つの重要なことがあります。私はOCamlを放棄したくありません。ただ学びたいだけです。 2番目 - 同じ理由でCoreを使いたい。
Nitですが、「シーケンス」は標準ライブラリにはないと思いますが、コアにあります。 – antron
OPは、彼がCoreを使い続けたかったと具体的に述べました。そのため私は自分のコードをベースにしています(私は通常Coreをあまり使わない)。 –
はい、理解して、それに反対しません。私が言いたいのは、最初の文章を読んでいる間、Sequenceがstdlibにあるというあいまいな示唆を感じました。後で他の読者を混乱させるかもしれません。私はそれが直接それを主張していないことを理解しています、それはちょっと混乱しています。 – antron