Mes enfants ont ce jeu amusant appelé Spot It! Les contraintes du jeu (du mieux que je puisse décrire) sont:
- C'est un jeu de 55 cartes
- Sur chaque carte se trouvent 8 images uniques (c'est-à-dire qu'une carte ne peut pas avoir 2 images identiques)
- Étant donné 2 cartes choisies dans le jeu, il y a 1 et 1 seule image correspondante .
- Les images correspondantes peuvent être mises à l'échelle différemment sur différentes cartes, mais cela ne fait que rendre le jeu plus difficile (c'est-à-dire qu'un petit arbre correspond toujours à un plus grand arbre)
Le principe du jeu est le suivant: retournez 2 cartes et celui qui choisit en premier l'image correspondante obtient un point.
Voici une image pour clarification:
(Exemple: vous pouvez voir sur les 2 cartes du bas ci-dessus que l'image correspondante est le dinosaure vert. Entre l'image en bas à droite et au milieu à droite, c'est la tête d'un clown.)
J'essaie de comprendre ce qui suit:
Quel est le nombre minimum de photos différentes requis pour répondre à ces critères et comment le détermineriez-vous?
En utilisant un pseudocode (ou Ruby), comment généreriez-vous 55 cartes de jeu à partir d'un tableau de N images (où N est le nombre minimum de la question 1)?
Mettre à jour:
Les images se produisent plus de deux fois par jeu (contrairement à ce que certains ont supposé). Voir cette image de 3 cartes, chacune avec un éclair:
la source
Réponses:
Géométries projectives finies
Les axiomes de la géométrie projective (plane) sont légèrement différents de la géométrie euclidienne:
Maintenant, ajoutez "fini" dans la soupe et vous avez la question:
Peut-on avoir une géométrie avec seulement 2 points? Avec 3 points? Avec 4? Avec 7?
Il y a encore des questions ouvertes concernant ce problème mais nous le savons:
Q
points, alorsQ = n^2 + n + 1
etn
est appelé leorder
de la géométrie.n+1
points sur chaque ligne.n+1
lignes.Le nombre total de lignes est également
Q
.Et enfin, si
n
est premier, alors il existe bien une géométrie d'ordren
.Qu'est-ce que cela a à voir avec le puzzle, peut-on se demander.
Mettez
card
au lieu depoint
etpicture
au lieu deline
et les axiomes deviennent:Maintenant, prenons
n=7
et nous avons laorder-7
géométrie finie avecQ = 7^2 + 7 + 1
. Cela fait desQ=57
lignes (images) et desQ=57
points (cartes). Je suppose que les fabricants de puzzles ont décidé que 55 était plus rond que 57 et ont laissé 2 cartes.Nous obtenons également
n+1 = 8
, donc de chaque point (carte), 8 lignes passent (8 images apparaissent) et chaque ligne (image) a 8 points (apparaît dans 8 cartes).Voici une représentation du plus célèbre plan projectif fini (ordre 2) (géométrie) à 7 points, connu sous le nom de Fano Plane , copié de Noelle Evans - Finite Geometry Problem Page
Je pensais créer une image qui expliquerait comment le plan d'ordre 2 ci-dessus pourrait être transformé en un puzzle similaire avec 7 cartes et 7 images, mais un lien de la question jumelle math.exchange a exactement un tel schéma: Dobble-et- la-geometrie-finie
la source
every two cards have exactly one picture in common
est énoncée dans la question. Le 2for every two pictures there is exactly one card that has both of them
, l'OP peut nous dire si le set de jeu le satisfait.Pour ceux qui ont du mal à imaginer la géométrie du plan projectif avec 57 points, il existe une façon très agréable et intuitive de construire le jeu avec 57 cartes et 57 symboles (basé sur la réponse de Yuval Filmus pour cette question ):
Dans l'exemple, je prends une ligne avec une pente zéro (rouge) et une avec une pente 1 (vert). Ils se croisent à exactement un point commun (le hibou).
Cette méthode garantit que deux cartes ont exactement un symbole commun, car
De cette façon, nous pouvons construire des cartes 7x7 (7 décalages et 7 pentes).
Nous pouvons également construire sept cartes supplémentaires à partir de lignes verticales à travers la grille (c'est-à-dire en prenant chaque colonne). Pour ceux-ci, l'icône de pente infinie est utilisée.
Étant donné que chaque carte se compose de sept symboles de la grille et d'exactement un symbole "pente", nous pouvons créer une carte supplémentaire, qui se compose simplement des 8 symboles de pente.
Cela nous laisse 7x8 + 1 = 57 cartes possibles et 7 x 7 + 8 = 57 symboles requis.
(Naturellement, cela ne fonctionne qu'avec une grille de nombre premier (par exemple n = 7). Sinon, les lignes de pente différente pourraient avoir zéro ou plusieurs intersections si la pente est un diviseur de la taille de la grille.)
la source
Il y a donc k = 55 cartes contenant m = 8 images chacune à partir d'un pool de n images au total. Nous pouvons reformuler la question «Combien d'images n avons-nous besoin, afin que nous puissions construire un ensemble de k cartes avec une seule image partagée entre une paire de cartes? de manière équivalente en demandant:
Il existe exactement ( n choisir m ) des vecteurs possibles pour construire des paires. Nous avons donc au moins besoin d'un n assez grand pour que ( n choisissez m )> = k . Ceci est juste une borne inférieure, donc pour remplir la contrainte de compatibilité par paire, nous avons probablement besoin d'un n beaucoup plus élevé .
Juste pour expérimenter un peu, j'ai écrit un petit programme Haskell pour calculer des jeux de cartes valides:
Edit: Je viens de réaliser après avoir vu la solution de Neil et Gajet, que l'algorithme que j'utilise ne trouve pas toujours la meilleure solution possible, donc tout ce qui suit n'est pas nécessairement valide. J'essaierai de mettre à jour mon code bientôt.
Le nombre maximum de cartes compatibles résultant pour m = 8 images par carte pour un nombre différent d'images à choisir parmi n pour les premiers n ressemble à ceci:
Cette méthode de force brute ne va cependant pas très loin à cause de l'explosion combinatoire. Mais j'ai pensé que ça pourrait être intéressant.
Il est intéressant de noter que pour un m donné , k augmente avec n seulement jusqu'à un certain n , après quoi il reste constant.
Cela signifie que pour chaque nombre d'images par carte, il existe un certain nombre d'images parmi lesquelles choisir, ce qui se traduit par un nombre maximum de cartes légales. Ajouter plus d'images à choisir parmi ce nombre optimal n'augmente pas davantage le nombre de cartes légales.
Les premiers k optimaux sont:
la source
D'autres ont décrit le cadre général de la conception (plan projectif fini) et montré comment générer des plans projectifs finis d'ordre premier. Je voudrais juste combler certaines lacunes.
Des plans projectifs finis peuvent être générés pour de nombreux ordres différents, mais ils sont plus simples dans le cas d'un ordre premier
p
. Ensuite, les entiers modulop
forment un champ fini qui peut être utilisé pour décrire les coordonnées des points et des lignes dans le plan. Il y a 3 différents types de coordonnées pour les points:(1,x,y)
,(0,1,x)
et(0,0,1)
oùx
ety
peuvent prendre des valeurs de0
lap-1
. Les 3 différents types de points expliquent la formulep^2+p+1
du nombre de points dans le système. On peut aussi décrire les lignes avec les mêmes 3 types de coordonnées différentes:[1,x,y]
,[0,1,x]
et[0,0,1]
.Nous calculons si un point et une ligne sont incidents par si le produit scalaire de leurs coordonnées est égal à 0 mod
p
. Ainsi, par exemple, le point(1,2,5)
et la ligne[0,1,1]
sont incidentsp=7
depuis1*0+2*1+5*1 = 7 == 0 mod 7
, mais le point(1,3,3)
et la ligne[1,2,6]
ne sont pas incidents depuis1*1+3*2+3*6 = 25 != 0 mod 7
.En traduisant dans le langage des cartes et des images, cela signifie que la carte avec les coordonnées
(1,2,5)
contient l'image avec les coordonnées[0,1,1]
, mais la carte avec les coordonnées(1,3,3)
ne contient pas l'image avec les coordonnées[1,2,6]
. Nous pouvons utiliser cette procédure pour développer une liste complète des cartes et des images qu'elles contiennent.Soit dit en passant, je pense qu'il est plus facile de considérer les images comme des points et des cartes comme des lignes, mais il y a une dualité dans la géométrie projective entre les points et les lignes, donc cela n'a vraiment pas d'importance. Cependant, dans ce qui suit, j'utiliserai des points pour les images et des lignes pour les cartes.
La même construction fonctionne pour tout champ fini. Nous savons qu'il existe un champ d'ordre fini
q
si et seulement siq=p^k
, une puissance première. Le champ est appeléGF(p^k)
ce qui signifie "champ de Galois". Les champs ne sont pas aussi faciles à construire dans le cas de puissance principale que dans le cas principal.Heureusement, le travail acharné a déjà été fait et mis en œuvre dans les logiciels libres, à savoir Sage . Pour obtenir une conception de plan projectif d'ordre 4, par exemple, tapez simplement
et vous obtiendrez une sortie qui ressemble à
J'interprète ce qui précède comme suit: il y a 21 images étiquetées de 0 à 20. Chacun des blocs (ligne en géométrie projective) me dit quelles images apparaissent sur une carte. Par exemple, la première carte aura les images 0, 1, 2, 3 et 20; la deuxième carte aura les images 0, 4, 8, 12 et 16; etc.
Le système d'ordre 7 peut être généré par
qui génère la sortie
la source
Je viens de trouver un moyen de le faire avec 57 ou 58 photos mais maintenant j'ai très mal à la tête, je posterai le code rubis dans 8 à 10 heures après avoir bien dormi! juste un indice ma ma solution toutes les 7 cartes partagent la même marque et 56 cartes au total peuvent être construites en utilisant ma solution.
voici le code qui génère les 57 cartes dont ypercube parlait. il utilise exactement 57 images, et désolé j'ai écrit du vrai code C ++ mais sachant que
vector <something>
c'est un tableau contenant des valeurs de type,something
il est facile de comprendre ce que fait ce code. et ce code génère desP^2+P+1
cartes utilisant desP^2+P+1
images contenant chacune uneP+1
image et partageant une seule image en commun, pour chaque valeur P principale. ce qui signifie que nous pouvons avoir 7 cartes en utilisant 7 images ayant chacune 3 images (pour p = 2), 13 cartes en utilisant 13 images (pour p = 3), 31 cartes en utilisant 31 images (pour p = 5), 57 cartes pour 57 images (pour p = 7) et ainsi de suite ...encore une fois désolé pour le code retardé.
la source
p=4
? (et 21 cartes / images)Voici la solution de Gajet en Python, car je trouve Python plus lisible. Je l'ai modifié pour qu'il fonctionne également avec les nombres non premiers. J'ai utilisé Thies Insight pour générer un code d'affichage plus facile à comprendre.
Avec sortie:
la source
(p) + (p * p) + (1)
configurations.all p except 4 and 6
. Si vous voulez produire un plan fini où il y a desp*p+p+1
points et des lignes (cartes et images), alors c'est lié àfinite fields
et nonrings
. Il existe des champs d'ordre finisp
lorsque p estprime
ou aprime power
. Votre code fonctionne correctement pour les nombres premiers car les expressions commek * p + (j + i * k) % p
s'exprimentk*p + j + i*k
en termes de multiplication et d'addition dans le champ fini de l'ordrep
.p^2
,p^3
etc. Ainsi, il travaillera pour4, 8, 9, 16, 25, 27, ...
Utilisation du
z3
prouveur de théorèmeSoit
P
le nombre de symboles par carte. Selon cet article et saypercubeᵀᴹ
réponse, il y a respectivement desN = P**2 - P + 1
cartes et des symboles. Un jeu de cartes peut être représenté avec sa matrice d'incidence qui a une ligne pour chaque carte et une colonne pour chaque symbole possible. Son(i,j)
élément est1
si la cartei
a un symbolej
dessus. Il suffit de remplir cette matrice avec ces contraintes à l'esprit:P
P
Cela signifie des
N**2
variables et desN**2 + 2*N + (N choose 2)
contraintes. Il semble être gérable en peu de temps avecz3
de petites entrées.edit : Malheureusement P = 8 semble être trop grand pour cette méthode. J'ai tué le processus après 14 heures de temps de calcul.
Résultats
la source
J'aime beaucoup ce fil. Je construis ce projet python github avec des parties de ce code ici pour dessiner des cartes personnalisées au format png (donc on peut commander des jeux de cartes personnalisés sur Internet).
https://github.com/plagtag/ProjectiveGeometry-Game
la source
J'ai écrit un article sur la façon de générer ce type de decks, avec du code en Perl. Le code n'est pas optimisé mais il est au moins capable de générer des decks de commandes "raisonnables" ... et quelques autres.
Voici un exemple avec l'ordre 8, qui doit prendre en compte un calcul sous-jacent légèrement plus compliqué, car 8 n'est pas premier bien qu'un ordre valide pour générer ce type de decks. Voir ci-dessus ou l'article pour une explication plus détaillée, ci-dessous si vous voulez simplement générer un Spot-It légèrement plus difficile :-)
Chaque identifiant de
0
à72
peut être lu à la fois comme identifiant de carte et comme identifiant d'image. Par exemple, la dernière ligne signifie que:72
contient des photos2
,13
,22
, ...,59
,68
ET72
apparaît dans les cartes2
,13
,22
, ...,59
et68
.la source