Elementos desaparecendo


17

Dada uma sequência Se uma lista de índices X, modifique Sremovendo o elemento em cada índice Senquanto usa esse resultado como o novo valor de S.

Por exemplo, dado S = 'codegolf'e 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

Sua tarefa é executar esse processo, coletar os valores Sapós cada operação e exibir cada um em uma nova linha em ordem. A resposta final seria

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

Answer:

codegolf
cdegolf
cdeglf
cdegf
degf
def
  • Isso é então faça seu código o mais curto possível.
  • Você pode assumir que os valores em Xsempre são índices válidos Se pode usar a indexação com base em 0 ou em 1.
  • A cadeia conterá apenas [A-Za-z0-9]
  • De qualquer Sou xpodem por esvaziar. Se Sestiver vazio, segue-se que xtambém deve estar vazio.
  • Você também pode usar Scomo uma lista de caracteres em vez de uma string.
  • Você pode imprimir a saída ou retornar uma lista de seqüências de caracteres. Os espaços em branco à esquerda e à direita são aceitáveis. Qualquer forma de saída é boa, desde que seja facilmente legível.

Casos de teste

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 

Podemos tomar Scomo uma lista de caracteres?
Mr. Xcoder

@ Mr.Xcoder Claro, vou adicionar isso nas especificações.
miles

Podemos imprimir como uma lista de caracteres?
Erik the Outgolfer

Podemos pular o primeiro item (a string original) na saída?
ETHproductions

@ETHproductions Não, a saída deve ser a sequência original primeiro e, em seguida, cada sequência resultante da exclusão de um caractere. Portanto, a saída deve conter len(x)+1seqüências de caracteres.
miles

Respostas:


8

Haskell, 38 33 bytes

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

Para a frente: pegue os elementos repetidamente antes e depois do índice i, junte-os novamente e colete os resultados.

Experimente online!

Edit: @Lynn salvou 5 bytes. Obrigado!


s#i=take i s++drop(i+1)sé realmente mais curto, economizando 5 bytes.
Lynn

11
Não, agora você tem 33 anos - não esqueça que o trecho do TIO está q=lá ^^;
Lynn

Sim, você está certo.
N

8

JavaScript (ES6), 57 50 48 45 42 bytes

Pega a sequência como uma matriz de caracteres individuais, gera uma matriz contendo uma sequência separada por vírgula do original seguida por uma sub-matriz de sequências separadas por vírgula para cada etapa.

s=>a=>[s+"",a.map(x=>s.splice(x,1)&&s+"")]
  • 3 bytes salvos graças a Arnauld, sugerindo que eu abuse mais da especificação de saída solta do que já era, o que me levou a abusar ainda mais por mais 3 bytes de economia.

Teste-o

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>


Explicação

Pegamos as duas entradas por meio de parâmetros s(a matriz de strings) e a(a matriz inteira) na sintaxe de curry, o que significa que chamamos a função com f(s)(a).

Criamos uma nova matriz e começamos com a original s . No entanto, como o splicemétodo que usaremos posteriormente modifica uma matriz, precisamos fazer uma cópia dela, o que podemos fazer convertendo-a em uma cadeia de caracteres (basta acrescentar uma cadeia vazia).

Para gerar a sub map-matriz , passamos o mouse sobre o array inteiro a(onde xé o inteiro atual) e, para cada elemento, extraímos splice1 elemento s, começando no índice x. Retornamos o modificado s, novamente fazendo uma cópia dele convertendo-o em uma string.


Porque qualquer forma de saída é muito bem contanto que ele é facilmente legível , suponho que a pessoa também deve ser aceitável:s=>a=>[s+'',...a.map(x=>s.splice(x,1)&&s+'')]
Arnauld

Legal, @Arnuald - eu não teria pensado em ir tão longe, mesmo considerando essa especificação.
Shaggy

6

Japonês , 6 bytes

åjV uV

Teste online!

Explicação

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.

Alternativamente:

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.

Isso funciona porque a remoção do item no índice "não faz nada e, portanto, retorna a string original.


6

Casca , 7 bytes

G§+oh↑↓

Pega primeiro a sequência e depois os índices (com base em 1). Experimente online!

Explicação

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.

Como uso uma lista vazia de índices x?
miles

@miles Você precisa especificar o tipo, assim .
Zgarb 11/08

Entendo obrigado. Não estou muito familiarizado com Haskell ou Husk.
miles

6

Python 2 , 43 bytes

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

Experimente online!

Qualquer forma de saída é boa, desde que seja facilmente legível.

Portanto, isso é impresso como listas de caracteres.


11
Legal, mas por que você escolheu o abuso de notação for i in i+[0]?
Mr. Xcoder

@ Mr.Xcoder Porque assim é mostrada a última linha. (ea razão pela qual eu postei separadamente em primeiro lugar)
Erik o Outgolfer

Não, não +[0], eu estou falando for i in i.for k in ié equivalente .
Mr. Xcoder

@ Mr.Xcoder Porque eu gosto desse jeito ...
Erik o Outgolfer

Ok, apenas curioso ... Talvez fosse um truque que eu não sabia de :)
Mr. Xcoder

5

Python 2 , 47 bytes

Isso pode ser reduzido para 43 bytes , como o @LuisMendo apontou, mas essa já é a solução do @ ErktheOutgolfer.

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

Experimente online!


`a`[2::5]em vez''.join(a)
Rod

@ Rod Como isso funciona?
Mr. Xcoder

repre corda spliting, funciona bem para transformar uma lista de caracteres em uma string, `a`[1::3]também pode ser usado com uma lista de dígitos
Rod

@ Rod Eu sei o que são, não entendo como ::5funciona aqui: P
Sr. Xcoder 11/17

@ Mr.Xcoder bem, então estudar corte string;) basicamente leva cada 5 caractere a partir da segunda
Erik o Outgolfer

4

Java 8, 78 bytes

Este é um lambda ao curry, de int[]para um consumidor de StringBuilderou StringBuffer. A saída é impressa com saída padrão.

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

Experimente Online


11
Sua segunda resposta é uma entrada válida. Nada o proíbe de selecionar cuidadosamente seu tipo de entrada, desde que faça sentido. Eu já tomei várias vezes até Streams como entrada e obtive respostas muito boas. Na verdade, quase todas as línguas de golfe usam fluxos equivalentes internamente. Então, ao selecionar sua entrada, você apenas nivela um pouco. +1 no entanto
Olivier Grégoire

Talvez você esteja certo. Eu acho que tendem a ser mais conservadores do que a maioria sobre essas coisas. Vou mudar para a segunda solução.
Jakob

3

05AB1E , 11 bytes

v=ā0m0yǝÏ},

Experimente 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

A primeira linha não está lá. Ah, e não tenho certeza se você pode imprimir assim.
Erik the Outgolfer

@EriktheOutgolferAny form of output is fine as long as it is easily readable
Riley

Posso salvar alguns bytes então ...
Erik, o Outgolfer


3

R , 46 32 bytes

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

Experimente online!

Aceita entrada como uma lista de caracteres e Xé baseado em 1. Reduceé o equivalente R de fold, a função nesse caso é [qual é o subconjunto. Repete -Xporque a indexação negativa em R remove o elemento e inité definida como S, accum=TRUEassim acumulamos os resultados intermediários.

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)

Função de 2 argumentos, leva X 1-indexados. TomaS como uma corda.

Experimente online!


Muito inteligente para usar Reduceaqui. Bem feito!
djhurio 12/08


3

PowerShell , 94 84 bytes

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

Experimente online!

Recebe a entrada $scomo uma sequência e $xcomo uma matriz explícita. Em seguida, criamos com $abase em$s como uma lista.

As matrizes no PowerShell são de tamanho fixo (para nossos propósitos aqui), portanto, precisamos usar o [System.Collections.Generic.list]tipo longo para obter acesso à .removeAt()função, que faz exatamente o que diz na lata.

Eu sacrifiquei 10 bytes para incluir duas -joininstruções para tornar a saída bonita. O OP afirmou que a saída de uma lista de caracteres é boa, então eu poderia exibir apenas um $apouco -join$a, mas isso é realmente feio na minha opinião.

Economizou 10 bytes graças ao briantist.


Você pode parar Systeme usar [Collections.Generic.list[char]]. Para mantê-lo bonito sem sacrificar bytes, você pode colocar o último -join$ano rodapé no TIO.
Briantist

Eu acho que você também pode salvar 3 bytes mudando $a.removeat($_)para ,$a|% r*t $_.
Briantist

Graças @briantist para aqueles - Eu sempre se esqueça de remover Systema partir do nome da classe. Infelizmente, o último -join$aé necessário para o código, então não posso movê-lo para o rodapé.
AdmBorkBork 14/08


2

05AB1E , 9 7 bytes

=svõyǝ=

Experimente online!


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

-2 graças à ideia de @ETHProductions.


Isso não imprime nada se xestiver vazio.
Riley

@Riley fixo. (#ETHProductions fixo.)
Magia Octopus Urna

11
Você não poderia simplesmente fazer =sv""yǝ=algo semelhante em vez de substituir por uma nova linha e remover a nova linha?
ETHproductions

@ETHproductions õtambém funciona :)
Magia Octopus Urna

Bem, eu não sei 05AB1E, haha
ETHproductions

2

Retina , 58 bytes

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

Experimente online! Explicação:

¶\d+

Combine os índices (que nunca estão na primeira linha, portanto são sempre precedidos por uma nova linha).

¶¶1$&$*

Dê um espaço duplo nos índices, converta para unário e adicione 1 (porque os zeros são difíceis na Retina).

+1`

Altere repetidamente a primeira correspondência, que é sempre o valor atual da string.

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

Recupere o próximo índice em $#1.

                (           .    ¶)

Capture a sequência, incluindo o $#1caractere th e uma nova linha.

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

Capture separadamente o prefixo e o sufixo do $#1th caractere da string.

                                   ¶.*

Corresponder ao índice.

$2$3$4

Substitua a sequência por ela mesma e o índice pelo prefixo e sufixo do $#1caractere th.


2

Pitão, 8 bytes

.u.DNYEz

Demonstração

Reduza, começando com a sequência e repetindo a lista de índices, na função de exclusão.


2

PowerShell , 54 58 bytes

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

Experimente online!

Explicação

Recebe a entrada como uma matriz de caracteres ( [char[]]).

Percorre a gama de índices ( $x) além de uma injectados primeiro elemento de -1, em seguida, para cada um, atribui o elemento de corrente para $z, inicializa $ipara 0, em seguida, percorre o conjunto de caracteres ( $s), retornando uma nova matriz de apenas os caracteres cujo índice ( $i) não é igual a ( -ne) o índice atual a ser excluído ( $z). Essa nova matriz é atribuída de volta a $s, enquanto é retornada simultaneamente (isso acontece quando a atribuição é feita entre parênteses). O resultado retornado é -joined para formar uma sequência que é enviada ao pipeline.

A injeção -1no início garante que a string original seja impressa, pois é o primeiro elemento e um índice nunca coincide -1.


11
Maneira muito inteligente de obter os índices apropriados.
AdmBorkBork

2

q / kdb +, 27 10 bytes

Solução:

{x _\0N,y}

Exemplos:

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

Explicação:

Aproveita a funcionalidade de convergência\ e também descarte _.

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

Notas:

Se não precisássemos imprimir o resultado original, seriam 2 bytes em 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}}

Experimente online!


Agradável! Eu vim com uma abordagem muito semelhante, mas como um programa completo (usando -pa) para 44 bytes:$_=<>;substr$_,shift@F,print,""while@F&&$_
Dom Hastings

Agradável! Não tenho certeza de que você precisa da final, &&$_pois pode assumir que a entrada é válida (a lista de índices não pode ser maior que a sequência). Usar o valor de retorno printcomo o número de caracteres é bastante liso.
aschepler

Ah, é verdade! Eu não percebi essa parte das especificações! Eu pensei que minha resposta era muito semelhante à sua para postar separadamente!
Dom Hastings

2

MATL , 8 bytes

ii"t[]@(

A indexação é baseada em 1.

Experimente online! Ou verifique os casos de teste .

Explicação

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

Experimente online!

Apenas mostra que a recursão nem sempre é a melhor solução. Na verdade, é mais curto que minha resposta inválida original. Ainda imprime em STDOUT em vez de retornar, o que é necessário porque termina com um erro.

-4 bytes graças ao TheLethalCoder


Por um meta consenso recente (que não consigo encontrar), lambdas recursivas em C # não são permitidas, a menos que você especifique com o que elas serão compiladas na contagem de bytes. Portanto, um método completo é mais curto nesse caso. Estou com voto negativo até que isso seja corrigido. Avise-me quando.
TheLethalCoder

@TheLethalCoder Posso não concordar com o consenso, mas parece ser consenso . Eu atualizei minha resposta.
Kamil Drakari

70 bytes . Use currying e mova uma instrução para o loop para parar de precisar das chaves.
TheLethalCoder

@TheLethalCoder Ah, então é assim que você usa o curry em C #! Eu sabia que era mais curto para exatamente dois argumentos, mas sempre acabava reclamando de alguma parte da minha sintaxe. Obrigado pelas melhorias #
Kamil Drakari

Não se preocupa e sim o primeiro deve ser sempre um Funcque retorna o outro Func, Action, Predicate, ...
TheLethalCoder



1

Gaia , 9 bytes

+⟪Seḥ+⟫⊣ṣ

Eu realmente deveria adicionar uma função "excluir no índice" ...

Experimente online!

Explicação

+          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

Experimente online!

Isso é indexado em 1, a entrada é como:

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

Explicação

ò              ' <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

Como uso uma lista vazia de índices x?
miles

@miles Adicionando alguns bytes :). Simplesmente uma primeira linha vazia agora funcionará. Você ficaria bem se eu fizesse listas com uma vírgula à direita? IE 1,2,3,. Lista vazia seria nada, Singleton seria1,
nmjcman101

Claro, você pode usar esse formato de entrada.
miles


1

Pitão, 8 bytes

+zm=z.Dz

Suíte de teste!

explicação

+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



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.