Descrição do Desafio
Você tem uma biblioteca de música com muitas faixas gravadas por muitas bandas, cada um dos quais tem um nome, como Queen
, Aerosmith
, Sunny Day Real Estate
, The Strokes
. Quando um reprodutor de áudio exibe sua biblioteca em ordem alfabética pelo nome da banda, geralmente ignora a The
parte, como muitos nomes de banda iniciam The
, facilitando a navegação pela coleção de mídia. Nesse desafio, dada uma lista (matriz) de cadeias, você precisa classificá-la dessa maneira (ou seja, omitir a The
palavra no início do nome). Você pode escrever um método ou um programa de trabalho completo.
Amostras de entradas / saídas
[Queen, Aerosmith, Sunny Day Real Estate, The Strokes] -> [Aerosmith, Queen, The Strokes, Sunny Day Real Estate]
[The Ramones, The Cure, The Pixies, The Roots, The Animals, Enrique Iglesias] -> [The Animals, The Cure, Enrique Iglesias, The Pixies, The Ramones, The Roots]
[The The, The They, Thermodynamics] -> [The The, Thermodynamics, The They]
Notas / casos de borda
Classificar lexicograficamente não faz distinção entre maiúsculas e minúsculas, portanto
The Police
,The police
ethe police
são todos equivalentes,Seu algoritmo deve omitir apenas a primeira
the
palavra, para que as bandas nomeadasThe The
ouThe The Band
sejam classificadas normalmente pela segundathe
,Uma banda chamada
The
(uma palavra de três letras) é classificada normalmente (sem pular),A ordem de duas bandas com o mesmo nome, uma das quais começa com
the
(comoThe Police
ePolice
) é indefinida,Você pode assumir que, se o nome de uma banda consistir em mais de uma palavra, eles serão separados por um único caractere de espaço. Você não precisa lidar com espaços em branco iniciais ou finais,
Todas as cadeias de entrada correspondem
[A-Za-z0-9 ]*
, ou seja, elas consistem apenas em letras maiúsculas e minúsculas do alfabeto inglês, dígitos e caracteres de espaço,Lembre-se de que este é um desafio do código-golfe , portanto, faça o seu código o mais curto possível!
The
eThe The
? (A maioria das respostas provavelmente precisa mudar se é outra coisa senão indefinido)Respostas:
Python,
566264 bytesTente
Agradecemos a @Chris H por apontar que
lstrip()
não estava lidandoThe The
corretamente, pois a faixa estava detonando todos os caracteres correspondentes e classificando-os como uma sequência em branco, e a @manatwork por encontrar a falha no usoreplace()
. A nova versão deve funcionar.Versão antiga:
fonte
['The The', 'The', 'The Animals', 'Thermodynamics', 'The They']
. O caso da 2ª aresta sugere que o sit deve ser ['Os Animais', 'O', 'O', 'Termodinâmica', 'O Eles'] (ou troque os itens 2 e 3). Um pouco de mexer sugere o interior do espaçostrip('the ')
está a ser ignorado - tentativafor x in ['The The', 'The They', 'Thermodynamics', 'The', 'The Animals']: print (x.lower().strip('the '))
replace()
não é muito melhor:'what the snake'.replace('the ','',1)
resultados'what snake'
.V ,
3228 bytesExperimente online!
Nota para si mesmo: faça uma abreviação de
:sort
para que eu não precise de 6 bytes inteiros para um único comando!Explicação:
fonte
the
estiver em minúsculas, comothe pAper chAse
?Retina , 34 bytes
O avanço de linha à direita é significativo.
E / S é uma banda por linha.
Experimente online!
Explicação
Duplique cada linha, usando
;
como separador.Vire tudo na frente de um
;
para minúsculo.Remova todos os
the
s que aparecerem no início de uma linha.Classifique as linhas.
Remova o início das linhas que usamos para classificação.
fonte
(?i:the )?(.*)
/\L$1\E;$0
/Pyke, 16 bytes
Experimente aqui!
fonte
Perl, 52 bytes
-13 byte graças a @manatwork
-1 byte graças a @ msh210
Uma banda por linha como entrada e a saída também.
A implementação é bastante direta: o programa imprime a lista de bandas, classificadas com a ajuda de uma função personalizada (
f
) que retorna o nome da banda em minúsculas sem a eventual liderançathe
.fonte
sub f{lc$_[0]=~s/^the //ir}
.lc
parâmetro entre parênteses e oi
sinalizador em substituição. Ou você conheceu um caso de teste em que isso não funciona?perl -e 'sub f{lc$_[0]=~s/^the //ri}print sort{f($a)cmp f$b}<>' <<< $'Queen\nAerosmith\nSunny Day Real Estate\nThe Strokes'
.lc pop
vez delc$_[0]
e emsay
vez deprint
. (O último requer-M5.01
, que é gratuito.) Testado no Strawberry 5.20.2 com apenas o primeiro caso de teste da pergunta.Python,
667269 bytesUsa o
sorted
método Python com okey
argumento keyword para classificar pelo nome menos "The". Isso é uma lambda; para chamá-lo, dê um nome colocando-of=
na frente.Agora com insensibilidade extra à caixa!
fonte
the
; nesse caso, esse método não funcionará corretamente.Ruby, 42 bytes
Experimente online!
fonte
Perl 6 , 26 bytes
Explicação:
Teste:
fonte
PowerShell v2 +,
333229 bytesGuardado 3 bytes graças a @MathiasRJessen
A entrada é via argumentos da linha de comando. Classifica os nomes originais com base nos resultados do bloco de scripts
{...}
que executa uma regex-replace
para remover os principais (sem distinção entre maiúsculas e minúsculas)"the "
.Exemplos
fonte
-replace
é case-insensitive por padrão,'^the '
será suficiente para o padrãoJavaScript / ECMAScript 6
9370 bytes70 Agradecimentos a Neil e Downgoat pelos conselhos
Versão legível para a variante de 70 bytes
93
Versão legível para a variante de 93 bytes
fonte
^
? Além disso, o localeCompare não faz distinção entre maiúsculas e minúsculas no meu sistema, por isso não precisava do sinaltoLowerCase
, apenas uma/i
sinalização no regexp. Finalmente, você pode jogar isto da seguinte maneira:B=>B.sort((a,b)=>...,R=s=>...)
-sort
ignora o parâmetro extra que defineR
.^
movimento shuold no início da regexJava 8, 178 bytes
Versão não destruída:
Ligue como tal:
fonte
void q(String[]s){...}
paras->{...}
. E você pode mudar os dois(x.toLowerCase().startsWith("the ")?x.substring(4):x)
comx.replaceFirst("(?i)the ","")
. Assim, o total se torna:s->{java.util.Arrays.sort(s,(a,b)->a.replaceFirst("(?i)the ","").compareToIgnoreCase(b.replaceFirst("(?i)the ","")));}
- 118 bytess->{ ... }
não eram permitidas e eu tinha que ter uma assinatura de método completa com tipos e outros enfeites. Não sei se isso mudou desde então.Nim , 96 bytes
Esses
import
ocupam tantos bytes:|
Uma tradução da minha resposta Python .
Este é um procedimento anônimo; Para usá-lo, ele deve ser passado para um procedimento de teste. Aqui está um programa completo que você pode usar para testar:
fonte
Haskell, 84 bytes
Ligue com
Caso de teste:
fonte
MATL , 16 bytes
O formato de entrada é (cada linha corresponde a um caso de teste)
Experimente online!
Explicação
fonte
C #, 139 bytes
Experimente online!
Sem contar os usos, a resposta seria 102 bytes.
fonte
ToLower()
devido à exigência de maiúsculas e minúsculasl=>l.OrderBy(b=>(b.ToLower().StartsWith("the ")?b.Substring(4):b));
Para 67 bytes e, em seguida, você precisa adicionar nausing System.Linq;
tambémToLower
por causa do requisito que não diferencia maiúsculas de minúsculas. Caso contrário, o pedido faria distinção entre maiúsculas e minúsculas.BASH, 64 bytes
Entrada: stdin, uma banda por linha. Saída: stdout
Nota: As segundas substituições (s / ^ The / / s / ^ / The /) usam o caractere de tabulação, portanto nem sempre copiam / colam corretamente.
fonte
Bash + coreutils, 44 bytes
Explicação: o formato de entrada e saída é uma banda por linha
Execução de teste (usando um documento aqui com EOF como marcador final):
Saída:
fonte
Vim, 18 bytes
Bem, agora que percebi que isso é possível, estou meio envergonhado com a minha resposta V de 26 bytes, especialmente porque o V deve ser mais curto que o vim. Mas isso é praticamente um builtin.
Explicação (diretamente da ajuda do vim):
fonte
C,
216212135 + 5 (qsort
) =221217140 bytesBem, finalmente consegui terminar isso
C
. Dicas de golfe são muito apreciadas.Nesta submissão,
M
é a função de comparação a ser fornecidaqsort
. Portanto, para invocar isso, você deve usarqsort
no formato emqsort(argv++,argc--,8,M)
queargv
contém os argumentos da linha de comandos eargc
é o número de argumentos fornecidos.Experimente Online!
fonte
05AB1E , 27 bytes (não concorrente)
Experimente online!
Explicação
fonte
Groovy, 34 bytes
41% a minha resposta é
.toLowerCase()
, me mate agora.Saída
Ao executar ...
O resultado é...
[The Animals, The Cure, Enrique Iglesias, The Pixies, The ramones, The Roots]
Sem saída de depuração ou erro.
fonte
q / kdb +,
3633 bytesSolução:
Exemplo:
Explicação:
Retire qualquer "[Tt] ele" de cada sequência de entrada, classifique esta lista e, em seguida, classifique a lista original com base na indexação da lista classificada.
fonte
Japonês ,
1110 bytesTente
fonte
Java
176158 bytesFunção principal
); }
Função de classificação Golfed:
fonte
the
. A classificação não diferencia maiúsculas de minúsculas.public String[]sort(String[]names){ for(int i=-1;++i<names.length;) names[i]=names[i].replaceFirst("(the|The)", ""); return Arrays.sort(names,String.CASE_INSENSITIVE_ORDER); }
Como o e A deve funcionar, e cordas de um imutávelArrays.sort
Retorna o tipo voidthe pAper chAse