Todos conhecemos diferentes algoritmos de classificação sofisticados, mas nenhum deles fornece números de uma maneira fácil de pronunciar. Para remediar isso, proponho o uso do PronunciationSort ™, a maneira mais natural de classificar listas de números.
Pronúncia
As regras oficiais para pronunciar números (neste desafio) é que os dígitos são pronunciados um por um, e a sequência resultante é classificada em ordem lexicográfica. Como exemplo, isso significa que o número 845
é pronunciado "eight four five"
e deve ser classificado de acordo.
Números negativos
Os números negativos são pronunciados acrescentando a palavra "minus"
. Assim, -23
é pronunciado como "minus two three"
. Observe que isso faz com que os números negativos terminem no meio da saída, entre os números que começam com 4
(quatro) e 9
(nove).
Como guia, a ordem oficial das palavras para o PronunciationSort ™ é:
- oito
- cinco
- quatro
- menos
- nove
- 1
- Sete
- seis
- três
- dois
- zero
Isso é,
8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0
Entrada
Uma lista de números inteiros no intervalo , contendo no máximo 100 elementos. A entrada como uma lista de strings não é permitida. Se o seu idioma não suportar entrada como lista, é permitido fornecer entrada como números inteiros separados.
A entrada não conterá nenhum número inválido ou qualquer número começando com um 0 (exceto o próprio número 0). A entrada geralmente não será classificada, pode ser fornecida em qualquer ordem.
Saída
Os mesmos números inteiros, na ordem PronunciationSort ™. Observe que os números devem ser convertidos apenas em suas pronúncias para obter a classificação; a saída não deve conter nenhuma string.
Exemplos
Para os exemplos, a etapa do meio (entre parênteses) serve apenas como guia e não faz parte da saída.
[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]
Há também um script para verificar seus resultados .
Respostas:
05AB1E (herdado) , 15 bytes
Experimente online!
Explicação
fonte
•ĆU‘•
. Ele adiciona uma nova linha durante o mapeamento / classificação por qualquer motivo.Σ•ĆU‘•"54-ÿ"sSk
poderia ter sido uma alternativa de 15 bytes que eu estava trabalhando, se não fosse por esse bug estranho .. Se eu mudar•ĆU‘•
para o literal9176320
ele funciona muito bem ..…54-ì
parΣ•RT‹•Á…54-ìsSk
por 15•t∍ýJ•'-ìÁÁ
também funcionariaHaskell , 57 bytes
Experimente online!
fonte
Geléia ,
1513 bytesExperimente online!
Um link monádico que aceita uma lista de números inteiros que produz uma lista de números inteiros.
Quão?
Classifica pelos valores ordinais dos dígitos dos números inteiros (onde
-
é um "dígito" de -1) convertidos em seqüências de caracteres usando os caracteres no índice modular e com base em 1 na sequência mágica "murgeon lix".A classificação é efetivamente alfabética onde um espaço é considerado menor que qualquer letra.
A seqüência mágica "murgeon lix" foi encontrada inspecionando os dicionários de Jelly usados na compactação. Não há palavras de 11 letras que satisfaçam os requisitos (e nada mais que isso mediante a duplicação). como um espaço classifica antes das letras, a próxima escolha mais óbvia é uma palavra de comprimento sete, seguida por um espaço seguido de uma palavra de comprimento três. "murgeon" e "lix" é a única combinação satisfatória, embora sem espaço outros possam ser possíveis (por exemplo,
“£Py:ƥ»
"murgeonalix", que funciona para a mesma contagem de bytes)@ 15 bytes anteriores :
Aqui
“¡Zo⁶’Œ?¤
encontra a primeira permutação de números naturais que residiria no índice 21.340.635 quando todas as permutações dos números são classificadas lexicograficamente - o que é[6,10,9,3,2,8,7,1,5,4,11]
. (“¡Zo⁶’
é uma representação de base 250 de 21340635, enquantoŒ?
faz o cálculo e¤
agrupa essas instruções)fonte
Perl 6 , 30 bytes
Experimente online!
Porta da solução Ruby da GB.
Versão original de 35 bytes
Experimente online!
Converta cada número em uma string, obtenha o nome Unicode de cada caractere, retire a primeira palavra ("DIGIT" ou "HYPHEN") e depois classifique.
fonte
JavaScript (SpiderMonkey) , 69 bytes
Experimente online!
fonte
+''
, visto que está recebendo a entrada como uma matriz de seqüências de caracteres.K (ngn / k) ,
2120 bytesExperimente online!
{
}
função com argumentox
$
formato como cadeias"
"?
"8"
<
calcular permutação ascendente de classificaçãox@
o argumento nesses índicesfonte
Python 3,
68 bytes67 bytes64 bytesUsa a
sorted
função interna com uma lambda anônima para a chave. Codifique a ordem de classificação e compare cada dígito em cada valor na lista de entrada com sua posição na lista de ordem de classificação.Editar: salvou 1 byte removendo
8
da lista de classificação para aproveitar ostr.find
retorno-1
quando o parâmetro não for encontrado. Graças ao maxb.Edit2: salvou 3 bytes usando a sintaxe de descompactação com estrela em um
list
literal, em vez de nolist
construtorExperimente online!
fonte
lambda x:sorted(x,key=lambda y:map('54-9176320'.find,`y`))
Pitão,
1716 bytesExperimente online aqui ou verifique todos os casos de teste de uma vez aqui .
Economizou 1 byte graças a @ngn e sua resposta K , omitindo 8 no início da string de dicionário
fonte
Japonês, 19 bytes
Tente
fonte
S.n(s)
:ñ_s ®n"54-9176320
(aparentementeS.n(s)
é exatamente o mesmo ques.b(S)
paraS
de comprimento 1, exceto que ele retorna0
no lugar de-1
)Retina 0.8.2 , 36 bytes
Experimente online! O link inclui o conjunto de testes. Explicação:
Traduza o sinal de menos e os dígitos para sua posição em ordem de pronúncia, usando
:
a 10ª posição.Classifique em ordem de pronúncia.
Traduza o pedido de volta para o sinal de menos e os dígitos originais.
fonte
Ruby , 50 bytes
Experimente online!
fonte
R , 58 bytes
Experimente online!
Input é uma lista de números que são implicitamente convertidos como string usando
chartr
.order
em seguida, usa a ordem lexigográfica para recuperar a ordem pela qual a lista original deve ser classificada.fonte
Java (JDK 10) , 123 bytes
Experimente online!
Esta é uma implementação Java ingênua. Deve ser muito jogável.
Créditos
fonte
.chars
-IntStream e.reduce
para um ciclo regular de salva 2 bytes:n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}
. Além disso, mais um byte pode ser salvo alterando10+"85
para20+"5
, pois o.indexOf
dígito for8
resultaria em -1. Experimente online 123 bytesJavaScript (SpiderMonkey) ,
8773 bytesExperimente online!
Obrigado @Arnauld por dizer que o tipo no SpiderMonkey é estável, para que a
||-(F(q)>F(p))
peça possa finalmente ser descartada.fonte
Vermelho , 114 bytes
Experimente online!
Mais legível:
fonte
C ++, 353 bytes
Esta é uma espécie de entrada de comédia, mas eu estava perdendo tempo e escrevi, então não posso deixar de publicá-la ... Desfrute de uma risada e deixe-me saber se há algum poupador de espaço que eu perdi!
Saída:
fonte
Mathematica, 68 bytes
Função. Pega uma lista de números inteiros como entrada e retorna a lista classificada como saída. Apenas separa os dígitos de cada número com
IntegerDigits
, converte cada dígito em"zero"
,"one"
etc., comIntegerName
, converte a lista em uma sequência separada por espaços comStringRiffle
, precede um"m "
se o número for negativo e classifica com base nessa sequência. De fato, essa foi a abordagem mais curta que pude encontrar, pois o Mathematica usa apenas nativamente a classificação lexicográfica para listas do mesmo tamanho; assim, uma abordagem baseada em854-9176320
acaba consumindo mais bytes, pois as funções de string são muito caras.fonte
05AB1E ,
1514 bytes-1 byte graças a @Emigna .
Experimente online ou verifique todos os casos de teste .
Explicação:
Veja esta dica 05AB1E meu (seção Como comprimir grandes inteiros ) para entender por que
•ĆU‘•
é9176320
.fonte