Trò chơi giải đố


13

Có thể bạn biết trò chơi Set (một trò chơi tuyệt vời dành cho trẻ em btw) một trò chơi bài với 81 lá bài, trong đó mỗi lá bài có một hình trên đó với 4 thuộc tính khác nhau (hình thức, số, màu sắc và điền). Mỗi thuộc tính có 3 giá trị khác nhau:

form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.

12 thẻ được đặt trên bàn và bây giờ thử thách là chỉ ra các bộ. Một bộ bao gồm ba thẻ trong đó mọi giá trị thuộc tính xảy ra 0, 1 hoặc 3 lần. có 2 thẻ có số liệu màu đỏ, hoặc mờ hoặc 1 số là không tốt. Xem liên kết được cung cấp để giải thích trực quan hơn.

Tôi hình dung một mã cho một thẻ trong đó tất cả các thuộc tính được mã hóa để

"WP2N"

là viết tắt của

2 Purple Waves with No fill

Cùng với ví dụ OR1NDG3N

nhập mô tả hình ảnh ở đây

nó là một bộ (3 hình thức khác nhau, 3 màu khác nhau, 3 số khác nhau, 1 điền).

Đầu vào là chuỗi được phân tách bằng dấu cách của các mã duy nhất (được chọn ngẫu nhiên trong số 81 mã có thể) đại diện cho thẻ.

"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"

Giải pháp phải chỉ ra tất cả các bộ có thể có trong bộ sưu tập đã cho. Vì thế

OR1N, WP2N, DG3N

phải là một phần của giải pháp cùng với tất cả các bộ khác.


5
Âm thanh đầy hứa hẹn, nhưng vui lòng chỉ định chính xác hơn loại dữ liệu đầu vào nào cần được xử lý (stdin, tệp, tham số) và dữ liệu đầu vào và đầu ra sẽ như thế nào. Cũng cung cấp một đại diện trực quan (ảnh chụp màn hình hoặc tương tự) của một lần chạy mẫu.
thao tác

1
Tôi đã rút lại phiếu bầu gần của mình và ủng hộ điều này; nó rất thú vị :)
Doorknob

4
Bạn có ý gì khi nói "trò chơi cho trẻ em"?
gian hàng

2
Wa vitaminute ... có 4 chữ cái thứ 4 khác nhau: N, D, S và O.
boothby 17/10/13

1
@boothby: Tôi sẽ nói ngược lại. Nếu bảng chữ cái không trùng nhau, đối với mỗi bộ ứng cử viên, bạn chỉ có thể đếm số lần mỗi chữ cái hoặc số hiển thị: bộ đó hợp lệ khi và chỉ khi không có số hoặc chữ cái xuất hiện hai lần.
flodel

Câu trả lời:


4

Ruby, 104 98 81 80 ký tự

$*.combination(3).map{|c|puts c*?,if(0..3).all?{|i|c.map{|x|x[i]}.uniq.size!=2}}

Chạy mẫu (sử dụng dữ liệu mẫu của bạn):

c:\a\ruby>set.rb OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
OR1N,WP2N,DG3N
WP2N,DR1D,OG3O
WP2N,DR1D,OG3O
DG3N,WG3S,OG3O

Nó xuất ra WP2N,DR1D,OG3Ohai lần vì bạn có hai DR1Ds trong dữ liệu mẫu của mình.

Giải trình:

$*.combination(3).map{|c|- mỗi tổ hợp gồm 3 thẻ
puts c*?,if- xuất tập hợp, nếu ...
(0..3).all?{|i|- nếu tất cả các số từ 0 đến 3 (phân của các thuộc tính trong chuỗi) ước tính truekhi được chuyển vào khối này
c.map{|x|x[i]}- hãy lấy ichỉ số thứ của mỗi chuỗi
.uniq.size!=2}- nếu số lượng thuộc tính duy nhất (hình thức, màu sắc, v.v.) không phải là 2 (vì vậy, 1 hoặc 3)


Giả sử thử thách này sẽ trở thành codegolf, tôi có thể đề xuất hai cải tiến: a) loại bỏ endcộng với một số ngắt dòng: chuyển đổi if ... puts ... endthành puts ... if ...b) tất cả đều có thể có một khối, do đó, x.map{}.all?tương đương vớix.all?{}
Howard

@How Cảm ơn, tôi sẽ thực hiện những cải tiến đó khi tôi đến máy tính.
Doorknob

@Howard Chỉnh sửa để bao gồm cả hai. Cảm ơn!
Doorknob

Cũng loại bỏ không gian sau if.
Howard

Tôi thích giải pháp ruby, ngắn gọn, súc tích và ít nhiều có thể đọc được
dr jerry

5

Toán học 93 92 93 82 76 73

f={}⋃Select[StringSplit@#~Subsets~{3}, FreeQ[Tally/@(Characters@#^T),2]&]&

Hợp lý

StringSplit@#~Subsets~{3}tạo ra một danh sách các tập con 3 thẻ. Mỗi bộ ba như:

{{"D", "G", "3", "N"}, {"W", "G", "3", "S"}, {"O", "G", "3", "O"}}

hoặc là

mảng 1

sau đó được chuyển đổi,

mảng 2

Tally/@(Characters@#^T)số lượng các mặt hàng riêng biệt trong mỗi hàng.

{3,1,1,3}

3 tương ứng với "tất cả khác nhau"; 1 tương ứng với "tất cả giống nhau".

FreeQ[...,2]xác định xem 2 thẻ cùng loại hoặc trong bộ ba. Nếu 2 không nằm trong số các nàng tiên, thì ba lá bài là một "bộ", theo quy tắc của Game of Set.


Sử dụng

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{"DG3N", "WG3S", "OG3O"}, {"OR1N", "WP2N", "DG3N"}, {"WP2N", "DR1D", "OG3O"}}


Nó có thể ngắn hơn nếu trùng lặp được cho phép. f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&Đầu ra sẽ là{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
alephalpha

Cách rất thông minh để kiểm tra "tất cả giống nhau" hay "tất cả khác nhau"!
DavidC

4

Toán học 73

f = Select[StringSplit@#~Subsets~{3}, FreeQ[Tally /@ Thread@Characters@#, 2] &] &

Sử dụng

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{"OR1N", "WP2N", "DG3N"}, {"WP2N", "DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "W3 "," OG3O "}}


4

Brachylog , 12 byte

ṇ₁⊇Ṫz{=|≠}ᵐz

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

Đưa đầu vào qua biến đầu vào và tạo đầu ra thông qua biến đầu ra.

Trường hợp thử nghiệm thứ hai được lấy từ một bản sao đóng gần đây trong mã hóa của nó, vì giải pháp này không thực sự quan tâm bất cứ điều gì thực sự có nghĩa là gì.

                The output variable is
  ⊇             a subsequence
   Ṫ            of length 3
ṇ₁              of the input split on spaces,
    z      z    the columns of which
     {   }ᵐ     are all
       |        either
      =         the same element repeated,
        ≠       or entirely free of duplicates.


3

GolfScript, 53 ký tự

" "/:w,,{:a,{:^,{a^]{w=}%.0\zip{.&,2=|}/!{.p}*;}/}/}/

Đầu vào phải được cung cấp trên STDIN, ví dụ trực tuyến :

> OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D
["OR1N" "DG3N" "WP2N"]
["WP2N" "OG3O" "DR1D"]
["DG3N" "OG3O" "WG3S"]
["WR2D" "OR2D" "DR2D"]

Mã nhận xét:

" "/:w          # split the input at spaces and assign it to variable w
,,              # create the array [0..n-1] (n being the length of w)
{:a,{:^,{       # three nested loops: a=0..n-1, ^=0..a-1, _=0..b-1 
                # (third loop has no variable assigned but just pushes on stack)
    a^]         # make an array [a,^,_] of the three loop variables
    {w=}%       # take the corresponding list items, i.e. [w[a],w[^],w[_]]
    .0\         # push zero, add duplicate of the the array
    zip         # zip transposes the array, thus [OR1N WP2N DG3N] -> [OWD RPG 123 NNN]
    {           # loop over those entries
      .&        # unique
      ,2=       # length equals 2?
      |         # "or" with top of stack (two zero pushed before)
    }/          # end of loop, on stack remains the results of the "or"s
    !{.p}*      # if no length of 2 is there, make a copy of the set and print it
    ;           # discard stack item
}/}/}/          # closing the three nested loops

2
Tôi sẽ nói một người chiến thắng rõ ràng cho một golf-code. Hower hoàn toàn không thể đọc được ..
dr jerry

1
@drjerry So với các mã golf khác, nó khá dễ đọc. Ví dụ, nó chỉ chứa các vòng lặp đơn giản và không có thủ thuật nâng cao. Tôi sẽ thêm một lời giải thích về mã sau.
Howard

0\zip{.&,2=|}/!có thể rút ngắn thànhzip{.&,}%2&!
Peter Taylor

1

javascript 323 313

function a(b){d=h=[];c=e=f=0;for(i in b){for(j in b){for(k in b[i]){if(b[i][k]==b[j][k]){if(c+f<4)c++;else if(c==4){h+=b[j];if(h.length=3)return h}}else{for(l in d){for(m in d[l]){g=f;if(d[l][2]==i){if(d[l][3]==k)if(b[j][k]!=d[l][0]&&b[j][k]!=d[l][1])f++;}else{continue}}if(g==f)d[e++]=[b[i][k],b[j][k],j,k]}}}}}}

nó là một hàm lấy một mảng các đối tượng và trả về một mảng các đối tượng.

DEMO fiddle (với sự gọn gàng).


Bạn không phải khai báo các biến ...
Doorknob

@Doorknob tôi lấy lại, bạn nói đúng. chỉnh sửa. cảm ơn!
làm lạnh toán học

1

APL (IBM), 76

⍉¨x/⍨{{⍵≡1⌽⍵}⍵=1⌽⍵}¨x←⊃¨(∘.,/3⍴⊂⍪¨(' '≠y)⊂y←⍞)⌷⍨¨z/⍨∧/¨2</¨z←,⍳3⍴12

Tôi không có IBM APL, nhưng tôi tin rằng nó sẽ hoạt động.

Chạy mẫu (Thi đua IBM APL trong Dyalog APL)

OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
 OR1N  WP2N  WP2N  DG3N 
 WP2N  DR1D  DR1D  WG3S 
 DG3N  OG3O  OG3O  OG3O 

Lần đầu tiên tôi thấy mã apl cảm ơn!
dr jerry

1

Hiền nhân, 71

Nếu Clà một chuỗi, giả sử "OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D", thực thi

[c for c in Subsets(C.split(),3)if{1,3}>={len(set(x))for x in zip(*c)}]

để có được [{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]

Và đây là một cách tiếp cận rất khác bằng cách giải thích rằng Tập hợp là một đường chiếu trong GF(3)^4:

[c for c in Subsets(C.split(),3)if sum(matrix(3,map('WODRPG123N'.find,''.join(c))))%3==0]

Tôi hơi khó chịu khi Dđược sử dụng hai lần ... cho đến khi tôi tìm ra cách lạm dụng nó. Nhưng thậm chí tốt hơn, tôi lạm dụng findphương pháp, quá. str.findtrả về -1 nếu không tìm thấy chữ cái. Vì -1 = 2 mod 3, bức thư Sđược xử lý thích hợp vì nó không xảy ra 'WODRPG123N'.


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.