AtCoder
Julia
競技プログラミング

AtCoderに登録したら解くべき精選過去問 10 問を Julia で解いてみた

More than 1 year has passed since last update.


はじめに

drkenさんが紹介されている過去問精選10問をJuliaで解いてみました。


入力の受け取り

入力の受け取りはreadline()関数をベースに使いました。


出力

出力はprintln()関数を使いました。


提出コード

なるべく元記事の書き方に似せました。

コードをmain()関数に入れていますが、これは最適化の為です。

一応解説を書きますが、より詳細なものは元記事を参照してください。


第零問 はじめてのあっとこーだー

function main()

# 整数の入力
a = parse(Int, readline())
# スペース区切りの整数の入力
(b, c) = map(x -> parse(Int, x), split(readline()))
# 文字列の入力
s = readline()
# 出力
print("$(a + b + c) $s")
end

main()


第一問 Product

これは問題文をプログラムに落とし込むだけで大丈夫です。

多くの言語と違い、Juliaではif 数値 ~ endと書くと怒られます。ちゃんと比較しましょう。

function main()

(a, b) = map(x -> parse(Int, x), split(readline()))
c = a * b
if c % 2 == 0
println("Even")
else
println("Odd")
end
end

main()


第二問 Placing Marbles

function main()

s = readline()

counter = 0
if s[1] == '1'; counter += 1; end
if s[2] == '1'; counter += 1; end
if s[3] == '1'; counter += 1; end

println(counter)
end

main()

if~endを一行で書けることも地味に嬉しいポイントです。

勿論forループを使って解いても大丈夫です。


第三問 Shift only

function main()

N = parse(Int, readline())
A = map(x -> parse(Int, x), split(readline()))

res = 0

while true
exist_odd = false
for i = 1:N
if A[i] % 2 != 0
exist_odd = true
end
end

if exist_odd
break
end

for i = 1:N
A[i] /= 2
end

res += 1
end

println(res)
end

main()


第四問 Coins

function main()

A = parse(Int, readline())
B = parse(Int, readline())
C = parse(Int, readline())
X = parse(Int, readline())

res = 0
for a = 0:A
for b = 0:B
for c = 0:C
total = 500 * a + 100 * b + 50 * c
if total == X
res += 1
end
end
end
end

println(res)
end

main()


第五問 Some Sums

function find_sum_of_digits(n::Int)

sum = 0
while n > 0
sum += n % 10

n -= n % 10
n /= 10
end

return sum
end

function main()
(N, A, B) = map(x -> parse(Int, x), split(readline()))

total = 0
for i = 1:N
sum = find_sum_of_digits(i)
if A <= sum <= B
total += i
end
end

println(total)
end

main()


第六問 Card Game for Two

function main()

N = parse(Int, readline())
a = map(x -> parse(Int, x), split(readline()))

sort!(a, rev=true)

alice = 0
bob = 0
for i = 1:N
if i % 2 == 1
alice += a[i]
else
bob += a[i]
end
end

println(alice - bob)
end

main()


第七問 Kagami Mochi

function main()

N = parse(Int, readline())
d = zeros(Int, (N,))
for i = 1:N
d[i] = parse(Int, readline())
end

num = zeros(Int, (100,))
for i = 1:N
num[d[i]] += 1
end

res = 0
for i = 1:100
if num[i] > 0
res += 1
end
end

println(res)
end

main()


第八問 Otoshidama

function main()

(N, Y) = map(x -> parse(Int, x), split(readline()))
res10000 = res5000 = res1000 = -1
for a = 0:N
for b = 0:N - a
c = N - a - b
total = 10000 * a + 5000 * b + 1000 * c
if total == Y
res10000 = a
res5000 = b
res1000 = c
end
end
end

println("$res10000 $res5000 $res1000")
end

main()


第九問 Daydream

cielavenirさんからコードの提供を頂きました。ありがとうございます!

function main()

divide = ["dream", "dreamer", "erase", "eraser"]

S = chomp(readline())

ans = true
lenS = length(S)
while lenS > 0
is_contains = false
for i = 1:4
if length(divide[i]) <= lenS
if S[lenS - length(divide[i]) + 1:lenS] == divide[i]
is_contains = true
lenS -= length(divide[i])
end
end
end

if !is_contains
ans = false
break
end
end

if ans
println("YES")
else
println("NO")
end
end

main()


第十問 Traveling

function main()

N = parse(Int, readline())
t = zeros(Int, N + 1)
x = zeros(Int, N + 1)
y = zeros(Int, N + 1)

for i = 2:N + 1
(t[i], x[i], y[i]) = map(x -> parse(Int, x), split(readline()))
end

can = true
for i = 1:N
dt = t[i + 1] - t[i]
dist = abs(x[i + 1] - x[i]) + abs(y[i + 1] - y[i])
if dt < dist
can = false
end
if dist % 2 != dt % 2
can = false
end
end

if can
println("Yes")
else
println("No")
end
end

main()