2017-04-15 3 views
0

2dマップを作成していて、空の値であらかじめ入力しています。Elixirのループでマップを作成する方法

私はエリクサーでは動作しませんが、これは私がやろうとしていることです。

def empty_map(size_x, size_y) do 
    map = %{} 

    for x <- 1..size_x do 
    for y <- 1..size_y do 
     map = Map.put(map, {x, y}, " ") 
    end 
    end 
end 

それから私は、私は2次元配列としてそれをやって試してみましたが、キーがで動作するように簡単になりますように私は、座標touplesとフラットなマップを考える

def create_room(map, {from_x, from_y}, {width, height}) do 
    for x in from_x..(from_x + width) do 
    for y in from_x..(from_x + width) do 
     if # first line, or last line, or first col, or last col 
     map = Map.replace(map, x, y, '#') 
     else 
     map = Map.replace(map, x, y, '.') 
     end 
    end 
    end 
end 

のように、そのマップ上に図形を描画します。

私は再帰を使用するはずですが、私は実際にはエレガントにそれを行う方法の良いアイデアを持っていないとこのシナリオは今後も続くと私はこれを行う簡単な/普遍的な方法を見ていない。

答えて

2

代わりに再帰関数を自分で書くので、アキュムレータとしてマップを渡し、ここでは2つの入れ子Enum.reduce/3を使用することができます。

defmodule A do 
    def empty_map(size_x, size_y) do 
    Enum.reduce(1..size_x, %{}, fn x, acc -> 
     Enum.reduce(1..size_y, acc, fn y, acc -> 
     Map.put(acc, {x, y}, " ") 
     end) 
    end) 
    end 
end 

IO.inspect A.empty_map(3, 4) 

出力:

%{{1, 1} => " ", {1, 2} => " ", {1, 3} => " ", {1, 4} => " ", {2, 1} => " ", 
    {2, 2} => " ", {2, 3} => " ", {2, 4} => " ", {3, 1} => " ", {3, 2} => " ", 
    {3, 3} => " ", {3, 4} => " "} 
+0

ちょうど私が必要なもの、感謝! Btwに 'end 'のビットで括弧を取り除く方法がありますか? – hakunin

+1

はい、 'reduce(' reduce 'と' end) 'を' end'で置き換えることができます。議論が長くても、私はそれらを書くのが好きですが、オプションです。 – Dogbert

1

別のアプローチは、リストのタプルを作成することですそれを地図に変換します。

iex(18)> defmodule Room do 
...(18)> def empty_map(size_x, size_y) do 
...(18)>  for x <- 1..size_x, y <- 1..size_y do 
...(18)>  {{x,y}, " "} 
...(18)>  end 
...(18)>  |> Enum.into(%{}) 
...(18)> end 
...(18)> 
...(18)> def create_room(map, {from_x, from_y}, {width, height}) do 
...(18)>  last_x = from_x + width 
...(18)>  last_y = from_y + height 
...(18)>  for x <- from_x..last_x, y <- from_y..last_y do 
...(18)>  if x == from_x or x == last_x or y == from_y or y == last_y, 
...(18)>   do: {{x, y}, "#"}, else: {{x, y}, "."} 
...(18)>  end 
...(18)>  |> Enum.into(map) 
...(18)> end 
...(18)> end 
warning: redefining module Room (current version defined in memory) 
    iex:18 

{:module, Room, 
<<70, 79, 82, 49, 0, 0, 10, 244, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 1, 10, 
    131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 
    95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:create_room, 3}} 


iex(19)> Room.empty_map(3,4) |> Room.create_room({1,2}, {3,3}) 
%{{1, 1} => " ", {1, 2} => "#", {1, 3} => "#", {1, 4} => "#", {1, 5} => "#", 
    {2, 1} => " ", {2, 2} => "#", {2, 3} => ".", {2, 4} => ".", {2, 5} => "#", 
    {3, 1} => " ", {3, 2} => "#", {3, 3} => ".", {3, 4} => ".", {3, 5} => "#", 
    {4, 2} => "#", {4, 3} => "#", {4, 4} => "#", {4, 5} => "#"} 
iex(20)> 
関連する問題