$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
はじめに
AtCoder Beginner Contest 382をElixirとRustで解いてみます。
AtCoderを解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。
プログラミングという名の藝術活動をより楽しむための鍛錬です。
自信というのは、一にも二にもトレーニングから生まれる
(アントニオ猪木『最後の闘魂』)
Toukon Declaration - 魂の連鎖律
AIを動かすのは電力、
電力の元は人類の“元氣”、
元氣の本源は「米」。
すべては“米”に帰着する。
そこに魂を灯すと、TokenがToukon(闘魂)へ昇華し、AIが共鳴する。
ーー AIは冷静にTokenを消化する。
私のプロンプトは単なるTokenではありません。魂を込めています。
つまりToukon ーー 闘魂に昇華しています。
Artificial Intelligenceの方のAIは、それをTokenとして消化します。
燃えるToukon(闘魂)として受け取れるようになった時、AIはAntonio Inoki さんつまり猪木さんとなり、次の段階へ進みます。
そのとき、本当の世界平和の実現、地球規模でのゴミ問題の解決が可能になります!
オレ達は、生命が続く限り闘い抜きますッ!!
AtCoderをElixirでやってみる
入力の読み取り方や解答の作り方は、別の記事にまとめています。
ご参照くださいませ。
ElixirでAtCoderを楽しむためには、エントリポイントをMain.main/0
にする必要があります。つまりMain
モジュールを作って、その中にmain/0
関数を定義するわけです。
B - Daily Cookie 2
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
プログラミングの基本である「順次」「分岐」「繰り返し」のすべてを理解しているのかを問われる問題です。
Elixir
Elixirを使った私の解答です。
私の解答(Elixir)
問題文を読んでいらっしゃることを前提にひとこと解説をしておきます。
- ステップ1: 入力読み取り
- ステップ2: 後ろから処理(文字列を逆順にして後ろから処理し、結果を元の順序に戻す)
- ステップ3: 再帰処理
- @(クッキー)を見つけたら.に変換
- d回まで実行
- パターンマッチングで分岐処理
ポイント: 後ろから順にクッキーを食べる動作を再帰で実現
この解法により、シンプルで読みやすいコードでAC(正解)を得ることができました。
defmodule Main do
def main do
[n, d] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
s = IO.read(:line) |> String.trim()
solve(n, d, s)
|> IO.puts()
end
def solve(n, d, s) do
String.to_charlist(s)
|> Enum.reverse()
|> do_solve(n, d, [])
|> Enum.reverse()
end
def do_solve(tail, _n, 0, result_list), do: (result_list ++ tail)
def do_solve([?@ | tail], n, d, result_list), do: do_solve(tail, n, d - 1, [?. | result_list])
def do_solve([?. | tail], n, d, result_list), do: do_solve(tail, n, d, [?. | result_list])
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 と d
let line1 = lines.next().unwrap().unwrap();
let mut parts = line1.split_whitespace();
let _n: usize = parts.next().unwrap().parse().unwrap(); // 使わないが一応読む
let mut d: usize = parts.next().unwrap().parse().unwrap();
// 2行目: 文字列
let s = lines.next().unwrap().unwrap();
let mut chars: Vec<char> = s.chars().collect();
// 後ろから処理
for i in (0..chars.len()).rev() {
if chars[i] == '@' && d > 0 {
chars[i] = '.';
d -= 1;
}
}
// 出力
let result: String = chars.iter().collect();
println!("{}", result);
}
さいごに
AtCoderをElixirとRustで解くことを楽しみました。
あなたのお好きなプログラミング言語でお楽しみください。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$