Le défi est simple: écrire un programme ou une fonction qui, lorsqu'il reçoit un entier fini non négatif, génère un tableau imbriqué.
Les règles
- Votre code doit produire un tableau imbriqué valide unique pour chaque entier 0 ≤ n <2 31 .
- Chaque tableau imbriqué possible avec jusqu'à 16 parenthèses ouvertes doit être sorti dans cette plage. (Cela ne signifie pas que votre code ne peut jamais sortir un tableau imbriqué avec plus de 16 crochets ouverts.)
- Votre code peut générer une représentation sous forme de chaîne du tableau imbriqué au lieu d'un tableau réel (avec ou sans virgules).
Une cartographie possible:
0 -> []
1 -> [[]]
2 -> [[[]]]
3 -> [[], []]
4 -> [[[[]]]]
5 -> [[[], []]]
6 -> [[[]], []]
7 -> [[], [[]]]
8 -> [[], [], []]
9 -> [[[[[]]]]]
etc.
Notation
Il s'agit de code-golf , donc le code le plus court en octets l'emporte.
code-golf
array-manipulation
balanced-string
ETHproductions
la source
la source
Réponses:
Python 2.7,
172 149 124 124118 octetsExplication:
Définissez une bijection par
[
↔1
et]
↔0
. Tout arrangement de parenthèses peut alors être écrit comme un nombre binaire et vice versa, par exemple[][]
↔1010
(10) et[[][]]
↔110100
(52). Tous les arrangements valides jusqu'à 15 crochets ouverts (30 crochets au total) sont couverts par des nombres jusqu'à 30 bits (en ignorant les zéros en tête), qui sont précisément les nombres inférieurs à 2 31 .La première boucle for donne l'inverse de cette bijection, convertissant un nombre en un arrangement de parenthèses, tout en vérifiant que l'arrangement est valide.
Les dispositions non valides sont remplacées dans l'instruction d'impression par de longues séquences de crochets pour éviter les collisions. Par exemple
11
(3) ↔[[
n'est pas valide, nous concaténons donc 3 + 16 crochets à la place. Cela garantit que tous les arrangements sont uniques.L'agencement résultant est placé dans une paire de crochets pour former un tableau imbriqué, de sorte que
1010
(10) devient[[][]]
et110100
(52) devient[[[][]]]
. Le support supplémentaire ouvert signifie que nous avons maintenant couvert tous les tableaux avec 16 supports ouverts.Le programme suivant peut être utilisé pour déterminer le numéro d'un tableau donné avec jusqu'à 16 crochets.
la source
Python,
153128 octetsNous mappons un nombre n à une liste imbriquée en regardant ses chiffres binaires de gauche à droite. Cet algorithme fonctionne pour n'importe quel nombre, pas seulement en dessous de 2 32 .
[
.][
.][
.]
.Enfin, nous fermons tous les crochets ouverts.
la source
Cuillère , 63 octets (501 bits)
Voici le programme brainfuck suivant converti en cuillère:
Lit un entier en binaire sur stdin et affiche la liste imbriquée sur stdin. Nécessite 0 pour être entré comme chaîne vide (pas de chiffres) et nécessite un interpréteur brainfuck avec des cellules 8 bits. Même algorithme que ma réponse Python.
Version lisible:
la source
Gelée , 28 octets
Cela itère sur toutes les chaînes de caractères
[
et]
qui commence par a[
et se termine par a]
, vérifie si les crochets correspondent et imprime la n ème correspondance.Essayez-le en ligne!
la source
Perl,
8079 octetsUtilise à nouveau l'algorithme d' orlp , mais cette fois j'ai d'abord vérifié si cela fonctionne ...
Comprend +1 pour
-p
Donner le numéro d'entrée sur STDIN
nest.pl
:La solution de Linus est de 64 octets en perl:
La solution de Dennis est de 59 octets en perl (de plus en plus lent pour les grands nombres):
la source
-p
compte pour 1 octet supplémentairePython 3,
120114 octetsTestez-le sur Ideone .
Comment ça marche
La fonction définie f prend l'entrée n et initialise k à 0 . Nous continuerons à incrémenter k jusqu'à ce que n + 1 valeurs de k donnent une sortie valide. Chaque fois que nous trouvons une telle valeur de k , n est décrémenté une fois qu'il atteint -1 ,
~n
donne 0 , et la liste r qui correspond à la dernière valeur de k est imprimée.Le mappage partiel des entiers positifs aux listes imbriquées (c'est-à-dire k ↦ r ) doit être bijectif, mais il n'y a pas d'autres contraintes. Celui utilisé dans cette réponse fonctionne comme suit.
Convertissez k en une représentation sous forme de chaîne binaire, en commençant par 0b .
Par exemple, 44 ↦ "0b101100" .
Remplacez tous les 0 (point de code 48 ) dans la représentation sous forme de chaîne par la chaîne "]", et tous les 1 (point de code 49 ) par [ .
Par exemple, "0b101100" ↦ "], b [], [[],]," .
Supprimez les trois premiers caractères (ils correspondent à "0b" ) et le caractère de fin (si tout va bien une virgule).
Par exemple, "], b [], [[],]," ↦ "[], [[],]" .
Essayez d'évaluer le code généré. Si cela entraîne une erreur, k n'est mappé à aucune liste.
Par exemple, "[], [[],]" ↦ ([], [[]]) .
Concatène le résultat (le cas échéant) avec la liste vide. Si cela entraîne une erreur, k n'est mappé à aucune liste.
Par exemple, ([], [[]]) + [] erreurs car + ne peut pas concaténer des listes et des tuples.
la source
Haskell, 71 octets
La fonction principale de la dernière ligne indexe dans une liste de tous les tableaux imbriqués, triés par taille (nombre de crochets ouverts). Ainsi, tous les tableaux de taille au plus 16 sont répertoriés en premier.
Examinons d'abord le code plus agréable et plus court, mais le vérificateur de typographie de Haskell refuse d'accepter.
La fonction
p
en entréen
donne une liste de tous les tableaux imbriqués de taillen
(crochets ouverts). Cela se fait récursivement. Chacun de ces tableaux se compose d'une têteh
(premier membre) de taillek
et d'une queuet
(autres membres) de taillen-k
, les deux tailles étant différentes de zéro. Ou, c'est le tableau vide pour la taillen==1
.L'expression
p=<<[1..]
s'aplatit ensuitep(1), p(2), ...
en une seule liste infinie de tous les tableaux triés par tailleet la fonction principale y est indexée.
... Ou, si Haskell ne se plaignait pas de "construire [ing] le type infini: t ~ [t]". Haskell ne peut pas représenter la liste infinie ci-dessus dont les éléments sont des tableaux imbriqués arbitrairement. Tous ses éléments doivent avoir le même type, mais un type t ne peut pas être le même qu'une liste de t. En fait, la fonction
p
elle-même ne peut pas être affectée à un type cohérent sans typage dépendant, ce qui manque à Haskell.Donc, à la place, nous travaillons sur des chaînes de crochets, simulant l'opération par contre en agissant sur
[
et sur les]
caractères. Cela prend 9 octets supplémentaires. Les dangers du golf dans un langage sûr.la source
Haskell,
8782 octetsGénère les éléments du tableau. Exemple d'utilisation:
(([0..]>>= \y->y#y)!!) 3
->"[][]"
.La fonction
#
crée tous les tableaux imbriqués sous forme de chaînes pourn
lesm
crochets ouverts et fermés, en gardant une trace du nombre de chacun qui reste. Commence toujours parn == m
. La fonction principale appelley # y
for everyy <- [0,1,...]
et sélectionne l'élément à l'index donné par l'entrée.la source
MATL , 31 octets
Essayez-le en ligne! Ou vérifiez les premiers cas de test (cela prend quelques secondes).
La cartographie produite est:
Explication
Le code continue de tester des nombres binaires croissants, le chiffre étant
0
remplacé par-1
; c'est-à-dire en utilisant1
et en-1
tant que chiffres. Le chiffre1
représentera'['
et-1
représentera']'
.Le programme compte jusqu'à ce que n +1 numéros valides aient été obtenus. Un numéro est valide si les deux conditions suivantes sont remplies:
1
et-1
)1
chiffres dépasse toujours celui de-1
) sauf à la fin (où il est nul par la condition 1).Une fois que n +1 numéros valides ont été obtenus, le dernier est translittéré en changeant
1
en[
et-1
en]
, puis il est affiché.Code:
la source