$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
はじめに
AtCoder Beginner Contest 397をElixirとRustで解いてみます。
AtCoderを解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。
プログラミングという名の芸術活動をより楽しむための鍛錬です。
自信というのは、一にも二にもトレーニングから生まれる
(アントニオ猪木『最後の闘魂』)
AtCoderをElixirでやってみる
入力の読み取り方や解答の作り方は、別の記事にまとめています。
ご参照くださいませ。
ElixirでAtCoderを楽しむためには、エントリポイントをMain.main/0
にする必要があります。つまりMain
モジュールを作って、その中にmain/0
関数を定義するわけです。
A - Thermometer
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
プログラミングの基本である「順次」「分岐」「繰り返し」の、すべてを理解できているのかを問う問題です。
Elixir
Elixirを使った私の解答です。
私の解答(Elixir)
問題文を読んでいらっしゃることを前提にひとこと解説をしておきます。
Bにしては、なかなか難問でした。
再帰を使って解きました。先頭や末尾のケアに手こずりました。
defmodule Main do
def main do
s = IO.read(:line) |> String.trim()
solve(s)
|> IO.puts()
end
def solve("i" <> _remain = s) do
list = String.to_charlist(s) |> Enum.with_index()
do_solve(list, 0)
|> answer(String.length(s))
end
def solve("o" <> _remain = s) do
list = String.to_charlist("i" <> s) |> Enum.with_index()
do_solve(list, 0)
|> Kernel.+(1)
|> answer(String.length(s))
end
defp answer(cnt, len) when rem(cnt + len, 2) == 0, do: cnt
defp answer(cnt, len) when rem(cnt + len, 2) == 1, do: cnt + 1
defp do_solve([], acc), do: acc
defp do_solve([{?i, idx} | tail], acc) when rem(idx + acc, 2) == 0 do
do_solve(tail, acc)
end
defp do_solve([{?o, idx} | tail], acc) when rem(idx + acc, 2) == 1 do
do_solve(tail, acc)
end
defp do_solve([{_, _idx} | tail], acc) do
do_solve(tail, acc + 1)
end
end
Rust
RustはAI先生のお力をお借りして、Elixirのコードを置き換えてもらいました。
私は、Rustを勉強中です。万年勉強中です。闘魂にゴールはない。いつまでも挑戦中です。
私の解答(Rust)
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let s = stdin.lock().lines().next().unwrap().unwrap();
let result = if s.starts_with('i') {
let list: Vec<(usize, char)> = s.chars().enumerate().collect();
let cnt = do_solve(&list, 0);
answer(cnt, s.len())
} else if s.starts_with('o') {
let mut new_s = String::from("i");
new_s.push_str(&s);
let list: Vec<(usize, char)> = new_s.chars().enumerate().collect();
let cnt = do_solve(&list, 0) + 1;
answer(cnt, s.len())
} else {
0
};
println!("{}", result);
}
fn do_solve(list: &[(usize, char)], mut acc: usize) -> usize {
for &(idx, ch) in list {
match (ch, (idx + acc) % 2) {
('i', 0) | ('o', 1) => continue,
_ => acc += 1,
}
}
acc
}
fn answer(cnt: usize, len: usize) -> usize {
if (cnt + len) % 2 == 0 {
cnt
} else {
cnt + 1
}
}
さいごに
AtCoder Beginner Contest 397をElixirとRustで解くことを楽しみました。
あなたのお好きなプログラミング言語でお楽しみください。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$