はじめに
What is AtCoder?
- 世界最高峰の競技プログラミングサイトです
- だいたい毎週土曜や日曜の21時すぎにコンテストが行われているようです
- 出題された問題の答えを出力するプログラムを書いて提出することで自動的に採点されます
- 実行時間が長かったり、メモリの使用量が多いとパスできません
- 競技プログラミングというもの自体に私は馴染みがなかったのですが、最近はじめました
はじめての方は
-
ElixirでAtCoderにはじめて取り組まれる方は、手前味噌ですが、「AtCoderをElixirでやってみる」をご参照ください
- インプットの読み取り方などのTipsを書いています
-
Elixir自体がはじめての方はまずインストールしましょう
- 手前味噌ですがインストールなどをご参照ください
便利なツール
-
tamanugi/ex_at_coder
- @tamanugiさん作
- AtCoder用のmixタスクを作ってみた
- @tamanugiさんのex_at_coderを使ってみる (Elixir)
- 本日はこちらを使います
- g-kenkun/kyopuro
プロジェクト作成
$ mkdir awesome_at_coder
$ cd awesome_at_coder
$ asdf local elixir 1.10.2-otp-22
$ mix new .
mix.exs
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
{:ex_at_coder, ">0.0.0"}
]
end
$ mix deps.get
ABC114C
$ mix atcoder.open abc114 c
- 問題文のページがブラウザで開かれます
- 問題をご確認ください
$ mix atcoder.new abc114
- 問題文のページからテストケースや回答モジュールの雛形が作られます
ソースコードを書く
- 自分を信じてがんばって解きましょう
lib/abc114/c.ex
defmodule Abc114.C.Main do
def main() do
n = IO.read(:line) |> String.trim() |> String.to_integer()
digits = Integer.to_string(n) |> String.codepoints() |> Enum.count()
numbers(digits)
|> Enum.filter(&(&1 <= n))
|> Enum.count()
|> IO.puts()
end
defp numbers(digits) do
1..digits
|> Enum.reduce([[]], fn _, list_of_lists ->
Enum.reduce(list_of_lists, [], fn list, acc ->
[[3 | list], [5 | list], [7 | list], list | acc]
end)
end)
|> Enum.filter(fn list ->
Enum.any?(list, &(&1 == 3)) and Enum.any?(list, &(&1 == 5)) and Enum.any?(list, &(&1 == 7))
end)
|> Enum.map(fn list ->
Enum.join(list) |> String.to_integer()
end)
|> MapSet.new()
end
end
テストする
$ mix atcoder.test abc114 c
自信をもって提出しましょう。
提出の際にはモジュール名をMain
にして提出します。
Wrapping Up 🎍🎍🎍🎍🎍
- 私は、めちゃくちゃ時間かけて解いています
- 問題は問題解決力を鍛える!アルゴリズムとデータ構造 第4章の章末問題に挙げられていたものをチョイスしました
- Enjoy Elixir