Elixir에서 ABC163의 A, B, C 문제를 제어하십시오!

16235 단어 AtCoderElixir

소개



  • Elixir 에서 해 보았습니다

  • 문제


  • AtCoder Beginner Contest 163
  • A ~ C까지 풀어보십시오

  • 준비



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

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

    문제 A - Circle Pond


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

  • lib/abc_163_a.ex
    defmodule Abc163A do
      def main do
        IO.read(:line) |> String.trim() |> String.to_integer() |> solve() |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc163/tasks/abc163_c
    
      ## Examples
    
          iex> Abc163A.solve(1)
          6.283185307179586
    
          iex> Abc163A.solve(73)
          458.67252742410977361942
    
      """
      def solve(r) do
        2 * :math.pi() * r
      end
    end
    
  • ## Examples 에 쓰여진 것은 Doctests
  • 자세한 내용은 ExUnit.DocTest을 참조하십시오

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

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

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


  • 이 음색에서 B 문제, C 문제를 해결합니다.

    문제 B - Homework



    lib/abc_163_b.ex
    defmodule Abc163B do
      def main do
        [n, _m] =
          IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    
        IO.read(:line)
        |> String.trim()
        |> String.split(" ")
        |> Enum.map(&String.to_integer/1)
        |> solve(n)
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc163/tasks/abc163_b
    
      ## Examples
    
          iex> Abc163B.solve([5, 6], 41)
          30
    
          iex> Abc163B.solve([5, 8], 10)
          -1
    
          iex> Abc163B.solve([5, 6], 11)
          0
    
      """
      def solve(list, n) do
        do_solve(Enum.sum(list), n)
      end
    
      defp do_solve(work_sum, n) when n >= work_sum, do: n - work_sum
    
      defp do_solve(_, _), do: -1
    end
    

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



  • 문제 C - management


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

  • lib/abc_163_c.ex
    defmodule Abc163C do
      def main do
        n = IO.read(:line) |> String.trim() |> String.to_integer()
    
        IO.read(:line)
        |> String.trim()
        |> String.split(" ")
        |> Enum.map(&String.to_integer/1)
        |> solve()
        |> (fn map -> 1..n |> Enum.map(&Map.get(map, &1, 0)) end).()
        |> Enum.join("\n")
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc163/tasks/abc163_c
    
      ## Examples
    
          iex> Abc163C.solve([1, 1, 2, 2])
          %{1 => 2, 2 => 2}
    
      """
      def solve(list), do: list |> Enum.frequencies()
    end
    

  • Enum.frequencies/1

  • @QWYNG 님의 풀릭 감사합니다
  • OSS로서의 Elixir

  • 또 다른 포인트는 IO.puts/2의 호출을 한 번으로하는 것입니다
  • 다음과 같이 여러 번 IO.puts/2
        |> solve()
        |> (fn map -> 1..n |> Enum.map(&Map.get(map, &1, 0)) end).()
        |> Enum.each(&IO.puts/1)
    

  • 시간 초과 오류의 경우 모듈 이름은 Main이어야합니다

  • Wrapping Up


  • 이번은 자력으로 갈 수 있었습니다!
  • Enjoy 제출 !!!
  • 좋은 웹페이지 즐겨찾기