Elixir로 ABC174의 A, B, C 문제를 제압!

15702 단어 AtCoderElixir

소개



  • @u2dayo 님의 【AtCoder 해설】Python으로 ABC174의 A, B, C 문제를 제압한다!을 쳐다 보았습니다.

    문제


  • Elixir
  • A ~ C까지 풀어보십시오

  • 준비



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

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

    설치


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

  • lib/at_coder_174_a.ex
    defmodule AtCoder174A do
      def main do
        IO.read(:line)
        |> String.trim()
        |> String.to_integer()
        |> solve()
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc174/tasks/abc174_a
    
      ## Examples
    
          iex> AtCoder174A.solve(25)
          "No"
          iex> AtCoder174A.solve(30)
          "Yes"
          iex> AtCoder174A.solve(-1)
          "No"
    
      """
      def solve(x) when x >= 30, do: "Yes"
    
      def solve(_), do: "No"
    end
    
    
  • solve/1 두 개의 함수를 작성했지만 위에서부터 순서대로 처음 일치하는 것이 실행됩니다.
  • ## Examples 에 쓰여진 것은 문제 A - Air Conditioner
  • 자세한 내용은 Doctests을 참조하십시오

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

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

  • ExUnit.DocTest의 경우 모듈 이름은 Main이어야합니다


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

    제출



    lib/at_coder_174_b.ex
    defmodule AtCoder174B do
      def main do
        [n, d] =
          IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    
        1..n
        |> Enum.reduce([], fn _, acc ->
          [
            IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
            | acc
          ]
        end)
        |> solve(d)
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc174/tasks/abc174_b
    
      ## Examples
    
          iex> AtCoder174B.solve([[0, 5], [-2, 4], [3, 4], [4, -4]], 5)
          3
    
      """
      def solve(list_of_lists, d) do
        square_of_d = d * d
    
        list_of_lists
        |> Enum.map(fn [x, y] -> x * x + y * y end)
        |> Enum.filter(&(&1 <= square_of_d))
        |> Enum.count()
      end
    end
    

  • 문제 B - Distance의 경우 모듈 이름은 Main이어야합니다


  • 수수께끼에 입력 값을 읽는 곳에서 String.split(" ") 그리고 하지 않고 String.split()pattern 를 지정하지 않고 호출하면 타임 아웃 해 버리는 일이있었습니다.

    제출


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

  • 문제 C - Repsept 의 해설을 매우 참고로 했습니다!
  • 감사합니다!


  • lib/at_coder_174_c.ex
    defmodule AtCoder174C do
      def main do
        IO.read(:line)
        |> String.trim()
        |> String.to_integer()
        |> solve()
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc174/tasks/abc174_c
    
      ## Examples
    
          iex> AtCoder174C.solve(101)
          4
          iex> AtCoder174C.solve(2)
          -1
          iex> AtCoder174C.solve(999983)
          999982
    
    
      """
      def solve(k) do
        1..k
        |> Enum.reduce_while({0, -1}, fn i, {a, _result} ->
          a = a * 10 + 7
          rem = rem(a, k)
          if rem == 0, do: {:halt, {rem, i}}, else: {:cont, {rem, -1}}
        end)
        |> elem(1)
      end
    end
    

  • 원래 기사의 경우 모듈 이름은 Main이어야합니다


  • Wrapping Up



  • 제출에서 입력을 공백으로 나눌 때 두 번째 인수 pattern" "를 지정합시다.
  • Enjoy String.split/3 !!!
  • 좋은 웹페이지 즐겨찾기