Verschwindende Elemente

17

Wenn Sie eine Zeichenfolge Sund eine Liste von Indizes angeben X, ändern Sie diese, Sindem Sie das Element an jedem Index entfernen Sund dieses Ergebnis als neuen Wert von verwenden S.

Zum Beispiel gegeben S = 'codegolf'und 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

Ihre Aufgabe ist es, diesen Prozess auszuführen, die Werte Snach jeder Operation zu erfassen und diese nacheinander in einer neuen Zeile anzuzeigen. Die endgültige Antwort wäre

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

Answer:

codegolf
cdegolf
cdeglf
cdegf
degf
def
  • Das ist also mach deinen Code so kurz wie möglich.
  • Sie können davon ausgehen, dass die Werte in Ximmer gültige Indizes für sind S, und Sie können entweder eine 0-basierte oder eine 1-basierte Indexierung verwenden.
  • Die Zeichenfolge enthält nur [A-Za-z0-9]
  • Entweder Soder xleer. Wenn Sleer ist, xmuss das auch leer sein.
  • Sie können Sanstelle einer Zeichenfolge auch eine Liste von Zeichen verwenden.
  • Sie können entweder die Ausgabe drucken oder eine Liste von Zeichenfolgen zurückgeben. Führende und nachfolgende Leerzeichen sind zulässig. Jede Form der Ausgabe ist in Ordnung, solange sie gut lesbar ist.

Testfälle

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'
Meilen
quelle
Dürfen wir Sals Liste von Zeichen nehmen?
Mr. Xcoder
@ Mr.Xcoder Klar, das füge ich in der Spezifikation hinzu.
Meilen
Dürfen wir als Liste von Zeichen drucken?
Erik der Outgolfer
Können wir das erste Element (die ursprüngliche Zeichenfolge) in der Ausgabe überspringen?
ETHproductions
@ETHproductions Nein, die Ausgabe sollte zuerst die ursprüngliche Zeichenfolge sein und dann jede Zeichenfolge, die aus dem Löschen eines Zeichens resultiert. Die Ausgabe sollte also len(x)+1Zeichenfolgen enthalten .
Meilen

Antworten:

8

Haskell, 38 33 Bytes

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

Einfach: Nimm die Elemente vor und nach dem Index i wiederholt, füge sie wieder zusammen und sammle die Ergebnisse.

Probieren Sie es online!

Edit: @Lynn hat 5 Bytes gespeichert. Vielen Dank!

nimi
quelle
s#i=take i s++drop(i+1)sist eigentlich kürzer und spart 5 Bytes.
Lynn
1
Nein, Sie sind jetzt 33 Jahre alt - vergessen Sie nicht, dass das TIO-Snippet darin enthalten ist q=^^;
Lynn
Ja, du hast recht.
nimi
8

JavaScript (ES6), 57 50 48 45 42 Byte

Nimmt die Zeichenfolge als Array einzelner Zeichen und gibt ein Array aus, das eine durch Kommas getrennte Zeichenfolge des Originals gefolgt von einer Unteranordnung von durch Kommas getrennten Zeichenfolgen für jeden Schritt enthält.

s=>a=>[s+"",a.map(x=>s.splice(x,1)&&s+"")]
  • Dank Arnauld wurden 3 Byte gespart, was darauf hindeutet, dass ich die losen Ausgabespezifikationen stärker missbrauche als ich es bereits war, was dazu führte, dass ich sie noch mehr für eine weitere 3-Byte-Speicherung missbrauchte.

Probier es aus

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>


Erläuterung

Wir nehmen die beiden Eingaben über Parameter s(das String-Array) und a(das Integer-Array) in die aktuelle Syntax, dh wir rufen die Funktion mit auf f(s)(a).

Wir bauen ein neues Array und beginnen es mit dem Original s. Da die spliceMethode, die wir später verwenden werden, ein Array ändert, müssen wir eine Kopie davon erstellen, indem wir es in eine Zeichenfolge konvertieren (einfach eine leere Zeichenfolge anhängen).

Um das Subarray zu generieren, bewegen wir uns mapüber das Integer-Array a(wobei xdie aktuelle Ganzzahl ist) und für jedes Element splice1 Element ab dem sIndex x. Wir geben das Geänderte zurück sund machen erneut eine Kopie davon, indem wir es in einen String konvertieren.

Zottelig
quelle
Da jede Form der Ausgabe in Ordnung ist, solange sie gut lesbar ist , sollte auch eine akzeptabel sein:s=>a=>[s+'',...a.map(x=>s.splice(x,1)&&s+'')]
Arnauld
Netter, @Arnuald - ich hätte nicht gedacht, es so weit zu treiben, selbst wenn diese Spezifikation gegeben wäre.
Shaggy
6

Japt , 6 Bytes

åjV uV

Online testen!

Erläuterung

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.

Alternative:

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.

Dies funktioniert, da das Entfernen des Elements am Index "nichts bewirkt und somit die ursprüngliche Zeichenfolge zurückgibt.

ETHproductions
quelle
6

Schale , 7 Bytes

G§+oh↑↓

Nimmt zuerst den String und dann (1-basierte) Indizes. Probieren Sie es online!

Erläuterung

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
quelle
Wie verwende ich eine leere Liste von Indizes x?
Meilen
@miles Sie müssen den Typ wie folgt angeben .
Zgarb
Ich verstehe, danke. Ich kenne weder Haskell noch Husk sehr gut.
Meilen
6

Python 2 , 43 Bytes

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

Probieren Sie es online!

Jede Form der Ausgabe ist in Ordnung, solange sie gut lesbar ist.

Dies wird also als Liste von Zeichen gedruckt.

Erik der Outgolfer
quelle
1
Schön, aber warum hast du den Notationsmissbrauch gewählt for i in i+[0]?
Mr. Xcoder
@ Mr.Xcoder Da wird so die letzte Zeile angezeigt. (und der Grund, warum ich separat an erster Stelle gepostet habe)
Erik the Outgolfer
Nein, nicht +[0], ich spreche davon for i in i. for k in iist gleichwertig .
Mr. Xcoder
@ Mr.Xcoder Weil es mir so gefällt ...
Erik the Outgolfer
Ok, nur neugierig ... Vielleicht war es ein Trick, den ich nicht kannte :)
Mr. Xcoder
5

Python 2 , 47 Bytes

Dies könnte auf 43 Bytes verkürzt werden , wie @ LuisMendo betonte, aber das ist bereits die Lösung von @ ErktheOutgolfer.

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

Probieren Sie es online!

Mr. Xcoder
quelle
`a`[2::5]stattdessen''.join(a)
Rod
@Rod Wie geht das?
Mr. Xcoder
reprund Aufteilen von Zeichenfolgen, funktioniert gut, um eine Liste von Zeichen in eine Zeichenfolge umzuwandeln, `a`[1::3]kann auch mit einer Liste von Ziffern verwendet werden
Rod
@ Rod Ich weiß, was sie sind, ich verstehe nicht, wie es ::5hier funktioniert: P
Mr. Xcoder
@ Mr.Xcoder na dann studier mal das Stringslicing;) Im Grunde genommen dauert es jeden 5. Char ab dem 2.
Erik the Outgolfer
4

Java 8, 78 Bytes

Dies ist ein Curry-Lambda, von int[]einem Verbraucher von StringBuilderoder StringBuffer. Die Ausgabe wird standardmäßig ausgedruckt.

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

Probieren Sie es online

Jakob
quelle
1
Ihre zweite Antwort ist eine gültige Eingabe. Nichts verbietet Ihnen, Ihren Eingabetyp sorgfältig auszuwählen, solange dies sinnvoll ist. Ich habe schon mehrfach selbst Streams als Input genommen und sehr nette Antworten bekommen. Tatsächlich verwenden fast alle Golfsprachen intern äquivalente Streams. Wenn Sie also Ihren Eingang auswählen, nivellieren Sie einfach einen Tick. +1 dennoch
Olivier Grégoire
Vielleicht hast du Recht. Ich denke, ich neige dazu, in diesen Dingen konservativer zu sein als die meisten anderen. Ich werde zur zweiten Lösung wechseln.
Jakob
3

05AB1E , 11 Bytes

v=ā0m0yǝÏ},

Probieren Sie es online!

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
quelle
Die erste Zeile ist nicht da. Oh, und nicht sicher, ob Sie so drucken können.
Erik der Outgolfer
@EriktheOutgolferAny form of output is fine as long as it is easily readable
Riley
Dann kann ich ein paar Bytes sparen ...
Erik the Outgolfer
3

R , 46 32 Bytes

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

Probieren Sie es online!

Nimmt Eingaben als Liste von Zeichen und Xist 1-basiert. Reduceist das R-Äquivalent von fold, die Funktion ist in diesem Fall [die Teilmenge. Iteriert über, -Xweil die negative Indizierung in R das Element entfernt und auf gesetzt initist S, accum=TRUEsodass wir die Zwischenergebnisse akkumulieren.

R , 80 Bytes

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

Funktion mit 2 Argumenten, X1-indiziert. Nimmt Sals Zeichenfolge.

Probieren Sie es online!

Giuseppe
quelle
Sehr schlau hier zu benutzen Reduce. Gut gemacht!
Djhurio
3

PowerShell , 94 84 Byte

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

Probieren Sie es online!

Übernimmt Eingaben $sals Zeichenfolge und $xals explizites Array. Wir erstellen dann $abasierend auf $sals Liste.

Arrays in PowerShell haben eine feste Größe (für unsere Zwecke hier), daher müssen wir den langen [System.Collections.Generic.list]Typ verwenden, um Zugriff auf die .removeAt()Funktion zu erhalten, die genau das tut, was sie verspricht.

Ich habe 10 Bytes geopfert, um zwei -joinAnweisungen einzuschließen, um die Ausgabe hübsch zu machen. OP hat festgestellt, dass das Ausgeben einer Liste von Zeichen in Ordnung ist, also könnte ich nur $astattdessen ausgeben -join$a, aber das ist meiner Meinung nach wirklich hässlich.

Dank briantist 10 Bytes gespart.

AdmBorkBork
quelle
Sie können Systemeinfach aufhören und verwenden [Collections.Generic.list[char]]. Um es schön zu halten, ohne Bytes zu opfern, können Sie das Letzte -join$ain der Fußzeile in TIO einfügen.
Briantist
Ich denke , man kann auch sparen 3 Bytes durch eine Änderung $a.removeat($_)an ,$a|% r*t $_.
Briantist
@briantist Danke für diese - ich vergesse immer, Systemaus dem Klassennamen zu entfernen . Leider ist der letzte -join$aCode für den Code erforderlich, sodass ich ihn nicht in die Fußzeile verschieben kann.
AdmBorkBork
2

05AB1E , 9 7 Bytes

=svõyǝ=

Probieren Sie es online!


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

-2 dank der Idee von @ETHProductions.

Magische Kraken-Urne
quelle
Dies druckt nichts, wenn xleer ist.
Riley
@ Riley behoben. (#ETHProductions behoben.)
Magic Octopus Urn
1
Könnten Sie nicht einfach =sv""yǝ=etwas Ähnliches tun , anstatt es durch eine neue Zeile zu ersetzen und dann die neue Zeile zu entfernen?
ETHproductions
@ETHproductions õfunktioniert auch :)
Magic Octopus Urn
Nun, ich weiß nicht, 05AB1E, haha
ETHproductions
2

Netzhaut , 58 Bytes

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

Probieren Sie es online! Erläuterung:

¶\d+

Passen Sie die Indizes an (die sich nie in der ersten Zeile befinden, also immer mit einer neuen Zeile voran).

¶¶1$&$*

Verdoppeln Sie die Indizes, konvertieren Sie sie in Unary und addieren Sie 1 (da in Retina Nullen hart sind).

+1`

Ändern Sie wiederholt die erste Übereinstimmung, bei der es sich immer um den aktuellen Wert der Zeichenfolge handelt.

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

Rufen Sie den nächsten Index in ab $#1.

                (           .    ¶)

Erfassen Sie die Zeichenfolge einschließlich des $#1achten Zeichens und einer neuen Zeile.

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

Erfassen Sie das Präfix und das Suffix des $#1th-Zeichens der Zeichenfolge separat .

                                   ¶.*

Passen Sie den Index an.

$2$3$4

Ersetzen Sie die Zeichenfolge durch sich selbst und den Index durch das Präfix und Suffix des $#1th-Zeichens.

Neil
quelle
2

Pyth, 8 Bytes

.u.DNYEz

Demonstration

Reduzieren Sie die Löschfunktion, indem Sie mit der Zeichenfolge beginnen und die Liste der Indizes durchlaufen.

isaacg
quelle
2

Power , 54 58 Bytes

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

Probieren Sie es online!

Erläuterung

Übernimmt die Eingabe als Zeichen-Array ( [char[]]).

Durchläuft das Array von Indizes ( $x) plus ein eingefügtes erstes Element von, -1weist dann für jedes Element das aktuelle Element zu $z, initialisiert $ies 0und durchläuft dann das Array von Zeichen ( $s), wobei ein neues Array nur der Zeichen zurückgegeben wird, deren Index ( $i) entspricht nicht ( -ne) dem aktuellen Index zum Ausschließen ( $z). Dieses neue Array wird zurück zugewiesen $sund gleichzeitig zurückgegeben (dies geschieht, wenn die Zuweisung in Klammern erfolgt). Das zurückgegebene Ergebnis wird -joinzu einer Zeichenfolge verarbeitet, die an die Pipeline gesendet wird.

Durch das Einspritzen -1am Anfang wird sichergestellt, dass die ursprüngliche Zeichenfolge gedruckt wird, da dies das erste Element ist und ein Index niemals übereinstimmt -1.

Briantist
quelle
1
Sehr clevere Art, die entsprechenden Indizes herauszuziehen.
AdmBorkBork
2

q / kdb +, 27 10 Bytes

Lösung:

{x _\0N,y}

Beispiele:

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}["";()]
""

Erläuterung:

Nutzt die Converge- Funktionalität \ebenso wie Drop _.

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

Anmerkungen:

Wenn wir das ursprüngliche Ergebnis nicht drucken müssten, wären dies 2 Byte in q:

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

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

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

Probieren Sie es online!

aschepler
quelle
Nett! Ich kam mit einem sehr ähnlichen Ansatz, aber als volles Programm (mit -pa) für 44 Bytes:$_=<>;substr$_,shift@F,print,""while@F&&$_
Dom Hastings
Nett! Sie sind sich nicht sicher, ob Sie das Finale benötigen, &&$_da Sie davon ausgehen können, dass die Eingabe gültig ist (die Liste der Indizes kann nicht länger als die Zeichenfolge sein). Die Verwendung des Rückgabewerts von printas als Anzahl der Zeichen ist recht raffiniert.
Aschepler
Ah, das stimmt! Ich habe diesen Teil der Spezifikation nicht bemerkt! Ich dachte, meine Antwort wäre Ihrer viel zu ähnlich, um sie separat zu posten!
Dom Hastings
2

MATL , 8 Bytes

ii"t[]@(

Die Indizierung basiert auf 1.

Probieren Sie es online! Oder überprüfen Sie die Testfälle .

Erläuterung

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
quelle
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);}

Probieren Sie es online!

Nur um zu zeigen, dass Rekursion nicht immer die beste Lösung ist. Dies ist tatsächlich kürzer als meine ursprüngliche ungültige Antwort. Druckt weiterhin auf STDOUT, anstatt zurückzukehren. Dies ist erforderlich, da dies mit einem Fehler endet.

-4 Bytes dank TheLethalCoder

Kamil Drakari
quelle
Gemäß einem aktuellen Metakonsens (den ich nicht finden kann) sind rekursive Lambdas in C # nicht zulässig, es sei denn, Sie geben in der Byteanzahl an, zu was sie kompiliert werden. Daher ist eine vollständige Methode in diesem Fall kürzer. Ich stimme ab, bis dies behoben ist, lass es mich wissen, wann.
TheLethalCoder
@TheLethalCoder Ich bin vielleicht nicht mit dem Konsens einverstanden, aber es scheint Konsens zu sein . Ich habe meine Antwort aktualisiert.
Kamil Drakari
70 Bytes . Verwenden Sie currying und verschieben Sie eine Anweisung in die Schleife, um zu verhindern, dass die Klammern der Schleife benötigt werden.
TheLethalCoder
@TheLethalCoder Ah, so benutzt du das C # -currying! Ich wusste, dass es für genau zwei Argumente kürzer war, aber es endete immer damit, dass ich mich über einen Teil meiner Syntax beschwerte. Vielen Dank für die Verbesserungen
Kamil Drakari
Keine Sorgen und ja die erste muss immer sein , Funcdass die Rendite der andere 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);}}

Probieren Sie es online!

Nimmt den String, das Array und die Länge des Arrays.

betseg
quelle
91 Bytes
Ceilingcat
1

Pyth , 10 Bytes

Regeländerungen haben mir 1 Byte erspart:

V+E0Q .(QN

Probieren Sie es online!

Pyth , 11 Bytes

V+E0sQ .(QN

Probieren Sie es online!

Mr. Xcoder
quelle
@miles ist die Ausgabe von stderr nicht standardmäßig erlaubt?
Erik der Outgolfer
@ Mr.Xcoder Ich dachte, stderr Ausgabe wurde in diesem Fall ignoriert ...
Erik der Outgolfer
@miles Ich werde meins entfernen und es einem Mod melden, wenn wir sie nicht entfernen. Vielen Dank!
Mr. Xcoder
1

Gaia , 9 Bytes

+⟪Seḥ+⟫⊣ṣ

Ich sollte wirklich eine "Löschen am Index" -Funktion hinzufügen ...

Probieren Sie es online!

Erläuterung

+          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
Geschäfts-Katze
quelle
1

V , 12 Bytes

òdt,GÙ@-|xHx

Probieren Sie es online!

Dies ist 1-indiziert, die Eingabe ist wie folgt:

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

Erläuterung

ò              ' <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
quelle
Wie verwende ich eine leere Liste von Indizes x?
Meilen
@miles Durch Hinzufügen einiger Bytes :). Jetzt funktioniert einfach eine leere erste Zeile. Wäre es in Ordnung, wenn ich Listen mit einem Nachkomma aufnehmen würde? IE 1,2,3,. Leere Liste wäre nichts, Singleton wäre1,
nmjcman101
Natürlich können Sie dieses Eingabeformat verwenden.
Meilen
1

Pyth, 8 Bytes

+zm=z.Dz

Testsuite!

Erläuterung

+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
quelle
1

Python 2 , 54

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

Probieren Sie es online

Nathan Dimmer
quelle
Ich sehe nur die letzte Zeichenfolge in der Ausgabe.
Meilen
Ich habe es vermasselt ... Einen Moment ...
Nathan Dimmer