Suppression ciblée des doublons
La tâche
Dans ce défi, vous recevez un numéro et une liste. Votre tâche consiste à supprimer de la liste toutes les occurrences du nombre donné à l'exception du premier (le plus à gauche) et à afficher la liste résultante. Les autres éléments de la liste doivent être laissés intacts.
- Le nombre sera un entier positif inférieur à 1000 et la liste ne contiendra que des entiers positifs inférieurs à 1000.
- Il n'est pas garanti que la liste contienne des occurrences du nombre donné. Il peut même être vide. Dans ces cas, vous devez afficher la liste telle quelle.
- Les formats d'entrée et de sortie sont flexibles dans la limite du raisonnable. Vous pouvez sortir en modifiant la liste en place.
- Le nombre d'octets le plus bas l'emporte.
Cas de test
5 [] -> []
5 [5] -> [5]
5 [5,5] -> [5]
10 [5,5] -> [5,5]
10 [5,5,10,10,5,5,10,10] -> [5,5,10,5,5]
2 [1,2,3,1,2,3,1,2,3] -> [1,2,3,1,3,1,3]
7 [9,8,7,6,5] -> [9,8,7,6,5]
7 [7,7,7,7,7,7,7,3,7,7,7,7,7,7,3,7,1,7,3] -> [7,3,3,1,3]
432 [432,567,100,432,100] -> [432,567,100,100]
Réponses
Husk , 5 4 octets
üoEė
Essayez-le en ligne!
- 1 octet enregistré grâce à Razetime
- Sauvegardé 2 octets grâce à Jo King
Merci à Razetime de m'avoir suggéré üet à Jo King de m'avoir fait savoir que je pouvais laisser les arguments en exposant de côté, ce qui m'a fait gagner 2 octets. Il supprime les doublons avec un prédicat personnalisé qui garantit que les deux arguments sont égaux au nombre à supprimer.
Explication:
üoEė
ü Remove duplicates by binary function (implicit second argument)
o Compose 2 functions
ė Make a list of 3 elements (first element is implicitly added)
E Are they all equal?
R , 30 octets
function(l,d)unique(l,l[l!=d])
Essayez-le en ligne!
unique()a la signature unique(x,incomparables = FALSE,...); cela définit incomparablesles éléments qui ne sont pas égaux à d, donc seul dest uniquifié.
JavaScript (ES6), 32 30 octets
Attend (x)(list).
x=>a=>a.filter(v=>v^x||a[a=0])
Essayez-le en ligne!
Comment?
Toutes les valeurs vqui ne sont pas égales à xsont conservées grâce à v^x. La première valeur égale à xest également conservée car elle a[0]est garantie comme étant un entier positif (sauf si elle aest vide, mais nous n'entrons pas dans la .filter()boucle pour commencer). Pour les valeurs suivantes qui sont égales à x, nous avons a = 0et a[0] === undefined, donc elles sont rejetées. Ce test ne génère pas d'erreur car les nombres sont des objets, il est donc légal d'accéder à la propriété (inexistante) '0'de 0.
Python 2 , 50 octets
l,n=input()
for x in l:
if~n-x:print x;n^=-(x==n)
Essayez-le en ligne!
Imprime une entrée par ligne.
L'idée est de stocker si nous avons déjà rencontré l'entrée à supprimer ndans le signe nplutôt que dans une variable booléenne distincte. Lorsque nous voyons une entrée de liste égale n, nous annulons n. Pour décider s'il faut imprimer l'entrée actuelle x, nous vérifions si elle est égale -n, ce qui vérifie qu'elle est égale à l'original net que nous avons déjà annulé en nraison d'une correspondance antérieure. Notez que puisque net les entrées de liste sont positives, il n'y a aucun moyen d'obtenir x==-navant nest annulé.
Eh bien, en fait, au lieu de nier n, il est plus court de le compléter en bits ~n, ce qui est -n-1. Pour faire la complémentation conditionnelle, nous notons que nous pouvons convertir [x,~x][b]en x^-b(comme dans cette astuce ), en utilisant ce xor au niveau du bit ^a x^0==xet x^-1==~x. Alors, nous le faisons n^=-(x==n).
Haskell , 43 octets
a%(b:c)|a==b=b:filter(/=a)c|1<2=b:a%c
_%x=x
Essayez-le en ligne!
Non golfé:
dedupl v (x:xs)
| x == v = x : filter (/= v) xs
| otherwise = x : dedupl v xs
dedupl _ [] = []
Haskell , 40 octets
Cette version prend un prédicat (négatif) pour l'entrée à la place.
f%(b:c)|f b=b:f%c|1<2=b:filter f c
_%x=x
Essayez-le en ligne!
C (gcc) , 60 octets
Sauvé 2 octets grâce à plafonnier !!!
Sauvegardé 2 octets grâce à ErikF !!!
t;f(d,l)int*l;{for(t=0;*l;++l)*l==d&&t++||printf("%d ",*l);}
Essayez-le en ligne!
Entre un nombre et un pointeur vers un tableau terminé par null (car il n'y a aucun moyen de connaître la longueur d'un tableau passé dans une fonction en C) et renvoie le tableau filtré vers stdout.
Explication
f(d, // function taking the duplicate number d,
l)int*l;{ // a null terminated array of int l
for( // loop...
t=0; // init test flag t to 0, this will mark the
// 1st (if any) occurance of d
*l; // ...over the array elements
++l) // bumping the array pointer each time
*l==d // if the array element isn't d...
&&t // or it's the 1st time seeing d
++ // unmark t by making it non-zero
||printf("%d ",*l); // ...then print that element
}
APL (Dyalog Unicode) , 18 15 10 octets
Merci à Adám pour -8 octets !!!
∊⊢⊆⍨≠∨<\⍤=
Essayez-le en ligne!
Exemples d'entrées: argument gauche, argument 3droit 1 2 3 4 3 4.
=fait une comparaison non égale par élément. => 0 0 1 0 1 0
<\Scans avec moins de. Cela ne garde que le premier 1, tous les autres endroits le sont 0. => 0 0 1 0 0 0
≠∨fait un OU élément par élément avec le ≠masque. => 1 1 1 1 0 1.
⊢⊆partitionne l'entrée en fonction du vecteur, y compris les positions avec des entiers positifs. => (1 2 3 4) (4) ∊aplatit le tableau imbriqué.=> 1 2 3 4 4
Japt , 10 7 octets
kȶV©T°
Essayez-le
-3 octets grâce à la caféine!
kȶV©T° :Implicit input of array U and integer V
k :Remove the elements in U that return true
È :When passed through the following function
¶V :Is equal to V?
© :Logical AND with
T° :Postfix increment T (initially 0)
05AB1E , 6 octets
Ê0X.;Ï
Entier comme première entrée, liste comme deuxième entrée.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Ê # Check for each value in the second (implicit) input-list whether it's NOT equal
# to the first (implicit) input-integer (1 if NOT equal; 0 if equal)
0X.; # Replace the first 0 with a 1
Ï # And only keep the values in the (implicit) input-list at the truthy (1) indices
# (after which the result is output implicitly)
Gelée , 6 5 octets
-1 grâce à la suggestion de Sisyphe d'utiliser Ẇà la place deW€
Ẇi¦⁹ḟ
Un programme complet acceptant la liste et la valeur qui imprime la représentation Jelly d'une liste avec tout sauf la première occurrence de la valeur supprimée (les listes vides n'impriment rien, les listes avec un élément impriment cet élément).
Essayez-le en ligne! Ou voir la suite de tests .
Comment?
Ẇi¦⁹ḟ - Link: list, A; value V
¦ - sparse application...
i ⁹ - ...to indices: first occurrence of V in A ([0] if no V found)
W - ...action: all non-empty sublists (since ¦ zips, the element, z, at any
given index of A will be [z])
ḟ - filter discard occurrence of V (leaves the [z] as is)
- implicit print
Je pensais que ḟẹḊ¥¦cela fonctionnerait pour 5, mais cela échoue avec une erreur de division par zéro avec [5,5]et 5.
Bash + sed, 49 octets
sed "s/\b$1\b/_/;s/\b$1\b \?//g;s/_/$1/"<<<${*:2}
Essayez-le en ligne!
Prend le premier argument comme doublon et le reste comme tableau.
APL (Dyalog Unicode) , 9 octets ( SBCS )
Traduction de la solution J de Galen Ivanov .
Fonction d'infixe tacite anonyme, prenant le nombre comme argument de gauche et la liste comme argument de droite (bien que l'ordre des arguments puisse être changé en changeant le ⊢s en ⊣s).
∊⊢⊆⍨≠∨∘≠⊢
Essayez-le en ligne!
⊢ sur le bon argument
… ∘≠ Appliquer nub-sieve (liste booléenne avec des vrais où les éléments uniques apparaissent en premier), puis:
… Par ∨ élément OU cela avec:
≠ Liste booléenne avec Vrai où les éléments de la liste sont différents du nombre
… ⊆⍨ Correspondant à des exécutions de Trues en ce sens que l'extrait s'exécute en:
⊢ la liste
∊ ϵ nlist (aplatir)
Wolfram Language (Mathematica) , 26 24 octets
#2/.(a=#)/;a++>#:>Set@$&
Essayez-le en ligne!
Le modèle (a=#)à mettre en correspondance n'est évalué qu'une seule fois, au tout début. Ensuite, la condition a++>#n'est évaluée que lorsque le modèle est mis en correspondance - elle aaura donc été incrémentée lors des correspondances suivantes.
Python 3 , 62 octets
f=lambda n,l:l.count(n)>1and f(l.pop(~l[::-1].index(n)),l)or l
Essayez-le en ligne!
Cette fonction affichera récursivement la dernière instance de la valeur donnée jusqu'à ce qu'il n'y ait pas plus d'une instance présente. Ensuite, il renvoie la liste.
ou, pour le même nombre d'octets
lambda n,l:[j for i,j in enumerate(l)if j!=n or i==l.index(n)]
Essayez-le en ligne!
Ceci est juste un simple filtre.
05AB1E , 8 octets
ʒÊD¾ms_½
Essayez-le en ligne!
Commenté :
ʒ # filter the first input on ...
Ê # not equal to the second input (n)?
D # duplicate this value
¾ # push the counter variable initially 0
m # power (value != n)**(counter)
# this is only 0 if value==n and counter is positive
s # swap to (value != n)
_ # negate this
½ # increment the counter variable if this is truthy (value == n)
Perl 5 , 36 octets
sub{$n=pop;$i=0;grep$n-$_||!$i++,@_}
Essayez-le en ligne!
Pop dernière valeur d'entrée de @_ dans $ n. Le @_ restant est la liste d'entrée. Filtre (grep) @_ pour les valeurs qui ne sont pas non plus égales à $ n ( $n-$_est vrai quand $ n et la valeur de la liste actuelle$_ is different) or is the first equal to $n puisque !$i++c'est la vérité pour le premier et non pour le reste.
J , 15 10 octets
-5 octets grâce à xash!
]#~=<:~:@]
Essayez-le en ligne!
Ma solution initiale:
J , 15 octets
[#~~:+i.@#@[=i.
Essayez-le en ligne!
APL + WIN, 19 octets
Demande le vecteur suivi de l'élément à supprimer:
((v≠n)+<\v=n←⎕)/v←⎕
Essayez-le en ligne! Merci à Dyalog Classic
Husk , 13 12 octets
F+ṀΓ·:f≠⁰↕≠⁰
Essayez-le en ligne!
réponse de l'utilisateur (- 3 octets, puis -1 octet).
Husk , 16 octets
J²fI§e←of≠²→↕≠²⁰
Essayez-le en ligne!
Peut probablement être raccourci avec Γ.
Il peut également y avoir une solution extrêmement courte avec réponse de l'utilisateurü.
+2 octets après avoir pris en charge les nombres ne figurant pas dans la liste.
C # (compilateur interactif Visual C #) , 42 octets
a=>b=>a.Where((x,i)=>x!=b|i==a.IndexOf(b))
Essayez-le en ligne!
Scala , 62 61 58 octets
a=>s=>{val(c,d)=s splitAt s.indexOf(a)+1;c++d.filter(a!=)}
Essayez-le en ligne!
- Merci à Galen pour -1 personnage
- Merci à l' utilisateur pour -3 caractères
Haskell , 55 octets
f n=foldl(\a x->if x==n&&x`elem`a then a else a++[x])[]
Essayez-le en ligne!
- La réponse précédente était compliquée et pas si bonne alors j'ai décidé d'essayer une approche plus expressive inspirée de la réponse @ Caagr98, la mienne est encore plus longue mais je me sens mieux maintenant =)
# 72 octets précédents
g b n(h:t)
|h/=n=h:g b n t
|b>0=g 1n t
|1>0=h:g 1n t
g b n _=[]
f=g 0
Essayez-le en ligne!
Javascript
117
113 octets
function x(i,j){var d=false;var o=[];for(x in i){if(i[x]==j){d?0:o.push(j),d=true;}else{o.push(i[x]);}}return o;}
Usage:
x (tableau d'entrée, nombre);
renvoie le tableau de sortie;
Essayez-le en ligne!
PowerShell Core , 50 31 octets
param($a,$b)$b|?{$_-$a-or!$o++}
-19 octets grâce à mazzy!
Essayez-le en ligne!
Itère sur le tableau passé en tant que deuxième paramètre et ignore l'occurrence dupliquée du premier paramètre.
Rouge , 46 octets
func[n b][try[replace/all find/tail b n n[]]b]
Essayez-le en ligne!
Charbon , 12 octets
IΦη∨⁻ιθ⁼κ⌕ηι
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
η Input list
Φ Filtered where
ι Current element
⁻ Subtract (i.e. does not equal)
θ Input integer
∨ Logical Or
κ Current index
⁼ Equals
⌕ First index of
ι Current element in
η Input list
I Cast to string
Implicitly print
Le dernier caractère pourrait aussi être θbien sûr puisque les deux variables sont égales à ce point.
Python 2 , 55 52 octets
Merci à xnor pour -3 octets!
La sortie est séparée par une nouvelle ligne.
n,l=input()
x=1
for d in l:
if x|d-n:print d;x*=d-n
Essayez-le en ligne!
K (Kona) , 21 octets
{y@&(~x=y)+(!#y)=y?x}
Essayez-le en ligne!
Empilé , 28 octets
[@y:0@b[b\y=:b+@b*¬]"!keep]
Essayez-le en ligne!
Explication
[@y:0@b[b\y=:b+@b*¬]"!keep]
[ ] anonymous function (expects 2 args)
@y save top as y
0@b initialize b = 0
: [ ]"! for each element E in the input array:
b\ save the current value of b for later computation
y= b+@b b = max(b, y == E)
b y=: *¬ not both (old b) and (y == E) are true
for y != E, and for the first y == E, this is 1, else 0
this generates a mask of 1s and 0s
keep keep only the elements in the input which correspond to a 1
Autres solutions
51 octets: [@y()@z{e:[z e push][z y∈¬*]$!e y=ifelse}[email protected]]
41 octets: [@y::inits[:y index\#'1-=]map\y neq+keep]
36 octets: [@y:0@b[b\:y=b\max@b y=*¬]map keep]
33 octets: [@y:0@b[b\:y=b+@b y=*¬]map keep]
PHP 63 octets
Numéro fourni dans $n, list provided in $une,
$p=explode($n,$a,2);echo$p[0].$n.str_replace("$n,", '', $p[1]);
Non golfé:
$p = explode($n,$a,2);
echo $p[0].$n.str_replace("$n,", '', $p[1]);
par exemple
$n=432; $a="[432,567,100,432,100]";
$p = explode($n,$a,2); echo $p[0].$n.str_replace("$n,", '', $p[1]);
(Je ne sais pas s'il est correct de ne pas compter l'entrée dans les octets, ou l'ouverture '<? Php' d'ailleurs ...)