2010-12-27 28 views
9

Gần đây tôi đã viết một chương trình Ruby để xác định các giải pháp cho một câu đố "Scramble Squares" ngói:Làm thế nào tôi có thể sử dụng TDD để giải quyết một câu đố với một câu trả lời không xác định?

tôi đã sử dụng TDD để thực hiện hầu hết của nó, dẫn đến kiểm tra mà trông như thế này:

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 

Điều này làm việc tốt cho các phương thức "trợ giúp" cấp thấp hơn: xác định "các cạnh" của một ô, xác định xem một lát có thể được đặt hợp lý vào lưới không, v.v.

Nhưng tôi chạy vào một vấn đề khi viết mã thuật toán thực tế để giải câu đố. Vì tôi không biết các giải pháp có thể hợp lệ cho vấn đề này, Tôi không biết cách viết bài kiểm tra trước.

tôi đã kết thúc viết một khá xấu xí, chưa được kiểm tra, thuật toán để giải quyết nó:

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 

Vì vậy, câu hỏi của tôi là: làm thế nào để bạn sử dụng TDD để viết một phương pháp khi bạn chưa biết đầu ra hợp lệ?

Nếu bạn quan tâm, mã là trên GitHub:

Trả lời

8

Đây không phải là câu trả lời trực tiếp, nhưng điều này nhắc tôi về số the comparison giữa các trình giải Sudoku được viết bởi Peter Norvig và Ron Jeffries. Cách tiếp cận của Ron Jeffries đã sử dụng TDD cổ điển, nhưng anh ta chưa bao giờ thực sự có một giải pháp tốt. Norvig, mặt khác, đã có thể giải quyết nó rất tao nhã mà không có TDD.

Câu hỏi cơ bản là: thuật toán có thể xuất hiện bằng TDD không?

+0

tôi sẽ nghĩ rằng bạn sẽ phải biết một thuật toán (hoặc ít nhất là phần của nó) trước khi bạn có thể viết các bài kiểm tra cho nó. 1 cho liên kết, rất thú vị. –

+1

http://pindancing.blogspot.com/2009/09/sudoku-in-coders-at-work.html được liên kết từ liên kết của bạn dường như thảo luận về một loại "câu trả lời" cho o.p. –

+0

Cảm ơn mọi người đã liên kết. Dường như trong không gian vấn đề ** đặc biệt ** (tạo ra một thuật toán để giải một câu đố), cách tiếp cận của "kiểm tra sử dụng để tìm ra thiết kế khi bạn đi" có xu hướng dẫn đến các giải pháp vụng về hoặc không hiệu quả. Nó nhắc tôi về [những lời chỉ trích của TDD] (http://www.dalkescientific.com/writings/diary/archive/2009/12/29/problems_with_tdd.html). Tôi không chắc bạn có thể đưa ra thêm bất kỳ phán xét nào về quá trình này hay không. Ít nhất, tôi rất vui khi có các phương pháp cấp thấp hơn (và được thử nghiệm) sẵn có trước khi đi sâu vào giải quyết vấn đề thực tế. – matthewsteele

1

Từ puzzle website:

Đối tượng của hình vuông Scramble Squares® pu zzle trò chơi là sắp xếp chín các hình vuông được minh họa đầy màu sắc thành hình vuông 12 "x 12" sao cho hình ảnh thực tế trên các mảnh ' cạnh hoàn toàn phù hợp để tạo thành một thiết kế hoàn chỉnh theo mọi hướng.

Vì vậy, một trong những điều đầu tiên tôi sẽ tìm kiếm là kiểm tra xem hai ô, theo một sắp xếp cụ thể có khớp với nhau hay không. Điều này liên quan đến câu hỏi của bạn về tính hợp lệ. Nếu không có phương pháp đó hoạt động chính xác, bạn không thể đánh giá liệu câu đố đã được giải quyết chưa. Điều đó có vẻ giống như một điểm khởi đầu tốt đẹp, một mảnh cắn đẹp về phía giải pháp đầy đủ. Nó không phải là một thuật toán, tất nhiên.

Khi match() đang hoạt động, chúng tôi sẽ đi đâu từ đây? Vâng, một giải pháp rõ ràng là sức mạnh vũ phu: từ tập hợp tất cả các sắp xếp có thể có của các viên gạch trong lưới, từ chối những nơi mà bất kỳ hai gạch liền kề không phù hợp. Đó là một thuật toán, các loại, và nó khá chắc chắn để làm việc (mặc dù trong nhiều câu đố cái chết nhiệt của vũ trụ xảy ra trước khi một giải pháp).

Làm thế nào về việc thu thập tập hợp của tất cả các cặp ô xếp theo một cạnh nhất định (LTRB)? Bạn có thể nhận được từ đó đến một giải pháp, nhanh hơn? Chắc chắn bạn có thể kiểm tra nó (và lái thử nó) một cách dễ dàng đủ.

Bài kiểm tra không thể cung cấp cho bạn một thuật toán, nhưng chúng có thể giúp bạn suy nghĩ về thuật toán và tất nhiên họ có thể xác thực phương pháp của bạn dễ dàng hơn.

0

dunno nếu điều này "câu trả lời" câu hỏi hoặc

phân tích của "câu đố"

9 gạch
từng có 4 bên
mỗi ngói có một nửa mẫu/hình ảnh

BRUTE FORCE APPROACH

để giải quyết vấn đề này bạn cần tạo 9! kết hợp (9 gạch X 8 gạch X 7 gạch ...)

bị giới hạn bởi số lượng các bên phù hợp với gạch hiện tại (s) đã được tại chỗ

XÉT TIẾP CẬN

Q bao nhiêu bên là khác nhau? IE có bao nhiêu kết quả phù hợp?

do đó 9 X 4 = 36 bên/2 (vì mỗi bên "phải" trận đấu ít nhất 1 bên kia)
nếu không nó một câu đố uncompleteable
LƯU Ý: ít nhất 12 phải phù hợp "đúng" cho 3 X 3 câu đố

nhãn mỗi bên kết hợp của một gạch sử dụng thư độc đáo

sau đó xây dựng một bảng cầm mỗi ngói
bạn sẽ cần 4 mục vào bảng cho mỗi ngói
4 bên (góc) vì thế 4 kết hợp
nếu bạn sắp xếp bảng ở bên cạnh và INDEX vào bảng

bên, tile_number
ABCD tile_1
BCda tile_1
CDab tile_1
DAbc tile_1

sử dụng bảng nên điều tốc độ lên
vì bạn chỉ cần phải đối sánh 1 hoặc 2 mặt tại hầu hết các
điều này giới hạn số lượng lát KHÔNG SẢN PHẨM đặt nó phải làm

tùy thuộc vào thiết kế của mô hình/hình ảnh
có 3 kết hợp (định hướng) vì mỗi ngói có thể được đặt bằng 3 phương hướng
- như nhau (nhiều bản sao của gạch giống nhau)
- phản ánh
- xoay

Chúa phù hộ cho chúng tôi nếu họ quyết định làm cho cuộc sống rất khó khăn
bằng cách đặt tương tự như mô hình/hình ảnh ở phía bên kia mà cũng cần phải phù hợp
HOẶC thậm chí làm cho gạch thành miếng vuông và phù hợp với 6 bên !!!

Sử dụng TDD,
bạn sẽ viết các bài kiểm tra và sau đó mã để giải quyết từng phần nhỏ của vấn đề,
như đã nêu ở trên và viết bài kiểm tra và mã hơn để giải quyết toàn bộ vấn đề

NO nó không dễ dàng, bạn cần phải ngồi xuống và viết bài kiểm tra và mã để thực hành

Chú ý: đây là một biến thể của vấn đề màu bản đồ

Các vấn đề liên quan