最近我写了一个Ruby程序来确定"Scramble Squares"拼图的解决方案:
我使用TDD来实现其中的大部分,导致测试看起来像这样:
it "has top, bottom, left, right" do
c = Cards.new
card = c.cards[0]
card.top.should == :CT
card.bottom.should == :WB
card.left.should == :MT
card.right.should == :BT
end
这适用于较低级别的帮助者"方法:识别" side"瓦片,确定瓦片是否可以有效地放置在网格中等等。
但是在编写实际算法以解决难题时遇到了问题。由于我不知道问题的有效可行解决方案,我不知道如何首先编写测试。
我最终编写了一个非常丑陋,未经测试的算法来解决它:
def play_game
working_states = []
after_1 = step_1
i = 0
after_1.each do |state_1|
step_2(state_1).each do |state_2|
step_3(state_2).each do |state_3|
step_4(state_3).each do |state_4|
step_5(state_4).each do |state_5|
step_6(state_5).each do |state_6|
step_7(state_6).each do |state_7|
step_8(state_7).each do |state_8|
step_9(state_8).each do |state_9|
working_states << state_9[0]
end
end
end
end
end
end
end
end
end
所以我的问题是:当你不知道有效输出时,如何使用TDD编写方法?
如果您有兴趣,请参阅GitHub上的代码:
答案 0 :(得分:8)
这不是一个直接的答案,但这让我想起了Peter Norvig和Ron Jeffries写的Sudoku求解器之间的the comparison。 Ron Jeffries的方法使用了经典的TDD,但他从来没有真正得到过一个好的解决方案。另一方面,Norvig能够在没有TDD的情况下非常优雅地解决它。
基本问题是:使用TDD可以出现算法吗?
答案 1 :(得分:1)
ScrambleSquares®的目标 益智游戏就是安排九个 五颜六色的插图方块 进入一个12“x 12”的方形使 碎片上的逼真图形' 边缘完美匹配形成一个 完成各个方向的设计。
因此,我要寻找的第一件事就是测试两个瓷砖在特定排列中是否相互匹配。这是关于你的有效性问题。如果没有正确的方法,您无法评估拼图是否已经解决。这似乎是一个很好的起点,是一个完美的解决方案。当然,它还不是算法。
match()
工作后,我们从哪里开始?嗯,一个明显的解决方案是蛮力:从网格中所有可能的瓦片排列的集合中,拒绝任何两个相邻瓦片不匹配的那些。这是一种算法,各种各样,并且它确实可以工作(尽管在许多难题中,宇宙的热量死亡发生在解决方案之前)。
如何收集沿给定边缘(LTRB)匹配的所有瓷砖对的集合?你能从那里得到更快的解决方案吗?当然,你可以很容易地测试它(并试驾它)。
测试不太可能给你算法,但它们可以帮助你思考算法,当然他们可以更容易地验证你的方法。
答案 2 :(得分:0)
不知道如果这个“回答”这个问题
分析“谜题” 9个瓷砖
每个都有4面
每个图块都有一半图案/图片
BRUTE FORCE APPROACH
解决这个问题 你需要生成9!组合(9个瓷砖X 8个瓷砖X 7个瓷砖......)
受到已经到位的当前图块的匹配边数量的限制
考虑方法
问有多少方面不同? IE有多少场比赛?
因此,9×4 = 36边/ 2(因为每边“必须”匹配至少另一边) 否则它是一个不可完成的谜题 注意:对于3 X 3拼图,至少12个必须“正确”匹配使用唯一字母
标记图块的每个匹配面然后建立一个包含每个瓦片的表格
每个瓷砖的表格需要4个条目
4个侧面(角落)因此4个组合
如果您将表格和INDEX排序到表格中
侧,tile_number
ABcd tile_1
BCda tile_1
CDab tile_1
DAbc tile_1
使用该表应该加快进度 因为你最多只需要匹配1或2个边 这限制了它必须做的非生产性瓷砖的数量
取决于图案/图片的设计
有3种组合(方向),因为每个瓷砖可以使用3个方向放置
- 相同(同一瓷砖的多个副本)
- 反思
- 轮换
使用TDD,
你会编写测试然后编写代码来解决问题的每个小部分,
如上所述,编写更多测试和代码来解决整个问题
不容易,你需要坐下来编写测试和代码来练习
注意:这是地图着色问题的变体
http://en.wikipedia.org/wiki/Four_color_theorem