Dobble / SpotIt kart üreticisi


15

Giriş

Dobble / SpotIt , insanların aynı simgeyi bir çift kartta en kısa sürede tespit etmeleri, göstermeleri ve bir sonraki çifte geçmeleri gereken bir kart oyunudur. Her kartın birden fazla sembolü vardır (normal sürümde 8), ancak her kart çifti arasında tam olarak bir tane ortaktır.

Oyunun fiziksel kopyasından bir örnek: Çift örnekleri içeren kartlar

Meydan okuma

Her kart için sembol setini (tek ascii karakterleri) ve tek kartta sembol sayısını veren bir program yazın, her kart için sembol içeren çıkış listeleme kartları üretir. Açıkçası birçok eşdeğer kombinasyon vardır, programınız verilen giriş için en büyük miktarda kart üreten kombinasyonlardan herhangi birini yazmak zorundadır.

Bu bir kod golf, çok daha kısa kod, daha iyi.

En karmaşık vaka için hesaplamanın evrenin sıcak ölümünden önce bitip bitmeyeceği de harika olurdu.

Giriş

/ Stdin işlevine ilişkin iki argüman (seçiminiz)

  • Bunlardan ilki, 'ABCDE' veya ['A', 'B', 'C', 'D', 'E'] gibi bir dizi sembol koleksiyonu - dize, set, liste, akış gibi format seçiminiz veya dil seçimi için deyimsel ne olursa olsun. Karakterler [A-Za-z0-9] kümesinden verilecek, yinelenmeyecektir (bu nedenle maksimum giriş sembolü kümesinin boyutu 62'dir). böylece 6 sembollü kılıf için de "yX4i9A" alabilirsiniz).

  • İkinci argüman, tek karttaki sembollerin miktarını gösteren tamsayıdır. Simge kümesinin boyutundan <= olacaktır.

Çıktı

Her biri tek kart için simgeler içeren yeni satırlarla ayrılmış birden fazla satır yazdırın.

Örnekler

ABC
2
>>>>
AB
BC
AC

Veya

ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF

Veya

ABCDE
4
>>>>
ABCD

İpuçları

  • Üretilen kart sayısı, ayrı sembollerin miktarından fazla olamaz ve birçok kombinasyonda oldukça küçük olacaktır.
  • Sorunun matematik tarafında yardıma ihtiyacınız varsa bazı matematik arka planlarını okumak isteyebilirsiniz

Bu benim ilk kod golf meydan okuma, bu yüzden biçimlendirme / stil ile olası sorunları affet - yorumlarda işaret ederseniz hataları düzeltmeye çalışacağım.



Önerilen test durumu ('abcdefghijklmnopqrstu', 5)-> ['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']veya başka bir 21 kartlı çalışma çözümü. (Bunun 4. derecenin projektif sonlu düzlemi olduğunu unutmayın).
Jonathan Allan

Yanıtlar:


5

Python 2 , 192162 bayt

Bunun her senaryo için maksimum kart dizisini ürettiğini ve 3 test vakasını ele aldığını iddia ediyorum.

from itertools import*
def m(a,s):
    C=["".join(x)for x in combinations(a,s)]
    while len(C):
        print C[0]
        C=list(set(A for A in C if len(set(A)&set(C[0]))==1<s))

Çevrimiçi deneyin!

Algoritma

Bir alfabe ave kart boyutu verildiğinde s, tüm söğelerin kombinasyonlarını alın ave arayın C, ardından:

  • İlk elemanını al, Conu araC0
  • Kayıt etmek C0
  • Eşit olmayan Cbir birleşim olan tüm öğeleri kaldırınC01
  • Öğesinin ikinci öğesi ile tekrarlayın C
  • CBoş olana kadar devam et

Ardından kaydedilen öğeleri yazdırın.

tartışma

Boş olmayan bazı alt Ckümeler maksimum çözümümüzdür K. En az bir eleman içerdiğinden ve herhangi iki eleman ayırt edilemez olduğundan C0, içinde Colmak için keyfi bir eleman seçin K. İçindeki herhangi bir öğe eiçin K, ebirliğin xasıl gücü x != ein için 1'dir K; böylece Csendikası ile C0kardinallity olmayan tüm unsurları ortadan kaldırın 1. Aynı mantıkla, yeni bir keyfi eleman seçin C, ekleyin Kve azaltın C. Sonunda Cboş kümedir ve Kmaksimum çözüm olacaktır çünkü hiçbir noktada başka herhangi bir öğeden ayırt edilebilir bir eleman seçmedik.


Test Durumları

Bu test senaryoları, baskının bir gereklilik olduğunu fark etmeden yazılmıştır.

a=["a","b","c"]
b=2
c=3
d=m(a,b)
print d,len(d)==c
>> ['bc', 'ab', 'ac'] True

a=["a","b","c","d","e","f","g"]
b=3
c=7
d=m(a,b)
print d,len(d)==c
>> ['aef', 'abc', 'bde', 'ceg', 'adg', 'cdf', 'bfg'] True

a=["a","b","c","d","e"]
b=4
c=1
d=m(a,b)
print d,len(d)==c
>> ['abcd'] True

Güncelleme

  • +9 [16-12-07] Baskı gereksinimini karşılayın
  • -11 [16-12-07] RDeğişkeni dışarı çıkardı
  • -30 [16-12-09] KDeğişkeni dışarı çıkardım , @Leo sayesinde !

1
Gerçekten her adımda K setini C'den çıkarmanız mı gerekiyor? A for A in C if len(set(A)&set(C[0]))==1S == 1 (bu durumda len (set (C [0]) & set (C [0])) 1 olmadığı sürece yaptığınız ( ) filtrelemenin zaten seçilen öğeleri kaldırdığını düşünüyorum . Son hattınızı ikinci sıraya kadar golf oynayabilirsiniz:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Leo

Kum havuzunda bir Dobble mücadelesi yazıyordum ve Dom Hastings beni bu soruya olası bir dupe olarak işaret etti (ki bu iyi olabilir), ancak fark ettiğim bir şey N * N'nin tam bir Dobble destesini yapmanın çok daha zor olduğu + N + 1 kartlar (ve semboller) ve kart başına N + 1 semboller, N ise asal olmayan bir ana güçtür. N = 4 = 2 ^ 2 için bu 4 * 4 + 4 + 1 = 21 sembol ve aynı sayıda kart kullanan bir destedir; ancak bu çözüm sadece 13 kartlık bir deste üretir - henüz 21 mümkündür .
Jonathan Allan

@JonathanAllan Yeni bir TIO bağlantısı ekledik. İşlevi 21 karakterden oluşan bir alfabe ve kart başına 5 karakterle çalıştırdım. 21 kart çıktı. Yanlış anlamadığım sürece bunun doğru olduğunu düşünüyorum.
NonlinearFruit

Hmm, üzgünüm, o zaman yerel olarak çalıştırırken bazı hatalar yapmış olmalıyım! ( Bu Tam Dobble 4. Sipariş Güvertesi )
Jonathan Allan

2

Haskell, 175 156 bayt

İlk golf oynamam, bir şeyleri berbat edersem bana bildirin.

import Data.List
f 0_=[[]]
f n a=g$c n a
c n a=[a!!i:x|i<-[0..(length a)-1],x<-f(n-1)(drop(i+1)a)]
g[]=[]
g(x:t)=x:g(filter(\z->length(z`intersect`x)<= 1)t)

Çevrimiçi deneyin!

@Paul Mutser'e iyileştirme ve -19 bayt için teşekkürler


Orijinal versiyon


1
PPCG'ye Hoşgeldiniz! İthalatın puanınıza dahil olduğunu unutmayın. Olası iyileştirme: İthalat dahil 156 bayt
Paul Mutser

Başlar için teşekkürler, yaptıklarından emin değildim!
böcek

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.