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 OR1N
danDG3N
dan
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.
Jawaban:
Ruby,
104988180 karakterContoh dijalankan (menggunakan data contoh Anda):
Ini menghasilkan
WP2N,DR1D,OG3O
dua kali karena Anda memiliki duaDR1D
dalam data sampel Anda.Penjelasan:
$*.combination(3).map{|c|
- masing-masing kombinasi dari 3 kartuputs c*?,if
- output set, jika ...(0..3).all?{|i|
- jika semua angka dari 0 hingga 3 (indeces dari properti dalam string) mengevaluasitrue
ketika dilewatkan ke blok inic.map{|x|x[i]}
- ambili
indeks th dari setiap string.uniq.size!=2}
- jika jumlah properti unik (bentuk, warna, dll.) bukan 2 (jadi, 1 atau 3)sumber
end
ditambah beberapa jeda baris: berubahif ... puts ... end
menjadiputs ... if ...
b) semua dapat mengambil blok, dengan demikianx.map{}.all?
sama denganx.all?{}
if
.Mathematica
93 92 93 93 82 7673Logika
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
kemudian dialihkan,
dan
Tally/@(Characters@#^T)
menghitung jumlah item berbeda di setiap baris.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
sumber
f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&
Keluaran akan{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
Mathematica 73
Pemakaian
sumber
Brachylog , 12 byte
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.
sumber
GolfScript, 53 karakter
Masukan harus diberikan di STDIN, contoh online :
Kode yang dikomentari:
sumber
0\zip{.&,2=|}/!
dapat disingkat menjadizip{.&,}%2&!
javascript
323313ini adalah fungsi yang mengambil array objek, dan mengembalikan array objek.
Biola DEMO (dengan rapi).
sumber
APL (IBM), 76
Saya tidak memiliki IBM APL, tetapi saya yakin ini akan berhasil.
Contoh dijalankan (Meniru IBM APL dalam Dyalog APL)
sumber
Sage, 71
Jika
C
sebuah string, katakan"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"
, jalankanmendapatkan
[{'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
:Saya sedikit jengkel karena
D
digunakan dua kali ... sampai saya menemukan cara untuk menyalahgunakannya. Tetapi lebih baik lagi, saya juga menyalahgunakanfind
metode ini.str.find
mengembalikan -1 jika surat tidak ditemukan. Karena-1 = 2 mod 3
, suratS
itu ditangani dengan tepat karena tidak terjadi pada'WODRPG123N'
.sumber
Python 2 , 99 byte
Cobalah online!
sumber