$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
はじめに
AtCoder Beginner Contest 401をElixirとRustで解いてみます。
AtCoderを解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。
プログラミングという名の芸術活動をより楽しむための鍛錬です。
自信というのは、一にも二にもトレーニングから生まれる
(アントニオ猪木『最後の闘魂』)
AtCoderをElixirでやってみる
入力の読み取り方や解答の作り方は、別の記事にまとめています。
ご参照くださいませ。
ElixirでAtCoderを楽しむためには、エントリポイントをMain.main/0
にする必要があります。つまりMain
モジュールを作って、その中にmain/0
関数を定義するわけです。
B - Unauthorized
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
プログラミングの基本である「順次」「分岐」「繰り返し」を、すべて理解できているのかを問う問題です。
Elixir
Elixirを使った私の解答です。
私の解答(Elixir)
問題文を読んでいらっしゃることを前提にひとこと解説をしておきます。
①login
状態であるかどうかによってカウントが変わる、②アクセスするページによってカウントがかわる の2点から、Enum.reduce/3 を使い、Accumulatorには、それまでのカウントと現在状態をタプルで持たせました。
defmodule Main do
def main do
n = IO.read(:line) |> String.trim() |> String.to_integer()
s_list = for _ <- 1..n do
IO.read(:line)
|> String.trim()
end
solve(s_list)
|> IO.puts()
end
def solve(list) do
Enum.reduce(list, {0, false}, fn
"login", {acc_count, _acc_state} -> {acc_count, true}
"logout", {acc_count, _acc_state} -> {acc_count, false}
"private", {acc_count, true} -> {acc_count, true}
"private", {acc_count, false} -> {acc_count + 1, false}
_, {acc_count, acc_state} -> {acc_count, acc_state}
end)
|> elem(0)
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行目:n
let n: usize = lines
.next()
.unwrap()
.unwrap()
.trim()
.parse()
.expect("Failed to parse n");
// 次のn行:コマンド
let s_list: Vec<String> = lines
.take(n)
.map(|line| line.unwrap().trim().to_string())
.collect();
let result = solve(&s_list);
println!("{}", result);
}
fn solve(list: &[String]) -> i32 {
let mut acc_count = 0;
let mut acc_state = false;
for cmd in list {
match cmd.as_str() {
"login" => acc_state = true,
"logout" => acc_state = false,
"private" if !acc_state => acc_count += 1,
"private" => {} // acc_state == true → 無視
_ => {} // その他コマンド → 状態維持
}
}
acc_count
}
さいごに
AtCoder Beginner Contest 401をElixirとRustで解くことを楽しみました。
あなたのお好きなプログラミング言語でお楽しみください。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$