Éléments en voie de disparition

17

Étant donné une chaîne Set une liste d'index X, modifiez Sen supprimant l'élément à chaque index de Stout en utilisant ce résultat comme nouvelle valeur de S.

Par exemple, étant donné S = 'codegolf'et X = [1, 4, 4, 0, 2],

0 1 2 3 4 5 6 7  |
c o d e g o l f  |  Remove 1
c d e g o l f    |  Remove 4
c d e g l f      |  Remove 4
c d e g f        |  Remove 0
d e g f          |  Remove 2
d e f

Votre tâche consiste à effectuer ce processus, à collecter les valeurs Saprès chaque opération et à afficher chacune sur une nouvelle ligne dans l'ordre. La réponse finale serait

S = 'codegolf'
X = [1, 4, 4, 0, 2]

Answer:

codegolf
cdegolf
cdeglf
cdegf
degf
def
  • C'est du alors faites votre code le plus court possible.
  • Vous pouvez supposer que les valeurs de Xsont toujours des indices valides pour S, et vous pouvez utiliser une indexation basée sur 0 ou basée sur 1.
  • La chaîne ne contiendra que [A-Za-z0-9]
  • Soit Sou xpeut être vide. Si Sest vide, il s'ensuit qu'il xdoit également être vide.
  • Vous pouvez également prendre Sune liste de caractères au lieu d'une chaîne.
  • Vous pouvez soit imprimer la sortie, soit renvoyer une liste de chaînes. Les espaces blancs avant et arrière sont acceptables. Toute forme de sortie est correcte tant qu'elle est facilement lisible.

Cas de test

S = 'abc', x = [0]
'abc'
'bc'

S = 'abc', x = []
'abc'

S = 'abc', x = [2, 0, 0]
'abc'
'ab'
'b'
''

S = '', x = []
''

S = 'codegolfing', x = [10, 9, 8, 3, 2, 1, 0]
'codegolfing'
'codegolfin'
'codegolfi'
'codegolf'
'codgolf'
'cogolf'
'cgolf'
'golf'
miles
la source
Pouvons-nous prendre Scomme liste de personnages?
M. Xcoder
@ Mr.Xcoder Bien sûr, je vais ajouter cela dans la spécification.
miles
Pouvons-nous imprimer une liste de caractères?
Erik the Outgolfer
Pouvons-nous ignorer le premier élément (la chaîne d'origine) dans la sortie?
ETHproductions
@ETHproductions Non, la sortie doit d'abord être la chaîne d'origine, puis chaque chaîne résultant de la suppression d'un caractère. La sortie doit donc contenir des len(x)+1chaînes.
miles

Réponses:

8

Haskell, 38 33 octets

s#i=take i s++drop(i+1)s
scanl(#)

Simple: prenez à plusieurs reprises les éléments avant et après l'index i, rejoignez-les et collectez les résultats.

Essayez-le en ligne!

Modifier: @Lynn a enregistré 5 octets. Merci!

nimi
la source
s#i=take i s++drop(i+1)sest en fait plus court, économisant 5 octets.
Lynn
1
Non, vous avez maintenant 33 ans - n'oubliez pas que l'extrait TIO en contient q=^^;
Lynn du
Oui, tu as raison.
nimi
8

JavaScript (ES6), 57 50 48 45 42 octets

Prend la chaîne comme un tableau de caractères individuels, génère un tableau contenant une chaîne séparée par des virgules de l'original suivie d'un sous-tableau de chaînes séparées par des virgules pour chaque étape.

s=>a=>[s+"",a.map(x=>s.splice(x,1)&&s+"")]
  • 3 octets économisés grâce à Arnauld suggérant que j'abuse la spécification de sortie lâche plus que je ne l'étais déjà, ce qui m'a conduit à en abuser encore plus pour une autre économie de 3 octets.

Essaye-le

o.innerText=JSON.stringify((f=

s=>a=>[s+"",a.map(x=>s.splice(x,1)&&s+"")]

)([...i.value="codegolf"])(j.value=[1,4,4,0,2]));oninput=_=>o.innerText=JSON.stringify(f([...i.value])(j.value.split`,`))
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>String: </label><input id=i><label for=j>Indices: </label><input id=j><pre id=o>


Explication

Nous prenons les deux entrées via des paramètres s(le tableau de chaînes) et a(le tableau d'entiers) dans la syntaxe de curry, ce qui signifie que nous appelons la fonction avec f(s)(a).

Nous construisons un nouveau tableau et commençons avec l'original s. Cependant, comme la spliceméthode que nous utiliserons plus tard modifie un tableau, nous devons en faire une copie, ce que nous pouvons faire en le convertissant en chaîne (ajoutez simplement une chaîne vide).

Pour générer le sous- maptableau , nous sur le tableau entier a(où xest l'entier actuel) et, pour chaque élément, nous splice1 élément à partir s, en commençant à l'index x. Nous retournons le modifié s, en faisant à nouveau une copie en le convertissant en chaîne.

Hirsute
la source
Parce que toute forme de sortie est très bien tant qu'elle est facilement lisible , je suppose que l'une devrait également être acceptable:s=>a=>[s+'',...a.map(x=>s.splice(x,1)&&s+'')]
Arnauld
Sympa, @Arnuald - Je n'aurais pas pensé pousser aussi loin, même compte tenu de cette spécification.
Shaggy
6

Japt , 6 octets

åjV uV

Testez-le en ligne!

Explication

UåjV uV   Implicit: U = array of integers, V = string
Uå        Cumulatively reduce U by
  j         removing the item at that index in the previous value,
   V        with an initial value of V.
     uV   Push V to the beginning of the result.

Alternativement:

uQ åjV

UuQ       Push a quotation mark to the beginning of U.
    å     Cumulatively reduce by
     j      removing the item at that index in the previous value,
      V     with an initial value of V.

Cela fonctionne car la suppression de l'élément à l'index "ne fait rien et renvoie donc la chaîne d'origine.

ETHproductions
la source
6

Décortiquer , 7 octets

G§+oh↑↓

Prend d'abord la chaîne, puis les indices (basés sur 1). Essayez-le en ligne!

Explication

G§+oh↑↓
G        Scan from left by function:
           Arguments are string, say s = "abcde", and index, say i = 3.
      ↓    Drop i elements: "de"
     ↑     Take i elements
   oh      and drop the last one: "ab"
 §+        Concatenate: "abde"
         Implicitly print list of strings on separate lines.
Zgarb
la source
Comment utiliser une liste d'indices vide x?
miles
@miles Vous devez spécifier le type, comme ceci .
Zgarb
Je vois, merci. Je ne connais pas très bien Haskell ou Husk.
miles
6

Python 2 , 43 octets

s,i=input()
for i in i+[0]:print s;s.pop(i)

Essayez-le en ligne!

Toute forme de sortie est correcte tant qu'elle est facilement lisible.

Donc, cela s'imprime sous forme de listes de caractères.

Erik le Outgolfer
la source
1
Bien, mais pourquoi avez-vous choisi l'abus de notation for i in i+[0]?
M. Xcoder
@ Mr.Xcoder Parce que de cette façon, la dernière ligne est affichée. (et la raison pour laquelle j'ai posté séparément en premier lieu)
Erik the Outgolfer
Non, non +[0], je parle for i in i. for k in iest équivalent .
M. Xcoder
@ Mr.Xcoder Parce que je l'aime comme ça ...
Erik the Outgolfer
Ok, juste curieux ... Peut-être que c'était un truc que je ne connaissais pas :)
M. Xcoder
5

Python 2 , 47 octets

Cela pourrait être raccourci à 43 octets , comme l'a souligné @LuisMendo, mais c'est déjà la solution de @ ErktheOutgolfer.

a,b=input();print a
for i in b:a.pop(i);print a

Essayez-le en ligne!

M. Xcoder
la source
`a`[2::5]au lieu de cela''.join(a)
Rod
@Rod Comment ça marche?
M. Xcoder
repret le fractionnement de chaînes, fonctionne bien pour transformer une liste de caractères en chaîne, `a`[1::3]peut également être utilisé avec une liste de chiffres
Rod
@ Rod Je sais ce que c'est, je ne comprends pas comment ça ::5marche ici: P
M. Xcoder
@ Mr.Xcoder, puis étudiez le découpage des cordes;) en gros, il faut tous les 5 caractères à partir du 2
Erik the Outgolfer
4

Java 8, 78 octets

Ceci est un lambda au curry, de int[]à un consommateur de StringBuilderou StringBuffer. La sortie est imprimée en sortie standard.

l->s->{System.out.println(s);for(int i:l)System.out.println(s.delete(i,i+1));}

Essayez-le en ligne

Jakob
la source
1
Votre deuxième réponse est une entrée valide. Rien ne vous interdit de sélectionner soigneusement votre type d'entrée tant que cela a du sens. J'ai déjà pris plusieurs fois même Streamen entrée et obtenu de très belles réponses. En fait, presque toutes les langues de golf utilisent des flux équivalents en interne. Donc, en sélectionnant votre entrée, vous nivelez juste un peu. +1 néanmoins
Olivier Grégoire
Peut-être que tu as raison. Je pense que j'ai tendance à être plus conservateur que la plupart de ces choses. Je passe à la deuxième solution.
Jakob
3

05AB1E , 11 octets

v=ā0m0yǝÏ},

Essayez-le en ligne!

v           # For each index:
 =          #   Print without popping
  ā         #   Push range(1, len(a) + 1)
   0m       #   Raise each to the power of 0. 
            #   This gives a list of equal length containing all 1s
     0yǝ    #   Put a 0 at the location that we want to remove
        Ï   #   Keep only the characters that correspond to a 1 in the new list
         }, # Print the last step
Riley
la source
La première ligne n'est pas là. Oh, et je ne sais pas si vous pouvez imprimer comme ça.
Erik the Outgolfer
@EriktheOutgolferAny form of output is fine as long as it is easily readable
Riley
Je peux économiser quelques octets alors ...
Erik the Outgolfer
3

R , 46 32 octets

function(S,X)Reduce(`[`,-X,S,,T)

Essayez-le en ligne!

Prend la saisie sous forme de liste de caractères et Xest basé sur 1. Reduceest l'équivalent R de fold, la fonction dans ce cas est [qui est un sous-ensemble. Itère plus -Xcar l'indexation négative dans R supprime l'élément et initest définie sur S, avecaccum=TRUE ainsi nous accumulons les résultats intermédiaires.

R , 80 octets

function(S,X,g=substring)Reduce(function(s,i)paste0(g(s,0,i-1),g(s,i+1)),X,S,,T)

Fonction à 2 arguments, prend X1 indexé. PrendS comme une chaîne.

Essayez-le en ligne!

Giuseppe
la source
Très intelligent à utiliser Reduceici. Bien joué!
djhurio
3

PowerShell , 94 84 octets

param($s,$x)$a=[Collections.Generic.list[char]]$s;$x|%{-join$a;,$a|% r*t $_};-join$a

Essayez-le en ligne!

Prend l'entrée $scomme une chaîne et $xcomme un tableau explicite. Nous créons ensuite$a sur la base$s d'une liste.

Les tableaux dans PowerShell sont de taille fixe (pour nos besoins ici), nous devons donc utiliser le [System.Collections.Generic.list]type long afin d'accéder à la.removeAt() fonction, qui fait exactement ce qu'elle dit sur l'étain.

J'ai sacrifié 10 octets pour inclure deux -joininstructions pour rendre la sortie jolie. OP a déclaré que la sortie d'une liste de caractères est très bien, donc je pourrais sortir juste $aplutôt que -join$a, mais c'est vraiment moche à mon avis.

10 octets enregistrés grâce à briantist.

AdmBorkBork
la source
Vous pouvez vous arrêter Systemet simplement utiliser [Collections.Generic.list[char]]. Pour le garder joli sans sacrifier les octets, vous pouvez mettre le dernier -join$adans le pied de page dans TIO.
briantist
Je pense que vous pouvez également économiser 3 octets en passant $a.removeat($_)à ,$a|% r*t $_.
briantist
@briantist Merci pour ceux-ci - j'oublie toujours de supprimer Systemdu nom de classe. Malheureusement, le dernier -join$aest nécessaire pour le code, donc je ne peux pas le déplacer vers le pied de page.
AdmBorkBork
2

05AB1E , 9 7 octets

=svõyǝ=

Essayez-le en ligne!


=s        # Print original string, swap with indices.
  v       # Loop through indices...
   õyǝ    # Replace current index with empty string.

-2 grâce à l'idée de @ETHProductions.

Urne de poulpe magique
la source
Cela n'imprime rien s'il xest vide.
Riley
@Riley corrigé. (#ETHProductions fixed.)
Urne de poulpe magique
1
Ne pourriez-vous pas simplement faire =sv""yǝ=ou quelque chose de similaire au lieu de remplacer par une nouvelle ligne, puis de supprimer la nouvelle ligne?
ETHproductions
@ETHproductions õfonctionne aussi :)
Magic Octopus Urn
Eh bien, je ne sais pas 05AB1E, haha
ETHproductions
2

Rétine , 58 octets

¶\d+
¶¶1$&$*
+1`(?=.*¶¶.(.)*)(((?<-1>.)*).(.*)¶)¶.*
$2$3$4

Essayez-le en ligne! Explication:

¶\d+

Faites correspondre les indices (qui ne sont jamais sur la première ligne, donc sont toujours précédés d'une nouvelle ligne).

¶¶1$&$*

Double-espacez les indices, convertissez-les en unaire et ajoutez 1 (car les zéros sont durs dans la rétine).

+1`

Modifiez à plusieurs reprises la première correspondance, qui est toujours la valeur actuelle de la chaîne.

   (?=.*¶¶.(.)*)

Récupérez l'index suivant dans $#1.

                (           .    ¶)

Capturez la chaîne, y compris le $#1e caractère et une nouvelle ligne.

                 ((?<-1>.)*) (.*)

Capturez séparément le préfixe et le suffixe du $#1 e caractère de la chaîne.

                                   ¶.*

Faites correspondre l'index.

$2$3$4

Remplacez la chaîne par elle-même et l'index par le préfixe et le suffixe du $#1e caractère.

Neil
la source
2

Pyth, 8 octets

.u.DNYEz

Manifestation

Réduisez, en commençant par la chaîne et en parcourant la liste des indices, sur la fonction de suppression.

isaacg
la source
2

PowerShell , 54 58 octets

param($s,$x),-1+$x|%{$z=$_;$i=0;-join($s=$s|?{$z-ne$i++})}

Essayez-le en ligne!

Explication

Prend l'entrée comme un tableau de caractères ([char[]] ).

Itère à travers le tableau d'indices ( $x) plus un premier élément injecté de -1, puis pour chacun, attribue l'élément actuel à $z, initialise $ià 0, puis itère à travers le tableau de caractères ( $s), renvoyant un nouveau tableau composé uniquement des caractères dont l'index ( $i) n'est pas égal ( -ne) à l'indice actuel à exclure ( $z). Ce nouveau tableau est affecté à $s, tout en étant retourné simultanément (cela se produit lorsque l'affectation est effectuée entre parenthèses). Ce résultat renvoyé est-join édité pour former une chaîne qui est envoyée au pipeline.

L'injection -1au début garantit que la chaîne d'origine sera imprimée, car il s'agit du premier élément et un index ne correspondra jamais -1.

briantiste
la source
1
Une façon très intelligente de retirer les indices appropriés.
AdmBorkBork
2

q / kdb +, 27 10 octets

Solution:

{x _\0N,y}

Exemples:

q){x _\0N,y}["codegolf";1 4 4 0 2]
"codegolf"
"cdegolf"
"cdeglf"
"cdegf"
"degf"
"def"
q){x _\0N,y}["abc";0]
"abc"
"bc"
q){x _\0N,y}["abc";()]
"abc"
q){x _\0N,y}["abc";2 0 0]
"abc"
"ab"
,"b"
""    
q){x _\0N,y}["";()]
""

Explication:

Profite de la fonctionnalité de convergence\ ainsi que de la suppression _.

{x _\0N,y}
{        } / lambda function, x and y are implicit variables
     0N,y  / join null to the front of list (y), drop null does nothing
   _\      / drop over (until result converges) printing each stage
 x         / the string (need the space as x_ could be a variable name)

Remarques:

Si nous n'avions pas besoin d'imprimer le résultat d'origine, ce serait 2 octets dans q:

q)_\["codegolfing";10 9 8 3 2 1 0]
"codegolfin"
"codegolfi"
"codegolf"
"codgolf"
"cogolf"
"cgolf"
"golf"
streetster
la source
2

Perl 5 , 55 octets (54 + " -l")

sub{print($s=shift);for(@_){substr$s,$_,1,"";print$s}}

Essayez-le en ligne!

aschepler
la source
Agréable! J'ai trouvé une approche très similaire, mais en tant que programme complet (en utilisant -pa) pour 44 octets:$_=<>;substr$_,shift@F,print,""while@F&&$_
Dom Hastings
Agréable! Pas sûr que vous ayez besoin de la finale &&$_car vous pouvez supposer que l'entrée est valide (la liste des index ne peut pas être plus longue que la chaîne). L'utilisation de la valeur de retour de printas comme nombre de caractères est assez simple.
aschepler
Ah, that's true! I didn't notice that part of the spec! I thought my answer was far too similar to yours to post separately though!
Dom Hastings
2

MATL, 8 bytes

ii"t[]@(

Indexing is 1-based.

Try it online! Or verify the test cases.

Explanation

i      % Input string. Input has to be done explicitly so that the string
       % will be displayed even if the row vector of indices is empty
i      % Input row vector of indices
"      % For each
  t    %   Duplicate current string
  []   %   Push empty array
  @    %   Push current index
  (    %   Assignment indexing: write [] to string at specified index
       % End (implicit). Display stack (implicit)
Luis Mendo
la source
2

C# (.NET Core), 87 87 74 70 bytes

S=>I=>{for(int i=0;;S=S.Remove(I[i++],1))System.Console.WriteLine(S);}

Try it online!

Just goes to show that recursion isn't always the best solution. This is actually shorter than my original invalid answer. Still prints to STDOUT rather than returning, which is necessary because it ends with an error.

-4 bytes thanks to TheLethalCoder

Kamil Drakari
la source
Per a recent meta consensus (that I can't find) recursive lambdas in C# are disallowed unless you specify what they compile to in the byte count. Therefore, a full method is shorter in this case. I am downvoting until this is fixed, let me know when.
TheLethalCoder
@TheLethalCoder I may not agree with the consensus, but it does seem to be consensus. I've updated my answer.
Kamil Drakari
70 bytes. Use currying and move one statement into the loop to stop needing the loop braces.
TheLethalCoder
@TheLethalCoder Ah, so THAT's how you use currying in C#! I knew it was shorter for exactly two arguments, but it always ended up complaining about some part of my syntax. Thanks for the improvements
Kamil Drakari
No worries and yeah the first one must always be a Func that returns the other Func, Action, Predicate,...
TheLethalCoder
1

C (gcc), 99 bytes

j;f(s,a,i)char*s;int*a;{puts(s);for(j=0;j<i;j++){memmove(s+a[j],s+a[j]+1,strlen(s)-a[j]);puts(s);}}

Try it online!

Takes the string, array, and the length of the array.

betseg
la source
91 bytes
ceilingcat
1

Pyth, 10 bytes

Rule changes saved me 1 byte:

V+E0Q .(QN

Try it online!

Pyth, 11 bytes

V+E0sQ .(QN

Try it online!

Mr. Xcoder
la source
@miles isn't stderr output allowed by default?
Erik the Outgolfer
@Mr.Xcoder I thought stderr output was ignored in that case...
Erik the Outgolfer
@miles I will remove mine and flag it to a mod if we do not remove them. Thanks!
Mr. Xcoder
1

Gaia, 9 bytes

+⟪Seḥ+⟫⊣ṣ

I should really add a "delete at index" function...

Try it online!

Explanation

+          Add the string to the list
 ⟪Seḥ+⟫⊣   Cumulatively reduce by this block:
  S         Split around index n
   e        Dump the list
    ḥ       Remove the first char of the second part
     +      Concatenate back together
        ṣ  Join the result with newlines
Business Cat
la source
1

V, 12 bytes

òdt,GÙ@-|xHx

Try it online!

This is 1-indexed, input is like:

11,10,9,4,3,2,1,
codegolfing

Explanation

ò              ' <M-r>ecursively until error
 dt,           ' (d)elete (t)o the next , (errors when no more commas)
    G          ' (G)oto the last line
     Ù         ' Duplicate it down
        |      ' Goto column ...
      @-       ' (deleted number from the short register)
         x     ' And delete the character there
          H    ' Go back home
           x   ' And delete the comma that I missed
nmjcman101
la source
How do I use an empty list of indices x?
miles
@miles By adding a few bytes :). Simply an empty first line will now work. Would you be OK if I took lists with a trailing comma? IE 1,2,3,. Empty list would be nothing, Singleton would be 1,
nmjcman101
Sure, you can use that input format.
miles
1

Pyth, 8 bytes

+zm=z.Dz

Test suite!

explanation

+zm=z.DzdQ    # implicit: input and iteration variable
  m      Q    # for each of the elements of the first input (the array of numbers, Q)
     .Dzd     # remove that index from the second input (the string, z)
   =z         # Store that new value in z
+z            # prepend the starting value
KarlKastor
la source
1

Python 2, 54

X,S=input()
for a in X:
    print S
    S=S[:a]+S[a+1:]
print S

Try It Online

Nathan Dimmer
la source
I only see the last string in the output.
miles
I messed up... One moment...
Nathan Dimmer
1

APL, 31 30 28 bytes

{⎕←⍺⋄⍵≡⍬:⍬⋄⍺[(⍳⍴⍺)~⊃⍵]∇1↓⍵}

Try it online!

Zacharý
la source