Đây có phải là một trò chơi hợp lệ của Five Up (Dominoes) không?


8

Một tập hợp domino bao gồm các ô có hai số trên đó sao cho mọi tổ hợp số nguyên từ 0 đến N được biểu diễn. Các ví dụ dưới đây đề cập đến N = 6 vì sự tiện lợi, nhưng N = 9 và N = 12 cũng phổ biến. Hướng của gạch không quan trọng (chúng thường được in bằng dấu chấm chứ không phải chữ số), vì vậy [1-6][6-1]tham chiếu đến cùng một ô, trong đó chỉ có một trong một tập hợp.

Hầu hết các trò chơi được chơi với domino liên quan đến việc người chơi thay phiên nhau thêm domino vào một dòng của những người đã chơi trên bàn, sao cho một trong những số trên domino mới được đặt liền kề với cùng một số ở một đầu của dòng trên bàn. Do đó, bạn có thể thêm một [2-5]đầu vào của một dòng hiện có [2-3][3-3][3-5], sản xuất [5-2][2-3][3-3][3-5]hoặc [2-3][3-3][3-5][5-2].

Nhiều trò chơi như vậy đòi hỏi "nhân đôi", những quân cờ có hai số giống nhau trên chúng, được đặt vuông góc với các quân domino khác được kết nối với chúng. Ngoài việc ghi điểm mà chúng tôi không quan tâm ở đây, điều này không có tác dụng gì ngoại trừ khi ...

Nhiều trò chơi trong số đó sau đó cho phép "đường" rẽ nhánh ở một số hoặc tất cả gấp đôi. Five Up là một trò chơi như vậy trong đó dòng có thể rẽ thành 3 dòng mới ở mỗi đôi, vì vậy tất cả bốn cạnh của một đôi có thể có một domino phù hợp kèm theo.

Dưới đây là cách bố trí ví dụ về domino từ bộ "double 6" trong trò chơi Five Up (trong đó A | B hoặc AB là một domino duy nhất):

     4
     -
     0

3|0 0|0 0|2

     0
     -
     1

4|1 1|1 1|6
                3
     1          -
     -          6
     5
                6
6|5 5|5 5|0 0|6 - 6|2 2|1
                6
     5
     -          6
     4          -
                4

Nhiệm vụ của bạn là lấy một danh sách các quân cờ theo thứ tự chúng được thêm vào bảng và xác định xem thứ tự này có đại diện cho một trò chơi hợp pháp của Five Up hay không.

Bạn có thể viết toàn bộ chương trình lấy đầu vào từ stdin hoặc một hàm lấy đầu vào là một hoặc nhiều tham số.

Đầu vào Canonical sẽ là một danh sách hoặc một mảng gồm hai bộ số nguyên. Một danh sách các danh sách, mảng các mảng, vectơ của bộ dữ liệu, v.v ... đều là các dạng hợp lệ để lấy đầu vào, như là một chuỗi đại diện cho bất kỳ chuỗi nào ở trên hoặc nhiều chuỗi. Đầu vào sẽ chỉ chứa các cặp số nguyên không âm, domino hợp lệ.

Đầu ra phải là một giá trị trung thực hoặc falsey, cho các trò chơi hợp lệ và không hợp lệ tương ứng.

Mã của bạn nên chấp nhận số domino lớn tùy ý, trong khả năng của các giá trị nguyên tối đa của ngôn ngữ của bạn.

Ví dụ:

  • 0-6 là hợp lệ, như bất kỳ domino duy nhất khác
  • 0-6 6-0không hợp lệ, chỉ có một 0-6domino trong một bộ
  • 6-6 6-5 5-3 3-0 là hợp lệ, một sự sắp xếp tuyến tính đơn giản
  • 6-6 6-5 3-0 5-3không hợp lệ, không có 3hoặc 0chơi để domino thứ ba kết nối với trước khi 5-3được chơi
  • 1-1 1-2 1-3 1-4 1-5 1-6không hợp lệ, tất cả bốn 1kết thúc mở được sử dụng hết không để kết nối1-6
  • 1-1 1-2 1-3 1-4 1-5 3-6 1-6 là hợp lệ, 3-6 kết nối với 1-3, sau đó 1-6 có thể kết nối với 3-6
  • 5-5 5-4 5-0 0-6 6-6 6-4 6-2 2-1 6-3 5-1 1-1 1-6 4-1 1-0 0-0 2-0 3-0 0-4 là hợp lệ, ví dụ minh họa ở trên
  • 12-12 12-1 3-12 3-1 1-2 3-3 là hợp lệ, sử dụng domino lớn hơn và có một vị trí mơ hồ

LƯU Ý: Chức năng được yêu cầu ở đây không phải là một kiểm tra hoàn hảo cho các trò chơi Five Up hợp lệ. Chúng tôi đang bỏ qua ở đây các quy tắc về việc domino nào được chơi trước, sẽ yêu cầu thêm thông tin về biến thể của trò chơi và số lượng người chơi, và sẽ loại bỏ một số lượng đáng kể đầu vào.


Chúng ta có cần tính đến các ràng buộc hình học về vị trí, tức là chuỗi domino đâm vào chính nó không?
xnor

@xnor bạn không. Tôi quên đề cập đến quy ước chung rằng "đường kẻ" có thể uốn cong tùy ý để thuận tiện trong bất kỳ trò chơi domino nào. cũng tốt để tránh các cạnh bàn :)
Sparr

Tôi nghĩ rằng thể tạo ra một thứ tự chơi bệnh lý với một bộ 12 quân domino không thể tránh khỏi giao điểm. Nó chắc chắn có thể với các bộ lớn hơn. Hãy bỏ qua những trường hợp đó. Trường hợp xấu nhất, chúng có thể được giải quyết bằng cách uốn dòng trong 3D :)
Sparr

Chúng ta có thực sự cần phải có khả năng xử lý các domino có giá trị> 6 không? Nếu vậy, bạn có thể làm cho rõ ràng hơn trong thông số kỹ thuật và có thể thêm một trường hợp thử nghiệm. Mặt khác, mặc dù, thử thách tốt đẹp - +1 từ tôi.
Shaggy

@Shaggy đã thêm một trường hợp thử nghiệm cho một domino lớn hơn
Sparr

Câu trả lời:


1

Haskell , 188 174 168 byte

f(p:r)=[p]!r$p?p
(s!(p:r))o|b<-[p,reverse p]=or[(q:s)!r$q%o|q<-b,elem(q!!0)o,all(`notElem`s)b]
(s!_)o=1<3
p@[x,y]?r=[c|x==y,c<-p]++r
p@[x,y]%(a:r)|a/=x=a:p%r|z<-y:r=p?z

Hãy thử trực tuyến! Ví dụ sử dụng: f [[6,6],[6,5],[5,3],[3,0]]sản lượng True.

Ung dung:

f :: [[Int]] -> Bool
f (p:r) = check [p] (double p p) r

check :: [[Int]] -> [Int] -> [[Int]] -> Bool
check seen open [] = True
check seen open ([x,y]:r) = 
	  notElem [x,y] seen
   && notElem [y,x] seen
   && (elem x open && check ([x,y]:seen) (update [x,y] open) r 
   ||  elem y open && check ([y,x]:seen) (update [y,x] open) r)

double :: [Int] -> [Int] -> [Int]
double [x,y] rest = 
    if x==y 
    then [x,y] ++ rest 
    else rest

update :: [Int] -> [Int] -> [Int]
update [x,y] (a:rest) = 
    if x==a 
    then double [x,y] (y:rest) 
    else a : update [x,y] rest

Hãy thử trực tuyến!


0

R , 224 byte

function(L,x=c(),y=c()){o=T
z=length
if(z(L)){p=sort(L[1:2])
w=rep(p,2-(p[2]>p[1]))
x=rbind(p,x)
if(z(y)){m=match(p,y,0)
v=which.max(m)
if(m[v]>0){y=y[-m[v]]
w=w[-v]}}
y=c(y,w)
L=L[-1:-2]
o=o&f(L,x,y)&!sum(duplicated(x))}
o}

Hãy thử trực tuyến!

Mã nhận các phần dưới dạng một danh sách được sắp xếp và trả về TRUE hoặc FALSE theo thông số kỹ thuật. Hàm quét đệ quy từng mảnh, thêm mảnh vào chỉ mục để xác minh sự vắng mặt của các bản sao và theo dõi các điểm chèn có sẵn để kiểm tra xem mảnh đó có thể được thêm vào ngăn xếp một cách hiệu quả không. Việc xử lý các kết nối mảnh (ví dụ gắn 1-2 bằng 1 hoặc bằng 2) được thực hiện theo kiểu tham lam, do đó không hoàn toàn không thể một số cấu hình kỳ lạ có thể nổ tung.


tiếc là lòng tham không đủ tốt. xem xét 6-6 6-3 6-2 2-3bạn cần có khả năng xử lý việc này với 2-_hoặc 3-_tiếp theo vì 2-3có thể đã được đặt ở hai đầu.
Sparr

Tôi sẽ có một cái nhìn.
NofP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.