As pessoas deste site adoram embelezar seus títulos de postagem ...
Stewie's sequence: + * - / + * - /
No entanto, quando esse título precisa ser incluído no URL da página, ele é simplificado:
stewies-sequence
O desafio
Sua tarefa é criar um programa ou função que, dada uma sequência que representa o título da postagem, produz / retorne sua conversão "compatível com URL".
O algoritmo é:
- Converter em minúsculas (onde aplicável)
- Substitua todos os espaços (
), ponto (
.
), vírgula (,
) ou barra (/
) por um traço (-
) - Remova todos os caracteres não alfanuméricos, exceto os traços.
- Minimize os grupos de traços adjacentes (
a---b -> a-b
), remova os que estão à frente / à direita.
Observe que esse algoritmo é uma simplificação e nem sempre pode produzir os mesmos resultados que o método real do site.
Regras
- Você pode assumir essa entrada:
- Não ficará vazio.
- Irá conter pelo menos um caractere alfanumérico.
- Contém apenas caracteres no intervalo ASCII 32-126 (imprimível)
- Programas ou funções completos são permitidos.
- Um built-in que faça a especificação exata da tarefa não é permitido.
- Isso é código-golfe , então a solução mais curta (em bytes) vence!
Casos de teste
A maioria das postagens neste site servirá como testes, mas aqui está uma lista útil:
Loading... Forever -> loading-forever
N(e(s(t))) a string -> nest-a-string
"Hello, World!" -> hello-world
URL-Friendly titles -> url-friendly-titles
C.U.S.R.S -> c-u-s-r-s
1+2+3+4+...+n = -1/12? -> 1234-n-1-12
How can I use cmp(a,b) -> how-can-i-use-cmpa-b
Alguns mais longos ...
Export The $PATH Variable, Line-By-Line -> export-the-path-variable-line-by-line
Do n and n^3 have the same set of digits? -> do-n-and-n3-have-the-same-set-of-digits
Quine Anagrams! (Cops' Thread) -> quine-anagrams-cops-thread
The Golfer Adventure - Chapter 1 -> the-golfer-adventure-chapter-1
Bootloader golf: Brainf*** -> bootloader-golf-brainf
E algumas amostras de verificação de casos extremos (sinta-se à vontade para sugerir mais):
0123 -> 0123
a a1 -> a-a1
2-1=1 -> 2-11
-
s? Eles terão que ser removidos? Por exemploasdf-
, em , o último-
terá que ser removido?if(isalphanum(ch))...
_
sublinhados? Meu código funciona, exceto quando há sublinhados.Respostas:
Retina,
3331 bytes(O programa tem uma nova linha à direita)
Não tenho certeza se posso extrair mais disso. Isso deve cobrir tudo. Veio semelhante ao Mama Fun Roll's. Outra versão de 33 bytes usando expressões regulares recursivas
Experimente online!
Explicação
Esta linha é simples, converte para minúscula por T ransliterando
A-Z
(L
) paraa-z
(l
, minúscula).Esse estágio é simples, ele basicamente se livra de todos os personagens desnecessários para nos salvar de muitos problemas mais tarde
[^a-z ,-9]
Corresponde a qualquer caractere que NÃO seja:a-z
: alfabeto em minúsculas (lembre-se de que a sequência inteira está em minúscula devido ao item anterior): espaço chacacter
,-9
este é o intervalo de código de char de,
para9
que passa a ser,-./0123456789
, exatamente os caracteres que precisamosEm seguida, convertemos todos os caracteres não alfanuméricos em traços (que agora são apenas
e
,./-
.Isso não corresponderá
_
(incluído) em\w
(negação de\W
) porque foi removido no estágio anteriorfonte
a = b
.a = b
:(JavaScript (ES6),
90827975 bytesEsta é uma tentativa de fazer o trabalho com um único
replace()
. Esse código extrai apenas os caracteres nos quais estamos interessados e ignora todo o resto. Há alguma lógica adicional para processar os hífens.Casos de teste
Mostrar snippet de código
fonte
,a^a,
, este código fornece-aa-
(existem hífens à esquerda / à direita) #V ,
41, 40, 37, 36 bytesExperimente online! ou Verifique todos os casos de teste de uma vez!
Como sempre, aqui contém um monte de caracteres não imprimíveis e não ASCII, então aqui está um hexdump:
São desafios como esses, nos quais o sistema "Regex comprimido" de V é útil.
Explicação
Primeiramente, converteremos tudo em minúsculas. Felizmente, existe uma maneira realmente conveniente de fazer isso em dois bytes. Eu escrevi uma dica sobre isso aqui . Então nós fazemos
Depois disso, fazemos um monte de comandos substitutos compactados. Uma boa visão geral de como o regex compactado do V funciona pode ser confusa aqui , mas a idéia básica é que podemos definir o nível mais alto para evitar ter que escapar de certos caracteres. Outra conveniência é que intervalos (como
:%
) e sinalizadores (como/g
) são preenchidos automaticamente. Mas, no final, tudo se traduz em comandos substitutos do vim. De fato, podemos até traduzir diretamente o restante do programa para o vim. Isso nos daria o seguinte:Se você fala vim-regex, deve ficar mais claro o que o resto do programa faz agora. Então, aqui está o resto do programa:
fonte
JavaScript (ES6) 91
961 bytes salvos thx @ETHproductions
Teste
fonte
*
na última regex, embora eu possa estar erradoPython 3,
1031009695 bytes5 bytes salvos graças ao Flp.Tkc
fonte
Retina, 34 bytes
Experimente online!
Observe a nova linha à direita. Essencialmente a implementação do OP.
fonte
T`L`l
para ir para letras minúsculas com menos bytesa..
snd similar #[\W]
é apenas\W
MATL , 38 bytes
Experimente online! Ou verifique todos os casos de teste .
Explanation
fonte
Ruby ,
6160616453 bytes(52 bytes de código mais um byte para o
-p
)Experimente online!
Atualização 1:
usogets
do modo de edição de fluxo do Ruby salva um byte.Revertida de acordo com a sugestão da ValueInk .
Atualização 2: (+3 bytes no geral)
..--hi, $/
(→hi
) (+10 bytes) - mais uma vez cortesia do usuário ValueInk-p
(+1 byte)squeeze
e usadogsub
em vez (+2 bytes) , o que me permitiu:strip
para lidar com os traços iniciais e finais (-10 bytes) .Atualização 3: Hattrick de ValueInk. Nós economizamos 11 bytes através da alavancagem
String#split
do hábito de runs-apertando auto do mesmo separador, o que nos permite abandonar todo o final destrip
/gsub
corrente e substituí-lo por umsplit
/join
combinação. (-11 bytes)fonte
-p
bandeira, mas isso definitivamente não funcionará.-p
sinalizador adiciona implicitamente 1 byte ao seu código (porque altera a execução do código deruby -e 'your code'
pararuby -pe 'your code'
). Eu também encontrei um caso de borda em que ele fornece-hi-
entrada, como..--hi, $/
quando você deve remover todos os traços iniciais / finais e, assim, retornarhi
.gsub(/[^\w ]/){}
paratr('^a-z ','')
e, em seguida, termine com, em.split*?-
vez de,.strip.gsub...
pois ele lida automaticamente com duplicatas e as extremidades da string, tudo de uma vez!JavaScript (ES6),
7469 bytesEditar: salvou 5 bytes ao perceber que eu já havia excluído todos os caracteres, exceto
-/,. 0-9a-z
para que eu possa usar\w
para combinar as palavras restantes.fonte
[a-z\d]
poderia ser[^\W_]
?PHP, 87 bytes
A idéia das expressões regulares vem de respostas existentes.
Requer que você tenha um servidor executando PHP e acesso por HTTP.
O título deve estar na chave
T
e o resultado será impresso na tela.Exemplo:
http://localhost/title.php?T=<my shiny title>
fonte
ferramentas bash / Unix, 56 bytes
Substitua maiúsculas por minúsculas e os caracteres especiais necessários por traços.
Exclua (-d opção para tr) caracteres diferentes de letras, dígitos e traços e, em seguida, pressione (-s opção para tr) vários traços em uma linha em um único traço.
Exclua traços no início e depois no final.
fonte
Powershell, 85 bytes
torná-lo minúsculas, em seguida, 3 substitui regex em uma fileira, e aparar qualquer arrasto
-
'sfonte
$input
economizar 2 bytes?JavaScript,
90989493919091 bytes1 byte salvo graças a @ edc65!
1 byte economizado graças a @IsmaelMiguel por detectar um ponto e vírgula líder!
1 byte ganho após falhar por
,a-^-a,
O que eu mais gosto nessa submissão em particular são os intervalos. No primeiro
replace
, nós removemos qualquer coisa que não é alfanumérico e não um,
,-
,.
,/
e não um espaço. Usamosa-z
para detectar as letras e,-9
para detectar esses caracteres e números especiais, pois os códigos de caracteres desses literais ASCII estão alinhados!Mostrar snippet de código
fonte
f=
portanto a contagem de bytes é de 96 no momento. E não há necessidade de o \ dentro de um intervalo na expressão regular, assim que poderia ser 95. Mas ... ainda não está funcionando: try...title
f=
e;
no final. Apenas especifique que essa é uma função anônima. Com isso, sua resposta deve ter 90 bytes.Lua, 91 bytes
Onde
a
está a string do URL.Explicação:
a:lower()
retorna a função minúscula:gsub
localiza a correspondência do padrão e a substitui pela sequência.'[ .,/]'
: Colchetes significam "ou", portanto, isso corresponde a espaço, ponto, vírgula e barra. Não há necessidade de ser ganancioso, porque:gsub
todas as ocorrências.'[^%w-]'
:^
significa "não" quando dentro de colchetes,%w
significa qualquer coisa alfanumérica. Então'[^%w-]
combina com qualquer coisa que não seja alfanumérica ou que seja um traço.'%-+'
: Combine o maior número possível de traços e substitua-os por apenas um traço.match'%-?(.*)%-?'
: Em Lua, se uma string é o único argumento da função, nenhum parêntese é necessário. Só é necessário verificar um traço no início e no final, porque os traços já foram minimizados. Não há necessidade de caracteres âncora, porque.*
é igual a tudo, ganancioso.fonte
C, 194 bytes
Ligue para:
fonte
SAS, 108
Uma das respostas menos competitivas aqui devido à sintaxe detalhada do SAS - a penalidade de 9 caracteres por regex realmente dói - mas foi um bom exercício de aprendizado de regex:
fonte
Pitão, 35 bytes
Explicação
fonte
Perl 6, 75
fonte
GNU Sed, 65 bytes
Uma série de substituições regex. Usa não-portátil
\L
do GNU sed para minúsculas a entrada. Executar a partir de um arquivo usandosed -f
.fonte