Polystrips são um subconjunto de poliominoes em conformidade com as seguintes regras:
- cada peça consiste em 1 ou mais células
- nenhuma célula pode ter mais de dois vizinhos
- as células não devem colocar um buraco
Os poliominos livres são distintos quando não há uma transformação rígida (translação, rotação, reflexão ou reflexão de deslizamento) de outra (peças que podem ser apanhadas e viradas). Traduzir, girar, refletir ou deslizar refletindo um poliomino livre não muda sua forma ( Wikipedia )
Por exemplo, existem 30 heptastrips livres (polystrips com comprimento 7). Aqui estão todos eles, agrupados em uma grade de 14x15.
Crédito da imagem: Miroslav Vicher
Objetivo
Escreva um programa / função que receba um número inteiro positivo n
como entrada e enumere as n
tiras livres-distintas .
n = 1 -> 1 (um único quadrado)
n = 2 -> 1 (Existe apenas uma 2 faixas possíveis de 2 quadrados)
n = 3 -> 2 (um é composto por 3 quadrados unidos em uma linha e o outro é em forma de L)
n = 4 -> 3 (um reto, um em L e um em Z)
. . .
Casos de teste:
n polystrips
1 1
2 1
3 2
4 3
5 7
6 13
7 30
8 64
9 150
10 338
11 794
12 1836
13 4313
14 10067
15 23621
Pontuação
Isso é código-golfe , então o código mais curto é melhor. Eu apreciaria muito as explicações detalhadas do algoritmo e do código.
Implementação de referência parcial em J
Decidi descrever cada peça no formato "vetor" e só preciso de n-2 blocos para descrever uma peça de n-poli-faixa (existe apenas 1 2-poli-faixa e é retornada explicitamente). Os blocos descrevem a direção relativa: 0 - sem alteração; 1 - vire à esquerda; 2 - vire à direita. Não importa em que direção uma começará, mas apenas para indicar onde a próxima célula será colocada. Pode haver qualquer número de 0s consecutivos, mas 1s e 2s são sempre únicos. Essa implementação é parcial, porque não leva em conta os furos - as soluções para n> 6 contam as peças com furos também.
fonte
101010
na notação de amostra)?Respostas:
Python 3 ,
480433406364309299295 bytesParecia um bom ponto para começar minha carreira no PPCG (ou não?).
Experimente online!
Editar% s:
D
eX
, e tweaked um pouco em alguns pontos de golfe.m
. (Números complexos são realmente um recurso de golfe forte, mas muitas vezes ignorado; adaptados da solução da xnor para outro desafio )LFR
representação string para-1,0,1
tuplas e sacrificou o tempo de execução por uma quantidade louca de redução de bytes (!). Agora, a solução está teoricamente correta, mas expirou o tempo limite antes de gerar o resultado para 15.r
. FINALMENTE SOB 300 BYTES !!!1j
pode se ater a qualquer outra coisa sem confundir o analisador (-2B) enot
tem precedência incrivelmente baixa (-2B).Versão obsoleta (480 bytes):
Experimente online!
Solução ungolfed com comentários:
Experimente online!
Não precisamos mais disso, e agora é garantido que o tamanho da entrada é arbitrário, graças ao número complexo incorporado.m = 999
é escolhido porque leva um tempo exponencial para contar tudo e já está demorando ~ 8s para calcularn = 1..15
. Talvez seja bom economizar 1 byte usando 99.fonte
APL (Dyalog Unicode) ,
7065 bytesExperimente online!
Versão completa do programa do código abaixo, graças a Adám.
APL (Dyalog Unicode) , 70 bytes
Experimente online!
Como funciona
O código acima é equivalente à seguinte definição:
Isso funciona como a solução Python, mas em uma ordem diferente. É
gen
eradosLFR
-strips de comprimenton-2
,canonicalize
s cada tira, leva∪
tiras nique,test
s cada tira se toca em si (1, se não se tocam, 0 de outro modo), e soma+/
o resultado booleano.gen
canonicalize
test
fonte