Mini-golfe de segunda-feira: Uma série de desafios curtos de golfe com código , publicados (espero!) Toda segunda-feira.
História verdadeira 1 : Outro dia, eu estava brincando no meu tablet quando tive a ideia de visitar a página que normalmente uso no meu PC para testar o JavaScript. Depois que a página foi carregada, entrei neste programa simples:
alert("Hello!")
Passei a pressionar o botão Executar e fiquei surpreso ao me dizer que o código que eu havia inserido era inválido. Dei uma segunda olhada na caixa de texto e vi o seguinte:
alllelelerlerlertlert("Heeelelellellelloello!")
Wha??? Não foi isso que eu entrei! Então o que aconteceu aqui? Para descobrir, digitei duas linhas simples:
abcdefg
0123456
Isso acabou como:
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456
Até agora, eu ainda não tinha idéia do que aconteceu com as letras, mas os números pareciam mais simples, então olhei mais de perto. Como se viu, a página da Web estava simplesmente inserindo o primeiro caractere e repetindo todo o resto da string toda vez que um novo era pressionado:
0112123123412345123456
0
1
12
123
1234
12345
123456
Mas e as seções de letras? Depois de refletir por um minuto, percebi que é a mesma coisa, mas em vez de repetir cada subseção uma vez, ela repete duas vezes :
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
bb
bcbc
bcdbcd
bcdebcde
bcdefbcdef
bcdefgbcdefg
Uma combinação dos dois funciona com uma combinação dessas técnicas:
abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
bb
bcbc
bc1
bc12
bc123
bc123zbc123z
Qualquer falha que causa isso parece redefinir a pontuação e os espaços, assim abc def
se torna abbbcbc deeefef
.
A essa altura, eu estava tão absorto em descobrir e transformá-lo em um desafio interessante que esqueci por que eu estava lá em primeiro lugar. (Contudo, eu descobri como digitar normalmente: pressionar espaço-atrás após cada caractere. Bastante entediante, mas você precisa fazer o que precisa.)
Desafio
O objetivo do desafio é escrever um programa ou função que inclua o texto a ser processado, faça as alterações listadas acima e produza / retorne o resultado.
Detalhes
- A entrada conterá apenas ASCII imprimível e nenhuma guia ou nova linha.
Casos de teste
Entradas: (uma por linha)
Mess up text
This is some longer text.
CAPS LOCK && "Punc-tua"+'tion'
under_score_style
CaPs wItHIn loWERs
1337 numb3r5
abcdefghij 0123456789
Code-golf is the best!
Saídas:
Meeesesessess upp teeexexextext
Thhhihihishis iss sooomomomeome looononongongongeongeongeronger teeexexextext.
CAAAPAPAPSAPS LOOOCOCOCKOCK && "Puuunununcunc-tuuuaua"+'tiiioioionion'
unnndndndendendernder_scccococorcorcorecore_stttytytyltyltyletyle
CaaaPaPaPsaPs wIIItItItHItHItHIItHIItHInItHIn loooWoWoWEoWEoWERoWERoWERsoWERs
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefgbcdefghbcdefghbcdefghibcdefghibcdefghijbcdefghij 0112123123412345123456123456712345678123456789
Cooodododeode-gooolololfolf iss thhhehe beeesesestest!
Pontuação
Este é o code-golf , pelo que o código válido mais curto em bytes vence. O desempatador vai para o envio que atingiu sua contagem final de bytes primeiro. O vencedor será escolhido na próxima segunda-feira, 2 de novembro. Boa sorte!
Edit: E o vencedor é ... @ MartinBüttner usando Retina para uma incrível solução de 43 bytes !
1 Sim, essa história é completamente verdadeira e, se você precisar de mais esclarecimentos, consulte a nota de rodapé 1.
' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
Respostas:
Retina , 43 bytes
Execute o código de um único arquivo com o
-s
sinalizador. Como essa é apenas uma substituição de regex única, você pode testá-la aqui (clique na guia Contexto para ver os resultados).Explicação
Isso corresponde a qualquer dígito e letra que não seja o primeiro de uma execução. Embora
.
possa corresponder a qualquer caractere que não seja de avanço de linha, os visores garantem as outras condições:Isso corresponde ao contrário da posição após o
.
. Primeiro ele corresponde a um ou mais caracteres alfanuméricos e os captura em grupo1
com([^_\W]+)
. Isso garante imediatamente que o valor.
corresponde a um caracter alfanumérico. O adicional[^_\W]
garante que haja mais um caracter alfanumérico na execução atual, que não inclui a correspondência. Agora grupo1
é o que queremos substituir a correspondência se for um dígito - se for uma letra, queremos substituí-lo com o dobro dessa string. É aí que o segundo olhar entra em cena:Este é opcional, portanto, se falhar, não afetará a partida. Primeiro, ele garante que não
.
havia um dígito via - portanto, isso só é relevante quando estamos correspondendo letras. Nesse caso, correspondemos ao grupo mais uma vez (isso sempre corresponde, porque capturamos o grupo da mesma posição), mas capturamos no grupo .(?<=\D)
\1
2
Portanto, simplesmente substituímos a regex pelo conteúdo de ambos os grupos (
$1$2
). Se a correspondência foi um dígito,$2
ainda estará vazia e nós escrevemos o prefixo apenas uma vez. Se era uma carta,$2
é a mesma que$1
e escrevemos de volta duas vezes.fonte
JavaScript (ES6) 82
Usando a otimização regexp sugerida por Mwr247
Teste a execução do snippet abaixo em qualquer navegador recente
fonte
JavaScript (ES6),
928887Eu não tenho idéia de como jogar isso para baixo ...
Obrigado Mwir247 pelo regex reduzido e ETHproductions pelo golfe de um byte na função de redução .
fonte
/[^_\W]+/g
(salva 3 caracteres) #.reduce
função:(a,e)=>a+=(y+=e,++e?y:y+y)
(1 byte mais curto)Haskell,
215200 bytesÉ uma bagunça.
Divirta-se lendo todas as peculiaridades estranhas, eu nunca pensei que usaria
id
tanto.Pena que o material que já faz metade do trabalho aqui precisa ser importado (
isDigit
,isAlpha
,inits
).fonte
lang-hs
nãolang-haskell
. Especificandolang-haskell
, provavelmente acaba usando um marca-texto padrão.Gema, 57 caracteres
Exemplo de execução:
fonte
Haskell,
183181 bytesUso:
Não sei se é essencialmente diferente com a resposta de Leif Willerts. Mas aqui está o algoritmo.
De alguma forma, mantenho colchetes redundantes.
fonte
T-SQL, 357 bytes
ex:
exec x(@s='1337 numb3r5')
retorna1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
fonte
Python 2, 131 bytes
Faz um loop entre os caracteres e salva / repete, se necessário.
fonte
Pip, 41 bytes
Leva o texto como um argumento da linha de comando. Usamos uma substituição de regex para substituir todas as execuções alfanuméricas (
[^_\W]+
) por uma função de retorno de chamada. Essa função mapeia outra função para cada caractere da palavra, gerando execuções cada vez maiores de caracteres (com a variável globaly
acompanhando o índice) e repetindo-as X2 se o caractere não for um número. (A lógica pela qual+
se converte em um número e depoisQ
verifica se é igual a um caractere original.) Esse processo deixa de fora o primeiro caractere; portanto, precisamos adicioná-lo posteriormente (a@0.
).fonte
Python 3 , 86 bytes
Experimente online!
fonte