README.md

# ExAtCoder

[![hex.pm version](https://img.shields.io/hexpm/v/ex_at_coder.svg)](https://hex.pm/packages/ex_at_coder)

Mix Task for [AtCoder](https://atcoder.jp/)

![スクリーンショット 2020-11-29 22 54 27](https://user-images.githubusercontent.com/16176282/100543886-e34e2f80-3295-11eb-97a9-182ba6aa1834.png)

## インストール

```elixir
def deps do
  [
    {:ex_at_coder, "~> 0.1.0"}
  ]
end
```

## 使い方

### ログイン

```
$ mix atcoder.login [username] [password]
```

AtCoderにログインします。  
ログイン状態を保持するために、ローカルに `cookie.txt` を作成します。


### 提出用コードの作成

```
$ mix atcoder.new [contest]
$ mix atcoder.new [contest] [tasks]
```

指定したコンテスト用の提出ファイルの雛形とテストケースの作成を行います。  
コンテストの指定は `arc109` のようなURLに含まれる形で指定します。

また一部問題のみ作成したい場合は
`arc109 a b d` のような形で問題を指定することができます。

```
$ mix atcoder.new arc109
Generated ex_at_coder app
* creating lib/arc109
* creating lib/arc109/a.ex
* creating lib/arc109/test_case
* creating lib/arc109/test_case/a.yml
* creating lib/arc109/b.ex
* creating lib/arc109/test_case/b.yml
* creating lib/arc109/c.ex
* creating lib/arc109/test_case/c.yml
* creating lib/arc109/d.ex
* creating lib/arc109/test_case/d.yml
* creating lib/arc109/e.ex
* creating lib/arc109/test_case/e.yml
* creating lib/arc109/f.ex
* creating lib/arc109/test_case/f.yml
✨ Generate code for arc109
👍 Good Luck
```

問題は`https://atcoder.jp/contests/[contest]/tasks`のページから取得します。  

提出ファイルの雛形に用いるテンプレートのEEXは以下の形で`config.exs`で指定することができます。

```elixir
config :ex_at_coder,
  template_path: "lib/template.eex"
```

```elixir
defmodule <%= @namespace %>.Main do
    def read_single() do
    IO.read(:line) |> String.trim() |> String.to_integer()
  end

  def read_array() do
    IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
  end

  def main() do
    n = 
      IO.read(:line)
      |> String.trim()
      |> String.to_integer()
   
    IO.puts(n)
  end
end
```

### テスト

```
$ mix atcoder.test [contest] [problem]
```

指定したコンテスト、問題のテストケースを実行します。
デフォルトでは問題ページにある入出力サンプルをテストケースとして実行します

```
$ mix atcoder.test arc109 a
arc109 a
running 3 test...
-------------------------------------
sample1  AC  0ms
actual:
1
expected:
1
-------------------------------------
sample2  WA  0ms
actual:
1
expected:
101
-------------------------------------
sample3  WA  0ms
actual:
1
expected:
199
```

テストケースの入出力は `lib/[contest]/test_case` 以下にある yaml で設定できます。

```yml
# test_case/a.yml
- name: sample1
  in: |
    2 1 1 5
    
  out: |
    1
    

- name: sample2
  in: |
    1 2 100 1
    
  out: |
    101
    

- name: sample3
  in: |
    1 100 1 100
    
  out: |
    199

```

### ブラウザでコンテストのページを開く

```
$ mix atcoder.open [contest]

# あるいは

$ mix atcoder.open [contest] [problem]
```

AtCoderのコンテストのページをブラウザで開きます。
コンテスト名のみを渡した場合はコンテストのトップページを、問題名も渡した場合はその問題のページを開きます。

---

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/ex_at_coder](https://hexdocs.pm/ex_at_coder).