Help us understand the problem. What is going on with this article?

Swiftとプログラミングコンテスト

概要

プログラミングコンテストとSwift5にまつわる状況メモ(2020年2月時点)
AtCoderのバージョンアップテストで対応された模様(2020年3月現在)

AtCoder(現行)

プロコンと言えばAtCoderな訳ですが、現在採用されているバージョンは 2.2 です。リリース日は2016年3月21日であり、ほぼ4年前です。
言語別AC数で言うと、Pineさんという方が586ACしていますが、2位以下のAC数は100未満です。
 →Language Owner

最新版は 5.1.4 で、リリース日は2020年1月31日です。

AtCoder(バージョンアップテスト - 2020年2月22日)

AtCoderは現在、言語のバージョンアップテスト中です(下記のリンクから飛べます)。
Language Test 202001
こちらのバージョンは 5.1.3 です。リリース日は2019年12月13日です。
ただ、提出結果を見れば分かりますが、現在のところすべて CE(CompileError) になっています。Pineさんの提出もすべてCEなので、現在ACをするのは不可能と見るのが妥当です。 →その後、AC出来るようになりました(下記参照)。

AtCoder(バージョンアップテスト - 2020年3月1日)

2020年3月1日に再度確認したところ、Swift5.1.3で AC しているケースが出てきています。私が2月22日に提出して CE になっていたものも AC になっているので、リジャッジされたものと思われます。

Paiza

プロコンと言えばPaizaな訳ですが(?)、現在採用されているバージョンは 5.0.1 で、リリース日は2019年4月18日です。
 →こちらで確認できます

はじめてのあっとこーだー

テスト問題 はじめてのあっとこーだー を、Paiza(Swift 5.0.1)で通るように組んでみました。

let a = Int(readLine()!)!
let bc = readLine()!.split(separator: " ")
let b = Int(bc[0])!
let c = Int(bc[1])!
let d = a + b + c
let s = readLine()!
print (d.description + " " + s)

テストバージョンのサイトでは通らないので、通常の方(Swift2.2)にブチこんでみます。

コンパイルメッセージ
./Main.swift:2:20: error: value of type 'String' has no member 'split'
let bc = readLine()!.split(separator: " ")
~~~~~~~~~~^ ~~~~~

ダメでした。
Swift2で通す方法が知りたい訳ではないので、ここで終了です。
あーあ。 :cactus:

はじめてのあっとこーだー(関数を使う)

はじめてのあっとこーだー の、関数を使う版。
引数名を記述しなくてはいけません。
逆に言えば、

関数の順番通り

func k1(x: Int, y: Int) -> Int {
    return x + y
}

let a = Int(readLine()!)!
let bc = readLine()!.split(separator: " ")
let b = Int(bc[0])!
let c = Int(bc[1])!
let d = k1(x: k1(x: a, y: b), y: c)
let s = readLine()!

print (d.description + " " + s)

関数の順番を変更

引数名を記述するので、順番を変えることができるのか……と思いきや。
error: argument 'x' must precede argument 'y'
(引数 'x'は引数 'y'の前になければなりません)

記述順でエラーが出ます。意味が分からない…… :sweat:

引数名の省略には「_」(アンダースコア)

関数名の引数名は指定しても、呼び出し側からは省略したい、という場合には 「_」(アンダースコア)を 使うと良いです。

func k1(_ x: Int, _ y: Int) -> Int {
    return x + y
}

let a = Int(readLine()!)!
let bc = readLine()!.split(separator: " ")
let b = Int(bc[0])!
let c = Int(bc[1])!
let d = k1( k1(a, b), c)
let s = readLine()!

print (d.description + " " + s)

いろいろ試している途中

https://paiza.io/projects/5Gq5ZJkqi2o60Pzz52sIqg

takepan
PC-8001の産湯をつかい、姓は車、名は寅次郎 人呼んでtakepanと発します
yyphp
PHPerが毎週集まり、ざっくばらんに情報交換する雑談コミュニティ
https://yyphp.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away