Game Set Puzzle

13

Mungkin Anda tahu permainan Set (permainan yang bagus untuk anak-anak), permainan kartu dengan 81 kartu, di mana setiap kartu memiliki angka di atasnya dengan 4 atribut yang berbeda (bentuk, jumlah, warna, dan isi). Setiap atribut memiliki 3 nilai berbeda:

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

12 kartu diletakkan terbuka di atas meja dan sekarang tantangannya adalah untuk menunjukkan set. Satu set terdiri dari tiga kartu di mana setiap nilai atribut terjadi 0, 1 atau 3 kali. memiliki 2 kartu dengan angka merah, atau buram, atau 1 angka tidak baik. Lihat tautan yang disediakan untuk penjelasan yang lebih visual.

Saya membayangkan kode untuk kartu di mana semua atribut dikodekan begitu

"WP2N"

berdiri untuk

2 Purple Waves with No fill

Bersama dengan misalnya OR1NdanDG3N

dan masukkan deskripsi gambar di sini

itu adalah satu set (3 bentuk berbeda, 3 warna berbeda, 3 angka berbeda, 1 isian).

Input adalah string kode unik yang dibatasi ruang (dipilih secara acak dari 81 kode yang mungkin) yang mewakili kartu.

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

Solusinya harus menunjukkan semua set yang mungkin dalam koleksi yang diberikan. Begitu

OR1N, WP2N, DG3N

harus menjadi bagian dari solusi bersama dengan semua set lainnya.

dr jerry
sumber
5
Kedengarannya menjanjikan, tetapi mohon tentukan dengan lebih tepat seperti apa data input yang perlu ditangani (stdin, file, parameter) dan bagaimana data input dan output akan terlihat. Juga memberikan representasi visual (tangkapan layar atau yang serupa) dari menjalankan sampel.
manatwork
1
Saya telah menarik kembali suara dekat saya dan membatalkan ini; itu sangat menarik! :)
Gagang Pintu
4
Apa yang Anda maksud dengan "permainan untuk anak-anak"?
stan
2
Waitaminute ... ada 4 huruf 4 yang berbeda: N, D, S, dan O.
boothby
1
@ bbyby: Saya akan mengatakan sebaliknya. Jika huruf tidak tumpang tindih, untuk setiap kandidat yang ditetapkan, Anda dapat menghitung berapa kali setiap huruf atau angka muncul: set tersebut valid jika dan hanya jika tidak ada angka atau huruf yang muncul dua kali.
flodel

Jawaban:

4

Ruby, 104 98 81 80 karakter

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

Contoh dijalankan (menggunakan data contoh Anda):

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

Ini menghasilkan WP2N,DR1D,OG3Odua kali karena Anda memiliki dua DR1Ddalam data sampel Anda.

Penjelasan:

$*.combination(3).map{|c|- masing-masing kombinasi dari 3 kartu
puts c*?,if- output set, jika ...
(0..3).all?{|i|- jika semua angka dari 0 hingga 3 (indeces dari properti dalam string) mengevaluasi trueketika dilewatkan ke blok ini
c.map{|x|x[i]}- ambil iindeks th dari setiap string
.uniq.size!=2}- jika jumlah properti unik (bentuk, warna, dll.) bukan 2 (jadi, 1 atau 3)

Gagang pintu
sumber
Dengan asumsi tantangan ini akan menjadi codegolf, bolehkah saya mengusulkan dua perbaikan: a) menyingkirkan endditambah beberapa jeda baris: berubah if ... puts ... endmenjadi puts ... if ...b) semua dapat mengambil blok, dengan demikian x.map{}.all?sama denganx.all?{}
Howard
@Berapa Terimakasih, saya akan melakukan perbaikan ketika saya sampai di komputer.
Gagang Pintu
@ Bagaimana Diedit untuk memasukkan keduanya. Terima kasih!
Gagang Pintu
Hapus juga ruang setelah if.
Howard
Saya suka solusi ruby, pendek, ringkas dan lebih mudah dibaca
dr jerry
5

Mathematica 93 92 93 93 82 76 73

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

Logika

StringSplit@#~Subsets~{3}menghasilkan daftar subset 3-kartu. Setiap rangkap tiga seperti:

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

atau

array 1

kemudian dialihkan,

array 2

dan Tally/@(Characters@#^T)menghitung jumlah item berbeda di setiap baris.

{3,1,1,3}

3 sesuai dengan "semua berbeda"; 1 sesuai dengan "semua sama".

FreeQ[...,2]menentukan apakah 2 kartu dengan jenis yang sama atau dalam rangkap tiga. Jika 2 bukan di antara penghitungan, maka tiga kartu adalah "set", menurut aturan Game of Set.


Pemakaian

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

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

DavidC
sumber
Ini bisa lebih pendek jika duplikat diizinkan. f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&Keluaran akan{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
alephalpha
Cara yang sangat cerdas untuk memeriksa "semua sama" atau "semua berbeda"!
DavidC
4

Mathematica 73

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

Pemakaian

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

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

alephalpha
sumber
4

Brachylog , 12 byte

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

Cobalah online!

Mengambil input melalui variabel input dan menghasilkan output melalui variabel output.

Test case kedua diambil dari duplikat yang baru saja ditutup dalam penyandiannya, karena solusi ini tidak terlalu peduli apa arti sebenarnya.

                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.
String yang tidak terkait
sumber
3

GolfScript, 53 karakter

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

Masukan harus diberikan di STDIN, contoh online :

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

Kode yang dikomentari:

" "/: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
Howard
sumber
2
Saya akan mengatakan pemenang yang jelas untuk golf kode. Hower benar-benar tidak dapat dibaca ..
dr jerry
1
@drjerry Dibandingkan dengan kode skrip golf lainnya cukup mudah dibaca. Misalnya hanya berisi loop biasa dan tidak ada trik canggih. Saya akan menambahkan penjelasan kode nanti.
Howard
0\zip{.&,2=|}/!dapat disingkat menjadizip{.&,}%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]}}}}}}

ini adalah fungsi yang mengambil array objek, dan mengembalikan array objek.

Biola DEMO (dengan rapi).

Chiller matematika
sumber
Anda tidak perlu mendeklarasikan variabel ...
Gagang Pintu
@ Doorknob saya ambil kembali, Anda benar. diedit. Terima kasih!
Math chiller
1

APL (IBM), 76

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

Saya tidak memiliki IBM APL, tetapi saya yakin ini akan berhasil.

Contoh dijalankan (Meniru IBM APL dalam 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 
TwiNight
sumber
Pertama kali saya melihat kode apl, terima kasih!
dr jerry
1

Sage, 71

Jika Csebuah string, katakan "OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D", jalankan

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

mendapatkan [{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]

Dan inilah pendekatan yang sangat berbeda menggunakan interpretasi bahwa Set adalah garis proyektif GF(3)^4:

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

Saya sedikit jengkel karena Ddigunakan dua kali ... sampai saya menemukan cara untuk menyalahgunakannya. Tetapi lebih baik lagi, saya juga menyalahgunakan findmetode ini. str.findmengembalikan -1 jika surat tidak ditemukan. Karena -1 = 2 mod 3, surat Situ ditangani dengan tepat karena tidak terjadi pada 'WODRPG123N'.

stan
sumber
0

Python 2 , 99 byte

lambda A:[a for a in combinations(A,3)if all(len(set(t))-2for t in zip(*a))]
from itertools import*

Cobalah online!

Chas Brown
sumber