Set Yapboz Oyunu


13

Set oyununu biliyor olabilirsiniz (çocuklar için harika bir oyun) 81 kartlı bir kart oyunu, her kartın üzerinde 4 farklı özellik (şekil, sayı, renk ve dolgu) bulunan bir figür vardır. Her özelliğin 3 farklı değeri vardır:

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

12 kart masaya açık olarak yerleştirilir ve şimdi meydan okuma takımları belirtmektir. Bir set, her özellik değerinin 0, 1 veya 3 kez oluştuğu üç karttan oluşur. Kırmızı kartlı veya opak veya 1 numaradan oluşan 2 karta sahip olmak iyi değildir. Daha görsel bir açıklama için verilen bağlantıya bakın .

Ben tüm nitelikleri böylece kodlanmış bir kart için bir kod öngörmek

"WP2N"

anlamına gelir

2 Purple Waves with No fill

Örneğin ile birlikte OR1NveDG3N

ve resim açıklamasını buraya girin

bir settir (3 farklı form, 3 farklı renk, 3 farklı sayı, 1 dolgu).

Giriş, kartları temsil eden, benzersiz kodların (81 olası koddan rastgele seçilen) alanla sınırlandırılmış dizesidir.

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

Çözüm, verilen koleksiyon içindeki tüm olası kümeleri göstermelidir. Yani

OR1N, WP2N, DG3N

diğer tüm setlerle birlikte çözümün bir parçası olmalıdır.


5
Umut vericidir, ancak lütfen ne tür giriş verilerinin (stdin, dosya, parametre) ele alınması gerektiğini ve giriş ve çıkış verilerinin nasıl görüneceğini daha kesin bir şekilde belirtin. Ayrıca örnek bir çalışmanın görsel bir sunumunu (ekran görüntüsü veya benzeri) sağlayın.
manatwork

1
Yakın oyumu geri çektim ve bunu iptal ettim; bu çok ilginç! :)
Kapı Tokmağı

4
"Çocuklar için oyun" demekle ne demek istiyorsun?
boothby

2
Waitaminute ... 4 farklı 4. harf var: N, D, S ve O.
boothby

1
@boothby: Tam tersini söylerdim. Alfabeler çakışmazsa, her aday kümesi için, her harf veya rakamın kaç kez göründüğünü sayabilirsiniz: küme, yalnızca iki sayı veya harf görünmüyorsa geçerlidir.
flodel

Yanıtlar:


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}}

Örnek çalışma (örnek verilerinizi kullanarak):

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

WP2N,DR1D,OG3Oİki kere çıktı verir, çünkü DR1Dörnek verilerinizde iki s bulunur.

Açıklama:

$*.combination(3).map{|c|- 3 karttan oluşan her bir kombinasyon
puts c*?,if- setin çıktısını al, eğer ...
(0..3).all?{|i|- 0 ile 3 arasındaki tüm sayılar (dizgideki özelliklerin işaretleri) truebu bloğa geçtiğinde değerlendirilirse
c.map{|x|x[i]}- iher dizenin th dizinini al
.uniq.size!=2}- benzersiz özelliklerin miktarı (form, renk vb.) 2 değilse (yani, 1 veya 3)


Kurtulmak a): bu zorluğu varsayarsak İki iyileştirmeler önerebilir, codegolf olacak endartı birkaç satır sonları: dönüşümü if ... puts ... endiçine puts ... if ...bütün bir blok sürebilir) b, böylece x.map{}.all?eşittirx.all?{}
Howard

@ Nasıl teşekkürler, bir bilgisayara geldiğimde bu iyileştirmeleri yapacağım.
Kapı tokmağı

@Howard Her ikisini de içerecek şekilde düzenlendi. Teşekkürler!
Kapı tokmağı

Ayrıca sonraki alanı da kaldırın if.
Howard

Yakut çözümü beğendim, kısa, özlü veya az ya da çok okunabilir
dr jerry

5

Mathematica 93 92 93 82 76 73

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

Mantık

StringSplit@#~Subsets~{3}3 kartlı alt kümelerin bir listesini oluşturur. Her üçlü gibi:

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

veya

dizi 1

sonra aktarılır,

dizi 2

ve Tally/@(Characters@#^T)her satırdaki ayrı öğelerin sayısını hesaplar.

{3,1,1,3}

3, "hepsi farklı" ya karşılık gelir; 1 "hepsi aynı" ya karşılık gelir.

FreeQ[...,2]aynı tipte veya üçlüde 2 kart olup olmadığını belirler. 2, taksitler arasında değilse, Set of Game kurallarına göre üç kart bir "set" tir.


kullanım

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

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


Kopyalara izin verilirse daha kısa olabilir. f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&Çıktı{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
alephalpha

"Hepsi aynı" veya "hepsi farklı" kontrol etmek için çok akıllı bir yol!
DavidC

4

Mathematica 73

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

kullanım

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 "}}


4

Brachylog , 12 bayt

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

Çevrimiçi deneyin!

Girişi değişken üzerinden alır ve çıktıyı çıktı değişkeni üzerinden üretir .

Kodlamada yakın zamanda kapatılmış bir kopyadan alınan ikinci test örneği , çünkü bu çözüm aslında ne anlama geldiğini umursamıyor.

                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 karakter

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

Giriş STDIN'de sağlanmalıdır, örnek çevrimiçi :

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

Yorumlanan kod:

" "/: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
Ben bir kod golf için açık bir kazanan söyleyebilirim. Hower tamamen okunamaz ..
dr jerry

1
@drjerry Diğer golfscript kodlarıyla karşılaştırıldığında oldukça okunabilir. Örneğin sadece düz döngüler içerir ve gelişmiş numaralar içermez. Daha sonra kodun bir açıklamasını ekleyeceğim.
Howard

0\zip{.&,2=|}/!kısaltılabilirzip{.&,}%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]}}}}}}

bir nesne dizisini alan ve bir dizi nesne döndüren bir işlevdir.

DEMO keman (düzenli).


Değişkenleri beyan etmek zorunda değilsiniz ...
Kapı tokmağı

@ İşi geri alıyorum, haklısın. düzenlendi. Teşekkürler!
Matematik soğutucu

1

APL (IBM), 76

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

IBM APL'im yok, ancak bunun işe yarayacağına inanıyorum.

Örnek çalıştırma (Dyalog APL'de IBM APL'yi taklit etme)

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

Apl kodunu ilk gördüğümde teşekkürler!
dr jerry

1

Adaçayı, 71

Eğer Cbir dizedir, diyelim "OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D", yürütmek

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

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

Ve burada bir Set'in yansıtmalı bir çizgi olduğu yorumunu kullanan çok farklı bir yaklaşım GF(3)^4:

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

Dİki kez kullanılan biraz sinirliydim ... bunu nasıl kötüye kullanacağımı anlayana kadar. Ama daha da iyisi, findyöntemi de kötüye kullanıyorum . str.findbir harf bulunmazsa -1 değerini döndürür. Çünkü -1 = 2 mod 3mektup S, içinde bulunmadığı için uygun şekilde işlenir 'WODRPG123N'.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.