$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
はじめに
AtCoder Beginner Contest 404をElixirとRustで解いてみます。
AtCoderを解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。
プログラミングという名の芸術活動をより楽しむための鍛錬です。
自信というのは、一にも二にもトレーニングから生まれる
(アントニオ猪木『最後の闘魂』)
AtCoderをElixirでやってみる
入力の読み取り方や解答の作り方は、別の記事にまとめています。
ご参照くださいませ。
ElixirでAtCoderを楽しむためには、エントリポイントをMain.main/0にする必要があります。つまりMainモジュールを作って、その中にmain/0関数を定義するわけです。
A - Not Found
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
プログラミングの基本である「順次」「分岐」「繰り返し」のうち、これらすべてを理解できているのかを問う問題です。
Elixir
Elixirを使った私の解答です。
私の解答(Elixir)
問題文を読んでいらっしゃることを前提にひとこと解説をしておきます。
MapSetモジュールを使いました。
Enum.reduce_while/3で、答えの候補が見つかったら探索を打ち切ることにしました。
defmodule Main do
def main do
IO.read(:line)
|> String.trim()
|> solve()
|> IO.puts()
end
def solve(s) do
s
|> String.to_charlist()
|> MapSet.new()
|> do_solve()
end
defp do_solve(map_set) do
(?a..?z)
|> Enum.reduce_while(nil, fn c, nil ->
if MapSet.member?(map_set, c), do: {:cont, nil}, else: {:halt, c}
end)
|> List.wrap()
|> List.to_string()
end
end
Rust
RustはAI先生のお力をお借りして、Elixirのコードを置き換えてもらいました。
私は、Rustを勉強中です。万年勉強中です。闘魂にゴールはない。いつまでも挑戦中です。
私の解答(Rust)
use std::collections::HashSet;
use std::io::{self, BufRead};
fn main() {
// 入力を受け取る
let stdin = io::stdin();
let s = stdin.lock().lines().next().unwrap().unwrap();
// solve 関数で処理
let result = solve(&s);
println!("{}", result);
}
fn solve(s: &str) -> String {
// 入力文字列の各文字を HashSet に追加(重複排除)
let set: HashSet<char> = s.chars().collect();
// a〜z の中で最初に出現していない文字を探す
for c in 'a'..='z' {
if !set.contains(&c) {
return c.to_string();
}
}
// 全ての文字が含まれていた場合は空文字を返す(必要に応じて"None"などに変更可)
String::new()
}
さいごに
AtCoder Beginner Contest 404をElixirとRustで解くことを楽しみました。
あなたのお好きなプログラミング言語でお楽しみください。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$
