Les polystrips sont un sous-ensemble de polyominos se conformant aux règles suivantes:
- chaque pièce se compose de 1 ou plusieurs cellules
- aucune cellule ne peut avoir plus de deux voisins
- les cellules ne doivent pas fermer un trou
Les polyominos libres sont distincts quand aucun n'est une transformation rigide (translation, rotation, réflexion ou réflexion de glissement) d'un autre (morceaux qui peuvent être ramassés et retournés). La traduction, la rotation, la réflexion ou le glissement reflétant un polyomino libre ne change pas sa forme ( Wikipedia )
Par exemple, il existe 30 heptastrips libres (polystrips de longueur 7). Voici tous, emballés dans une grille 14x15.
Crédit d'image: Miroslav Vicher
Objectif
Écrivez un programme / une fonction qui prend un entier positif n
en entrée et énumère les n
bandes de couleurs libres distinctes .
n = 1 -> 1 (un seul carré)
n = 2 -> 1 (Il n'y a qu'une seule bande 2 possible composée de 2 carrés)
n = 3 -> 2 (l'un est composé de 3 carrés réunis en ligne et l'autre est en forme de L)
n = 4 -> 3 (une droite, une en L et une en Z)
. . .
Cas de test:
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
Notation
C'est du code-golf , donc le code le plus court est meilleur. J'apprécierais fortement les explications détaillées de l'algorithme et du code.
Implémentation de référence partielle dans J
J'ai décidé de décrire chaque pièce au format "vecteur" et je n'ai besoin que de n-2 blocs pour décrire une pièce n-polystrip (il n'y a que 1 2-polystrip et elle est retournée explicitement). Les blocs décrivent la direction relative: 0 - pas de changement; 1 - tournez à gauche; 2 - tournez à droite. Peu importe dans quelle direction on commencera, mais seulement pour indiquer où la cellule suivante doit être placée. Il peut y avoir n'importe quel nombre de 0 consécutifs, mais les 1 et les 2 sont toujours simples. Cette implémentation est partielle, car elle ne tient pas compte des trous - les solutions pour n> 6 comptent également les pièces avec des trous.
la source
101010
dans votre exemple de notation)?Réponses:
Python 3 ,
480433406364309299295 octetsCela semblait être un bon point pour commencer ma carrière PPCG (ou pas?).
Essayez-le en ligne!
Modifications:
D
etX
, et peaufiné un peu sur certains spots golfables.m
. (Les nombres complexes sont vraiment une caractéristique golfique forte mais souvent ignorée; adapté de la solution de xnor pour un autre défi )LFR
représentation des chaînes en-1,0,1
tuples et sacrifié le temps d'exécution pour une quantité folle de réduction d'octets (!). Maintenant, la solution est théoriquement correcte, mais les délais d'attente avant de produire le résultat pour 15.r
. ENFIN SOUS 300 OCTOS !!!1j
peut s'en tenir à autre chose sans confondre l'analyseur (-2B) etnot
a une priorité incroyablement faible (-2B).Version obsolète (480 octets):
Essayez-le en ligne!
Solution non golfée avec commentaires:
Essayez-le en ligne!
Nous n'en avons plus besoin, et maintenant il est garanti d'être correct pour une taille d'entrée arbitraire, grâce à un nombre complexe intégré.m = 999
est choisi car il faut du temps exponentiel pour tout compter, et cela prend déjà ~ 8s pour calculern = 1..15
. Peut-être que c'est bien d'économiser 1 octet en utilisant 99 à la place.la source
APL (Dyalog Unicode) ,
7065 octetsEssayez-le en ligne!
Version complète du programme du code ci-dessous, grâce à Adám.
APL (Dyalog Unicode) , 70 octets
Essayez-le en ligne!
Comment ça fonctionne
Le code ci-dessus est équivalent à la définition suivante:
Cela fonctionne comme la solution Python, mais dans un ordre différent. Il
gen
nèreLFR
-strips de longueurn-2
,canonicalize
est chaque bande, prend∪
bandes nique,test
est chaque bande elle-même si elle touche (1 si ne se touchent pas, sinon 0), et additionne+/
le résultat booléen.gen
canonicalize
test
la source