Alfabetizar Inteiros
Para um determinado conjunto de números, coloque-os em ordem alfabética quando estiverem escritos (por exemplo, 1: um, 2: dois, 90: noventa, 19: dezenove). Seu código deve funcionar para o intervalo [-999999, 999999]
. A saída deve ter um delimitador entre os números. Um espaço funcionará, assim como um espaço e uma vírgula, conforme mostrado nos exemplos abaixo. A entrada pode ser uma matriz de números inteiros, uma sequência de números delimitados ou o que você achar melhor. Todos os números inteiros são considerados únicos.
Os números não são hifenizados para os propósitos deste desafio e os espaços são alfabetizados antes de qualquer outro caractere. Os números negativos são assumidos para ser expressa usando a palavra minus
. Por exemplo, four
precederia four thousand
e o número -40
seria classificado usando a sequência minus forty
. Suponha que todos os números sejam compostos apenas por palavras numéricas e sem conjunções (por exemplo, use em two thousand forty two
vez de two thousand and forty two
).
Casos de teste
Inteiros de um dígito:
Entrada:
1, 2, 3, 4, 5
Resultado:
5, 4, 1, 3, 2
Inteiros com vários dígitos:
Entrada:
-1002, 5, 435012, 4, 23, 81, 82
Resultado:
81, 82, 5, 4, 435012, -1002, 23
Espaços entre palavras, sem hífens, vírgulas ou "e":
Entrada:
6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804
Resultado:
6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204
Lembre-se, isso é código-golfe , portanto o código com o menor número de bytes vence. Não são permitidas brechas!
Respostas:
JavaScript (ES6),
189179186 bytesA idéia básica é converter cada número de entrada em uma sequência curta que esteja na posição lexográfica correta em comparação com todos os outros pares de sequência numérica. Aqui está o dicionário usado: (Não execute o snippet; é usado apenas para ocultar a lista longa.)
Mostrar snippet de código
Isso cria uma maneira muito concisa de mapear cada número para sua posição lexograficamente correta. É isso que a
q
função recursiva faz:O
0
início da string é para garantir que, por exemplo, 100 (one hundred
convertido emPK0
) seja classificado antes101
(one hundred one
convertido emPKP
). Isso cria um cenário ímpar, em que 0 (zero
) é classificado na frente da matriz, para contornar isso, na função de classificação, primeiro ordenamos os zeros à direita!x-!y||(...
.fonte
[1100, 1000]
. Eu esperaria que a saída fosse1000 (one thousand), 1100 (one thousand one hundred)
, mas a saída é da mesma ordem que a entrada.1000
está sendo analisado comoone thousand zero
; Eu vou consertar isso momentaneamente. Devemos apoiar0
por conta própria? É um caso único que adicionará mais ou menos 15 bytes ao meu código.Informar 7,
214201118 bytesO Inform 7 é uma linguagem absolutamente terrível para o golfe, então eu queria dar uma chance aqui.
O recuo deve usar
\t
caracteres tab ( ), mas o HTML não gosta deles. Por outro lado, o Inform não gosta de espaços para recuo, portanto, você precisará substituir os espaços por tabulações se copiar e colar o código daqui para testá-lo. Ou apenas copie e cole da fonte Markdown.Golfe:
A entrada deve ser uma tabela Inform, da seguinte forma (com
\t
entre as colunas):Resultado:
Esta função percorre a tabela uma vez, adicionando uma representação textual de cada número em uma nova coluna. Em seguida, classifica as linhas da tabela de acordo com a coluna de texto; no Inform, as strings são classificadas lexicograficamente. Por fim, imprime a coluna original no novo pedido. Convenientemente, o formato "bruto, mas às vezes útil" do Inform 7 para imprimir colunas da tabela é separado por vírgula, exatamente como solicitado.
Ungolfed, com clichê mostrando como chamar a função:
fonte
words
uma referência das versões detalhadas dos números, incorporadas ao Inform 7?say "[R entry] "
deve ser suficiente.Mathematica, 67 bytes
Função sem nome, tendo uma lista de números inteiros como argumento e retornando uma lista de números inteiros como seu valor.
#~IntegerName~"Words"
é um interno que altera um número inteiro para seu nome em inglês.IntegerName
às vezes tem vírgulas e hífens em sua saída, então aStringReplace
chamada se livra deles. (Infelizmente, o hífen é realmente o caractere de 3 bytes, 8208, em UTF-8.) Em seguida,SortBy
classifica a lista original em ordem alfabética de acordo com o valor do nome inteiro modificado.Uma boa coincidência:
IntegerName
usa emnegative
vez deminus
em sua saída - mas nenhuma palavra que apareça nos nomes de nenhum dos números permitidos está alfabeticamente entre essas duas palavras; portanto, nenhuma substituição é necessária!(Gorjeta para ngenisis por me lembrar
Sortby
.)fonte
IntegerName
. A documentação da Wolfram diz que é o caractere unicode 2010 .Bash + utilitários GNU + bsdgames, 52
E / S são linhas delimitadas por nova linha.
number
), seguida por uma:
forma numérica do número.sort
ed.sed
tira os caracteres iniciais até e inclusive o:
, deixando a forma numérica classificada conforme necessário.number
lida corretamente com "menos" e sua saída é próxima o suficiente do formato especificado para quesort
funcione conforme necessário. Ele produz "quarenta e quatro" em vez de "quarenta e quatro", mas isso não deve importar da perspectiva da classificação.O pacote bsdgames pode precisar de instalação:
Os utilitários
sed
esort
já estão quase certamente na sua distribuição.fonte
-t:
é inútil e você pode usarnumber<<<&
-t:
. No entanto, oe
recurso val do sed executa comandos usandosh
, portanto, recursos do bash como<<<
não funcionam.sh
ele tenta emular o Posix sh o máximo possível, o que significa que bashismos como<<<
estão desativados.sed
Oe
recurso val do GNU inicia comandos com/bin/sh -c ...
e não/bin/bash -c ...
. Você já tentou isso?<<<
, nem mesmo no modo posixPython + flexão,
979189 bytesUtilizou a
inflect
biblioteca para transformar awords
matriz de números inteiros em sua representação fonética / string. Armazenado em um dicionário de pares k / v em que as chaves eram a representação numérica e os valores eram a representação em cadeia. Retornou a lista de chaves conforme classificada por valores.EDIT: Salvo 5 e 3 bytes, graças a ETHproductions e Alex.S!
fonte
a={x:inflect.engine().number_to_words(x)for x in words}
.from inflect import*
e jogando forainflect.
na segunda linha.Mathematica, 30 bytes
A resposta abaixo gera uma função pura que pega uma lista de números inteiros como entrada e os classifica pelo nome alfabético. Exatamente o que o médico pediu;)
Aqui está a versão não destruída:
E aqui está um exemplo de uso:
O que também pode ser escrito como
Eles produzem saídas idênticas - no mathematica,
f[x]
é equivalente af@x
.Há uma resposta muito mais longa que outro usuário postou no Mathematica. Essa resposta tenta corrigir algumas pequenas diferenças entre a maneira como o mathematica alphebatiza os números para melhor se adaptar à maneira como os números declarados do OP devem ser alfabetizados, no entanto, as coisas que eles corrigem não afetam a ordem de classificação, e minha resposta é idêntica à deles:
fonte
TheirF
classifica corretamente 888 antes de 880.000, enquantoMyF
não. Provavelmente, o problema está na cópia e colagem do hífen estranho: sua versãoTheirF
provavelmente está substituindo hífens normais (dos quais não existem), enquanto a versão real substitui o hífen Unicode estranho de 3 bytes. (Ele ainda seria interessante ver se a remoção vírgulas é necessário.)Lisp comum, 113 bytes
Nenhuma biblioteca externa necessária.
Saída se
x
for'(1 2 3 4 5)
:fonte