Étant donné l'entrée d'une liste d'entiers positifs dont certains ont été remplacés par 0
, affichez la liste avec les nombres manquants qui ont été 0
remplacés par.
Caractéristiques de la liste d'entrée:
La liste aura toujours une longueur d'au moins 2.
Définissons la liste d'entrée comme
a
et la "liste d'origine" (c'est-à-dire la liste avant que les nombres aient été remplacés par0
s) commeb
. Pour toutn
,a[n]
c'est soitb[n]
ou0
.Pour tout
n
,b[n]
c'est soitb[n-1] + 1
oub[n-1] - 1
. C'est-à-dire que les nombres enb
changeront toujours de1
chaque index par rapport au précédent. Le premier élément est bien entendu exempté de cette règle.Pour chaque série de zéros dans
a
(c'est-à-dire les éléments consécutifs remplacés par0
), avecx
représentant l'index du début de la série ety
représentant la fin,a[x-1]
toa[y+1]
sera toujours soit uniquement en augmentation soit uniquement en diminution. Par conséquent, il n'y aura qu'une seule façon possible de remplir les zéros.- Cela signifie également que ni le premier ni le dernier élément du tableau ne peuvent être des zéros.
En termes plus simples, pour remplir une série de zéros, remplacez-le simplement par une plage allant du nombre précédent au nombre suivant. Par exemple, une entrée de
1 2 0 0 0 6 7
doit sortir
1 2 3 4 5 6 7
Puisqu'il s'agit de code-golf , le code le plus court en octets gagnera.
Cas de test:
In Out
-----------------------------------------------------
1 0 0 0 5 6 0 4 0 0 1 | 1 2 3 4 5 6 5 4 3 2 1
7 6 0 0 3 0 0 0 7 0 5 | 7 6 5 4 3 4 5 6 7 6 5
1 0 3 0 5 0 3 0 5 0 7 | 1 2 3 4 5 4 3 4 5 6 7
14 0 0 0 0 0 0 0 0 23 | 14 15 16 17 18 19 20 21 22 23
la source
0
notre programme peut-il prendre une autre valeur telle quenull
?0
.Réponses:
JavaScript (ES6),
72 66 64 5453 octets12 octets enregistrés grâce à @Neil!
1 octet enregistré grâce à @IsmaelMiguel
Très bon pour JavaScript.
Essayez-le en ligne (tous les navigateurs fonctionnent)
Explication
la source
a.find((q,r)=>r>i&&q)>b?++b:--b
c'est la même chose queb+=a.find((q,r)=>r>i&&q)>b||-1
MATL , 11
12octetsFonctionne avec la version actuelle (13.0.0) du langage / compilateur.
Essayez-le en ligne!
la source
Haskell,
686158 octetsExemple d'utilisation:
g.filter(>0) $ [7,6,0,0,3,0,0,0,7,0,5]
->[7,6,5,4,3,4,5,6,7,6,5]
.Comment ça marche: supprimez les zéros de l'entrée, puis appelez
g
. Soita
le premierb
puis le deuxième élément de la liste restante. Concaténer les listes dea
haut en basb-1
et dea
bas en hautb+1
(l'une d'entre elles sera vide) et un appel récursif aveca
abandon.Modifier: @Zgarb a enregistré 3 octets. Merci!
la source
Mathematica, 59 octets
Cas de test
la source
Perl,
4745443937 octetsComprend +1 pour
-p
Attend la liste sur stdin. Exemple: écho 1 0 3 0 1 | perl -p fichier.pl
la source
Gelée,
1211 octetsEssayez-le en ligne!
Version alternative, 8 octets (non concurrent)
Malheureusement, Jelly's
pop
n'a pas été lancé en version itérable, dans la dernière version antérieure à ce défi. Ce problème a été corrigé et les éléments suivants fonctionnent dans la version actuelle.Essayez-le en ligne!
Comment ça marche
Dans la version alternative,
ḢWW;
devient inutile. Cependant, étant donné que le premier élément est converti en itérable avant l'éclatement, il n'est pas réellement modifié. La finaleḊ
supprime le doublon du premier élément.la source
Rétine,
393431 octets3 octets enregistrés grâce à @Martin.
Prend l'entrée et donne la sortie en unaire.
Le code remplit de manière itérative tous les espaces vides (0) avec
previous_number - 1 + 2 * if_next_nonzero_number_bigger
.previous_number - 1
est$1
etif_next_nonzero_number_bigger
est$3
.Avec les E / S décimales, le code fait 51 octets, comme vous pouvez le voir dans l' interpréteur en ligne avec tous les cas de test .
la source
1
dans la tête de lecture.GNU Sed (avec
exec
extension utilisant bash), 61Le score inclut +1 pour l'
-r
option de sed.0
s et les remplacer..
{1..4}
pour les points de terminaison locaux. La beauté des extensions d'accolade bash ici est que la séquence générée s'exécutera toujours dans la bonne direction, que le début ou la fin soit plus grand.e
option de las
commande pour appeler bash afin d'évaluer cette extension d'accolade0
s sont trouvés, revenez au début.Ideone.
la source
Python 2,
195111 octets (merci Alex !)Entrée: doit être une valeur en
[list]
poucesSortie: en
[list]
poucesla source
Perl,
8582 octetscomprend +1 pour
-p
Attend la liste sur stdin. Exemple:
echo 1 0 3 0 1 | perl -p file.pl
.Cela utilise une expression rationnelle imbriquée. Assez lisible:
la source
Python 2,
9288 octets(Variable intermédiaire supprimée)
la source
Pyth, 17 octets
La façon dont cela fonctionne:
En d'autres termes: tous les zéros sont supprimés de l'entrée, puis une plage exclusive est insérée entre chaque élément. Cette plage est de longueur nulle sur des éléments séparés d'un seul.
la source
05AB1E , 3 octets (non concurrent)
C'était une fonctionnalité ajoutée après le défi. Code:
Explication:
Essayez-le en ligne! ou Vérifiez tous les cas de test!
la source
Vim: 231 commandes clés
Notez que tout ^ précédant un caractère signifie que vous devez garder le contrôle tout en tapant ce caractère
Étapes pour que vous puissiez exécuter cela aussi!
:s/\^V/<Ctrl-V><Ctrl-V>/g
et appuyez sur Entrée (les deux s devraient vous donner un ^ V bleu):s/\^R/<Ctrl-V><Ctrl-R>/g
et appuyez sur Entrée (vous devriez voir bleu ^ Rs maintenant):s/\^X/<Ctrl-V><Ctrl-X>/g
et appuyez sur Entrée (vous devriez voir des ^ Xs bleus maintenant):s/\^O/<Ctrl-V><Ctrl-O>/g
et appuyez sur Entrée:s/\^A/<Ctrl-V><Ctrl-A>/g
et appuyez sur Entrée:s/\^\[/<Ctrl-V><Ctrl-[>/g
et appuyez sur Entrée (cette commande est légèrement différente car j'avais besoin d'échapper au [)0"yy$
. La commande est maintenant stockée dans le registre y@y
Si quelqu'un connaît une meilleure façon de partager la commande, faites-le moi savoir. Je sais que c'est long, mais c'est le mieux que j'ai pu trouver.
Entrée sortie
La chaîne d'entrée doit être seule sur n'importe quelle ligne du fichier. 1 0 0 4 3 0 0 0 7
La sortie remplacera simplement la chaîne d'entrée 1 2 3 4 3 4 5 6 7
Explication
Algorithme
Macros utilisées
@e - Vérifiez la fin. Le dernier numéro sera accompagné d'un e. Si le nombre sous le curseur a un e à la fin, supprimez le e et arrêtez l'exécution. Sinon, démarrez un cycle d'interpolation avec @b.
@b - Commence le cycle d'interpolation. Enregistrez le nombre sous le curseur pour une opération de soustraction (@s) puis recherchez le terme non nul suivant (@f)
@s - Stocke la commande de soustraction à utiliser dans @d. C'est simplement
(val)^X
où(val)
est le nombre au début de l'étape d'interpolation. Ceci est défini par la commande @b.@f - Trouver le prochain terme non nul. Écrivez la valeur actuelle dans le registre sans nom, puis écrivez
@f @d
sur la ligne suivante, puis exécutez @z. Cela répétera cette commande si le nombre est un zéro et exécutera @d s'il ne l'est pas.@z - Exécution conditionnelle si le registre sans nom est 0. Cette commande attend deux commandes sur une nouvelle ligne au format
command1 command2
. Si le registre sans nom est 0,command1
est exécuté, sinoncommand2
est exécuté. Notez qu'aucune commande ne peut contenir d'espace.@t - Registre de commande temporaire. Stocke diverses commandes pendant une courte période avant de les exécuter. Utilisé principalement dans les instructions if.
@d - Détermine la direction d'interpolation. Soustrait le premier nombre de la séquence du nombre sous le curseur (en utilisant @s). Si le résultat est négatif, l'interpolation doit diminuer afin que ^ X soit enregistré dans @a. Sinon, nous devons incrémenter pour que ^ A soit enregistré dans @a. Une fois que cela est enregistré, revenez au début de ce cycle d'interpolation et exécutez @i pour réellement interpoler
@a - Stocke
^A
ou^X
pour incrémenter ou décrémenter pendant l'étape d'interpolation. Ceci est défini par la commande @d.@i - Interpoler. Copiez le numéro de l'emplacement actuel dans @x et passez au numéro suivant. Si ce nombre est nul, remplacez-le par @x et exécutez @a pour le modifier correctement vers le haut ou vers le bas, puis répétez cette commande. Si le nombre n'est pas un zéro, nous avons atteint la fin de ce cycle d'interpolation. Un nouveau doit être démarré avec ce numéro comme début, donc exécutez @e pour vérifier la fin et recommencez.
@x - Registre de stockage temporaire. Utilisé dans la commande interpoler (@i)
Décomposer les frappes
la source
Python 3.5, 159 octets
une solution récursive
Non golfé
Dans la solution golfée, je remplace les conditions en utilisant le fait que
h*True=h
eth*False=[]
Résultat
la source
Perl 6 , 54 octets
la source
MATLAB,
393837 octetsFonction anonyme qui interpole linéairement entre les points dans
a
.find(a)
est un tableau d'indices d'éléments non nuls dansa
eta(a>0)
sont les valeurs positives. Enregistré 1 octet grâce à la suggestion d'un ami>
plutôt que~=
.la source