LoginSignup
1
2

More than 3 years have passed since last update.

Clojure の競プロ等での入力周り

Posted at

概要

 競プロだと、主に文字列の入力や数の入力、文字の入力等が多いと思います。そのときに 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 でハンデをつけるなり、高速化するなりしてほしいなと思っています。誤っているところや改善点などがあれば、編集リクエストやコメントなどをしてくれると幸いです。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2