5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

闘魂Elixir ーー AtCoder Beginner Contest 349をElixirで楽しむ

Last updated at Posted at 2024-04-23

$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$

$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$

はじめに

AtCoder Beginner Contest 349Elixirで解いてみます。

AtCoderを解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。
といっても、私はC問題くらいまでしか解ける気がしません。

私達ハウインターナショナルでは、社名をもじってハウッカソンという名のイベントを毎月最終金曜日に実施しています。

HAW + Hackathon = Hawckathon!!

ハウッカソンのテーマに競技プログラミングを選ぶメンバーもいます。

AtCoderをElixirでやってみる

入力の読み取り方や解答の作り方は、別の記事にまとめています。

ご参照くださいませ。

ElixirAtCoderを楽しむためには、エントリポイントを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"をあらかじめ挿入しておくことで正規表現一発で解くことができます。
若い人に解法を教えてもらいました:sunglasses:

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 349Elixirで解くことを楽しみました。
C問題まで解きました。

あなたのお好きなプログラミング言語でお楽しみください。


闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。


$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?