Moje dzieci mają zabawną grę o nazwie Spot It! Ograniczenia gry (jak najlepiej mogę to opisać) to:
- Jest to talia 55 kart
- Na każdej karcie znajduje się 8 unikalnych zdjęć (tzn. Karta nie może zawierać 2 tego samego obrazu)
- Biorąc pod uwagę dowolne 2 karty wybrane z talii, jest 1 i tylko 1 pasujące zdjęcie .
- Dopasowane zdjęcia mogą być różnie skalowane na różnych kartach, ale to tylko utrudnia grę (tzn. Małe drzewo nadal pasuje do większego drzewa)
Zasada gry jest taka: odwróć 2 karty, a ten, kto pierwszy wybierze pasujące zdjęcie, otrzyma punkt.
Oto zdjęcie dla wyjaśnienia:
(Przykład: z dolnych 2 kart powyżej widać, że pasującym obrazem jest zielony dinozaur. Między prawym dolnym i środkowym prawym zdjęciem jest głowa klauna.)
Próbuję zrozumieć, co następuje:
Jaka jest minimalna liczba różnych zdjęć wymaganych do spełnienia tych kryteriów i jak to określić?
Używając pseudokodu (lub Ruby), w jaki sposób wygenerowałbyś 55 kart do gry z szeregu N zdjęć (gdzie N jest minimalną liczbą z pytania 1)?
Aktualizacja:
Zdjęcia pojawiają się więcej niż dwa razy na pokład (w przeciwieństwie do tego, co niektórzy przypuszczali). Zobacz zdjęcie 3 kart, każda z błyskawicą:
źródło
Odpowiedzi:
Skończone geometrie rzutowe
W aksjomaty z rzutowej (płaszczyzny) geometrii są nieco inne niż w euklidesowej geometrii:
Teraz dodaj do zupy „skończone” i masz pytanie:
Czy możemy mieć geometrię z zaledwie 2 punktami? Z 3 punktami? Z 4? Z 7?
Nadal są otwarte pytania dotyczące tego problemu, ale wiemy o tym:
Q
punktów, wtedyQ = n^2 + n + 1
in
nazywa sięorder
geometrii.n+1
każdej linii są punkty.n+1
linie.Całkowita liczba linii jest również
Q
.I wreszcie, jeśli
n
jest liczbą pierwszą, to istnieje geometria porządkun
.Co to ma wspólnego z układanką, można zapytać.
Umieścić
card
zamiastpoint
ipicture
zamiastline
i aksjomaty stać:Teraz weźmy
n=7
i mamyorder-7
skończoną geometrię zQ = 7^2 + 7 + 1
. To tworzyQ=57
linie (zdjęcia) iQ=57
punkty (karty). Myślę, że twórcy puzzli zdecydowali, że 55 jest bardziej okrągłą liczbą niż 57, i zostawili 2 karty.Otrzymujemy również
n+1 = 8
, więc z każdego punktu (karty) przechodzi 8 linii (pojawia się 8 zdjęć), a każda linia (zdjęcie) ma 8 punktów (pojawia się w 8 kartach).Oto reprezentacja najsłynniejszej skończonej płaszczyzny rzutowej (rzędu 2) (geometrii) z 7 punktami, znanymi jako płaszczyzna Fano , skopiowana z Noelle Evans - Strona problemów ze skończoną geometrią
Zastanawiałem się nad stworzeniem obrazu wyjaśniającego, w jaki sposób powyższą płaszczyznę rzędu 2 można stworzyć podobną łamigłówkę z 7 kartami i 7 obrazkami, ale potem link z bliźniaczego pytania matematyki. Wymiany ma dokładnie taki schemat: Dobble-et- la-geometrie-finie
źródło
every two cards have exactly one picture in common
została podana w pytaniu. Drugifor every two pictures there is exactly one card that has both of them
, OP może nam powiedzieć, czy zestaw gry to spełnia.Dla tych, którzy mają problemy z wyobrażeniem geometrii płaszczyzny rzutowej z 57 punktami, istnieje naprawdę fajny, intuicyjny sposób na zbudowanie gry z 57 kartami i 57 symbolami (na podstawie odpowiedzi Yuvala Filmusa na to pytanie ):
W tym przykładzie biorę jedną linię ze spadkiem zero (czerwony), a drugą ze spadkiem 1 (zielony). Przecinają się dokładnie w jednym wspólnym punkcie (sowa).
Ta metoda zapewnia, że dowolne dwie karty mają dokładnie jeden wspólny symbol, ponieważ
W ten sposób możemy konstruować karty 7x7 (7 odsunięć i 7 nachyleń).
Możemy również zbudować siedem dodatkowych kart z linii pionowych przez siatkę (tj. Biorąc każdą kolumnę). Dla nich używana jest ikona nachylenia nieskończoności.
Ponieważ każda karta składa się z siedmiu symboli z siatki i dokładnie jednego symbolu „nachylenia”, możemy stworzyć jedną dodatkową kartę, która po prostu składa się ze wszystkich 8 symboli nachylenia.
To pozostawia nam 7x8 + 1 = 57 możliwych kart i 7 x 7 + 8 = 57 wymaganych symboli.
(Oczywiście działa to tylko z siatką wielkości pierwszej (np. N = 7). W przeciwnym razie linie o różnym nachyleniu mogą mieć zero lub więcej niż jedno przecięcie, jeśli nachylenie jest dzielnikiem wielkości siatki.)
źródło
Zatem istnieje k = 55 kart zawierających m = 8 zdjęć, każda z puli n zdjęć łącznie. Możemy przekształcić na pytanie "Ile zdjęć n potrzebujemy, tak, że możemy skonstruować zestaw k kart tylko z jednym wspólnym zdjęciu pomiędzy dowolnymi dwoma kartami? równoważnie, zadając:
Istnieją dokładnie ( n wybierz m ) możliwe wektory do budowania par. Potrzebujemy więc przynajmniej wystarczająco dużego n , aby ( n wybrać m )> = k . Jest to tylko dolna granica, więc aby spełnić ograniczenie kompatybilności parami, prawdopodobnie potrzebujemy znacznie wyższej wartości n .
Dla odrobiny eksperymentów napisałem mały program Haskell do obliczania prawidłowych zestawów kart:
Edycja: Właśnie zobaczyłem rozwiązanie Neila i Gajeta, że algorytm, którego używam, nie zawsze znajduje najlepsze możliwe rozwiązanie, więc wszystko poniżej niekoniecznie jest prawidłowe. Spróbuję wkrótce zaktualizować mój kod.
Wynikowa maksymalna liczba kompatybilnych kart dla m = 8 zdjęć na kartę dla różnych liczby zdjęć do wyboru n dla pierwszych kilku n wygląda następująco:
Ta metoda brutalnej siły nie dociera jednak zbyt daleko z powodu wybuchu kombinatorycznego. Ale pomyślałem, że to może być interesujące.
Co ciekawe, wydaje się, że dla danego m , k wzrasta z n tylko do pewnego n , po czym pozostaje stała.
Oznacza to, że na każdą liczbę zdjęć na kartę można wybrać pewną liczbę zdjęć, co daje maksymalną możliwą liczbę legalnych kart. Dodanie większej liczby zdjęć do wyboru z tej optymalnej liczby nie zwiększa już liczby legalnych kart.
Pierwsze kilka optymalnych wartości K to:
źródło
Inni opisali ogólne ramy projektowania (skończona płaszczyzna rzutowa) i pokazali, jak generować skończone płaszczyzny rzutowe pierwszego rzędu. Chciałbym tylko uzupełnić pewne luki.
Skończone płaszczyzny rzutowe mogą być generowane dla wielu różnych zamówień, ale są one najprostsze w przypadku zamówienia pierwszego
p
. Następnie moduł liczb całkowitychp
tworzy pole skończone, które można wykorzystać do opisania współrzędnych punktów i linii w płaszczyźnie. Istnieją 3 różne rodzaje współrzędnych Za punkty:(1,x,y)
,(0,1,x)
, i(0,0,1)
, gdziex
iy
może przyjmować wartości od0
dop-1
. Trzy różne rodzaje punktów wyjaśniają wzórp^2+p+1
na liczbę punktów w systemie. Możemy także opisać linie z tymi samymi 3 różnych rodzajów współrzędnych:[1,x,y]
,[0,1,x]
, i[0,0,1]
.Obliczamy, czy punkt i linia padają na podstawie tego, czy iloczyn kropek ich współrzędnych jest równy 0 mod
p
. Na przykład punkt(1,2,5)
i linia[0,1,1]
są incydentami, gdyp=7
od tego czasu1*0+2*1+5*1 = 7 == 0 mod 7
, ale punkt(1,3,3)
i linia[1,2,6]
nie są incydentami od tego czasu1*1+3*2+3*6 = 25 != 0 mod 7
.Tłumaczenie na język kart i zdjęć oznacza, że karta ze współrzędnymi
(1,2,5)
zawiera obraz ze współrzędnymi[0,1,1]
, ale karta ze współrzędnymi(1,3,3)
nie zawiera obrazu ze współrzędnymi[1,2,6]
. Możemy użyć tej procedury do opracowania pełnej listy kart i zdjęć, które zawierają.Nawiasem mówiąc, myślę, że łatwiej jest myśleć o obrazach jako punktach, a karty jako o liniach, ale istnieje dualność w geometrii rzutowej między punktami i liniami, więc to naprawdę nie ma znaczenia. Jednak w dalszej części będę używać punktów do zdjęć i linii do kart.
Ta sama konstrukcja działa dla każdego skończonego pola. Wiemy, że istnieje skończone pole porządku
q
wtedy i tylko wtedyq=p^k
, gdy jest siłą główną. Nazywa się to pole,GF(p^k)
które oznacza „pole Galois”. Pola nie są tak łatwe do zbudowania w przypadku pierwszej mocy, jak w przypadku pierwszej.Na szczęście ciężka praca została już wykonana i zaimplementowana w wolnym oprogramowaniu, a mianowicie Sage . Aby na przykład uzyskać rzutowy projekt rzędu 4, wystarczy wpisać
a otrzymasz wyjście, które wygląda
Interpretuję powyższe w następujący sposób: jest 21 zdjęć oznaczonych od 0 do 20. Każdy z bloków (linia w geometrii rzutowej) mówi mi, które obrazy pojawiają się na karcie. Na przykład pierwsza karta będzie miała zdjęcia 0, 1, 2, 3 i 20; druga karta będzie miała zdjęcia 0, 4, 8, 12 i 16; i tak dalej.
System rzędu 7 może być wygenerowany przez
który generuje dane wyjściowe
źródło
Właśnie znalazłem sposób na zrobienie tego z 57 lub 58 zdjęciami, ale teraz mam bardzo silny ból głowy, opublikuję kod ruby w 8-10 godzin po tym, jak dobrze spałem! tylko podpowiedź moje rozwiązanie co 7 kart ma ten sam znak i za pomocą mojego rozwiązania można zbudować 56 kart.
oto kod, który generuje wszystkie 57 kart, o których mówił Ypercube. używa dokładnie 57 zdjęć i przepraszam, napisałem rzeczywisty kod C ++, ale wiedząc, że
vector <something>
jest to tablica zawierająca wartości typusomething
, łatwo zrozumieć, co robi ten kod. i ten kod generujeP^2+P+1
karty przy użyciuP^2+P+1
zdjęć, z których każde zawieraP+1
zdjęcie i udostępnia tylko 1 zdjęcie wspólne, dla każdej pierwszej wartości P. co oznacza, że możemy mieć 7 kart przy użyciu 7 zdjęć, każdy z 3 zdjęciami (dla p = 2), 13 kart z 13 zdjęciami (dla p = 3), 31 kart z 31 zdjęciami (dla p = 5), 57 kart dla 57 zdjęć (dla p = 7) i tak dalej ...jeszcze raz przepraszam za opóźniony kod.
źródło
p=4
? (i 21 kart / zdjęć)Oto rozwiązanie Gajeta w Pythonie, ponieważ uważam, że Python jest bardziej czytelny. Zmodyfikowałem go tak, aby działał również z liczbami innymi niż pierwotne. Użyłem wglądu Thies do wygenerowania łatwiejszego do zrozumienia kodu wyświetlacza.
Z wyjściem:
źródło
(p) + (p * p) + (1)
konfiguracje.all p except 4 and 6
. Jeśli chcesz stworzyć skończoną płaszczyznę, w której znajdują sięp*p+p+1
punkty i linie (karty i obrazy), to jest to związanefinite fields
i nierings
. Istnieją skończone pola porządku,p
gdy p jestprime
lub aprime power
. Twój kod działa poprawnie dla liczb pierwszych, ponieważ wyrażenia takiek * p + (j + i * k) % p
wyrażają sięk*p + j + i*k
w kategoriach mnożenia i dodawania w skończonym polu rzędup
.p^2
,p^3
itd Tak, to będzie działać4, 8, 9, 16, 25, 27, ...
Korzystanie z
z3
twierdzenia twierdzącegoNiech
P
będzie liczbą symboli na kartę. Zgodnie z tym artykułem iypercubeᵀᴹ
odpowiedzią są odpowiednioN = P**2 - P + 1
karty i symbole. Talia kart może być reprezentowana za pomocą macierzy padania, która ma rząd dla każdej karty i kolumnę dla każdego możliwego symbolu. Jego(i,j)
elementem jest,1
jeśli kartai
ma symbolj
. Musimy tylko wypełnić tę macierz, mając na uwadze następujące ograniczenia:P
P
Oznacza to
N**2
zmienne iN**2 + 2*N + (N choose 2)
ograniczenia. Wydaje się, że jest to wykonalne w niezbyt długim czasie przyz3
małych nakładach.edycja : Niestety P = 8 wydaje się być zbyt duży dla tej metody. Zabiłem proces po 14 godzinach obliczeń.
Wyniki
źródło
Bardzo podoba mi się ten wątek. Buduję ten projekt github python z częściami tego kodu tutaj, aby narysować niestandardowe karty w formacie png (aby można było zamówić niestandardowe gry karciane w Internecie).
https://github.com/plagtag/ProjectiveGeometry-Game
źródło
Napisałem artykuł o tym, jak generować tego rodzaju talie, z kodem w Perlu. Kod nie jest zoptymalizowany, ale może przynajmniej generować talie „rozsądnych” zamówień ... i jeszcze więcej.
Oto przykład z rozkazem 8, który musi rozważyć nieco bardziej skomplikowaną matematykę, ponieważ 8 nie jest liczbą pierwszą, chociaż jest prawidłowym rozkazem do generowania tego rodzaju talii. Zobacz wyżej lub artykuł, aby uzyskać bardziej szczegółowe wyjaśnienie, poniżej, jeśli chcesz wygenerować nieco trudniejsze Spot-It :-)
Każdy identyfikator od
0
do72
można odczytać zarówno jako identyfikator karty, jak i identyfikator obrazu. Na przykład ostatni wiersz oznacza, że:72
zawiera zdjęcia2
,13
,22
, ...,59
,68
, I72
pojawia się na kartach2
,13
,22
, ...,59
, i68
.źródło