2차원 리스트의 움직임을 바라보는 것을 시도했다(Elixir)

18175 단어 Elixir

소개



  • @ 나스 _ 주먹밥 님의 2차원 배열의 움직임을 바라보는 함수를 만들었다(Python)을 쳐다 보았습니다.

    0. 준비



  • Elixir을 설치합시다
  • 앞에 된장인 기사입니다만 Elixir 등 참고로 해 주세요
  • 프로젝트를 만들어 둡니다
  • $ mix new list_of_lists
    $ cd list_of_lists
    

    1. 소스 코드 작성


  • 예, 동

  • lib/list_of_lists.ex
    defmodule ListOfLists do
      @n 3
      @m 3
      @timeout 1000
    
      def main do
        [head | tail] = results()
    
        print({head, {nil, nil}})
        Process.sleep(@timeout)
    
        Enum.zip(tail, for(i <- 0..(@n - 1), j <- 0..(@m - 1), do: {i, j}))
        |> Enum.zip(List.duplicate(@timeout, @n * @m))
        |> Enum.flat_map(fn {a, b} -> [a, b] end)
        |> Enum.each(&print/1)
    
        Enum.at(tail, -1) |> to_s(@n - 1, @m - 1, false) |> IO.puts()
      end
    
      defp results do
        for(i <- 0..(@n - 1), j <- 0..(@m - 1), do: {i, j})
        |> Enum.reduce([init_list_of_lists(@n, @m)], fn {i, j}, acc ->
          last =
            Enum.at(acc, -1)
            |> get_and_update_in([Access.at(i), Access.at(j)], &{&1, pow(3, i + j)})
            |> elem(1)
    
          acc ++ [last]
        end)
      end
    
      defp init_list_of_lists(n, m) do
        1..n |> Enum.map(fn _ -> List.duplicate(0, m) end)
      end
    
      defp print(n) when is_integer(n), do: Process.sleep(n)
    
      defp print({list_of_lists, {i, j}}) do
        to_s(list_of_lists, i, j)
        |> IO.puts()
      end
    
      defp to_s(list_of_lists, i, j, move \\ true, count \\ 5) do
        for(k <- 0..(@n - 1), l <- 0..(@m - 1), do: {k, l})
        |> Enum.map(fn {k, l} ->
          value_with_leading =
            get_in(list_of_lists, [Access.at(k), Access.at(l)])
            |> Integer.to_string()
            |> String.pad_leading(count)
    
          if k == i && l == j do
            "\x1b[31m#{value_with_leading}\x1b[0m"
          else
            value_with_leading
          end
        end)
        |> Enum.chunk_every(@m)
        |> Enum.map(&Enum.join/1)
        |> Enum.join("\n")
        |> (fn s -> "(#{i}, #{j})\n" <> s end).()
        |> (fn s -> if(move, do: s <> "\x1b[#{@n + 1}A", else: s) end).()
      end
    
      defp pow(_, 0), do: 1
    
      defp pow(n, m), do: n * pow(n, m - 1)
    end
    
  • 2차원 목록 업데이트를 위해 설치
  • 이런 편리한 함수를 처음으로 사용해 보았습니다
  • 동료에는 다음과 같은 것이 있습니다
  • Kernel.get_and_update_in/3
  • Kernel.get_in/2
  • 링크 된 샘플을 보면 어떤 것을 이해할 수 있습니다.


  • Kernel.put_in/3 라고 사고 나서 거의 읽지 않은 책에 그렇게 말하면 ○、✗ 게임의 데이터 구조의 설명으로 편리한 함수를 사용하고 있었던 것을 생각해 내고 나서 나서 기억해 냈습니다
  • list_of_lists라는 표현은 Designing Elixir Systems With OTP: Write Highly Scalable, Self-Healing Software With Layers의 인수 이름으로 사용되며 목록의 각 요소가 목록 인 경우 원어민이 될 것이라고 생각합니다.

  • '\033' ESC"\0x1b"

  • ぃ st. 지 p/1에서 알았습니다


  • 2. 실행


    $ iex -S mix
    
    iex> ListOfLists.main
    

    전 기사

    Wrapping Up



  • Elixir 는 공식 문서를 읽는 것이 제일!
  • 어느 정도 익숙해지면 전제가 있다고 생각합니다
  • 어느 정도를 더 구체적으로 말하면,

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