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

14794 단어 AtCoderElixir

소개



  • Elixir 에서 해 보았습니다

  • 문제


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

  • 준비



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

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

    문제 A - Coffee


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

  • lib/abc_160_a.ex
    defmodule Abc160A do
      def main do
        IO.read(:line)
        |> String.trim()
        |> solve()
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc160/tasks/abc160_a
    
      ## Examples
    
          iex> Abc160A.solve("sippuu")
          "Yes"
          iex> Abc160A.solve("iphone")
          "No"
          iex> Abc160A.solve("coffee")
          "Yes"
    
      """
      def solve(s) do
        String.codepoints(s) |> do_solve()
      end
    
      defp do_solve([_, _, f, f, e, e]), do: "Yes"
      defp do_solve(_), do: "No"
    end
    
  • ## Examples 에 쓰여진 것은 Doctests
  • 자세한 내용은 ExUnit.DocTest을 참조하십시오

  • 답의 키가되는 함수에 대해 문제에 쓰여진 입력 예제를 입력하여 출력 예제와 같이 출력되는지 확인합니다.
  • 이 문제는 입력이 6문자로, 3번째와 4번째가 동일하고 5번째와 6번째가 동일한 경우에 "Yes"를 표시해, 그렇지 않은 경우에는 "No"를 돌려주는

  • if/2 로 쓸 수도 있습니다
  • do_solve/1 와 같이 리스트의 요소에 같은 변수명을 사용하는 것으로 3번째와 4번째가 같고 5번째와 6번째가 같다는 것을 표현하고 있습니다(이런 쓰는 방법 개미라는 것은 나에게 발견)
  • test/at_coder_test.exs 에 설정을 더해 둡시다

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

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


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

    문제 B - Golden Coins



    lib/abc_160_b.ex
    defmodule Abc160B do
      def main do
        IO.read(:line)
        |> String.trim()
        |> String.to_integer()
        |> solve()
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc160/tasks/abc160_b
    
      ## Examples
    
          iex> Abc160B.solve(1024)
          2020
          iex> Abc160B.solve(0)
          0
          iex> Abc160B.solve(1000000000)
          2000000000
    
      """
      def solve(x) do
        div(x, 500) * 1000 + div(rem(x, 500), 5) * 5
      end
    end
    

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



  • 문제 C - Traveling Salesman around Lake


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

  • lib/abc_160_c.ex
    defmodule Abc160C do
      def main do
        [k, _n] =
          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(k)
        |> IO.puts()
      end
    
      @doc ~S"""
      https://atcoder.jp/contests/abc160/tasks/abc160_c
    
      ## Examples
    
          iex> Abc160C.solve([5, 10, 15], 20)
          10
          iex> Abc160C.solve([0, 5, 15], 20)
          10
    
      """
      def solve(list, k) do
        first = hd(list)
    
        list
        |> Kernel.++([first + k])
        |> Enum.chunk_every(2, 1, :discard)
        |> Enum.reduce(0, fn [small, big], acc ->
          diff = big - small
          if diff > acc, do: diff, else: acc
        end)
        |> Kernel.-(k)
        |> Kernel.*(-1)
      end
    end
    

  • Enum.chunk_every/4 가 대활약입니다!

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

  • Wrapping Up


  • 이번은 자력으로 갈 수 있었습니다!
  • C 문제는 법칙이라고 할 수 있습니까? 이렇게하면 계산이 적어질 것입니다.

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