Faça um programa "Ceeeeeeee"


95

Uma vez eu escrevi um programa JavaScript que usaria como entrada uma string e um caractere e removeria todos os caracteres, exceto o primeiro e o caractere fornecido como entrada, um por um.

Por exemplo, computar isso com entradas codegolf.stackexchange.come epara o caractere gera:

codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceeecom
ceeeom
ceeem
ceee

Mantém o primeiro caractere e todos os es. Todos os outros caracteres são removidos um por um.

Sua tarefa é escrever um programa (ou função) que recebe duas entradas e saídas (ou retorna) uma sequência que realiza esse efeito.

Especificações

  • Você pode assumir que a sequência não conterá nenhuma nova linha.
  • A segunda entrada sempre será um caractere.
  • Se a resposta estiver na forma de uma função, você poderá retornar uma matriz de cadeias contendo cada linha na saída.
  • A saída pode conter uma nova linha à direita.

Casos de teste

Test Cases, s:

Test Cases
Tst Cases
Ts Cases
TsCases
Tsases
Tsses
Tsss

Make a "Ceeeeeeee" program, e:

Make a "Ceeeeeeee" program
Mke a "Ceeeeeeee" program
Me a "Ceeeeeeee" program
Mea "Ceeeeeeee" program
Me "Ceeeeeeee" program
Me"Ceeeeeeee" program
MeCeeeeeeee" program
Meeeeeeeee" program
Meeeeeeeee program
Meeeeeeeeeprogram
Meeeeeeeeerogram
Meeeeeeeeeogram
Meeeeeeeeegram
Meeeeeeeeeram
Meeeeeeeeeam
Meeeeeeeeem
Meeeeeeeee

Hello World!, !:

Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!

Hello World!, z:

Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!
H

alphabet, a:

alphabet
aphabet
ahabet
aabet
aaet
aat
aa

upperCASE, e:

upperCASE
uperCASE
uerCASE
ueCASE
ueASE
ueSE
ueE
ue

Isso é , então o código mais curto (em bytes) vence.


27
Meio aleatório, mas +1
TuxCrafting

25
+1 paraMeeeeeeeeegram
FlipTack

No caso de retornar uma matriz, cada um dos elementos precisa incluir uma nova linha à direita?
Brad Gilbert b2gills

@ BradGilbertb2gills No.
Esolanging Fruit

4
Meeeeeeeeeeeeemem
Mathime 23/11

Respostas:


5

V , 12 bytes

òYpó.“„a]òd

Experimente online!

Hexdump:

00000000: f259 70f3 2e93 8412 615d f264            .Yp.....a].d

Eu testei isso com a versão mais recente do V disponível antes do desafio , e tudo funciona corretamente, tornando essa resposta competitiva.

Explicação:

ò         ò    " Recursively:
 Yp            "   Duplicate this line
   ó           "   Remove:
    .a]      "     A compressed regex
            d  " Delete our extra line

O regex compactado se traduz em

.\zs[^e]

Que significa

.           " Any character
 \zs        " Leave the previous character out of the selection
    [^e]    " Any character except for 'e' (Or whatever is given for input)

Versão não concorrente (11 bytes)

Esta versão usa um atalho para Ypque não estava disponível quando este desafio foi lançado.


@ challenger5 Incrível! Vou verificar uma versão antiga e verificar se ela funciona corretamente. Talvez eu precise modificá-lo um pouco. Vou dar um ping em você assim que atualizar.
DJMcMayhem

@ Challenger5 Editei a resposta e verifiquei que esta versão funcionava quando o desafio foi lançado.
DJMcMayhem

Como eu executaria vários comandos do Vim armazenados em um arquivo em um sistema Linux? Eu cat filename | vimfaria ou faria outra coisa?
Ckjbgames

31

Vim, 27, 26 , 25 bytes

DJqqYp:s/.\zs[^<C-r>-]<CR>@qq@qD

Experimente online!

A entrada vem neste formato:

e
codegolf.stackexchange.com

Minha primeira abordagem ingênua tem três bytes a mais:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd

Também estou feliz com esta resposta, porque começa com o meu nome.

DJqq:t$|s/.\zs[^<C-r>"]<CR>@qq@qD
DJMcMayhem

Veja a semelhança? Eh?

Abordagens menos bem-sucedidas:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd
i:s/.\zs[^<Right>]<CR>@q<Esc>"adkqqYp@aq@qdd
DJ:s/.\zs[^<C-r>"]<CR>uqqYp@:@qq@qdd
DJqq:t.|$s/.\zs[^<C-r>"]<CR>@qq@qdd

Explicação:

D                                   " Delete everything on this first line
 J                                  " Remove this empty line
  qq                                " Start recording into register 'q'
    Y                               " Yank this line
     p                              " And paste it
      :s/                           " Run a substitute command on the last line in the buffer. Remove:
         .                          "   Any character
          \zs                       "   Move the selection forward (so we don't delete the first one)
             [^<C-r>-]              "   Followed by anything *except* for the character we deleted
                      <CR>          " Run the command
                          @q        " Call register 'q'
                            q       " Stop recording
                             @q     " Run the recursive macro
                               D    " Delete our extra line

1
Eu acho que você tem um erro de digitação lá onde a entrada é dado há um kmuito :)
geisterfurz007

@ geisterfurz007 Não sei se entendi o que você quer dizer?
DJMcMayhem

Diz (...)comkna linha 5 atualmente.
geisterfurz007

Não há razão para usar :taqui. Normal Ypsalvaria um byte. Você terá que mudar para, é <C-R>-claro. As regras típicas do PPCG são frustrantes, porque, para qualquer caso de teste razoável, :t.|scom 99@:ou até 999@:estaria correto, mas não há uma boa maneira de obter uma repetição infinita dessa maneira. Você é forçado a usar estratégias menos interessantes.
Udioica

22

MATL , 20 16 bytes

y-f1X-"t[]@X@q-(

Experimente online! Ou verifique os casos de teste: 1 , 2 , 3 , 4 , 5 .

Bônus

Código modificado para ver a cadeia gradualmente reduzida (compilador offline):

y-f1X-"tt.3Y.XxD[]@X@q-(].3Y.XxDvx

insira a descrição da imagem aqui

Ou tente no MATL Online!

Explicação

y        % Implicitly input string and char. Duplicate string onto top
-        % Subtract. Gives nonzero for chars in the input string that are
         % different from the input char
f        % Array of indices of nonzero values
1X-      % Remove 1 from that array. This gives an array of the indices of 
         % chars to be removed from the string
"        % For each
  t      %   Duplicate previous string
  []     %   Push empty array
  @      %   Push index of char to be removed. But this index needs to be 
         %   corrected to account for the fact that previous chars have
         %   already been removed...
  X@q-   %   ... So we correct by subtracting the 0-based iteration index
  (      %   Assign empty array to that position, to remove that char
         % Implicitly end for each
         % Implicitly display

3
GIFS! gifs são legais!
Brain Guider

20

Haskell, 50 bytes

w@(a:x)%c|(d,_:y)<-span(==c)x=w:(a:d++y)%c|0<1=[w]

Define uma função que (%)retorna uma lista de cadeias.

Explicação

(%)é chamado como w%c, com wsendo a cadeia de entrada, e co caráter para manter. Em resumo, essa definição funciona separando wo primeiro caractere ( a) e o restante ( x), dividindo-se xna primeira ocorrência de um caractere que não seja ce chamando-se recursivamente com esse caractere descartado.

w@(a:x)%c              -- define (%) with w separated into a and x.
 |(d,_:y)<-span(==c)x  -- split x; bind the string of `c` to d, and the rest
                       -- to _:y, dropping first character and calling the rest y.
  =w:(a:d++y)%c        -- if there was a character to drop, cons w onto the
                       -- sequence gained by recursively calling (%) with that
                       -- character removed (i.e. call with a:d++y).
 |0<1=[w]              -- if nothing needed to be dropped, the result sequence is
                       -- simply the one-element list [w]

3
Você pode explicar o código?
bli

1
@bli Done! Espero que isso ajude?
Dianne

14

Retina , 28 27 bytes

A contagem de bytes assume a codificação ISO 8859-1.

;{G*1`
R1r`(?!^|.*¶?\1$)(.)

Experimente online!

Explicação

;{G*1`

Há muita configuração aqui. O palco em si é realmente justo G1`, que mantém apenas a primeira linha, descartando o caractere de entrada. *transforma em uma execução a seco, o que significa que o resultado (ou seja, a primeira linha da sequência) é impresso sem realmente alterar a sequência. {diz ao Retina para executar os dois estágios em um loop até que a string pare de mudar e ;evite a saída no final do programa.

R1r`(?!^|.*¶?\1$)(.)

Isso descarta o primeiro caractere que a) não está no início da entrada, b) não é igual ao caractere de entrada separado.


10

Pip , 22 26 24 22 bytes

Lv+#Paa@oQb?++oPaRA:ox

Aceita string como primeiro argumento da linha de comando, caractere como segundo. Experimente online!

Explicação

Loops sobre caracteres de entrada; se o caractere for igual ao caractere especial, passe para o próximo; caso contrário, exclua-o e imprima a string.

Uma versão ungolfed ( a, bobtenha cmdline args; ocomeça com um valor de 1, xé ""):

P a         Print a
L #a-1      Loop len(a)-1 times:
 I a@o Q b   If a[o] string-eQuals b:
  ++o         Increment o
 E {         Else:
  a RA: o x   In-place in a, Replace char At index o with x (i.e. delete it)
  P a         Print a
 }

Truques de golfe:

  • O cabeçalho do loop Lé avaliado apenas uma vez, para que possamos ocultar a impressão inicial. #Pa-1não funcionará porque Pé de baixa precedência (seria analisada como #P(a-1)), mas podemos reorganizá-la v+#Pausando a vvariável pré-inicializada como -1.
  • O RA:operador retorna o novo valor de a, para que possamos imprimir essa expressão em vez de ter uma Painstrução separada .
  • Agora, os dois ramos da instrução if são expressões únicas, para que possamos usar o operador ternário ?.

10

Perl 5, 29 bytes

Eu obtive 35 bytes usando Strawberry Perl: 31 bytes, mais 1 para em -nEvez de -e, mais 3 para espaço + -i(usado para a entrada de uma letra; a string mais longa é de STDIN).

chomp;say;s/(.)[^$^I]/$1/&&redo

No entanto, não tenho dúvida de que isso é possível sem o chomp;uso <<<, que é de 29 bytes, mesmo que eu não possa testá-lo usando Strawberry.

say;s/(.)[^$^I]/$1/&&redo

Portanto:

perl -im -nE'say;s/(.)[^$^I]/$1/&&redo' <<< "example"

Você pode simplesmente especificar "nenhuma nova linha na entrada" (que é como o segundo programa funciona). Se você precisar remover novas linhas na entrada, procure a -lopção, que ativa um modo de tratamento automático de linha, no qual printimprime uma nova linha adicional (irrelevante aqui) e -p/ -ninput remove a nova linha (muito relevante). Além disso, está obsoleto, mas acho que você pode substituir o ^Icontrole literal por um byte extra de economia. Finalmente, acho s/.\K[^$^I]/redo/eque seria um personagem mais curto, embora não tenha 100% de certeza de que é um lugar legal para colocar um redo.

@ ais523, obrigado pelo conselho da nova linha, mas acho que já lidei com o problema o suficiente. Re literal ^I, isso é verdade para a maioria das variáveis ​​de letra de controle, mas não para esta, IIRC. Re \Ke colocando redona substituição com /e, obrigado! Vou testá-lo quando tiver a chance de….
Msh210

... e não funciona. @ ais523
msh210 21/11

8

Perl 6 ,  47 40  38 bytes

->\a,\b{a,{S/^(."{b}"*:)./$0/}...^{$^a eq $^b}}
->\a,\b{a,{S/^(."{b}"*:)./$0/}...^&[eq]}
{$^b;$^a,{S/^(."$b"*:)./$0/}...^&[eq]}

Expandido:

{       # lambda with two placeholder parameters 「$a」 and 「$b」

  $^b;    # declare second parameter

  $^a,    # declare first parameter, and use it to seed the sequence

  {       # bare block lambda with implicit parameter 「$_」
    S/      # string replace and return
      ^       # beginning of string
      (       # capture into 「$0」
        .       # the first character
        "$b"*   # as many 「$b」 as possible
        :       # don't allow backtracking
      )
      .       # any character ( the one to be removed )

    /$0/      # put the captured values back into place
  }

  ...^      # repeat that until: ( and throw away the last value )

  &[eq]     # the infix string equivalence operator/subroutine

}

O motivo ...^foi usado em vez de ...é que &[eq]não retornaria Trueaté que o último valor fosse repetido.


7

05AB1E ,26 25 bytes

¬ˆ[¦Ðg_#¬²k0Qi²ˆë¯J?,]¯J?

¬ˆ                         Put the first character into an array
  [                        While true
   ¦                       Remove the first character
    Ð                      Triplicate
     g_#                   if the string is empty, break
        ¬²k0Qi             if the first character is equal to the one specified in the input
              ²ˆ           Add it to the array
                ë          Else
                 ¯J?       Display the array
                    ,      Display the remaining string
                     ]     End while
                      ¯J?  Display the last string

Experimente online!

Observe que isso ¬²k0Qpode ser reescrito ¬²Q, mas, por algum motivo, ele não funciona quando o caractere atual é uma marca de citação: Q retorna a string real em vez de um booleano e causa um loop infinito.

Este código pode ser jogado ainda mais, pois ¯J?é duplicado. Mover esta peça no loop removeria a duplicação e também permitiria soltar o colchete de fechamento.


DˆćUΔD²KRнõ.;DXìˆ}¯¨»para 21, mas que usa novos comandos.
Magic Octopus Urn

7

Python 2, 71 66 bytes:

f,m=input();k=f[0]
while f:a=f[0]==m;k+=f[0]*a;f=f[1+a:];print k+f

Um programa completo. Leva 2 entradas através de STDIN no formato '<String>','<Char>'.

Além disso, aqui está uma solução recursiva atualmente em 140 bytes :

Q=lambda c,p,k='',j=1,l=[]:c and Q(c[1:],p,k+c[0]*(j<2)+c[0]*(c[0]==p),j+1,l+[k+c])or'\n'.join(sorted({*l},key=l.index))+('\n'+k)*(k not in l)

Este deve ser chamado no formato print(Q('<String>','<Char>')).


Não sou fã de python, mas isso não deve imprimir apenas uma linha?
Conor O'Brien

@ ConorO'Brien Sim, eu li mal o post antes. Está consertado agora.
R. Kap

7

Python 3 , 72 bytes

def e(i,k):
 for r in i:
  if r!=k:i=i[0]+i[1:].replace(r,'',1);print(i)

Experimente online!

e('😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆','🥓')

Fazer uma dieta:

😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🍅🍄🍆
😋🥓🥓🥓🥓🍄🍆
😋🥓🥓🥓🥓🍆
😋🥓🥓🥓🥓

6

JavaScript (ES6), 74 bytes

(s,c)=>[...t=s.slice(1)].map(d=>c!=d?s+=`
`+s[0]+(t=t.replace(d,``)):s)&&s

Eu acho que isso produz uma saída incorreta para f('test cases', 's')(terminando com stss, em vez de tsss). Eu acho que isso ocorre porque replaceremove a primeira ocorrência e remove a primeira te não a segunda tna quarta iteração do maploop.
Lmis

@Lmis Obrigado por apontar isso, acho que consegui corrigir uma das minhas versões por "apenas" uma penalidade de 7 bytes.
Neil

5

Ruby, 148 139 97 90 83 77 62 bytes

a,c=$*;p s=""+a;i=1;while d=s[i];(d!=c)?(s[i]="";p s):i+=1;end

Não tenho certeza se o código amador é aceito nessa troca, mas estou interessado em aprender a codificar golfe, embora seja péssimo nisso, alguma ajuda sobre como eu faria esse programa parecer tão pequeno quanto os outros aqui?

EDITAR:

Põe substituída por p

Removida uma tonelada de espaço em branco e contados bytes corretamente, graças ao Assistente de Trigo

Graças a challenger5 passou de s=gets.chop;c=gets.chop;paras,c=gets.chop,gets.chop;

substituído thenpor ;e gets.chopcom gets[0]agradecimentos Mhutter!

Tomando entrada como variáveis ​​de linha de comando agora, por exemplo. prog.rb helloworld l

Graças a inúmeras melhorias de jeroenvisser101, substituindo a=s.duppor s=""+ae a declaração if anterior, if s[i]!=c;s[i]="";p s;else i+=1;endcom (d!=c)?(s[i]="";p s):i+=1;grande melhoria!


Bem vindo ao site! Eu não sou especialista em golfe Ruby, mas parece que você tem um espaço em branco extra. Particularmente em torno do =s. Para dicas mais abrangentes, visite nossa página de dicas .
Wheat Wizard

A maneira mais fácil de remover bytes é eliminar o excesso de espaço em branco, por exemplo s=gets.chomp. Não tenho certeza se você pode fazer isso em Ruby, mas em algumas linguagens como Python você pode combinar várias atribuições em uma instrução, como a,b,c=0,1,2.
precisa saber é o seguinte

Ei, obrigado pela dica sobre espaço em branco, leia a documentação do ruby ​​e ponto-e-vírgula realizado pode substituí-los pelas instruções finais: ') quanto a fazer s = gets.chop ec = gets.chop eu não posso fazer s, c = gets.chop ou qualquer coisa como que, infelizmente, eles estão definitivamente a maior parte do código e eu gostaria de remover essa longa declaração ..
Ben Hili

Você ainda tem alguns espaços extras, principalmente antes das palavras-chave ( do, thene end) e por volta da quarta =.
Assistente de trigo

Parece que você está mudando rapidamente na contagem de bytes. Eu conto apenas 90 bytes.
Assistente de trigo

4

c90, 129 125 bytes

com espaço em branco:

main(q, x)
{
    for (char **v = x, *a = v[1], *b = a, *c;*b++;)
        for (c = a; c == a | *c == *v[2] && *b != *v[2] && putchar(*c),
            ++c != b || *b != *v[2] && !puts(b););
}

sem espaço em branco:

main(q,x){for(char**v=x,*a=v[1],*b=a,*c;*b++;)for(c=a;c==a|*c==*v[2]&&*b!=*v[2]&&putchar(*c),++c!=b||*b!=*v[2]&&!puts(b););}

ungolfed:

#include <stdio.h>
int main(int argc, char **argv)
{
    char *a = argv[1];
    for (char *b = a + 1; *b; b++) {
        if (*b == *argv[2]) {
            continue;
        }
        putchar(*a);
        for (char *c = a + 1; c != b; c++) {
            if (*c == *argv[2]) {
                putchar(*c);
            }
        }
        puts(b);
    }
}

Isso leva um ponteiro para o início da string e faz um loop, iterando esse ponteiro até atingir o final da string. No loop, ele imprime o primeiro caractere e, em seguida, quaisquer instâncias do segundo argumento que encontrar entre o início da string e o ponteiro. Depois disso, ele chama put no ponteiro, imprimindo o restante da string.

Isso deve ser compilado em um sistema em que sizeof (int) == sizeof (char *). +3 bytes, caso contrário.

Esta é a primeira vez que experimentei o código de golfe aqui, por isso tenho certeza de que há algumas otimizações a serem feitas.


3

Dyalog APL , 27 bytes

{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}

é o caractere excluído, é a sequência inicial

argumento de impressão; encontre o índice ido primeiro não depois do primeiro caractere; se encontrado, chame recursivamente com iremovido


3

Mathematica, 64 bytes

Most@FixedPointList[StringReplace[#,b_~~Except@a:>b,1]&,a=#2;#]&

Função anônima. Pega duas cadeias como entrada e retorna uma lista de cadeias como saída. Funciona removendo repetidamente a primeira não instância do personagem.


Definitivamente vou começar a usar FixedPointList.
Ngenisis

3

PHP, 88 84 86 85 82 81 78 bytes

1 byte salvo graças a @IsmaelMiguel, 3 bytes graças a @ user59178, 3 bytes inspirado por @ user59178

while($b=substr("$argv[1]\n",$i++))$a>""&$b[0]!=$argv[2]?print$a.$b:$a.=$b[0];

recebe entrada de argumentos de linha de comando; correr comphp -r <code> '<string>' <character>


  • anexa uma nova linha à entrada para uma impressão final implícita.
    Isso adiciona 5 4 bytes de código, mas economiza na saída e em mais um echo$a;.

1
$argv[1]."\n"pode ser escrito como"$argv[1]\n"
Ismael Miguel

1
Ao $badicionar uma nova linha, ela sempre será verdadeira, desde que tenha comprimento> = 1. Portanto, isso ""<é desnecessário.
user59178

Você pode salvar outro byte usando um ternário na em substr()vez de atribuir $b.
user59178

@ user59178 Eu realmente não te peguei lá: preciso do substrresultado tanto para a condição quanto para a print; então eu deveria atribuí-lo em algum lugar. Mas você me inspirou.
Titus

Eu quis dizer, for(;$b=substr($b?:".$argv[1]\n",1);)mas o que você tem agora ainda melhor.
usar o seguinte comando

3

05AB1E, 26 24 23 bytes

Obrigado @Kade por 2 bytes!
Obrigado @Emigna por 1 byte!

¬UDvy²k0Êiy¡¬s¦yý«Xs«=¦

Usa a codificação CP-1252 . Experimente online!

y²k0Êpoderia ser, y²Êmas a "bagunça.

Provavelmente isso poderia ser mais jogado porque «é repetido duas vezes. Deixe um comentário se você tiver alguma sugestão ou maneira de jogar mais.


3

Java 10, 155 140 139 124 bytes

c->s->{var r=s+"\n";for(int i=0;++i<s.length();)if(s.charAt(i)!=c)r+=(s=s.substring(0,i)+s.substring(i--+1))+"\n";return r;}

Experimente online.

Explicação:

c->s->{          // Method with character and String parameters and String return-type
  var r=s+"\n";  //  Result-String, starting at the input-String with trailing new-line
  for(int i=0;++i<s.length();)
                 //  Loop over the characters of the String, skipping the first
    if(s.charAt(i)!=c)
                 //   If the current character and the input-character are equal
      r+=(s=s.substring(0,i)+s.substring(i--+1))
                 //     Remove this character from the String `s`
         +"\n";  //     And append the new `s` with trailing new-line to the result-String
  return r;}     //  Return the result-String

Resposta recursiva antiga de 139 bytes:

void c(String s,int c){System.out.println(s);for(int i=1;i<s.length();)if(s.charAt(i++)!=c){c(s.substring(0,i-1)+s.substring(i),c);break;}}

-1 bytes graças a @Eugene . (Da próxima vez, faça um comentário em vez de editar a postagem de outra pessoa.)

Experimente online.

Explicação:

void c(String s,int c){     // Method with String and integer parameters and no return-type
  System.out.println(s);    //  Print the input-String with trailing new-line
  for(int i=1;i<s.length();)//  Loop over the characters of the String, skipping the first
    if(s.charAt(i++)!=c){   //   If the current character and the input-character are equal
      c(s.substring(0,i-1)+s.substring(i),c); 
                            //    Remove this character, and do a recursive call
      break;}}              //    And stop the loop

Não seria muito mais curto não se preocupar com um char [] e apenas usar s.charAt ()?
dpa97

@ dpa97 Ah, você está completamente certo. Eu usei um loop foreach no início, mas mudei para um loop for regular. Esqueceu de remover o conjunto de caracteres. Obrigado.
Kevin Cruijssen

2

C #, 122 117 112 bytes

IEnumerable F(string s,char c){for(int i=0;i<s.Length;++i)if(i<1||s[i]!=c)yield return i>0?s=s.Remove(i--,1):s;}

Ungolfed:

public IEnumerable F(string s, char c) {
    for (int i = 0; i < s.Length; ++i) {
        if (i < 1 || s[i] != c)
            yield return i > 0 ? s = s.Remove(i--, 1) : s;
    }
}

Retorna uma coleção de strings.


1
Bom truque com o uso de coleção não genérica. Mas não funcionará, se o último caractere não for especial c. Nesse caso, o loop tentará trabalhar para sempre.
seguinte

1
@paldir Woops, você está certo! Ligando meu cérebro desta vez, encontrei uma maneira melhor (e mais curta!).
Psycho

Você pode remover os parênteses do loop for para economizar 2 bytes.
precisa saber é o seguinte

@PmanAce Desculpe, o que você quer dizer? Qual parêntese?
psico

public IEnumerable F (string s, char c) {for (int i = 0; i <s.Length; ++ i) if (i <1 || s [i]! = c) produza retorno i> 0? s = s.Remova (i--, 1): s; }
PmanAce 21/11

2

TSQL, 127 bytes (Excluindo definições de variáveis)

DECLARE @1 VARCHAR(100)='codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'

DECLARE @ char=LEFT(@1,1)WHILE patindex('%[^'+@2+']%',@1)>0BEGIN SET @1=STUFF(@1,patindex('%[^'+@2+']%',@1),1,'')PRINT @+@1 END

Formatado:

DECLARE @1 VARCHAR(100) = 'codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'
DECLARE @ CHAR = LEFT(@1, 1)

WHILE patindex('%[^' + @2 + ']%', @1) > 0
BEGIN
    SET @1 = STUFF(@1, patindex('%[^' + @2 + ']%', @1), 1, '')

    PRINT @ + @1
END

Bom uso de patindex, mas o alphabetexemplo não parece muito certo, é exibido aaphabetabaixo aaa. Também vale a pena mencionar que isso deve ser executado em um servidor ou banco de dados com um agrupamento que diferencia maiúsculas de minúsculas; caso contrário, o upperCASEexemplo também falha, sendo exibido ueEem sua linha final.
BradC 21/05/19

2

C #, 135 138 :( 137 bytes

Golfe:

IEnumerable<string>F(string s,char c){int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i==l)break;s=s.Remove(i,1);}}

Ungolfed:

    IEnumerable<string> F(string s, char c)
    {
        int i = 1, l;

        for (;;)
        {
            yield return s;

            l = s.Length;

            while (i < l && s[i] == c)
                i++;

            if (i == l)
                break;

            s = s.Remove(i, 1);
        }
    }

Função retorna coleção de strings.

EDIT1: @psycho notou que o algoritmo não foi implementado corretamente.

EDIT2: variável criada para s.Length. Um byte economizado graças a @TheLethalCoder.


1
Não funcionará se o caractere de entrada estiver presente mais de uma vez em uma linha. Ex: codeegolf edaria em cevez de cee.
psico

@psycho eu troquei ifcom whilee ele funciona.
seguinte

Melhor ! Mas pode ser mais curto. Vou postar o meu!
Psycho

1
Crie uma variável para s.Lengthsalvar um byte:int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i>=l)break;s=s.Remove(i,1);}}
TheLethalCoder 22/16/16

2

Python 2-65 73 bytes

lambda s,c:[s[0]+c*s[1:i].count(c)+s[i+1:]for i in range(len(s))]

E uma solução recursiva de 76 bytes , porque apesar de ser mais longa que a primeira, eu meio que gosto mais:

f=lambda s,c,i=1:s[i:]and[[s]+f(s[:i]+s[i+1:],c,i),f(s,c,i+1)][s[i]==c]or[s]

2

Raquete 194 bytes

(let p((s s)(n 1)(t substring)(a string-append))(displayln s)(cond[(>= n(string-length s))""]
[(equal? c(string-ref s n))(p(a(t s 0 n)(t s n))(+ 1 n)t a)][else(p(a(t s 0 n)(t s(+ 1 n)))n t a)]))

Ungolfed:

(define (f s c)
  (let loop ((s s)
             (n 1))
    (displayln s)
    (cond
      [(>= n (string-length s))""]
      [(equal? c (string-ref s n))
       (loop (string-append (substring s 0 n) (substring s n))
             (add1 n))]
      [else
       (loop (string-append (substring s 0 n) (substring s (add1 n)))
             n)])))

Testando:

(f "Test cases" #\s)
(f "codegolf.stackexchange.com" #\e)

Resultado:

Test cases
Tst cases
Tst cases
Ts cases
Tscases
Tsases
Tsses
Tsses
Tsss
Tsss
""
codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceee.com
ceeecom
ceeeom
ceeem
ceee
""

2

JavaScript (ES6), 64 69

Retornando uma única sequência com novas linhas

s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s

F=
s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s
  

function update() {
  var s=S.value,c=C.value[0]
  O.textContent=F(s)(c)
}

update()
<input id=S value='Hello world!' oninput='update()'>
<input id=C value='!' oninput='update()'>
<pre id=O></pre>


Um pouco estranho, pois não são necessários dois argumentos, mas um argumento e, em seguida, retorna outra função em que você precisa fornecer o segundo argumento. Não sei se esse foi o comportamento esperado.
MT0 21/11

@ MT0 I é estranho, mas é aceito para uma função com 2 argumentos, pois economiza 1 byte. Vou te dar uma referência quando encontrar uma. Aqui está meta.codegolf.stackexchange.com/a/8427/21348
edc65

Ótima técnica, não percebi que modificar o terceiro argumento .mapera cumulativo. Eu vi o .map().filter()e pensei "Isso daria uma grande compreensão da matriz!", Mas a falta de índice na compreensão da matriz o matou e acabou no mesmo comprimento: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](btw, eu conto 68 bytes para todos esses.)
ETHproductions

1
Na verdade, ao reorganizar os parâmetros, você pode obter a compreensão do array em 66: #([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHproductions

A @ETHproductions não pode acreditar que eu estava errado na contagem de bytes novamente . De qualquer forma, graças a me fazer pensar de novo sobre isso, então eu tenho 64 com ES6 padrão
edc65

2

Swift 3 - 151 147 bytes

Swift não é o idioma ideal para o golfe, principalmente quando se refere à indexação de strings. Isto é o melhor que eu poderia fazer:

func c(a:String,b:String){print(a);var q=Array(a.characters),i=1;while i<q.count{if "\(q[i])" != b{q.remove(at:i);c(a:String(q),b:b);break};i=i+1}}

Infelizmente, o Swift precisa de espaços ao redor !=(mas não para ==), e o Swift 3 abandonou o ++operador. O truque para ambos é converter para uma matriz de caracteres que permita a indexação de números inteiros e usar a interpolação de string de um caractere para converter novamente em um String( "\(c)").

Ungolfed:

func c(a:String, b:String) {
    print(a)
    var q = Array(a.characters)
    var i = 1
    while i < q.count {
        if "\(q[i])" != b {
            q.remove(at:i)
            c(a: String(q), b: b)
            break
        }
        i=i+1
    }
}

Solução anterior, não recursiva

func c(a:String,b:String){var q=Array(a.characters),e={q.removeFirst()},z="\(e())";print(a);while !q.isEmpty{"\(e())"==b ? z=z+b : print(z+String(q))}}
func c(a:String, b:String) {
    var q = Array(a.characters)
    var z = "\(q.removeFirst())"
    print(a)
    while !q.isEmpty {
        if "\(q.removeFirst())" == b {
            z = z + b
        }else{
            print(z + String(q))
        }
    }
}

Bem-vindo ao PPCG! Alguns espaços em branco no final do código podem ser removidos?
ETHproductions

Infelizmente, o @ETHproductions não, o operador ternário e os whileespaços necessários para compilar. Eu também brinquei com tipialiasing Stringe tentando definir printum fechamento, mas eles não economizaram espaço.
rabidaudio

2

Pyke, 26 19 17 bytes

jljjhF3<Q/Q*jih>s

Experimente aqui!

                  - Q = input
j                 - j = input_2
 ljjhF3           - for (i, j, j[0]) for i in range(len(j))
       <          -     j[:i]
        Q/        -    ^.count(Q)
          Q*      -   ^*Q
                s -  sum(j[0], ^, V)
            jih>  -   j[i+1:]

Você poderia adicionar uma explicação?
Esolanging Fruit

@ Challenger5 pronto e jogou 2 bytes!
Azul

1

Mathematica, 78 bytes

Maldito Martin Ender, eu fui quase o primeiro: p

(i=2;a={c=#};While[i<=Length@c,If[c[[i]]==#2,i++,c=c~Drop~{i};a=a~Append~c]];a)&

Função sem nome; implementação direta com um Whileloop e algumas variáveis ​​temporárias.


Oh, vamos lá, nós dois sabemos que Mathematica não é imperativo
LegionMammal978

1
<acena uma bandeira branca>
Greg Martin

1

JavaScript ES6, 89 bytes

Eu pensei que seria um desafio fácil, mas tenho certeza de que estou perdendo alguma coisa aqui ..

Usa recursão e retorna uma matriz de strings

(c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

F=
  (c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

G=_=>A.value.length>1 && (O.innerHTML = F(E.value)(A.value).join`
`)

G()
<input id=A oninput='G()' value='alphabet'>
<input id=E oninput='G()' value='a'>
<pre id=O>


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.