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.com
e e
para 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 e
s. 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 é código-golfe , então o código mais curto (em bytes) vence.
Meeeeeeeeegram
Respostas:
V , 12 bytes
Experimente online!
Hexdump:
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:
O regex compactado se traduz em
Que significa
Versão não concorrente (11 bytes)
Esta versão usa um atalho para
Yp
que não estava disponível quando este desafio foi lançado.fonte
cat filename | vim
faria ou faria outra coisa?Vim,
27, 26, 25 bytesExperimente online!
A entrada vem neste formato:
Minha primeira abordagem ingênua tem três bytes a mais:
Também estou feliz com esta resposta, porque começa com o meu nome.
Veja a semelhança? Eh?
Abordagens menos bem-sucedidas:
Explicação:
fonte
k
muito :)(...)comk
na linha 5 atualmente.:t
aqui. NormalYp
salvaria 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.|s
com99@:
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.MATL ,
2016 bytesExperimente 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):
Ou tente no MATL Online!
Explicação
fonte
Haskell, 50 bytes
Define uma função que
(%)
retorna uma lista de cadeias.Explicação
(%)
é chamado comow%c
, comw
sendo a cadeia de entrada, ec
o caráter para manter. Em resumo, essa definição funciona separandow
o primeiro caractere (a
) e o restante (x
), dividindo-sex
na primeira ocorrência de um caractere que não sejac
e chamando-se recursivamente com esse caractere descartado.fonte
Retina ,
2827 bytesA contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Explicação
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.Isso descarta o primeiro caractere que a) não está no início da entrada, b) não é igual ao caractere de entrada separado.
fonte
Pip ,
22262422 bytesAceita 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
,b
obtenha cmdline args;o
começa com um valor de1
,x
é""
):Truques de golfe:
L
é avaliado apenas uma vez, para que possamos ocultar a impressão inicial.#Pa-1
não funcionará porqueP
é de baixa precedência (seria analisada como#P(a-1)
), mas podemos reorganizá-lav+#Pa
usando av
variável pré-inicializada como-1
.RA:
operador retorna o novo valor dea
, para que possamos imprimir essa expressão em vez de ter umaPa
instrução separada .?
.fonte
Perl 5, 29 bytes
Eu obtive 35 bytes usando Strawberry Perl: 31 bytes, mais 1 para em
-nE
vez de-e
, mais 3 para espaço +-i
(usado para a entrada de uma letra; a string mais longa é de STDIN).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.Portanto:
fonte
-l
opção, que ativa um modo de tratamento automático de linha, no qualprint
imprime uma nova linha adicional (irrelevante aqui) e-p
/-n
input remove a nova linha (muito relevante). Além disso, está obsoleto, mas acho que você pode substituir o^I
controle literal por um byte extra de economia. Finalmente, achos/.\K[^$^I]/redo/e
que seria um personagem mais curto, embora não tenha 100% de certeza de que é um lugar legal para colocar umredo
.^I
, isso é verdade para a maioria das variáveis de letra de controle, mas não para esta, IIRC. Re\K
e colocandoredo
na substituição com/e
, obrigado! Vou testá-lo quando tiver a chance de….Perl 6 ,
47 4038 bytesExpandido:
O motivo
...^
foi usado em vez de...
é que&[eq]
não retornariaTrue
até que o último valor fosse repetido.fonte
05AB1E ,
2625 bytesExperimente online!
Observe que isso
¬²k0Q
pode 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.fonte
DˆćUΔD²KRнõ.;DXìˆ}¯¨»
para 21, mas que usa novos comandos.Python 2,
7166 bytes: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 :
Este deve ser chamado no formato
print(Q('<String>','<Char>'))
.fonte
Python 3 , 72 bytes
Experimente online!
Fazer uma dieta:
fonte
JavaScript (ES6), 74 bytes
fonte
f('test cases', 's')
(terminando comstss
, em vez detsss
). Eu acho que isso ocorre porquereplace
remove a primeira ocorrência e remove a primeirat
e não a segundat
na quarta iteração domap
loop.Ruby,
1481399790837762 bytesNã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
then
por;
egets.chop
comgets[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.dup
pors=""+a
e a declaração if anterior,if s[i]!=c;s[i]="";p s;else i+=1;end
com(d!=c)?(s[i]="";p s):i+=1;
grande melhoria!fonte
=
s. Para dicas mais abrangentes, visite nossa página de dicas .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, comoa,b,c=0,1,2
.do
,then
eend
) e por volta da quarta=
.c90,
129125 bytescom espaço em branco:
sem espaço em branco:
ungolfed:
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.
fonte
Dyalog APL , 27 bytes
{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}
⍺
é o caractere excluído,⍵
é a sequência inicialargumento de impressão; encontre o índice
i
do primeiro não⍺
depois do primeiro caractere; se encontrado, chame recursivamente comi
removidofonte
Mathematica, 64 bytes
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.
fonte
FixedPointList
.PHP,
88848685828178 bytes1 byte salvo graças a @IsmaelMiguel, 3 bytes graças a @ user59178, 3 bytes inspirado por @ user59178
recebe entrada de argumentos de linha de comando; correr com
php -r <code> '<string>' <character>
Isso adiciona
54 bytes de código, mas economiza na saída e em mais umecho$a;
.fonte
$argv[1]."\n"
pode ser escrito como"$argv[1]\n"
$b
adicionar uma nova linha, ela sempre será verdadeira, desde que tenha comprimento> = 1. Portanto, isso""<
é desnecessário.substr()
vez de atribuir$b
.substr
resultado tanto para a condição quanto para aprint
; então eu deveria atribuí-lo em algum lugar. Mas você me inspirou.for(;$b=substr($b?:".$argv[1]\n",1);)
mas o que você tem agora ainda melhor.05AB1E,
262423 bytesObrigado @Kade por 2 bytes!
Obrigado @Emigna por 1 byte!
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.fonte
Java 10,
155140139124 bytesExperimente online.
Explicação:
Resposta recursiva antiga de 139 bytes:
-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:
fonte
C #,
122117112 bytesUngolfed:
Retorna uma coleção de strings.
fonte
c
. Nesse caso, o loop tentará trabalhar para sempre.TSQL, 127 bytes (Excluindo definições de variáveis)
Formatado:
fonte
patindex
, mas oalphabet
exemplo não parece muito certo, é exibidoaaphabet
abaixoaaa
. 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, oupperCASE
exemplo também falha, sendo exibidoueE
em sua linha final.C #,
135138 :(137 bytesGolfe:
Ungolfed:
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.fonte
codeegolf e
daria emce
vez decee
.if
comwhile
e ele funciona.s.Length
salvar 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);}}
Python
2-6573 bytesE uma solução recursiva de 76 bytes , porque apesar de ser mais longa que a primeira, eu meio que gosto mais:
fonte
Raquete 194 bytes
Ungolfed:
Testando:
Resultado:
fonte
JavaScript (ES6), 64
69Retornando uma única sequência com novas linhas
fonte
.map
era 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.)([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
Swift 3 -
151147 bytesSwift não é o idioma ideal para o golfe, principalmente quando se refere à indexação de strings. Isto é o melhor que eu poderia fazer:
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 umString
("\(c)"
).Ungolfed:
Solução anterior, não recursiva
fonte
while
espaços necessários para compilar. Eu também brinquei com tipialiasingString
e tentando definirprint
um fechamento, mas eles não economizaram espaço.Pyke,
261917 bytesExperimente aqui!
fonte
Mathematica, 78 bytes
Maldito Martin Ender, eu fui quase o primeiro: p
Função sem nome; implementação direta com um
While
loop e algumas variáveis temporárias.fonte
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
fonte
Groovy, 34 bytes
fonte