introduction
Certains d'entre vous ont peut-être entendu parler du Hilbert's Grand Hotel . Le responsable a perdu sa liste des lieux de séjour des invités mais il a toujours l'ordre dans lequel ils se sont enregistrés. chambre, tous les invités dans les chambres supérieures sans espace vide entre eux et le nouvel invité sont déplacés d'une chambre. Pouvez-vous l'aider à trouver où logent chacun des invités?
Exigences
Écrivez un programme qui reçoit une liste ordonnée de nombres naturels en entrée et les place à leur index. S'il existe déjà une valeur dans cet index, elle est déplacée vers le haut jusqu'à l'entrée suivante dans la liste. Ce processus se répète jusqu'à ce que le premier espace vide (0 ou non défini) soit trouvé. Tout espace non défini entre l'index le plus élevé actuel et toute nouvelle entrée sera rempli en ajoutant des 0. Comme il s'agit du Hilbert's Grand Hotel, les chambres supérieures à l'indice d'occupation actuel le plus élevé n'existent pas.
Entrée et sortie
L'entrée sera une liste ordonnée de nombres naturels (autorisés à être lus à travers toute forme acceptée d'entrée)
Chaque numéro dans l'entrée est considéré comme un invité arrivant à l'hôtel et est dans l'ordre d'arrivée
La sortie sera l'arrangement final des invités (nombres)
Exemples
Entrée: 1 3 1
Sortie: 1 1 3
Étape par étape:
1
Créez une pièce à l'index 1 et placez-y 1
1 3
Créez des pièces jusqu'à l'index 3 et placez 3 dans la pièce 3
1 1 3
Déplacez le contenu de la pièce 1 vers le haut une pièce et place 1 dans la pièce 1Entrée: 1 4 3 1 2 1
Sortie : 1 1 2 1 3 4
Étape par étape:
1
Créez une pièce à l'index 1 et placez-y 1
1 0 0 4
Créez des pièces jusqu'à l'index 4 et placez 4 dans la pièce 4
1 0 3 4
Placez 3 dans la pièce 3
1 1 3 4
Déplacez le contenu de la pièce 1 vers le haut d'une pièce et placez 1 dans la pièce 1
1 2 1 3 4
Déplacez le contenu des pièces 2 à 4 vers le haut d'une pièce et placez 2 dans la pièce 2
1 1 2 1 3 4
Décaler le contenu des pièces 1 à 5 d'une pièce et placer 1 dans la pièce 1Entrée: 10
Sortie: 0 0 0 0 0 0 0 0 0 0 10 10
Pas à pas:
0 0 0 0 0 0 0 0 0 10
Créez des pièces jusqu'à la pièce 10 et placez 10 dans la pièce 10Remarques:
travailler avec 0 indexé est très bien et vous pouvez insérer un 0 à l'avant de la sortie dans ce cas
Les failles standard sont interdites, le code le plus court en octets gagne
la source
PHP 93 octets
0 indexé. Utilise une boucle 2 en 1 qui recherche l'invité suivant après avoir obtenu un 0 (ou une forme nulle dépassant la salle finale actuelle). Utilisez comme:
Non golfé:
la source
Haskell , 107 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
144120 octetsSauvé de 20 milliards grâce à Arnauld et de 11 milliards grâce à Neil
Usage
Vous pouvez affecter la fonction à la variable
f
et la liste doit être donnée sous forme de tableau. Exemple:Sortie
La sortie est également dans un tableau. Étant donné que Javascript fonctionne avec un index zéro, il y a un 0 supplémentaire à l'avant.
la source
(c+'').split`,`.map(Number)
faire le travail?c.map(n=>n|0)
plutôt que(c+'').split`,`.map(Number)
.map()
pas du tout sur les valeurs non définies dans le tableau. (Cela dit, je suis presque sûr qu'il existe un chemin plus court que celui que j'ai suggéré.)JavaScript (ES6), 86 octets
Zéro en tête du résultat car JavaScript est indexé sur 0.
la source
Mathematica, 98 octets
Fonction sans nom prenant une liste d'entiers positifs et renvoyant une liste d'entiers indexés sur 0. La
If
fonction entière prend une liste partiellement complétée et le prochain entier à insérer comme arguments. Si l'entier suivant dépasse la longueur de la liste partielle,PadRight@##~Append~#2
augmente la liste partielle en conséquence; sinon,Join[Take@##,{#2},Drop@##/.{a___,0,b__}->{a,b}]]
insère le prochain entier dans sa position, puis jette le premier0
trouvé après lui.Fold[...,{0},#]
applique cette fonction à plusieurs reprises à la liste d'origine, en commençant par l'hôtel vide{0}
, et affiche la liste finale des hôtels.la source
JavaScript (ES6), 81
Utilisation de l'indexation 0
Moins golfé
Tester
la source
R, 133 octets
Pour éviter les problèmes d'indexation incorrecte, je remplis de zéros, puis je les supprime à la fin. Ce n'est peut-être pas la meilleure solution, mais cela fonctionne.
la source
Python,
134125116 octetsValable pour Python 2.7.13 et 3.6.0. Ce code fonctionne au moyen d'un échange de la valeur maintenue avec la valeur contenue à chaque index jusqu'à ce que la valeur retenue soit 0. S'il atteint un index pas encore dans le tableau, il ajoute des zéros à la fin du tableau jusqu'à ce que le tableau contienne cela indice. Merci à Wheat Wizard et xnor pour avoir joué 9 octets chacun
la source
while
etif
n'ont pas besoin de parens. Vous pouvez placer plusieurs instructions sur une même ligne, séparées par;
comme,if(i<d):r.extend([0]*(d-i));i=d
sauf s'il y a un flux de contrôle dans les instructions ultérieures.