LoginSignup
32
27

More than 5 years have passed since last update.

paizaの問題をSwiftで挑戦するときの標準入出力

Last updated at Posted at 2019-01-13

値取得・出力サンプルコードの中にSwiftの例がない。
Swiftで標準入出力もらうことがほとんどないので、最初結構戸惑った。
(なんでサンプルないんだ?)

標準入力(単行)

デフォルト
let input_line=readLine()!
print("XXXXXX")

paizaのデフォルトで表示されるのがこれ。
readLine()で入力値を受け取れる。
!付きなのは、標準入力使うと、通常Optional型でラップされて返ってくるので、
強制アンラップをかけており、input_lineの型はString型になっている。
(標準入力は、nilが入ってくる可能性がある)
!をあんまりつけたくない気持ちはあるのだが、paizaがこれでいいと言ってくれるならば、これで行こう。

入力値が単行の場合、複数のデータが一行で入っていて、
それを分割するところから処理をはじめるケースが多い。

また、Dランクあたりは、2つの数値が文字列で来て、
数値型に変換して、何かしら計算して返せ、みたいなお題が多いように見えた。

標準入力受けるだけならデフォルトの一行なんだけど、
実際は下記くらいのことはだいたいやるんじゃないか。

サンプル(単行)
//aとbふたつの数値をなんかしろ、みたいな課題
//このときの入力データは「8 15」みたいな形式

import Foundation

let input_line: String = readLine()!
let split: [String] = input_line.components(separatedBy: " ") //ブランクで区切られている場合

let a = Int(split[0])! 
//String -> Intの型変換はnilが返る可能性があるので、ラップされたOptional<Int>型が返るので強制アンラップ
let b = Int(split[1])!

この辺の基本的な型変換とかできますか、というのがDランクで問われてることなのかな?

標準入力(複数行)

で、ここから僕がハマったポイントなんだけど、
複数行あると、readLine()は複数回行う必要がある。
EOFまでまとめて受け取れないかな〜と思ったが、そんな方法はないようだ。

Apple公式

readLine
func readLine(strippingNewline: Bool = default) -> String?

strippingNewlineなる引数があるが、
これはどうも改行文字(\n)を戻り値に含めるか、含めない(stripするか)かの指定っぽい。

2,3行だったら、決め打ちでreadLineを2,3回すればいいと思う。
それ以上になると、配列つくって、ループ文で受け取って、とやるしかない。

サンプル(複数行)
/*
25
5
10
みたいな入力を受け取りたい
*/
var input_lines = [String]()
let row = 3  //3行
for i in 0..<row {
    input_lines.append(readLine()!)
}
print(input_lines) // ["25", "5", "10"]

Int型への変換とかは単行のときと同様。

標準出力

pritn()で出せば終わり。

問題文の最後に「最後は改行し、余計な文字、空行を含んではいけません」とあるので、
\nを最後につけなきゃいけないのかと思ったのだけど、
どうやらpirnt関数は最後勝手に改行するらしく、これは不要。

32
27
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
32
27