Elixir로 ABC170의 A, B, C 문제를 제압한다!

16275 단어 AtCoderElixir

소개



  • Elixir 에서 해 보았습니다

  • 문제


  • AtCoder Beginner Contest 170
  • A ~ C까지 풀어보십시오
  • 이번은 자력으로 갈 수 있었습니다!

  • 준비



  • Elixir 설치
  • 앞에 된장입니다만, 설치 등 참고로 해 주세요

  • 프로젝트를 만들어 둡니다
  • $ mix new at_coder
    $ cd at_coder
    

    문제 A - Five Variables


  • 문제문은 링크처를 참조해 주세요

  • lib/abc_170_a.ex
    defmodule Abc170A do
      def main do
        IO.read(:line)
        |> String.trim()
        |> String.split(" ")
        |> Enum.map(&String.to_integer/1)
        |> solve()
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc170/tasks/abc170_b
    
      ## Examples
    
          iex> Abc170A.solve([0, 2, 3, 4, 5])
          1
          iex> Abc170A.solve([1, 2, 0, 4, 5])
          3
    
      """
      def solve(list) do
        Enum.find_index(list, &(&1 == 0)) + 1
      end
    end
    
    
  • ## Examples 에 쓰여진 것은 Doctests
  • 자세한 내용은 ExUnit.DocTest을 참조하십시오

  • 답의 키가되는 함수에 대해 문제에 쓰여진 입력 예제를 입력하여 출력 예제와 같이 출력되는지 확인합니다.
  • test/at_coder_test.exs 에 설정을 더해 둡시다

  • test/at_coder_test.exs
    defmodule AtCoderTest do
      use ExUnit.Case
      doctest Abc170A
    
    $ mix test
    ..........
    
    Finished in 0.2 seconds
    9 doctests, 1 test, 0 failures
    

  • 제출의 경우 모듈 이름은 Main이어야합니다


  • 다음은 B 문제, C 문제를 해결합니다.

    문제 B - Crane and Turtle



    lib/abc_170_b.ex
    defmodule Abc170B do
      def main do
        [x, y] =
          IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    
        solve(x, y)
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc170/tasks/abc170_b
    
      ## Examples
    
          iex> Abc170B.solve(3, 8)
          "Yes"
          iex> Abc170B.solve(2, 100)
          "No"
          iex> Abc170B.solve(1, 2)
          "Yes"
    
      """
      def solve(x, y) when y - 2 * x >= 0 and x - div(y - 2 * x, 2) >= 0 and rem(y - 2 * x, 2) == 0,
        do: "Yes"
    
      def solve(_x, _y), do: "No"
    end
    
    

  • 제출의 경우 모듈 이름은 Main이어야합니다



  • 문제 C - Forbidden List


  • 문제문은 링크처를 참조해 주세요

  • lib/abc_170_c.ex
    defmodule Abc170C do
      def main do
        [x, n] =
          IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    
        if n > 0 do
          IO.read(:line)
          |> String.trim()
          |> String.split(" ")
          |> Enum.map(&String.to_integer/1)
          |> solve(x)
          |> IO.puts()
        else
          IO.read(:line)
    
          solve([], x)
          |> IO.puts()
        end
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc170/tasks/abc170_c
    
      ## Examples
    
          iex> Abc170C.solve([4, 7, 10, 6, 5], 6)
          8
          iex> Abc170C.solve([4, 7, 10, 6, 5], 10)
          9
          iex> Abc170C.solve([], 100)
          100
    
      """
      def solve([], x), do: x
    
      def solve(list, x) do
        0..100
        |> Enum.reduce_while(x, fn i, acc ->
          minus_one = x - i
    
          if !(minus_one in list) do
            {:halt, minus_one}
          else
            plus_one = x + i
    
            if !(plus_one in list) do
              {:halt, plus_one}
            else
              {:cont, acc}
            end
          end
        end)
      end
    end
    
    
    

  • 제출의 경우 모듈 이름은 Main이어야합니다


  • Wrapping Up


  • Enjoy Elixir !!!
  • 좋은 웹페이지 즐겨찾기