概要
競プロだと、主に文字列の入力や数の入力、文字の入力等が多いと思います。そのときに split したり等いろいろで迷うことが多いので簡単にまとめてみました。
数
数の入力には (read)
がそのまま使えます。
入力
1 2
コード
(prn (read))
(prn (read))
出力
1
2
文字列
単純に (read)
するとシンボルになってしまいます。
一行に一つの文字列
一行まるごと読むのであれば (read-line)
でできます。
入力
Hello
Good Bye
コード
(prn (read-line))
(prn (read-line))
出力
"Hello"
"Good Bye"
一行に複数の文字列
先程の Good Bye
を "Good"
と "Bye"
に分けて入力したい場合は split します。split して帰ってきたシーケンスは分配束縛するとよいでしょう。
入力
CL Clojure Scheme Arc
C C++ C#
コード
;clojure.string から split をインポート
(use '[clojure.string :only (split)])
(let [[a b c d] (split (read-line) #"\s+")]
(prn a)
(prn b)
(prn c)
(prn d))
(println "")
(let [[a b c] (split (read-line) #"\s+")]
(prn a)
(prn b)
(prn c))
出力
"CL"
"Clojure"
"Scheme"
"Arc"
"C"
"C++"
"C#"
説明
split
は (split s re)
のように使います。 s
には対象となる文字列、 re
には区切りにマッチする正規表現を引数とします。 #"\s+"
は一文字以上の任意の長さの空白列にマッチする正規表現です。
その他
文字列と整数が同じ行にある
split
してから、整数であるものを Integer.
で文字列から整数に変えます。
入力
Galaxy Express 999
コード
;clojure.string から split をインポート
(use '[clojure.string :only (split)])
(let [[a b c] (split (read-line) #"\s+")
d (Integer. c)]
(prn a)
(prn b)
(prn d))
出力
"Galaxy"
"Express"
999
おわりに
Clojure 遅いしメモリ食うなぁと思っています。 ABC の A とかでも制限がきついと MLE 等をしたりするので、 AtCoder でハンデをつけるなり、高速化するなりしてほしいなと思っています。誤っているところや改善点などがあれば、編集リクエストやコメントなどをしてくれると幸いです。