Introdução
Meu avô é fã de James Bond, mas ele sempre tem dúvidas sobre como classificar seus atores favoritos. Como tal, ele está sempre fazendo listas, o que dá muito trabalho. Ele me pediu para elaborar um programa que tornasse sua vida mais fácil, mas não tenho tempo para isso, tenho que trabalhar! Então eu vou contar com vocês.
Desafio
O desafio é simples. A entrada consistirá em uma lista, no seguinte formato:
<number> <space> <actor's name> <newline>
Sua tarefa é classificá-los com base no número no início da linha, começando pelo último e terminando com o primeiro. Todos os números devem ser removidos.
No entanto, meu avô às vezes comete erros. Como tal, você precisará validar os dados. Se um dos nomes da lista não se referir a um dos atores que interpretou Bond, será necessário descartá-lo. No caso de repetições, as repetições devem ser removidas e o nome deve manter o menor peso ao qual foi associado (exemplo # 3).
Não há limite para quantas linhas podem existir.
A saída precisa ser apenas uma lista de algum tipo, seja uma matriz, uma sequência separada por vírgula, apenas valores separados por espaços ou algo completamente diferente, ou seja,
Pierce Brosnan, Sean Connery, David Niven
Uma nova linha ou espaço à direita é permitida.
Exemplo de entrada e saída
Entrada:
1 Sean Connery
2 Emma Watson
5 Timothy Dalton
4 Roger Moore
3 Daniel Craig
Saída:
Timothy Dalton, Roger Moore, Daniel Craig, Sean Connery
Entrada:
2 Timothy Dalton
4 George Lazenby
5 George Lazenby
3 Bob Simmons
Saída:
George Lazenby, Bob Simmons, Timothy Dalton
Entrada:
3 Sean Connery
2 Pierce Brosnan
1 Sean Connery
Saída:
Pierce Brosnan, Sean Connery
Como este é um código de golfe, o código mais curto (em bytes) vence!
Apêndice
Lista de atores que desempenharam o papel de Bond:
- Barry Nelson
- Bob Simmons
- Sean Connery
- Roger Moore
- David Niven
- George Lazenby
- Timothy Dalton
- Pierce Brosnan
- Daniel Craig
echo Sean Connery
porque todo mundo sabe, existe apenas uma ligaçãoRespostas:
Pitão,
136132 bytesExperimente aqui!
Explicação
fonte
Retina ,
201 197191Experimente online!
6 bytes salvos graças ao Martin!
Whee, tipo de bolha com regex. Observe que dez bytes são gastos na conversão de decimal para unário no início, se a entrada unária estiver OK, isso não será necessário. Além disso, se os números não puderem estar no nome das pessoas, mais alguns bytes poderão ser salvos movendo a linha que remove os atores não Bond até o fim e removendo o
1+
(não testado com a\D
versão).Explicação:
Um programa Retina é composto de várias etapas, portanto, explicarei cada etapa separadamente.
Estágio 1:
Substitui os números na entrada por unário. Isso usa o token de substituição especial da Retina:
$*
que repete o caractere depois de um número de vezes igual ao valor base 10 do token anterior.Etapa 2:
O material antes de um
`
estágio altera o modo que está sendo usado. Isso ativa o modo grep, o que significa que cada linha que não corresponde ao regex é descartada. As âncoras são necessárias para impedir que as partidas próximas deslizem.Etapa 3:
Este é o estágio de classificação. O
+
modo significa que esse estágio deve ser repetido até que a substituição não faça alterações quando aplicada (ou seja, atingimos um ponto fixo). A regex encontra um limite de palavras, seguido por um número de se1
depois todo o restante da linha até a nova linha. Então, se a próxima linha tiver mais1
s do que ela, a regex corresponderá e trocamos as linhas.Etapa 4:
Este estágio usa o
+
modo novamente, mas também usas
para fazer o.
meta-caractere corresponda às novas linhas. Isso remove as linhas duplicadas, correspondendo às duplicatas exatas após os se1
capturando o material após a primeira duplicata para substituir a correspondência inteira por elas. Isso funcionará sem a necessidade de considerar a ordem de desempate, porque os nomes já estão classificados adequadamente, com os números maiores acima, portanto, sempre manteremos os valores menores.Etapa 5:
Realmente simples aqui, tudo está em ordem, exceto que temos um monte de
1
s na frente dos nossos Bonds, então os substituímos e o espaço depois deles por nada.fonte
TSQL 426 bytes (incluindo dados de entrada + entrada)
Solução Golfed:
Experimente aqui
O SQL se destaca (sem trocadilhos) nesse tipo de tarefa: relacionando conjuntos, pedidos, eliminando duplicatas etc.
Tudo que você precisa é criar e preencher uma tabela de atores como este:
Agora, se usarmos uma variável de tabela como entrada, apenas precisamos obter a interseção dos dois conjuntos. Remoção de duplicatas e pedidos no SQL são realmente fáceis.
Exemplo 1:
Exemplo 2:
A versão golfada é a coisa completa, por exemplo, entrada 3
Além disso, esse SQL pode funcionar para versões mais antigas do DBMS (até ser reescrito para ANSI SQL) e executar sem problemas em computadores mais antigos que a maioria dos idiomas.
fonte
order by min(R) desc
com a seleção interna e removermin(R)
a seleção. Isso deve economizar 21 bytes.char
vez devarchar
salvará outros 6 bytes.Perl,
242179217 bytesVersão melhorada, com comentários:
A maior parte do tamanho é a lista de títulos; Não consigo encontrar uma boa maneira de comprimir esse regex sem permitir falsos positivos.
fonte
eval
em Perl, e um built-in sistema de compressão ...Python 2, 250 bytes:
Demo:
fonte
PowerShell v3 +,
227219 bytes121 bytes disso é apenas a lista de atores ...
Pega entrada
$args
e-split
lança em novas linhas com`n
. Canalize isso parasort
, que classificará as entradas numericamente ascendentes, o que é bom por enquanto. Nós os canalizamos para um loop foreach|%{...}
, cada iteração leva a entrada,-split
em espaços, e-join
a segunda metade de volta com um espaço (ou seja, eliminando os números desde o início). Os nomes classificados (ascendentes) agora são deixados no pipeline. Encaminhamos aqueles a um lugar onde?
isso garante que eles sejam-in
a lista aprovada de atores. Por fim,select
apenas as-u
entradas nique, que, para duplicados, selecionam a primeira que encontrar (ou seja, a mais baixa) e descartam o restante. Armazenamos a matriz de nomes resultante em$a
.Então, agora temos uma lista crescente de atores. Como o desafio exige uma descida, fazemos uma operação de reversão no local
$a
, indexando de$a.count
baixo para0
.Exemplo
Editar - não precisa usar [array] :: Reverse () quando a indexação for executada
fonte
sort -Des
e não a inversão da matriz? Concedido, isso poderia ser quebrado em versões posteriores do PowerShell, mas eu não acho que seja provável ou um problema real;)select -u
ele pegaria e manteria a ordem de maior valor, e não a menor, então, no meu exemplo, as posições de Daniel Craig e Roger Moore seriam trocadas. Minhas tentativas de corrigir isso resultaram em um código mais longo que a inversão da matriz.Python
309286 bytesfonte
print
ou depois de um)
ou]
JavaScript (ES6), 232 bytes
Explicação
fonte