Znikające elementy

17

Biorąc pod uwagę ciąg znaków Si listę indeksów X, zmodyfikuj S, usuwając element przy każdym indeksie, Sjednocześnie wykorzystując ten wynik jako nową wartość S.

Na przykład, biorąc pod uwagę S = 'codegolf'i 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

Twoim zadaniem jest wykonanie tego procesu, zebranie wartości Spo każdej operacji i wyświetlenie każdego z nich w nowej linii w kolejności. Ostateczna odpowiedź brzmi:

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

Answer:

codegolf
cdegolf
cdeglf
cdegf
degf
def
  • To jest więc ustaw swój kod tak krótko, jak to możliwe.
  • Możesz założyć, że wartości w Xsą zawsze poprawnymi indeksami Si możesz użyć indeksowania opartego na 0 lub na podstawie 1.
  • Ciąg będzie zawierać tylko [A-Za-z0-9]
  • Albo Salbo xmoże być pusty. Jeśli Sjest pusty, oznacza to, że xrównież musi być pusty.
  • Możesz również traktować Sjako listę znaków zamiast ciągu.
  • Możesz wydrukować dane wyjściowe lub zwrócić listę ciągów znaków. Dopuszczalne są wiodące i końcowe białe znaki. Każda forma wyniku jest w porządku, o ile jest łatwa do odczytania.

Przypadki testowe

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'
mile
źródło
Czy możemy traktować Sjako listę postaci?
Pan Xcoder,
@ Mr.Xcoder Oczywiście, dodam to do specyfikacji.
mile
Czy możemy wydrukować jako listę znaków?
Erik the Outgolfer,
Czy możemy pominąć pierwszy element (oryginalny ciąg) w danych wyjściowych?
ETHprodukcje
@ETHproductions Nie, wynik powinien być najpierw ciągiem oryginalnym, a następnie każdym ciągiem wynikającym z usunięcia znaku. Dane wyjściowe powinny więc zawierać len(x)+1ciągi.
mile

Odpowiedzi:

8

Haskell, 38 33 bajtów

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

Prosto: wielokrotnie bierz elementy przed i po indeksie i, dołącz do nich ponownie i zbieraj wyniki.

Wypróbuj online!

Edycja: @Lynn zapisał 5 bajtów. Dzięki!

nimi
źródło
s#i=take i s++drop(i+1)sjest faktycznie krótszy, oszczędzając 5 bajtów.
Lynn,
1
Nie, masz teraz 33 lata - nie zapomnij, że ma q=tam fragment kodu TIO ^^;
Lynn,
Tak, masz rację.
nimi
8

JavaScript (ES6), 57 50 48 45 42 bajtów

Pobiera ciąg znaków jako tablicę pojedynczych znaków, zwraca tablicę zawierającą ciąg znaków rozdzielony przecinkami oryginału, a następnie podtablicę ciągów znaków oddzielonych przecinkami dla każdego kroku.

s=>a=>[s+"",a.map(x=>s.splice(x,1)&&s+"")]
  • 3 bajty zaoszczędzone dzięki Arnauldowi sugerującemu, że nadużywam luźnej specyfikacji wyjściowej bardziej niż wcześniej, co doprowadziło mnie do nadużywania jej jeszcze bardziej do kolejnych 3 bajtów oszczędności.

Sprawdź to

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>


Wyjaśnienie

Bierzemy dwa wejścia przez parametry s(tablicę łańcuchów) i a(tablicę liczb całkowitych) w składni curry, co oznacza, że ​​wywołujemy funkcję za pomocą f(s)(a).

Budujemy nową tablicę i zaczynamy od oryginału s. Ponieważ jednak splicemetoda, której będziemy używać później, modyfikuje tablicę, musimy wykonać jej kopię, co możemy zrobić, konwertując ją na ciąg znaków (wystarczy dołączyć pusty ciąg).

Aby wygenerować podtablicę, mapnad tablicą liczb całkowitych a(gdzie xjest bieżąca liczba całkowita) i dla każdego elementu otrzymujemy splice1 element s, zaczynając od indeksu x. Zwracamy zmodyfikowany s, ponownie wykonując jego kopię, konwertując ją na ciąg.

Kudłaty
źródło
Ponieważ każda forma wydruku jest w porządku, o ile jest łatwa do odczytania , przypuszczam, że należy również akceptować:s=>a=>[s+'',...a.map(x=>s.splice(x,1)&&s+'')]
Arnauld
Fajny, @Arnuald - nawet nie pomyślałbym, żeby posunąć go tak daleko, nawet biorąc pod uwagę tę specyfikację.
Shaggy
6

Japt , 6 bajtów

åjV uV

Przetestuj online!

Wyjaśnienie

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.

Alternatywnie:

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.

Działa to, ponieważ usunięcie elementu z indeksu "nic nie robi, a zatem zwraca oryginalny ciąg.

ETHprodukcje
źródło
6

Łuska , 7 bajtów

G§+oh↑↓

Pobiera najpierw łańcuch, a następnie indeksy (1). Wypróbuj online!

Wyjaśnienie

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
źródło
Jak korzystać z pustej listy indeksów x?
mile
@miles Musisz określić typ, taki jak ten .
Zgarb,
Rozumiem dzięki. Nie znam się ani na Haskellu, ani na Husku.
mile
6

Python 2 , 43 bajty

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

Wypróbuj online!

Każda forma wyniku jest w porządku, o ile jest łatwa do odczytania.

To jest drukowane jako listy znaków.

Erik the Outgolfer
źródło
1
Fajnie, ale dlaczego wybrałeś nadużycie notacji for i in i+[0]?
Pan Xcoder,
@ Mr.Xcoder Ponieważ w ten sposób wyświetlana jest ostatnia linia. (i powód, dla którego opublikowałem osobno na pierwszym miejscu)
Erik the Outgolfer
Nie, nie +[0]mówię o tym for i in i. for k in ijest równoważne .
Pan Xcoder,
@ Mr.Xcoder Ponieważ podoba mi się to w ten sposób ...
Erik the Outgolfer
Ok, po prostu ciekawy ... Może to była sztuczka, o której nie wiedziałem :)
Mr. Xcoder,
5

Python 2 , 47 bajtów

Można to skrócić 43 bajtów , jak wskazał @LuisMendo, ale to już rozwiązanie @ ErktheOutgolfer.

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

Wypróbuj online!

Pan Xcoder
źródło
`a`[2::5]zamiast tego''.join(a)
Rod
@Rod Jak działa niż działa?
Pan Xcoder,
repri dzielenie ciągów, działa dobrze, aby zamienić listę znaków w ciąg, `a`[1::3]może być również używane z listą cyfr
Rod
@Rod Wiem, czym one są, nie rozumiem, jak to ::5działa tutaj: P
Mr. Xcoder
@ Mr.Xcoder dobrze następnie przestudiuj krojenie sznurków;) w zasadzie zajmuje co 5 znak, zaczynając od 2
Erik the Outgolfer
4

Java 8, 78 bajtów

To curry lambda, od int[]do konsumenta StringBuilderlub StringBuffer. Wyjście jest drukowane na standardowe wyjście.

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

Wypróbuj online

Jakob
źródło
1
Twoja druga odpowiedź jest prawidłowym wpisem. Nic nie zabrania ci ostrożnego wybierania typu danych wejściowych, o ile ma to sens. Kilka razy już wziąłem nawet Streams jako dane wejściowe i otrzymałem bardzo ładne odpowiedzi. W rzeczywistości prawie wszystkie języki gry w golfa używają wewnętrznych strumieni równoważnych. Więc wybierając swój wkład, po prostu poziomujesz. Niemniej jednak +1
Olivier Grégoire,
Może masz rację. Myślę, że jestem bardziej konserwatywny niż większość w tych sprawach. Przejdę do drugiego rozwiązania.
Jakob,
3

05AB1E , 11 bajtów

v=ā0m0yǝÏ},

Wypróbuj 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
źródło
Nie ma pierwszej linii. Aha, i nie jestem pewien, czy możesz tak drukować.
Erik the Outgolfer,
@EriktheOutgolferAny form of output is fine as long as it is easily readable
Riley
Mogę wtedy zaoszczędzić trochę bajtów ...
Erik the Outgolfer
3

Mathematica, 70 bajtów

(s=#;For[t=1,t<=Length@#2,Print@s;s=StringDrop[s,{#2[[t]]+1}];t++];s)&

Wypróbuj online!

J42161217
źródło
3

R , 46 32 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listę znaków i Xjest oparty na 1. Reducejest odpowiednikiem R dla foldfunkcji, w tym przypadku jest [to podzbiór. Powtarza się, -Xponieważ ujemne indeksowanie w R usuwa element i initjest ustawione na S, accum=TRUEwięc gromadzimy wyniki pośrednie.

R , 80 bajtów

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

Funkcja 2-argumentowa, bierze X indeks 1. Przyjmuje Sjako sznur.

Wypróbuj online!

Giuseppe
źródło
Bardzo sprytny w użyciu Reducetutaj. Dobra robota!
djhurio
3

PowerShell , 94 84 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe $sjako ciąg i $xjawną tablicę. Następnie tworzymy $ana podstawie $sjako listy.

Arrays in PowerShell are fixed size (for our purposes here), so we need to use the lengthy [System.Collections.Generic.list] type in order to get access to the .removeAt() function, which does exactly what it says on the tin.

I sacrificed 10 bytes to include two -join statements to make the output pretty. OP has stated that outputting a list of chars is fine, so I could output just $a rather than -join$a, but that's really ugly in my opinion.

Saved 10 bytes thanks to briantist.

AdmBorkBork
źródło
You can leave off System and just use [Collections.Generic.list[char]]. To keep it pretty without sacrificing bytes, you can put the last -join$a in the footer in TIO.
briantist
I think you can also save 3 bytes by changing $a.removeat($_) to ,$a|% r*t $_.
briantist
@briantist Thanks for those - I always forget to remove System from the class name. Sadly the last -join$a is necessary for the code, so I can't move it to the footer.
AdmBorkBork
2

05AB1E, 9 7 bytes

=svõyǝ=

Try it online!


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

-2 thanks to idea from @ETHProductions.

Magic Octopus Urn
źródło
This doesn't print anything if x is empty.
Riley
@Riley fixed. (#ETHProductions fixed.)
Magic Octopus Urn
1
Couldn't you just do =sv""yǝ= or something similar instead of replacing with a newline and then removing the newline?
ETHproductions
@ETHproductions õ also works :)
Magic Octopus Urn
Well I don't know 05AB1E, haha
ETHproductions
2

Retina, 58 bytes

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

Try it online! Explanation:

¶\d+

Match the indices (which are never on the first line, so are always preceded by a newline).

¶¶1$&$*

Double-space the indices, convert to unary, and add 1 (because zeros are hard in Retina).

+1`

Repeatedly change the first match, which is always the current value of the string.

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

Retrieve the next index in $#1.

                (           .    ¶)

Capture the string, including the $#1th character and one newline.

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

Separately capture the prefix and suffix of the $#1th character of the string.

                                   ¶.*

Match the index.

$2$3$4

Replace the string with itself and the index with the prefix and suffix of the $#1th character.

Neil
źródło
2

Pyth, 8 bytes

.u.DNYEz

Demonstration

Reduce, starting with the string and iterating over the list of indices, on the deletion function.

isaacg
źródło
2

PowerShell, 54 58 bytes

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

Try it online!

Explanation

Takes input as a char array ([char[]]).

Iterates through the array of indices ($x) plus an injected first element of -1, then for each one, assigns the current element to $z, initializes $i to 0, then iterates through the array of characters ($s), returning a new array of only the characters whose index ($i) does not equal (-ne) the current index to exclude ($z). This new array is assigned back to $s, while simultaneously being returned (this happens when the assignment is done in parentheses). That returned result is -joined to form a string which is sent out to the pipeline.

Injecting -1 at the beginning ensures that the original string will be printed, since it's the first element and an index will never match -1.

briantist
źródło
1
Very clever way of pulling out the appropriate indices.
AdmBorkBork
2

q/kdb+, 27 10 bytes

Solution:

{x _\0N,y}

Examples:

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

Explanation:

Takes advantage of the converge functionality \ as well as 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)

Notes:

If we didn't need to print the original result, this would be 2 bytes in q:

q)_\["codegolfing";10 9 8 3 2 1 0]
"codegolfin"
"codegolfi"
"codegolf"
"codgolf"
"cogolf"
"cgolf"
"golf"
streetster
źródło
2

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

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

Try it online!

aschepler
źródło
Nice! I came up with a very similar approach, but as a full program (using -pa) for 44 bytes: $_=<>;substr$_,shift@F,print,""while@F&&$_
Dom Hastings
Nice! Not sure you need the final &&$_ since you can assume the input is valid (the list of indices can't be longer than the string). Using the return value of print as the number of characters is quite slick.
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
źródło
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
źródło
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
źródło
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
źródło
@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
źródło
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
źródło
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
źródło
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
źródło
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ý
źródło