Une liste vide est une liste qui, à aucun niveau, ne contient aucun objet non-liste. Ou si vous préférez une définition récursive
La liste vide est nulle
Une liste ne contenant que d'autres listes nulles est nulle
Toutes les listes de vides ont une profondeur finie.
Voici quelques exemples de listes de vides (en utilisant la syntaxe python):
[]
[[]]
[[],[]]
[[[]]]
[[[]],[]]
[[],[[]]]
Voici quelques exemples de choses qui ne sont pas des listes nulles:
["a"]
[[...]]
[1]
2
[[],([],[])]
Tâche
Écrivez deux fonctions distinctes (ou programmes si vous préférez). L'un doit prendre un entier positif (vous pouvez également inclure zéro si vous le souhaitez) comme argument et renvoyer une liste vide, l'autre doit prendre une liste vide et lui retourner un entier. Ces deux fonctions doivent toujours être inverses l'une de l'autre. C'est-à-dire que si vous passez la sortie de f
dans, g
vous devriez obtenir l'entrée d'origine de f
comme résultat de g
. Cela signifie que le mappage doit être de 1: 1, c'est-à-dire que pour chaque entier, il ne peut exister qu'une seule liste de vides pour laquelle g
donne cet entier et pour chaque liste de vides, il devrait y avoir exactement un entier pour qui f
donne cette liste de vides.
Vous créez essentiellement une Bijection
Vous pouvez choisir d'utiliser une représentation sous forme de chaîne d'une liste vide (avec ou sans virgules et espaces) au lieu du type de liste native de votre langue.
Notation
Votre score sera la longueur de vos deux fonctions ensemble. Il s'agit de code-golf , vous devez donc essayer de minimiser cette somme.
Réponses:
Pyth, 27 + 29 = 56 octets
f
:Suite de tests
g
:Suite de tests
Le système est très simple: je génère toutes les listes possibles avec pas plus d'un certain nombre de
[
. Ensuite, je les trie de manière à ce que les listes que je n'ai pas encore générées soient presque terminées. Tout cela se fait par la fonctiony
, identique dans les deux programmes. Il est écrit commeEnsuite, je l'indexe dans cette liste
f
et la rechercheg
.Le nombre de listes que je génère est choisi pour être suffisamment grand pour que j'ai généré toutes les listes possibles qui apparaîtront à ou avant l'emplacement souhaité dans la liste triée infinie.
Les programmes autorisent / renvoient 0 en option.
la source
Python 2 , 96 octets
Essayez-le en ligne! pour tester la bijection.
Prend des listes vides à des entiers non négatifs. 42 octets.
Prend des entiers non négatifs pour annuler les listes. 54 octets. Une tentative plus récursive a donné la même longueur.
la source
Java 7, 725 octets
f(int)
( 325 octets ):g(String)
( 75 + 325 octets ):Étant donné que la méthode
g
utilise la méthodef
pour calculer son résultat en bouclant sur la liste de vides possible jusqu'à ce qu'elle trouve celui égal à celui entré, les octets def
sont comptés deux fois (car les deux méthodes devraient pouvoir s'exécuter sans l'autre pour ce défi).Explication:
En général, la méthode fait
f
simplement une boucle sur toutes les représentations binaires de chaînes d'entiers et augmente un compteur chaque fois qu'une valeur valide est trouvée. Les chaînes binaires valides pour ce défi sont conformes aux règles suivantes: elles commencent par un1
et se terminent par un0
; ils ont un nombre égal de 1 et de 0; et chaque fois que vous supprimez le premier1
et0
que vous validez ce qui reste, ces deux règles s'appliquent toujours. Une fois que le compteur est égal à l'entrée, il convertit cette chaîne binaire en une liste vide de chaînes, en remplaçant all1
with[
et all0
with]
.Quant à la méthode
g
: nous commençons par"[]"
(représentant void-list0
), puis continuons à utiliser la méthodef
tout en augmentant un entier, jusqu'à ce qu'il corresponde à la chaîne d'entrée.Exemples de cas d'entrée et de sortie:
Essayez-le ici. (REMARQUE: C'est assez lent pour les derniers cas de test. Cela prendra environ 10 à 15 secondes pour chacun d'eux.)
la source
[][]
soit une liste. Peut-être que je comprends mal la façon dont Java fait quoi que ce soit. Ajouter[...]
autour d'eux tous et avoir 0 carte[]
devrait faire l'affaire.K (ngn / k) , 49 octets
Essayez-le en ligne!
utilise la formule de l'exemple dans Bijection: listes arborescentes - nombres naturels
la source
JavaScript (Node.js) , 82 octets
Essayez-le en ligne!
L'idée de xnor
la source
Python 3 - signe / abs, 73 octets
Essayez-le en ligne!
Implémentation simple, prend en charge les nombres négatifs.
L'entier
i
est codé[sign(i), abs(i)]
, oùsign(i)=[] if i > 0 else [[]]
etabs(i)=[[]] * i
, c'est-à-dire une liste de listes vides de longueur abs (i).Python 3 - binaire, 126 octets
Il s'agit d'une version plus élaborée (et beaucoup plus longue ...), où la valeur absolue est codée dans une représentation de liste binaire.
Essayez-le en ligne!
la source
Stax , 33 octets au total
Ces programmes sont inverses les uns des autres. Ils se convertissent vers et depuis toutes les listes de vides et tous les entiers non négatifs, donc cela inclut 0. Cela semble être peut-être une fonction célèbre d'une sorte d'algèbre que je ne connais pas. Afin d'envelopper ma tête autour de lui, j'ai d'abord implémenté les programmes en tant que fonctions en python.
Les programmes stax ont le même comportement.
Entier non négatif → Liste vide, 15 octets
Exécuter et déboguer
Liste des vides → Entier non négatif, 18 octets
Exécuter et déboguer
la source