Dada uma sequência não vazia que consiste apenas em caracteres e espaços alfabéticos em maiúsculas e minúsculas ( [a-zA-Z ]
), reduza-a a um trecho do alfabeto, começando com o primeiro caractere.
Para reduzir uma string, comece com o primeiro caractere alfabético e remova todos os caracteres que não sejam a próxima letra do alfabeto. Continue fazendo isso até chegar ao final da string.
Por exemplo codegolf
:
Comece com c
, remova, o
pois não é a próxima letra do alfabeto.
Mantenha d
como é a próxima letra do alfabeto e mantenha e
como também é a próxima letra.
Remover g
, o
e l
, e manter f
.
Seu snippet final seria então cdef
Regras
- A capitalização deve ser mantida, o
CodEgolF
que resultaria emCdEF
- O espaço não é uma letra do alfabeto e, portanto, sempre deve ser removido, mesmo que seja o início da string
- Devido à natureza da redução, o primeiro caractere alfabético da entrada será sempre o primeiro caractere da saída.
zZ
é a última letra do alfabeto. Não há letras depois, o alfabeto não se repete.
Casos de teste
codegolf -> cdef
CodEgolf -> CdEf
codeolfg -> cdefg
ProgrammingPuzzles -> P
Stack Exchange -> St
The quick red fox jumped over the lazy brown dog -> Tuvw
Zebra -> Z
Abcdegfhijkl -> Abcdef
Pontuação
Isso é código-golfe , e o menor número de bytes em cada idioma vence!
z
apenas paramos, certo?<space>codegolf
Respostas:
JavaScript (ES6),
66796867 bytesQuão?
Testando letras consecutivas
Como converter dois caracteres em seus códigos ASCII seria uma operação bastante demorada em JS, em vez disso, usamos a seguinte fórmula:
Desde que ambos um e b são em
[a-zA-Z ]
, a expressão acima é igual a0
, se e apenas se um e b são letras consecutivas (isto é, os dígitos consecutivos na base 36), não importa o caso dos caracteres.Por exemplo:
Formatado e comentado
Casos de teste
Mostrar snippet de código
fonte
Python 2 , 69 bytes
Experimente online!
Uma simples redução da string. Simplesmente concatenamos o próximo caractere se e somente se
(ord(y)-ord(x[~0]))%32==1
. Cheque muito feio - tenho certeza de que pode ser melhorado, mas não sei como!fonte
from functools import*
.import functools as f
ef.
é muito mais longo do quefrom functools import*
com certeza, mesmo usado uma vez. Veja este tópico para mais informações.Python 3 ,
75 85 84 91 81 7775 bytesEu acho que isso é o mais curto possível no Python 3 . Pode ser reduzido por alguns bytes no Python 2, como mostra o envio de Sisyphus .
Experimente online!
fonte
05AB1E , 13 bytes
Experimente online!
-1 graças a Adnan
fonte
ðK
porá
?Braquilog , 15 bytes
Experimente online!
Seriam 10 bytes:
⊇.ḷ~sẠ&h~h
se não fosse a restrição bastante desinteressante de "cadeias podem começar com espaços".Explicação
Como isso é bastante declarativo, isso também é muito lento.
fonte
MATL ,
181615 bytesAgradecemos ao Mr.Xcoder por apontar um erro, agora corrigido
As letras na saída são separadas por novas linhas.
Experimente online! Ou verifique todos os casos de teste (o código do rodapé exibe todas as letras de saída na mesma linha para maior clareza).
Explicação
fonte
Java (OpenJDK 8) ,
10210174 bytesExperimente online!
-27 bytes graças a @Olivier Grégoire
fonte
s->{char c=0;for(char x:s)if(c<33&x>33|~-x%32==c%32)System.out.print(c=x);}
(comchar[]
como entrada).C # (Mono) ,
129107939187 bytesEconomizou 2 bytes graças a @Mr. Xcoder.
Guardado 4 bytes graças a @jkelm.
Experimente online!
fonte
(c-1)%32
é:~-c%32
PHP, 64 + 1 bytes
Execute como pipe
-nR
ou experimente online .Além dos truques habituais: Quando
$c
alcancesZ
,++$c
resulta emAA
,e
&__
mantém que o comprimento intocada; então$n
não corresponderá mais$c
.fonte
Pitão ,
23 22 2120 bytes-1 byte indiretamente, graças ao truque
-Qd
de @Erik the Outgolfer ( ) .-1 byte graças a @Erik the Outgolfer.
Experimente aqui.
fonte
Haskell,
106 10597 bytesTentei usar
fromEnum
aritmética + char em vez de importarData.Char
, mas isso acabou sendo mais ...Economizou 8 bytes graças a H.PWiz!
Experimente online.
fonte
filter
Data.List
Pitão,
212018 bytesExperimente aqui.
Muito mais eficiente versão de 20 bytes:
Experimente aqui.
-1 graças ao Sr. Xcoder (indiretamente).
fonte
.U+b?tlrreb1rZ1kZrz6
(eu acho). Esse truque me ajudou embora..U+b?tlrreb1rZ1kZr6
mas infelizmenter <str> 6
significaA.strip()
não remover o espaço em branco que não é líder ou à direita.32
, enquanto todas as letras têm> 64
e, portanto, não afetam a funcionalidade. Eu acho que isso se aplica à sua resposta também.Perl 6 , 51 bytes
Teste-o
Expandido:
Observe que
<!before …>
é uma asserção de largura zerofonte
Geléia , 17 bytes
Experimente online!
fonte
Japt ,
181716 bytesGuardado 1 byte graças a @Shaggy
Teste online!
Estava pensando que isso seria um pouco mais curto, mas ... Essa é a vida ...
Explicação
fonte
rS
porx
.C # (.NET Core) ,
7060 + 18 bytes-10 bytes graças a TheLethalCoder
A contagem de bytes também inclui:
Experimente online!
1 byte a mais
(atualmente)(não mais) do que a publicação TheLethalCoder, por diversão. Abordagem diferente, com o LINQ.Isso tira proveito de dois recursos do tipo C em C # - uma
char
variável de caractere está se comportando implicitamente da mesma forma que um número inteiroint
e o operador booleano AND&&
não executa a operação correta se a esquerda retornar afalse
. Explicação do código:fonte
.ToArray()
retornando como umIEnumerable<char>
para salvar bytes.q / kdb +,
4745 bytesSolução:
Exemplos:
Explicação:
Aproveitando o
mod 32
truque das soluções existentes, juntamente com a função de convergência . Itere sobre a sequência, se a diferença entre o último elemento do resultado (por exemplo, começar comT
"A raposa vermelha rápida ...") e o caractere atual for 1 (depois de sermod
d com 32), adicionaremos isso a o resultado (daí entendermos o motivolast x
), e depois converter tudo em uma string.fonte
Perl 5 , 30 + 1 (-n) = 31 bytes
Experimente online!
Quão?
fonte
Retina , 76 bytes
Experimente online! O link inclui casos de teste. Explicação:
Excluir espaços.
Triplicar o primeiro caractere e inserir um separador.
Converta o segundo e o terceiro caracteres em minúsculas e incremente-os. Converta o último para maiúsculas. Agora, esses são os caracteres de pesquisa.
Tente combinar com qualquer um dos caracteres de pesquisa. Se encontrado, triplique a correspondência, que reinicia o loop para a próxima pesquisa. Caso contrário, basta excluir os caracteres de pesquisa e o restante da entrada.
fonte
Oitavo , 114 bytes
Código
Explicação
Exemplo
fonte
C (gcc) ,
79787570 bytesExperimente online!
fonte
Proton , 59 bytes
Porta da submissão do Python 2 .
Experimente online!
fonte
Pitão, 15 bytes
Suíte de teste
Diferentemente de todas as outras respostas, isso não une a saída, gera todas as subsequências da entrada e, em seguida, ordena que colocem a sequência desejada no final e a produz.
fonte
J, solução parcial
Estou postando isso para feedback e idéias para melhorias mais do que qualquer outra coisa. Funciona, mas não lida com os casos de capitalização e borda de espaço, e já é longo para J.
Primeiro, um verbo diádico auxiliar que informa se os argumentos esquerdo e direito são alfabeticamente adjacentes:
A seguir, um verbo que remove o primeiro elemento que não faz parte de uma sequência alfabética iniciando no primeiro elemento:
Note que usamos Adverse
::
para retornar o argumento inteiro inalterado se não for encontrado nenhum elemento que não seja de raia (ou seja, se o argumento inteiro for uma raia alfabética válida).Finalmente, a solução é dada aplicando
f
até a convergência:Experimente online!
E aqui está uma versão analisada
f
para facilitar a leitura:Pergunta lateral : por que os caracteres da caixa não se alinham perfeitamente quando exibidos no SO (eles funcionam no meu console):
fonte