Meus filhos têm esse divertido jogo chamado Spot It! As restrições do jogo (da melhor maneira que posso descrever) são:
- É um baralho de 55 cartas
- Em cada cartão há 8 fotos únicas (ou seja, um cartão não pode ter 2 da mesma foto)
- Dadas quaisquer 2 cartas escolhidas no baralho, há 1 e apenas 1 foto correspondente .
- As imagens correspondentes podem ser dimensionadas de maneira diferente em cartões diferentes, mas isso é apenas para tornar o jogo mais difícil (por exemplo, uma pequena árvore ainda corresponde a uma árvore maior)
O princípio do jogo é: virar duas cartas e quem escolhe a imagem correspondente ganha um ponto.
Aqui está uma foto para esclarecimento:
(Exemplo: você pode ver nas 2 cartas inferiores acima que a imagem correspondente é o dinossauro verde. Entre a imagem inferior direita e a direita do meio, é a cabeça de um palhaço.)
Estou tentando entender o seguinte:
Qual é o número mínimo de imagens diferentes necessárias para atender a esses critérios e como você determinaria isso?
Usando o pseudocódigo (ou Ruby), como você geraria 55 cartões de jogo a partir de uma matriz de N imagens (onde N é o número mínimo da pergunta 1)?
Atualizar:
As imagens ocorrem mais de duas vezes por baralho (ao contrário do que alguns supuseram). Veja esta figura de 3 cartas, cada uma com um raio:
fonte
Respostas:
Geometrias projetivas finitas
Os axiomas da geometria projetiva (plana) são ligeiramente diferentes da geometria euclidiana:
Agora, adicione "finito" à sopa e você terá a pergunta:
Podemos ter uma geometria com apenas 2 pontos? Com 3 pontos? Com 4? Com 7?
Ainda existem perguntas em aberto sobre esse problema, mas sabemos o seguinte:
Q
pontos, entãoQ = n^2 + n + 1
en
é chamadoorder
de geometria.n+1
pontos em todas as linhas.n+1
linhas.O número total de linhas também é
Q
.E, finalmente, se
n
é primo, existe uma geometria da ordemn
.O que isso tem a ver com o quebra-cabeça, alguém pode perguntar.
Coloque em
card
vez depoint
e empicture
vez deline
e os axiomas se tornam:Agora, vamos pegar
n=7
e temos aorder-7
geometria finita comQ = 7^2 + 7 + 1
. Isso criaQ=57
linhas (imagens) eQ=57
pontos (cartões). Eu acho que os criadores de quebra-cabeças decidiram que 55 é um número maior que 57 e deixaram 2 cartas de fora.Também obtemos
n+1 = 8
, portanto, de cada ponto (cartão), 8 linhas passam (8 figuras aparecem) e cada linha (imagem) tem 8 pontos (aparece em 8 cartões).Aqui está uma representação do plano projetivo finito mais famoso (ordem 2) (geometria) com 7 pontos, conhecido como Fano Plane , copiado de Noelle Evans - Página de problemas de geometria finita
Eu estava pensando em criar uma imagem que explicasse como o plano de ordem 2 acima poderia ser transformado em um quebra-cabeça semelhante com 7 cartas e 7 figuras, mas depois um link da questão matemática math.exchange, exatamente como esse diagrama: Dobble-et- la-geometrie-finie
fonte
every two cards have exactly one picture in common
, é afirmada na pergunta. O segundofor every two pictures there is exactly one card that has both of them
, o OP pode nos dizer se o jogo está satisfatório.Para aqueles que têm problemas para visualizar a geometria do plano projetivo com 57 pontos, existe uma maneira muito boa e intuitiva de construir o jogo com 57 cartas e 57 símbolos (com base na resposta de Yuval Filmus para esta pergunta ):
No exemplo, pego uma linha com inclinação zero (vermelho) e uma com inclinação 1 (verde). Eles se cruzam exatamente em um ponto comum (a coruja).
Este método garante que quaisquer duas cartas tenham exatamente um símbolo comum, porque
Dessa forma, podemos construir cartões 7x7 (7 compensações e 7 inclinações).
Também podemos construir sete cartões adicionais a partir de linhas verticais através da grade (ou seja, pegar cada coluna). Para esses, o ícone da inclinação infinita é usado.
Como cada carta consiste em sete símbolos da grade e exatamente um símbolo de "inclinação", podemos criar uma carta adicional, que consiste simplesmente em todos os 8 símbolos de inclinação.
Isso nos deixa com 7x8 + 1 = 57 cartões possíveis e 7 x 7 + 8 = 57 símbolos necessários.
(Naturalmente, isso funciona apenas com uma grade do tamanho de um número primo (por exemplo, n = 7). Caso contrário, as linhas de inclinação diferente podem ter zero ou mais de uma interseção se a inclinação for um divisor do tamanho da grade.)
fonte
Portanto, existem k = 55 cartões contendo m = 8 fotos cada, de um total de n fotos. Podemos reafirmar a pergunta 'Quantas figuras n precisamos, para que possamos construir um conjunto de cartões k com apenas uma imagem compartilhada entre qualquer par de cartões?' equivalentemente, perguntando:
Existem exatamente ( n escolha m ) vetores possíveis para construir pares. Então, pelo menos, precisamos de um n grande o suficiente para que ( n escolha m )> = k . Esse é apenas um limite inferior; portanto, para cumprir a restrição de compatibilidade aos pares, é necessário um n muito maior .
Apenas para experimentar um pouco, escrevi um pequeno programa Haskell para calcular conjuntos de cartões válidos:
Edit: Acabei de perceber, depois de ver a solução de Neil e Gajet, que o algoritmo que eu uso nem sempre encontra a melhor solução possível, portanto, tudo abaixo não é necessariamente válido. Vou tentar atualizar meu código em breve.
O número máximo resultante de cartões compatíveis para m = 8 fotos por cartão para um número diferente de fotos para escolher n para os primeiros n é assim:
Esse método de força bruta não chega muito longe por causa da explosão combinatória. Mas eu pensei que ainda poderia ser interessante.
Curiosamente, parece que, para m dado k , aumenta com n apenas até um certo n , após o que permanece constante.
Isso significa que, para todo número de fotos por cartão, há um certo número de fotos para escolher, o que resulta no número máximo possível de cartões legais. Adicionar mais fotos para escolher do passado, esse número ideal não aumenta ainda mais o número de cartões legais.
Os primeiros poucos k 's ideais são:
fonte
Outros descreveram a estrutura geral do projeto (plano projetivo finito) e mostraram como gerar planos projetivos finitos de ordem primordial. Gostaria apenas de preencher algumas lacunas.
Planos projetivos finitos podem ser gerados para muitos pedidos diferentes, mas são mais diretos no caso de ordem primordial
p
. Então o módulo inteirop
forma um campo finito que pode ser usado para descrever coordenadas para os pontos e linhas no plano. Existem 3 tipos diferentes de coordenadas para pontos:(1,x,y)
,(0,1,x)
e(0,0,1)
, ondex
ey
pode assumir valores de0
ap-1
. Os três tipos diferentes de pontos explicam a fórmulap^2+p+1
para o número de pontos no sistema. Nós também pode descrever as linhas com os mesmos 3 tipos diferentes de coordenadas[1,x,y]
,[0,1,x]
e[0,0,1]
.Calculamos se um ponto e uma linha são incidentes, se o produto escalar de suas coordenadas é igual a 0 mod
p
. Assim, por exemplo, o ponto(1,2,5)
e a linha[0,1,1]
são incidentesp=7
desde então1*0+2*1+5*1 = 7 == 0 mod 7
, mas o ponto(1,3,3)
e a linha[1,2,6]
não são incidentes desde então1*1+3*2+3*6 = 25 != 0 mod 7
.Ao traduzir para o idioma dos cartões e figuras, significa que o cartão com coordenadas
(1,2,5)
contém a imagem com coordenadas[0,1,1]
, mas o cartão com coordenadas(1,3,3)
não contém a imagem com coordenadas[1,2,6]
. Podemos usar este procedimento para desenvolver uma lista completa de cartões e as imagens que eles contêm.A propósito, acho que é mais fácil pensar em imagens como pontos e cartões como linhas, mas há uma dualidade na geometria projetiva entre pontos e linhas, por isso realmente não importa. No entanto, a seguir, usarei pontos para fotos e linhas para cartões.
A mesma construção funciona para qualquer campo finito. Sabemos que existe um campo finito de ordem,
q
se e somente seq=p^k
, uma potência principal. É chamado o campoGF(p^k)
que significa "campo de Galois". Os campos não são tão fáceis de construir no caso de potência principal quanto no caso de potência principal.Felizmente, o trabalho duro já foi feito e implementado em software livre, o Sage . Para obter um design de plano projetivo da ordem 4, por exemplo, basta digitar
e você obterá uma saída que se parece
Interpreto o exposto da seguinte maneira: existem 21 figuras rotuladas de 0 a 20. Cada um dos blocos (linha na geometria projetiva) me diz quais figuras aparecem em um cartão. Por exemplo, o primeiro cartão terá as figuras 0, 1, 2, 3 e 20; o segundo cartão terá as figuras 0, 4, 8, 12 e 16; e assim por diante.
O sistema da ordem 7 pode ser gerado por
que gera a saída
fonte
Acabei de encontrar uma maneira de fazer isso com 57 ou 58 fotos, mas agora estou com uma dor de cabeça muito forte; postarei o código ruby em 8 a 10 horas depois de dormir bem! apenas uma sugestão minha solução a cada 7 cartões compartilham a mesma marca e um total de 56 cartões pode ser construído usando a minha solução.
Aqui está o código que gera todos os 57 cartões que o ypercube estava falando. ele usa exatamente 57 imagens e, desculpe, eu escrevi o código C ++ real, mas sabendo que
vector <something>
é uma matriz que contém valores do tiposomething
, é fácil entender o que esse código faz. e esse código geraP^2+P+1
cartões usandoP^2+P+1
imagens, cada uma contendoP+1
imagem e compartilhando apenas uma imagem em comum, para cada valor P principal. o que significa que podemos ter 7 cartões usando 7 fotos, cada um com 3 fotos (para p = 2), 13 cartões usando 13 fotos (para p = 3), 31 cartões usando 31 fotos (para p = 5), 57 cartões para 57 fotos (para p = 7) e assim por diante ...desculpe novamente pelo código atrasado.
fonte
p=4
? (e 21 cartões / fotos)Aqui está a solução da Gajet em Python, pois acho o Python mais legível. Eu o modifiquei para que também funcione com números não primos. Usei o Thies insight para gerar um código de exibição mais fácil de entender.
Com saída:
fonte
(p) + (p * p) + (1)
configurações.all p except 4 and 6
. Se você deseja produzir um plano finito onde háp*p+p+1
pontos e linhas (cartões e figuras), então está relacionadofinite fields
e nãorings
. Existem campos finitos de ordemp
quando p éprime
ou aprime power
. Seu código funciona corretamente para números primos porque expressões comok * p + (j + i * k) % p
estão expressandok*p + j + i*k
em termos de multiplicação e adição no campo finito da ordemp
.p^2
,p^3
etc. Então, ele vai trabalhar para4, 8, 9, 16, 25, 27, ...
Usando o
z3
provador de teoremasLet
P
Ser o número de símbolos por cartão. De acordo com este artigo eypercubeᵀᴹ
a resposta, existemN = P**2 - P + 1
cartões e símbolos, respectivamente. Um baralho de cartas pode ser representado com sua matriz de incidência, que possui uma linha para cada carta e uma coluna para cada símbolo possível. Seu(i,j)
elemento é1
se o cartãoi
tiver um símboloj
. Só precisamos preencher essa matriz com essas restrições em mente:P
P
Isso significa
N**2
variáveis eN**2 + 2*N + (N choose 2)
restrições. Parece ser gerenciável em um período não muito longo comz3
pequenas entradas.edit : Infelizmente, P = 8 parece ser muito grande para este método. Eu matei o processo após 14 horas de tempo de computação.
Resultados
fonte
Eu gosto muito deste tópico. Eu construo este projeto python no github com partes deste código aqui para desenhar cartões personalizados como png (para que você possa solicitar jogos de cartas personalizados na internet).
https://github.com/plagtag/ProjectiveGeometry-Game
fonte
Escrevi um artigo sobre como gerar esse tipo de decks, com código em Perl. O código não é otimizado, mas é pelo menos capaz de gerar decks de pedidos "razoáveis" ... e um pouco mais.
Aqui está um exemplo da ordem 8, que deve considerar uma matemática subjacente um pouco mais complicada, porque 8 não é primo, embora seja uma ordem válida para gerar esse tipo de deck. Veja acima ou o artigo para obter uma explicação mais detalhada, abaixo, se você deseja gerar um Spot-It um pouco mais difícil :-)
Cada identificador de
0
a72
pode ser lido tanto como identificador de cartão quanto como identificador de imagem. Por exemplo, a última linha significa que:72
contém imagens2
,13
,22
, ...,59
,68
, E72
aparece em cartões2
,13
,22
, ...,59
, e68
.fonte