Suppression ciblée des doublons

Oct 12 2020

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

10 user Oct 13 2020 at 00:02

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?
9 Giuseppe Oct 12 2020 at 19:27

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é.

7 Arnauld Oct 12 2020 at 16:17

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.

6 xnor Oct 12 2020 at 16:26

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).

6 Caagr98 Oct 13 2020 at 06:55

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!

5 Noodle9 Oct 12 2020 at 21:36

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  
}
5 ovs Oct 12 2020 at 16:36

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

4 Shaggy Oct 12 2020 at 16:13

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)
4 KevinCruijssen Oct 12 2020 at 19:44

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)
4 JonathanAllan Oct 12 2020 at 18:43

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.

3 Noodle9 Oct 13 2020 at 01:41

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.

3 Adám Oct 14 2020 at 18:21

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)

3 att Oct 13 2020 at 00:49

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.

2 Jitse Oct 12 2020 at 15:27

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.

2 ovs Oct 12 2020 at 17:16

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)
2 KjetilS. Oct 12 2020 at 17:42

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.

2 GalenIvanov Oct 12 2020 at 17:30

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!

2 Graham Oct 12 2020 at 20:30

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

2 Razetime Oct 12 2020 at 16:22

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.

2 LiefdeWen Oct 13 2020 at 14:54

C # (compilateur interactif Visual C #) , 42 octets

a=>b=>a.Where((x,i)=>x!=b|i==a.IndexOf(b))

Essayez-le en ligne!

2 TomerShetah Oct 13 2020 at 15:11

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
2 AZTECCO Oct 13 2020 at 04:48

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!

2 TheCoderPro Oct 19 2020 at 10:28

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!

2 Julian Dec 15 2020 at 13:06

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.

1 GalenIvanov Oct 12 2020 at 16:19

Rouge , 46 octets

func[n b][try[replace/all find/tail b n n[]]b]

Essayez-le en ligne!

1 Neil Oct 12 2020 at 16:56

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.

1 ovs Oct 12 2020 at 15:41

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!

1 GalenIvanov Oct 12 2020 at 20:09

K (Kona) , 21 octets

{y@&(~x=y)+(!#y)=y?x}

Essayez-le en ligne!

1 ConorO'Brien Oct 13 2020 at 23:38

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]

1 ZsoltSzilagy Oct 18 2020 at 06:05

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 ...)