$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
はじめに
AtCoder Beginner Contest 349をElixirで解いてみます。
AtCoderを解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。
といっても、私はC問題くらいまでしか解ける気がしません。
私達ハウインターナショナルでは、社名をもじってハウッカソンという名のイベントを毎月最終金曜日に実施しています。
HAW + Hackathon = Hawckathon!!
ハウッカソンのテーマに競技プログラミングを選ぶメンバーもいます。
AtCoderをElixirでやってみる
入力の読み取り方や解答の作り方は、別の記事にまとめています。
ご参照くださいませ。
ElixirでAtCoderを楽しむためには、エントリポイントをMain.main/0
にする必要があります。
つまりMain
モジュールを作って、その中にmain/0
関数を定義するわけです。
A - Zero Sum Game
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
私の解答
問題文を読んでいることを前提にひとこと解説をしておきます。
すべての対戦結果の場合を挙げていると時間内には終わらないでしょう。
問題のタイトルがヒントになっています。
Zero Sum Game つまり全部足すと0ということです。
ですから、N - 1
人までの得点を合計して、その符合(プラスかマイナス)を反転させたものがN人目の得点となります。これで全部の合計は0になるわけです。
defmodule Main do
def main do
IO.read(:line)
list = IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
list
|> solve()
|> IO.puts()
end
def solve(list) do
list |> Enum.sum() |> Kernel.*(-1)
end
end
B - Commencement
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
私の解答
問題文を読んでいることを前提にひとこと解説をしておきます。
文字列の中に含まれるアルファベットの数を数え上げればよいわけです。
そういった用途に適した関数として、Enum.frequencies/1関数があります。本問では大活躍です。
defmodule Main do
def main do
s = IO.read(:line) |> String.trim()
solve(s)
|> IO.puts()
end
def solve(s) do
s
|> String.to_charlist()
|> Enum.frequencies()
|> Map.values()
|> Enum.frequencies()
|> Map.values()
|> Enum.all?(fn
2 -> true
_ -> false
end)
|> if(do: "Yes", else: "No")
end
end
C - Airport Code
問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。
私の解答
問題文を読んでいることを前提にひとこと解説をしておきます。
これぞElixir! という感じで解けます。
再帰とパターンマッチで解きました。
余談であり、何の自慢にもなりませんが、私は学生時代から再帰プログラムを書くのは苦手でした。読むのもなんとなく分かったふりをしていただけです。頭がこんがらがります。
そんな私ですが、なぜだかElixirでは書けてしまいます。パターンマッチのおかげだとおもいます。
defmodule Main do
def main do
s = IO.read(:line) |> String.trim() |> String.to_charlist()
t = IO.read(:line) |> String.trim() |> String.downcase() |> String.to_charlist()
solve(s, t)
|> IO.puts()
end
def solve(_list, 'x'), do: "Yes"
def solve(_list, []), do: "Yes"
def solve([], _target), do: "No"
def solve([head | tail], [head | remain]) do
solve(tail, remain)
end
def solve([_head | tail], target) do
solve(tail, target)
end
end
別の解法です。
正規表現を使って解くというものです。
文字列s
の末尾に"x"
をあらかじめ挿入しておくことで正規表現一発で解くことができます。
若い人に解法を教えてもらいました
defmodule Main do
def main do
s = IO.read(:line) |> String.trim() |> Kernel.<>("x")
[a, b, c] = IO.read(:line) |> String.trim() |> String.downcase() |> String.codepoints()
r = Regex.compile!("#{a}.*#{b}.*#{c}")
if(s =~ r, do: "Yes", else: "No")
|> IO.puts()
end
end
参考記事
さいごに
AtCoder Beginner Contest 349をElixirで解くことを楽しみました。
C問題まで解きました。
あなたのお好きなプログラミング言語でお楽しみください。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$