$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
はじめに
AtCoder Beginner Contest 411をElixirとRustで解いてみます。
AtCoderを解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。
AtCoderをElixirでやってみる
入力の読み取り方や解答の作り方は、別の記事にまとめています。
ご参照くださいませ。
ElixirでAtCoderを楽しむためには、エントリポイントをMain.main/0にする必要があります。つまりMainモジュールを作って、その中にmain/0関数を定義するわけです。
B - Distance Table
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
プログラミングの基本である「順次」「分岐」「繰り返し」のうち、「順次」「分岐」「繰り返し」すべてを理解できているのかを問う問題です。
Elixir
Elixirを使った私の解答です。
私の解答(Elixir)
問題文を読んでいることを前提にひとこと解説をしておきます。
Enum.reduce/3(畳み込み)を使って、解きました。
defmodule Main do
def main do
IO.read(:line)
list = IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
list
|> solve()
|> Enum.join("\n")
|> IO.puts()
end
def solve(list) do
[_ | tail] = list
do_solve(tail, [cumulative_sums(list)])
end
def do_solve([], result), do: result |> Enum.reverse
def do_solve(list, result) do
[_ | tail] = list
do_solve(tail, [cumulative_sums(list) | result])
end
def cumulative_sums(list) do
Enum.reduce(list, [],
fn d, [] -> [d]
d, [head | tail] -> [head + d, head | tail]
end)
|> Enum.reverse()
|> Enum.join(" ")
end
end
Rust
RustはAI先生のお力をお借りして、Elixirのコードを置き換えてもらいました。
私は、Rustを勉強中です。万年勉強中です。闘魂にゴールはない。いつまでも挑戦中です。
私の解答(Rust)
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// 1行目(使わない)
let _ = lines.next();
// 2行目(整数リスト)
let list: Vec<i32> = lines
.next()
.unwrap()
.unwrap()
.trim()
.split_whitespace()
.map(|s| s.parse().unwrap())
.collect();
let results = solve(&list);
for line in results {
println!("{}", line);
}
}
fn solve(list: &[i32]) -> Vec<String> {
let mut results = Vec::new();
let mut slice = list;
while !slice.is_empty() {
results.push(cumulative_sums(slice));
slice = &slice[1..];
}
results
}
fn cumulative_sums(list: &[i32]) -> String {
let mut acc = Vec::new();
for &x in list {
if let Some(&last) = acc.last() {
acc.push(last + x);
} else {
acc.push(x);
}
}
acc.iter()
.map(|n| n.to_string())
.collect::<Vec<_>>()
.join(" ")
}
さいごに
AtCoder Beginner Contest 411をElixirとRustで解くことを楽しみました。
あなたのお好きなプログラミング言語でお楽しみください。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$
