Tiré de cette question à Stack Overflow. Merci également à @miles et @Dada d'avoir suggéré des entrées de test qui répondent à certains cas de coin.
Le défi
Étant donné un tableau de valeurs entières, supprimez tous les zéros qui ne sont pas flanqués d'une valeur différente de zéro.
De manière équivalente, une entrée doit être conservée si elle est non nulle ou si c'est un zéro qui est immédiatement proche d'une valeur non nulle.
Les entrées conservées doivent conserver dans la sortie l'ordre qu'elles avaient dans l'entrée.
Exemple
Donné
[2 0 4 -3 0 0 0 3 0 0 2 0 0]
les valeurs à supprimer sont marquées d'un x
:
[2 0 4 -3 0 x 0 3 0 0 2 0 x]
et donc la sortie doit être
[2 0 4 -3 0 0 3 0 0 2 0]
Règles
Le tableau d'entrée peut être vide (et la sortie doit également être vide).
Les formats d'entrée et de sortie sont flexibles comme d'habitude: tableau, liste, chaîne ou tout ce qui est raisonnable.
Code golf, le moins de mieux.
Cas de test
[2 0 4 -3 0 0 0 3 0 0 2 0 0] -> [2 0 4 -3 0 0 3 0 0 2 0]
[] -> []
[1] -> [1]
[4 3 8 5 -6] -> [4 3 8 5 -6]
[4 3 8 0 5 -6] -> [4 3 8 0 5 -6]
[0] -> []
[0 0] -> []
[0 0 0 0] -> []
[0 0 0 8 0 1 0 0] -> [0 8 0 1 0]
[-5 0 5] -> [-5 0 5]
[50 0] -> [50 0]
la source
_2
place de-2
? De nombreuses langues utilisent ce format.-0
?[010 0 0 01 1]
?Réponses:
JavaScript (ES6), 35 octets
Fonctionne également sur les flottants pour deux octets supplémentaires.
la source
Python, 50 octets
Une fonction récursive qui prend un tuple. Inclut le premier élément s'il y a une valeur non nulle parmi les deux premiers éléments ou la valeur précédente stockée la dernière fois. Ensuite, supprime le premier élément et revient. L'élément précédent est stocké dans la liste singleton
p
, qui s'emballe automatiquement dans la liste et commence comme vide (merci à Dennis pour 3 octets avec cela).55 octets:
Génère tous les morceaux de longueur 3 de la liste, en mettant d'abord des zéros au début et à la fin, et prend les éléments intermédiaires de ceux qui ne sont pas tous nuls.
Une approche itérative s'est avérée plus longue (58 octets)
Cela ne fonctionne pas exactement car
b,*l
nécessite Python 3, mais Python 3input
donne une chaîne. L'initialisation est aussi moche. Peut-être qu'une approche récursive similaire fonctionnerait.Malheureusement, la méthode d'indexation de
ne fonctionne pas car
l[-1:2]
interprète-1
comme la fin de la liste, pas un point avant son début.la source
Haskell,
5548 octetsExemple d'utilisation:
h [0,0,0,8,0,1,0,0]
->[0,8,0,1,0]
.scanr
reconstruit la liste d'entréex
avec un supplémentaire0
au début et à la fin. À chaque étape, nous modélisons 3 éléments et gardons celui du milieu s'il y a au moins un élément non nul.Merci @xnor pour 7 octets en passant de
zip3
àscanr
.la source
h x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t]
, mais je suppose qu'il n'y a pas de moyen court d'obtenir le deuxième élément d'un triplet.scan
d'unzip3
:h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]
.Matlab,
2927 octetsL'entrée doit être constituée d'une
1*n
matrice (lorsque celan=0
est possible). (Cela générera une erreur pour les0*0
matrices.)la source
's'
au lieu de'same'
<- :-D'UniformOutpout'
(naturellement). Mais je ne connaissais pas celui-ci~~a
place dea.*a
?logical
tableaux. Ceci est souvent un problème pour les modules intégrés qui ne sont pas écrits dans Matlab lui-même. Dans le cas contraire, les tableaux logiques se comportent un peu comme des tableaux numérotés. Cela pourrait fonctionner dans la pensée d'Octave, mais je ne l'ai pas installé pour le moment.J,
1714 octetsEnregistré 3 octets avec l'aide de @ Zgarb.
Usage
Explication
Essayez-le ici.
la source
0<
à la place de0~:
?MATL , 8 octets
La sortie est une chaîne avec des nombres séparés par des espaces. Un tableau vide à la sortie est affiché comme rien (pas même une nouvelle ligne).
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Le code convertit l'entrée en type logique, c'est-à-dire que les entrées non nulles deviennent
true
(ou1
) et les entrées nulles deviennentfalse
(ou0
). Ceci est ensuite convolu avec le noyau[1 2 3]
. Une valeur non nulle entraîne un résultat différent de zéro à cette position et à ses positions voisines. La conversion en logique donnetrue
des valeurs qui doivent être conservées, donc l'indexation de celle-ci produit la sortie souhaitée.la source
Jolf, 14 octets
Maintenant que j'y pense, Jolf est le Java des langages de golf. soupire Essayez-le ici.
Explication
la source
Python 3, 55 octets
la source
Gelée , 9 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
Perl, 34 + 1 (
-p
indicateur) = 35 octetsNécessite un indicateur -p pour fonctionner. Prend une liste de nombres comme imput. Par exemple :
la source
5
si j'entre50 0
.Haskell, 48 octets
Examine l'élément précédent
p
, le premier élémenth
et l'élément après (le cas échéant), et s'il y en a des non nuls, ajoute le premier élémenth
.La condition
any(/=0)$p:h:take 1t
est longue, en particulier latake 1t
. Je vais chercher un moyen de le raccourcir, peut-être en faisant correspondre les motifs.la source
Rétine ,
423533 octets7 octets grâce à Martin Ender.
La dernière ligne est nécessaire.
Vérifiez tous les tests en même temps. (Légèrement modifié pour exécuter tous les tests en même temps.)
On dirait que le langage parfait pour le faire ... a toujours été vaincu par la plupart des réponses.
la source
Mathematica, 43 octets
la source
C, 96 octets
Appelez
f()
avec un pointeur sur la liste des entiers et un pointeur sur la taille de la liste. La liste et la taille sont modifiées sur place.Essayez-le sur ideone .
la source
f(int*p,int*n)
enregistre un octet. Ou définissezs
comme un 3ème paramètre (ce n'est pas passé. C'est un peu OK).Brachylog ,
4438 octetsEssayez-le en ligne!
Ce langage est bon pour prouver les choses, c'est ce que nous utiliserons.
Prédicat 0 (prédicat principal)
Prédicat 1 (prédicat auxiliaire)
la source
Matlab avec boîte à outils de traitement d'image, 27 octets
Il s'agit d'une fonction anonyme.
Exemple d'utilisation:
la source
imerode
aussi, mais mes versions ont continué à être plus longues que ma version actuelle, beau travail =)Utilitaires Bash + GNU, 25
Accepte l'entrée en tant que liste séparée par des sauts de ligne.
Ideone - avec le code du pilote de test ajouté pour exécuter tous les cas de test ensemble en convertissant vers / depuis les espaces séparés et les sauts de ligne.
la source
Cheddar , 78 octets
Suite de tests.
Cheddar n'a pas de filtre, donc le filtrage se fait en enveloppant les éléments que nous voulons et en transformant les éléments que nous ne voulons pas en tableaux vides, puis en concaténant tout.
Par exemple,
[0,0,0,8,0,1,0,0]
devient[[],[],[0],[8],[0],[1],[0],[]]
, puis le tableau concaténé serait[0,8,0,1,0]
.la source
.reduce((+))
->.sum
APL, 14 octets
Tester:
Explication:
0,⍵,0
: ajouter un zéro au début et à la fin de ⍵×3∨/
: trouver le signe du GCD de chaque groupe de trois nombres adjacents (ce sera 0 s'ils sont tous nuls et 1 sinon).⍵/⍨
: sélectionnez tous les éléments de ⍵ pour lesquels le résultat était 1.la source
Ruby 2.x, 63 octets
Le crédit là où il est dû, c'est essentiellement un portage de la réponse ES6 supérieure de Neil.
C'est aussi ma première soumission de pcg. Yay.
la source
Brain-Flak 142 octets
Essayez-le en ligne!
Explication
la source