如何在函数式编程中映射 reduce 引用数据
How to map reduce referential data in functional programming
我想使用函数式编程制作一个基于图块的游戏。
游戏有6张牌,每张牌可以占一块。这是我的数据结构:
{
:pieces {
1 { :type 'p' }
2 { :type 'r' }
}
:tiles [{}
{}
{:current 1}
{}
{:current 2}
{}]
}
这是游戏图块的序列表示:
'00p0r0'
我需要一个函数将这个串行数据转换成我的数据结构。
有多种方法可以对此进行优化,但它应该会给您正确的想法。请参阅下面的代码以获取替代建议。
这里有趣的是您将固定的图块模型映射到可变块类型集上。将piece模型做成固定数组也会有效率
注意: 输入必须是字符串,而不是像您的示例那样使用单引号:(例如 "00p0r0"
与 '00p0r0'
).
(def empty-tile-map
{:piece-count 0
:pieces {}
:tiles (into [] (repeat 6 {}))})
(defn set-tile
"Sets the tile to the index reference to piece"
[arref indx value]
(assoc arref indx {:current value}))
(defn string-to-board-reducer
"Reduce function to create pieces and reference in tile"
[{:keys [piece-count tcount tiles] :as acc} x]
(let [ccnt (inc piece-count)
nmap (assoc acc :tcount (inc tcount))]
(if (> (int x) 48)
(assoc
(assoc
(update-in nmap [:pieces] assoc ccnt {:type x})
:tiles (set-tile tiles tcount ccnt))
:piece-count ccnt)
nmap)
))
(defn string-to-board
[s]
"Take serializated string and generate board"
(dissoc (reduce string-to-board-reducer
(assoc empty-tile-map :tcount 0) (seq s))
:tcount))
候补
根据定义,输入字符串隐式包含您想要的所有信息。可以定义一系列函数,将序列化字符串用作棋盘状态,并随时用新字符串替换它。只是一个建议。
我想使用函数式编程制作一个基于图块的游戏。
游戏有6张牌,每张牌可以占一块。这是我的数据结构:
{
:pieces {
1 { :type 'p' }
2 { :type 'r' }
}
:tiles [{}
{}
{:current 1}
{}
{:current 2}
{}]
}
这是游戏图块的序列表示:
'00p0r0'
我需要一个函数将这个串行数据转换成我的数据结构。
有多种方法可以对此进行优化,但它应该会给您正确的想法。请参阅下面的代码以获取替代建议。
这里有趣的是您将固定的图块模型映射到可变块类型集上。将piece模型做成固定数组也会有效率
注意: 输入必须是字符串,而不是像您的示例那样使用单引号:(例如 "00p0r0"
与 '00p0r0'
).
(def empty-tile-map
{:piece-count 0
:pieces {}
:tiles (into [] (repeat 6 {}))})
(defn set-tile
"Sets the tile to the index reference to piece"
[arref indx value]
(assoc arref indx {:current value}))
(defn string-to-board-reducer
"Reduce function to create pieces and reference in tile"
[{:keys [piece-count tcount tiles] :as acc} x]
(let [ccnt (inc piece-count)
nmap (assoc acc :tcount (inc tcount))]
(if (> (int x) 48)
(assoc
(assoc
(update-in nmap [:pieces] assoc ccnt {:type x})
:tiles (set-tile tiles tcount ccnt))
:piece-count ccnt)
nmap)
))
(defn string-to-board
[s]
"Take serializated string and generate board"
(dissoc (reduce string-to-board-reducer
(assoc empty-tile-map :tcount 0) (seq s))
:tcount))
候补 根据定义,输入字符串隐式包含您想要的所有信息。可以定义一系列函数,将序列化字符串用作棋盘状态,并随时用新字符串替换它。只是一个建议。