¡Mis hijos tienen este divertido juego llamado Spot It! Las restricciones del juego (como mejor puedo describir) son:
- Es un mazo de 55 cartas.
- En cada tarjeta hay 8 imágenes únicas (es decir, una tarjeta no puede tener 2 de la misma imagen)
- Dadas las 2 cartas elegidas del mazo, hay 1 y solo 1 imagen coincidente .
- Las imágenes coincidentes se pueden escalar de manera diferente en diferentes tarjetas, pero eso es solo para hacer que el juego sea más difícil (es decir, un árbol pequeño todavía coincide con un árbol más grande)
El principio del juego es: voltear 2 cartas y quien primero elija la imagen correspondiente obtendrá un punto.
Aquí hay una imagen para aclarar:
(Ejemplo: puedes ver en las 2 cartas inferiores de arriba que la imagen correspondiente es el dinosaurio verde. Entre la imagen inferior derecha y la derecha central, es la cabeza de un payaso).
Estoy tratando de entender lo siguiente:
¿Cuál es el número mínimo de imágenes diferentes requeridas para cumplir con estos criterios y cómo lo determinaría?
Usando pseudocódigo (o Ruby), ¿cómo generaría 55 tarjetas de juego a partir de una serie de N imágenes (donde N es el número mínimo de la pregunta 1)?
Actualizar:
Las imágenes ocurren más de dos veces por cubierta (al contrario de lo que algunos han supuesto). Vea esta imagen de 3 cartas, cada una con un rayo:
fuente
Respuestas:
Geometrías proyectivas finitas
Los axiomas de la geometría proyectiva (plana) son ligeramente diferentes de la geometría euclidiana:
Ahora, agregue "finito" en la sopa y tiene la pregunta:
¿Podemos tener una geometría con solo 2 puntos? Con 3 puntos? Con 4? Con 7?
Todavía hay preguntas abiertas sobre este problema, pero lo sabemos:
Q
puntos, entoncesQ = n^2 + n + 1
yn
se llama elorder
de la geometría.n+1
puntos en cada línea.n+1
líneas.Número total de líneas también
Q
.Y finalmente, si
n
es primo, existe una geometría de ordenn
.¿Qué tiene que ver eso con el rompecabezas?
Poner en
card
lugar depoint
y enpicture
lugar deline
y los axiomas se convierten en:Ahora, tomemos
n=7
y tenemos laorder-7
geometría finita conQ = 7^2 + 7 + 1
. Eso haceQ=57
líneas (imágenes) yQ=57
puntos (tarjetas). Supongo que los fabricantes de rompecabezas decidieron que 55 es más número redondo que 57 y dejaron 2 cartas.También obtenemos
n+1 = 8
, así que desde cada punto (tarjeta), pasan 8 líneas (aparecen 8 imágenes) y cada línea (imagen) tiene 8 puntos (aparece en 8 tarjetas).Aquí hay una representación del plano proyectivo finito más famoso (orden 2) (geometría) con 7 puntos, conocido como Plano Fano , copiado de Noelle Evans - Página del problema de geometría finita
Estaba pensando en crear una imagen que explicara cómo el plano de orden 2 anterior podría convertirse en un rompecabezas similar con 7 cartas y 7 imágenes, pero luego un enlace de la pregunta gemela matemática de intercambio tiene exactamente ese diagrama: Dobble-et- la-geometrie-finie
fuente
every two cards have exactly one picture in common
, se indica en la pregunta. El segundofor every two pictures there is exactly one card that has both of them
, el OP nos puede decir si el juego lo satisface.Para aquellos que tienen problemas para imaginar la geometría del plano proyectivo con 57 puntos, hay una forma realmente agradable e intuitiva de construir el juego con 57 cartas y 57 símbolos (basado en la respuesta de Yuval Filmus para esta pregunta ):
En el ejemplo, tomo una línea con pendiente cero (rojo) y otra con pendiente 1 (verde). Se cruzan exactamente en un punto común (el búho).
Este método asegura que dos cartas tengan exactamente un símbolo común, porque
De esta manera, podemos construir tarjetas 7x7 (7 compensaciones y 7 pendientes).
También podemos construir siete cartas adicionales a partir de líneas verticales a través de la cuadrícula (es decir, tomar cada columna). Para ellos, se usa el icono de pendiente infinita.
Debido a que cada tarjeta consta de siete símbolos de la cuadrícula y exactamente un símbolo de "pendiente", podemos crear una tarjeta adicional, que simplemente consta de los 8 símbolos de pendiente.
Esto nos deja con 7x8 + 1 = 57 cartas posibles, y 7 x 7 + 8 = 57 símbolos requeridos.
(Naturalmente, esto solo funciona con una cuadrícula del tamaño de un número primo (por ejemplo, n = 7). De lo contrario, las líneas de pendiente diferente podrían tener cero o más de una intersección si la pendiente es un divisor del tamaño de la cuadrícula).
fuente
Entonces, hay k = 55 tarjetas que contienen m = 8 imágenes cada una de un grupo de n imágenes en total. Podemos reformular la pregunta "¿Cuántas imágenes n necesitamos para poder construir un conjunto de k tarjetas con una sola imagen compartida entre cualquier par de tarjetas?" equivalentemente preguntando:
Hay exactamente ( n elegir m ) posibles vectores para construir pares. Entonces, al menos necesitamos un n lo suficientemente grande como para que ( n elija m )> = k . Esto es solo un límite inferior, por lo que para cumplir con la restricción de compatibilidad por pares posiblemente necesitemos una n mucho más alta .
Solo por experimentar un poco, escribí un pequeño programa Haskell para calcular conjuntos de tarjetas válidos:
Editar: Acabo de darme cuenta después de ver la solución de Neil y Gajet, que el algoritmo que uso no siempre encuentra la mejor solución posible, por lo que todo lo siguiente no es necesariamente válido. Intentaré actualizar mi código pronto.
El número máximo resultante de tarjetas compatibles para m = 8 imágenes por tarjeta para un número diferente de imágenes para elegir n para los primeros n se ve así:
Sin embargo, este método de fuerza bruta no llega muy lejos debido a la explosión combinatoria. Pero pensé que aún podría ser interesante.
Curiosamente, parece que para m dado , k aumenta con n solo hasta cierto n , después de lo cual se mantiene constante.
Esto significa que, por cada número de imágenes por tarjeta, hay un cierto número de imágenes para elegir, lo que da como resultado el máximo número posible de tarjetas legales. Agregar más fotos para elegir del pasado ese número óptimo ya no aumenta el número de tarjetas legales.
Las primeras k óptimas son:
fuente
Otros han descrito el marco general para el diseño (plano proyectivo finito) y han mostrado cómo generar planos proyectivos finitos de primer orden. Solo me gustaría llenar algunos vacíos.
Se pueden generar planos proyectivos finitos para muchos órdenes diferentes, pero son más directos en el caso del orden primario
p
. Luego, el módulo de números enterosp
forma un campo finito que puede usarse para describir coordenadas para los puntos y líneas en el plano. Hay 3 tipos diferentes de coordenadas de puntos:(1,x,y)
,(0,1,x)
y(0,0,1)
, dondex
yy
pueden tomar valores de0
ap-1
. Los 3 tipos diferentes de puntos explican la fórmulap^2+p+1
para el número de puntos en el sistema. También podemos describir líneas con las mismas 3 diferentes tipos de coordenadas:[1,x,y]
,[0,1,x]
, y[0,0,1]
.Calculamos si un punto y una línea son incidentes si el producto escalar de sus coordenadas es igual a 0 mod
p
. Entonces, por ejemplo, el punto(1,2,5)
y la línea[0,1,1]
son incidentes cuandop=7
desde entonces1*0+2*1+5*1 = 7 == 0 mod 7
, pero el punto(1,3,3)
y la línea[1,2,6]
no son incidentes desde entonces1*1+3*2+3*6 = 25 != 0 mod 7
.Traduciendo al lenguaje de tarjetas e imágenes, eso significa que la tarjeta con coordenadas
(1,2,5)
contiene la imagen con coordenadas[0,1,1]
, pero la tarjeta con coordenadas(1,3,3)
no contiene la imagen con coordenadas[1,2,6]
. Podemos utilizar este procedimiento para desarrollar una lista completa de tarjetas y las imágenes que contienen.Por cierto, creo que es más fácil pensar en las imágenes como puntos y tarjetas como líneas, pero hay una dualidad en la geometría proyectiva entre puntos y líneas, por lo que realmente no importa. Sin embargo, en lo que sigue usaré puntos para imágenes y líneas para tarjetas.
La misma construcción funciona para cualquier campo finito. Sabemos que hay un campo finito de orden
q
si y solo siq=p^k
, una potencia principal. El campo se llamaGF(p^k)
que significa "campo de Galois". Los campos no son tan fáciles de construir en el primer caso de poder como en el primer caso.Afortunadamente, el trabajo duro ya se ha realizado e implementado en software libre, a saber, Sage . Para obtener un diseño de plano proyectivo de orden 4, por ejemplo, simplemente escriba
y obtendrás una salida que se parece a
Interpreto lo anterior de la siguiente manera: hay 21 imágenes etiquetadas de 0 a 20. Cada uno de los bloques (línea en geometría proyectiva) me dice qué imágenes aparecen en una tarjeta. Por ejemplo, la primera tarjeta tendrá imágenes 0, 1, 2, 3 y 20; la segunda tarjeta tendrá imágenes 0, 4, 8, 12 y 16; y así.
El sistema de orden 7 puede ser generado por
que genera la salida
fuente
Acabo de encontrar una manera de hacerlo con 57 o 58 imágenes, pero ahora tengo un dolor de cabeza muy fuerte, ¡publicaré el código ruby en 8-10 horas después de haber dormido bien! solo una pista: mi solución cada 7 tarjetas comparten la misma marca y se pueden construir un total de 56 tarjetas utilizando mi solución.
Aquí está el código que genera las 57 tarjetas de las que hablaba Ypercube. utiliza exactamente 57 imágenes, y lo siento, he escrito un código C ++ real, pero sabiendo que
vector <something>
es una matriz que contiene valores de tiposomething
, es fácil entender lo que hace este código. y este código generaP^2+P+1
tarjetas que usanP^2+P+1
imágenes que contienenP+1
imágenes y comparten solo 1 imagen en común, por cada valor P principal. lo que significa que podemos tener 7 tarjetas con 7 imágenes, cada una con 3 imágenes (para p = 2), 13 tarjetas con 13 imágenes (para p = 3), 31 tarjetas con 31 imágenes (para p = 5), 57 tarjetas para 57 imágenes (para p = 7) y así sucesivamente ...Nuevamente, perdón por el código retrasado.
fuente
p=4
? (y 21 tarjetas / fotos)Aquí está la solución de Gajet en Python, ya que encuentro Python más legible. Lo he modificado para que también funcione con números no primos. He utilizado la información de Thies para generar un código de visualización más fácil de entender.
Con salida:
fuente
(p) + (p * p) + (1)
configuraciones exactas .all p except 4 and 6
. Si desea producir un plano finito donde hayap*p+p+1
puntos y líneas (tarjetas e imágenes), entonces está relacionadofinite fields
y norings
. Hay campos finitos de ordenp
cuando p esprime
o aprime power
. Su código funciona correctamente para los números primos porque las expresiones comok * p + (j + i * k) % p
se expresank*p + j + i*k
en términos de multiplicación y suma en el campo finito de ordenp
.p^2
,p^3
etc. Por lo tanto, va a trabajar para4, 8, 9, 16, 25, 27, ...
Usando el
z3
probador de teoremasDeje
P
ser el número de símbolos por tarjeta. Según este artículo yypercubeᵀᴹ
su respuesta, hayN = P**2 - P + 1
tarjetas y símbolos, respectivamente. Se puede representar un mazo de cartas con su matriz de incidencia que tiene una fila para cada carta y una columna para cada símbolo posible. Su(i,j)
elemento es1
si la tarjetai
tiene un símboloj
. Solo necesitamos llenar esta matriz con estas restricciones en mente:P
P
Eso significa
N**2
variables yN**2 + 2*N + (N choose 2)
restricciones. Parece ser manejable en poco tiempo conz3
entradas pequeñas.editar : Desafortunadamente P = 8 parece ser demasiado grande para este método. Maté el proceso después de 14 horas de tiempo de cálculo.
Resultados
fuente
Me gusta mucho este hilo. Construyo este proyecto de Github Python con partes de este código aquí para dibujar tarjetas personalizadas como png (para que uno pueda pedir juegos de cartas personalizados en Internet).
https://github.com/plagtag/ProjectiveGeometry-Game
fuente
Escribí un artículo sobre cómo generar este tipo de mazos, con código en Perl. El código no está optimizado, pero al menos es capaz de generar mazos de órdenes "razonables" ... y algo más.
Aquí hay un ejemplo con el orden 8, que tiene que considerar una matemática subyacente un poco más complicada, porque 8 no es primo, aunque es un orden válido para generar este tipo de mazos. Consulte más arriba o el artículo para obtener una explicación más detallada, más abajo si solo desea generar un Spot-It un poco más difícil :-)
Cada identificador de
0
a72
puede leerse como un identificador de tarjeta y como un identificador de imagen. Por ejemplo, la última fila significa que:72
contiene imágenes2
,13
,22
, ...,59
,68
, Y72
aparece en las tarjetas2
,13
,22
, ...,59
, y68
.fuente