$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
AtCoder Beginner Contest 400をElixirとRustで解いてみます。
AtCoderを解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。
プログラミングという名の芸術活動をより楽しむための鍛錬です。
自信というのは、一にも二にもトレーニングから生まれる
(アントニオ猪木『最後の闘魂』)
入力の読み取り方や解答の作り方は、別の記事にまとめています。
ご参照くださいませ。
ElixirでAtCoderを楽しむためには、エントリポイントをMain.main/0
にする必要があります。つまりMain
モジュールを作って、その中にmain/0
関数を定義するわけです。
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
プログラミングの基本である「順次」「分岐」「繰り返し」のうち、これらの基本をすべて理解できているのかを問う問題です。
Elixir
Elixirを使った私の解答です。
私の解答(Elixir)
問題文を読んでいらっしゃることを前提にひとこと解説をしておきます。
合計に条件があるため、Enum.reduce_while/3 を使いました。
べき乗計算は、 **
を使いました。**
はガード節には使えなかったので、別の関数do_solve/1
にわけてガード節で、上限値を超えた場合、上限値以内の場合の場合分けを実装しました。
defmodule Main do
@max 10 ** 9
def main do
[n, m] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
solve(n, m)
|> IO.puts()
end
def solve(n, m) do
(0..m)
|> Enum.reduce_while(0, fn
i, acc -> do_solve(n ** i + acc)
end)
end
defp do_solve(acc) when acc @max, do: {:cont, acc}
defp do_solve(_acc), do: {:halt, "inf"}
end
Rust
RustはAI先生のお力をお借りして、Elixirのコードを置き換えてもらいました。
私は、Rustを勉強中です。万年勉強中です。闘魂にゴールはない。いつまでも挑戦中です。
私の解答(Rust)
use std::io;
const MAX: u64 = 1_000_000_000;
fn main() {
// 入力を受け取る
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
// nとmに分割して整数に変換
let parts: Vecu64> = input
.trim()
.split_whitespace()
.map(|s| s.parse().expect("Invalid number"))
.collect();
let n = parts[0];
let m = parts[1];
// 結果を出力
println!("{}", solve(n, m));
}
fn solve(n: u64, m: u64) -> String {
let mut acc: u64 = 0;
for i in 0..=m {
match n.checked_pow(i as u32).and_then(|val| acc.checked_add(val)) {
Some(new_acc) if new_acc MAX => acc = new_acc,
_ => return "inf".to_string(),
}
}
acc.to_string()
}
AtCoder Beginner Contest 400をElixirとRustで解くことを楽しみました。
あなたのお好きなプログラミング言語でお楽しみください。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$
Views: 0