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'
code-golf  string  array-manipulation  code-golf  string  ascii-art  code-golf  number  sequence  pi  code-golf  number  array-manipulation  code-golf  string  ascii-art  code-golf  math  number  game  code-golf  math  sequence  polynomials  recursion  code-golf  math  number  sequence  number-theory  code-golf  permutations  balanced-string  code-golf  string  ascii-art  integer  code-golf  decision-problem  hexagonal-grid  code-golf  ascii-art  kolmogorov-complexity  code-golf  number  code-golf  matrix  binary-matrix  code-golf  math  statistics  code-golf  string  polyglot  code-golf  random  lost  code-golf  date  path-finding  code-golf  string  code-golf  math  number  arithmetic  number-theory  code-golf  tetris  binary-matrix  code-golf  array-manipulation  sorting  code-golf  number  code-golf  array-manipulation  rubiks-cube  cubically  code-golf  grid  optimization  code-golf  math  function  code-golf  string  quine  code-golf  ascii-art  grid  code-golf  decision-problem  grid  simulation  code-golf  math  sequence  code-golf  path-finding  code-golf  ascii-art  grid  simulation  code-golf  number  whitespace  code-golf  sequence  code-golf  sequence  code-golf  sequence  integer  code-golf  math  game  code-golf  internet  stack-exchange-api  code-golf  sequence  code-golf  internet  stack-exchange-api  code-golf  math  factoring  code-challenge  sequence  polyglot  rosetta-stone  code-golf  string  browser  code-golf  date  code-golf  base-conversion  code-challenge  cops-and-robbers  hello-world  code-golf  cops-and-robbers  hello-world 

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!


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.


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.


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.

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.


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!


`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


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

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!


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.


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.


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.


2

Pyth, 8 Bytes

.u.DNYEz

Demonstration

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


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.


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"

2

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

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

Probieren Sie es online!


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)

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


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

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

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

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



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.