如何使用TDD解决难以回答的拼图?

时间:2010-12-27 16:50:39

标签: tdd puzzle scramble

最近我写了一个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上的代码:

3 个答案:

答案 0 :(得分:8)

这不是一个直接的答案,但这让我想起了Peter Norvig和Ron Jeffries写的Sudoku求解器之间的the comparison。 Ron Jeffries的方法使用了经典的TDD,但他从来没有真正得到过一个好的解决方案。另一方面,Norvig能够在没有TDD的情况下非常优雅地解决它。

基本问题是:使用TDD可以出现算法吗?

答案 1 :(得分:1)

来自puzzle website

  

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个方向放置   - 相同(同一瓷砖的多个副本)
  - 反思
  - 轮换

如果他们决定让生活变得非常困难,上帝会帮助我们 通过在另一侧放置类似的图案/图片,也需要匹配 或者甚至将瓷砖制成立方体并匹配6面!!!

使用TDD,
你会编写测试然后编写代码来解决问题的每个小部分,
如上所述,编写更多测试和代码来解决整个问题

不容易,你需要坐下来编写测试和代码来练习

注意:这是地图着色问题的变体
http://en.wikipedia.org/wiki/Four_color_theorem