Rails on Tiles (어떻게 쓰기) (Elixir)

15238 단어 Elixir

소개



  • Elixir 즐기십니까

  • @ 나베타 님의 「 오프라인 실시간 어떻게 쓰는 제5회 참고문제 」를 Elixir 로 해 보았습니다

  • @obelisk68의 "Rails on Tiles (어떻게 쓰기)"에서 문제의 존재를 알았습니다.


  • 준비



  • Elixir을 설치합시다
  • 앞에 된장이지만 설치 등을 참조하십시오

  • 잘못하면


  • 모든 것을 준비하는 것이 중요합니다
  • 여기가 제일 시시하지 않고, 수수께끼에 빠져 버리는 경우가 많습니다만, 노력해 주세요!
  • 잘 안 된다면, 과감하게 내 가슴에 뛰어들어오길 바란다 (by 나가시마 시게오 요미우리 자이언츠 종신 명예 감독)

  • elixirjp.slack.com slack workspace 또는 NervesJP workspace에 들어와서 @torifukukaiou에 문의하십시오.
  • 비록 내가 대답 할 수 없어도, 진짜 모두 친절하고 부드러운 사람이 많기 때문에 반드시 해결할 수 있습니다.


  • mix new


    $ mix new rails_on_tiles
    $ cd rails_on_tiles
    

    소스 코드 작성



    lib/rails_on_tiles.ex
    defmodule RailsOnTiles do
      @moduledoc """
      Documentation for `RailsOnTiles`.
      """
    
      @tiles [[2, 3, 0, 1], [1, 0, 3, 2], [3, 2, 1, 0]]
      @dirs [[0, -1], [1, 0], [0, 1], [-1, 0]]
      @alphabets ?A..?I
    
      @doc """
      Rails on Tiles(どう書く)
    
      ## Examples
      iex> RailsOnTiles.go("101221102")
      "BEDGHIFEH"
    
      iex> RailsOnTiles.go("000000000")
      "BEH"
    
      iex> RailsOnTiles.go("111111111")
      "BCF"
    
      iex> RailsOnTiles.go("222222222")
      "BAD"
    
      iex> RailsOnTiles.go("000211112")
      "BEFIHEDGH"
    
      iex> RailsOnTiles.go("221011102")
      "BADGHIFEBCF"
    
      iex> RailsOnTiles.go("201100112")
      "BEHIFCBADEF"
    
      iex> RailsOnTiles.go("000111222")
      "BEFIH"
    
      iex> RailsOnTiles.go("012012012")
      "BC"
    
      iex> RailsOnTiles.go("201120111")
      "BEDABCFI"
    
      iex> RailsOnTiles.go("220111122")
      "BADEHGD"
    
      iex> RailsOnTiles.go("221011022")
      "BADG"
    
      iex> RailsOnTiles.go("111000112")
      "BCFIHEBA"
    
      iex> RailsOnTiles.go("001211001")
      "BEFI"
    
      iex> RailsOnTiles.go("111222012")
      "BCFEHIF"
    
      iex> RailsOnTiles.go("220111211")
      "BADEHI"
    
      iex> RailsOnTiles.go("211212212")
      "BCFEBAD"
    
      iex> RailsOnTiles.go("002112210")
      "BEFC"
    
      iex> RailsOnTiles.go("001010221")
      "BEF"
    
      iex> RailsOnTiles.go("100211002")
      "BEFIHG"
    
      iex> RailsOnTiles.go("201212121")
      "BEFCBAD"
      """
      def go(input) do
        String.codepoints(input)
        |> Enum.map(&String.to_integer/1)
        |> Enum.chunk_every(3)
        |> solve()
        |> Enum.map(&Enum.at(@alphabets, &1))
        |> Enum.map(&<<&1>>)
        |> Enum.join()
      end
    
      defp solve(field) do
        {x, y} = new_xy(1, -1, 2)
        do_solve(field, x, y, 2, [])
      end
    
      defp do_solve(_field, x, y, _dir, route) when x < 0 or x > 2 or y < 0 or y > 2, do: route
    
      defp do_solve(field, x, y, dir, route) do
        rev = get_in(@tiles, [Access.at(0), Access.at(dir)])
    
        nxt =
          get_in(@tiles, [
            get_in(field, [Access.at(y), Access.at(x)]) |> Access.at(),
            Access.at(rev)
          ])
    
        tile_num = y * 3 + x
    
        {x, y} = new_xy(x, y, nxt)
        do_solve(field, x, y, nxt, route ++ [tile_num])
      end
    
      defp new_xy(x, y, dir) do
        [dx, dy] = Enum.at(@dirs, dir)
        x = x + dx
        y = y + dy
    
        {x, y}
      end
    end
    

    Doctests


  • ## Examples 아래에있는 것은 Doctests이라는 것으로 테스트 할 수 있습니다
  • $ mix test
    ......................
    
    Finished in 0.08 seconds
    21 doctests, 1 test, 0 failures
    

    Wrapping Up 🎍🎍🎍🎍🎍


  • 문제를 해결하는 방법을 전혀 알지 못했습니다.
  • 모두가 다르다 모두들 (가네코 미스즈)
  • 여러분도 좋아하는 프로그래밍 언어로 써 보세요!

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