얼마 전, HackerRank에서 간단한 작업을 해결하기 위해 OCaml과 Core를 사용하기로 결정했습니다. 작업 중 하나, 나는 표준 입력에서 데이터를 읽을 생각 해요 :stdin에서 줄을 쉽게 읽는 방법?
첫 번째 줄은 전화 번호부에있는 항목 의 수를 나타내는 정수가 포함되어 있습니다. 후속 행은 각각 의 항목을 한 행에 공백으로 구분 된 값의 형식으로 설명합니다. 첫 번째 값인 은 친구의 이름이고 두 번째 값은 숫자로 된 전화 번호입니다.
전화 번호부 항목의 줄 뒤에 개의 쿼리 행을 알 수 없습니다. 각각의 라인 (질의)에는 룩업 (look up)을위한 A가 포함되어 있으며 더 이상의 입력이 없을 때까지 라인을 계속 읽어야합니다.
주요 문제 :
이- 내가
- 마지막 줄 바꿈으로하지 끝을 할 수있을 것입니다 얼마나 많은 줄 모르는, 그래서 난 그냥
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"
내가 파이썬에서이 작업을 해결하는 경우
는, 다음 코드는 다음과 같습니다
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 코드를 개선하는 방법에 대한 조언이 있으십니까? 그리고 두 가지 중요한 것들이 있습니다 : 저는 OCaml을 포기하고 싶지 않습니다. 단지 그것을 배우고 싶습니다. 두 번째 - 같은 이유로 Core를 사용하고 싶습니다.
Nit,하지만 'Sequence'는 표준 라이브러리에는 없지만 코어에는 있다고 생각합니다. – antron
OP는 구체적으로 그가 계속 Core를 사용하고 싶다고 말했고, 이것이 내가 Core 코드를 사용하는 이유입니다 (저는 보통 Core를 많이 사용하지 않습니다). –
예, 이해합니다. 반대하지 않습니다. 제가 의미하는 바는, 첫 문장을 읽는 동안, Sequence가 stdlib에 있다는 막연한 제안을 느꼈으므로 나중에 다른 독자들에게 혼란을 줄 수 있습니다. 나는 그것이 그것을 직접 주장하지 않는다는 것을 깨닫는다, 그것은 어떻게 든 다소 혼란 스럽다. – antron