Reorganizar um número em ordem alfabética


24

Dado um número inteiro não negativo ( n), crie uma função que retorne nem ordem alfabética, de acordo com a ortografia literal de cada dígito em n.

Exemplos:

Input: 101
>> one, zero, one
>> one, one, zero
Output: 110

Input: 31948
>> three, one, nine, four, eight
>> eight, four, nine, one, three
Output: 84913

Input: 5544
>> five, five, four, four
>> five, five, four, four
Output: 5544

Input: 1234567890
Output: 8549176320

Nota: as operações no exemplo são apenas ilustrativas e não precisam ser incluídas na saída. Apenas o número classificado alfabeticamente precisa ser retornado.

Isso é código-golfe, então o código mais curto em bytes vence.

Editar: a entrada pode ser obtida em qualquer formato desejado que melhor se adapte ao seu idioma e a saída pode ser produzida da mesma forma retornando da função ou impressão. A entrada sempre será um número natural (incluindo 0) e não conterá os zero iniciais.

Entrada OEIS relevante (A057846) encontrada por @DomHastings


11
Também posso pegar o número como uma string e gerar uma string?
ThreeFx 07/07

11
@nimi 00....
TuxCrafting 07/07

5
Você pode querer especificar que a entrada é em decimal, ou você vai ter algumas respostas atrevidas usando unário ...
Martin Ender

6
Isso é um pouco confuso: você escreveu nos comentários que espera um tipo numérico como entrada e saída da função, mas também é aceitável imprimir o resultado. Então, se a saída for 849, isso significa que podemos imprimir o número, 849mas não a string "849"? Na IMO, esse é apenas um formato de E / S complicado (ruim!), Além de um excelente desafio.
Lynn

11
Zeros à esquerda significativos ou não? por exemplo, o que produz 001? Se eles são significativos e o resultado não é 1, a maioria dos idiomas exigirá cadeias de caracteres como entrada, pelo simples fato de ser bruto, impraticável e geralmente quase impossível pedir ao analisador para preservar os zeros à esquerda nos números literais da base 10.
cat

Respostas:


12

Perl 6 ,  32  28 bytes

{+[~] .comb.sort: *.Str.uniname}
{+[~] .comb.sort: *.uniname}

Explicação:

{
  # turn the following into a Numeric
  +

  # fold the following list using string concatenation operator
  [~]

    # split $_ into individual characters
    # (implicit method call on implicit parameter)
    .comb

    .sort:
    *.uniname # sort by the Unicode name of the character (digit)
}

Teste:

#! /usr/bin/env perl6
use v6.c;
use Test;

my @tests = (
  101 => 110,
  31948 => 84913,
  5544 => 5544,
  1234567890 => 8549176320,
);

# give the lambda a lexical name for clarity
my &int-sort = {+[~] .comb.sort: *.uniname}

plan 3 * @tests;

for @tests -> $_ ( :key($input), :value($expected) ) {
  put '';
  isa-ok $input, Int, "input ($input) is an Int";

  my $output = int-sort $input;

  is $output, $expected, .gist;
  isa-ok $output, Int, "output ($output) is an Int"
}
1..12

ok 1 - input (101) is an Int
ok 2 - 101 => 110
ok 3 - output (110) is an Int

ok 4 - input (31948) is an Int
ok 5 - 31948 => 84913
ok 6 - output (84913) is an Int

ok 7 - input (5544) is an Int
ok 8 - 5544 => 5544
ok 9 - output (5544) is an Int

ok 10 - input (1234567890) is an Int
ok 11 - 1234567890 => 8549176320
ok 12 - output (8549176320) is an Int

8

05AB1E, 12 11 10 bytes

•OWÿ¾•vy†J

Explicado

•OWÿ¾•        # push sortorder (236719458)
      v       # for each number in sortorder
       y†     # filter to the front
         J    # join
              # implicitly print

Experimente online

Guardado 1 byte graças a Adnan


8

JavaScript (ES6), 54

Edite a mesma contagem de caracteres, mas evitando a variável globalz

Entrada / saída como strings

n=>[...n].sort((a,b)=>n[a]-n[b],n='9487216503').join``

Teste

f=n=>[...n].sort((a,b)=>n[a]-n[b],n='9487216503').join``

function test() {
  O.textContent=f(I.value)
}

test()
<input id=I type=number value=31948 oninput='test()'>
<pre id=O></pre>


2
Love this, usando os dígitos de entrada como índices da corda z...
Dom Hastings

6

Haskell, 62 51 44 bytes

Como o @nimi sugeriu, o uso de uma compreensão de lista é mais curto do que as funções de composição:

f x=0+read[a|a<-"8549176320",b<-show x,a==b]

Para referência minha versão:

f n=read.(=<<)(\x->filter(==x)$show n)$"8549176320"

A versão sem ponto é um pouco mais longa:

f=flip(read.)"8549176320".(=<<).flip(filter.(==)).show

Direto: filtre os dígitos na ordem correta e concatene o resultado.


5

Pyth, 12 10 bytes

ox`C" Ȁ\0

Não tenho certeza se ele pode ser jogado mais. A entrada precisa estar entre aspas.

2 bytes salvos graças a @isaacg!

No pseudocódigo pitônico:

                Q = input()
o          Q    sort(Q, key = lambda N:
  `C" Ȁ\0        repr(base256toDec(" Ȁ\0"))
 x        N         .index(N)     # 8 being absent from the number yields -1
                )

Teste aqui .


@busukxuan Também recebo 14 bytes : p.
Adnan

@Adnan reverte para números então. Parece que não há uma maneira de compactar estes números ...
busukxuan

2
Salve 2 bytes substituindo 549176320porC" Ȁ\0
isaacg 8/16/16

@isaacg Thanks! Tentei convertê-lo para a base 256 algumas vezes, mas o resultado estava errado. Como você fez isso certo?
busukxuan

11
Você precisa escapar bytes nulos, substituindo-os por \0. Esse é provavelmente o problema que você estava enfrentando.
Isaacg

4

Perl, 37 bytes

Código de 36 bytes + linha de comando de 1 byte (-F)

say sort{8549176320=~/$b.*$a/||-1}@F

Exemplo de uso:

echo -n "04823" | perl -F -M5.010 entry.pl

3

MATL , 19 bytes

Vt'8549176320'&m2$S

Experimente online!

Explicação

V              % Implicitly input number. Convert to string (¹)
t              % Push copy of (¹)
'8549176320'   % Push this string (²), which defines order
&m             % Indices (³) of each element of (¹) in (²)
2$S            % Sort copy of (¹) according to (³). Implicitly display

3

Gelatina, 11 bytes

“U1°ŀ”OṾf@€

Experimente aqui.

Explicação

“U1°ŀ”O       Get the Unicode ordinals of “U1°ŀ”
                (all of which are coincidentally single bytes
                in the Jelly code page!)
              The result is [85, 49, 176, 320].
       Ṿ      Uneval. This gets us the string “85,49,176,320”.
        f@€   For each char in this string, extract all chars
                from the first command line argument that
                equal it.

3

Mathematica 35 78 47 bytes

31 bytes salvos graças a uma sugestão do LIAMnYP!

FromDigits@SortBy[IntegerDigits@#,IntegerName]&

IntegerDigitsdivide o número em dígitos que são classificados de acordo com seus nomes em inglês. FromDigitsreúne os dígitos em um número de base 10.


FromDigits@SortBy[IntegerDigits@#,IntegerName]&[1234567890]

8549176320


Ao usar o "SortBy", você não tem o problema de converter as palavras novamente em dígitos. FromDigits@SortBy[IntegerName]@IntegerDigits@#&
LLlAMnYP

Também Interpreteré dolorosamente lento, então esse é um bônus adicional.
LLlAMnYP

Melhoria fantástica.
21418

11 bytes em Mtmca, sempre que isso ocorrer.
Michael Stern

3

C, 142 141 117

Passe o parâmetro quanto long long *a f(); a função modifica o parâmetro:

f(long long*n){char*c="8549176320",g[10]={0};for(;*n;*n/=10)++g[*n%10];for(;*c;++c)for(;g[*c-48]--;*n=*n*10+*c-48);}

long longé necessário, pois o último caso de teste estourou e intquando classificado.


2

Python 2 - 95 bytes

def s(n):
    l=list("8549176320")
    return "".join(sorted(list(n),key=lambda x: l.index(x)))

Tentando jogar mais golfe ... Eu acho que a linha 2 é desnecessária e isso pode se tornar 1 lambda.

EDIT: versão 49 caracteres nos comentários, thx para xnor e vaultah para obter ajuda.


lambda n:''.join(sorted(`n`,key="8549176320".find))
vaultah

4
@vaultah Solução agradável, você deve publicá-la! Eu acho que você pode omitir o 8para que o finddá -1.
xnor 07/07

11
ooh isso é inteligente @xnor. O mais curto que consegui foi lambda n: "".join(sorted(n,key="549176320".find)), que é realmente semelhante ao que você sugeriu, vaultah. Você deve publicá-lo!
Jeremy

11
@ Jeremy Você deve editar essa versão em sua postagem.
DJMcMayhem

2
Pelo menos se livrar do espaço em branco supérfluo ... O recuo pode ser feito com um único espaço. Isso também é inválido, porque o OP afirmou que a saída deve ser do tipo numérico.
Mego 07/07

2

- Oracle 11 (SQL): 164 bytes

  SELECT LISTAGG(DECODE(s,0,'zero',TO_CHAR(TO_DATE(s,'j'),'jsp')),',')WITHIN GROUP(ORDER BY 1)FROM(SELECT SUBSTR(&1,level,1)s FROM dual CONNECT BY LEVEL<=LENGTH(&1));

Forma longa e explicação

  SELECT LISTAGG(DECODE(s,0,'zero',TO_CHAR(TO_DATE(s,'j'),'jsp')),',') WITHIN GROUP (ORDER BY 1)
  FROM ( SELECT SUBSTR(&1,level,1)s FROM dual
           CONNECT BY LEVEL <= LENGTH(&1)
        );

Obtenha a entrada como parâmetro para o script:

  SELECT &1 FROM dual

"crie" linhas usando connect by com base no comprimento da entrada:

  CONNECT BY LEVEL <= LENGTH(&1)

Retire cada dígito da sequência de caracteres para cada posição:

  SELECT SUBSTR(&1,level,1)s FROM dual

Converta o dígito em data juliana e volte para Char para obter a ortografia:

  TO_CHAR(TO_DATE(s,'j'),'jsp')

Verifique se há zero - caso especial.

  DECODE(s,0,'zero'

Use a função LISTAGG para concatenar linhas de volta em uma única lista de linhas, delimitada por vírgulas, ordenada alfabeticamente

  LISTAGG(DECODE(s,0,'zero',TO_CHAR(TO_DATE(s,'j'),'jsp')),',') WITHIN GROUP (ORDER BY 1)

Sempre divertido tentar ajustar o SQL para coisas assim ... :) realmente testa meu conhecimento sobre o bugger ...


1

Ruby, 60 bytes

->n{n.to_s.chars.sort_by{|c|'8549176320'.index c}.join.to_i}

1

Raquete, 142 130 bytes

(λ(n)(string->number(list->string(sort(string->list(~a n))char<? #:key(λ(m)(string-ref "9487216503"(-(char->integer m)48)))))))

De que as conversões são mais do que quase metade do comprimento ( 76 64 bytes).


(+ 1 answer)para raquete!
cat

@cat É útil para mim continuar praticando o Racket, pois é uma maneira de manter o conhecimento de programação funcional enquanto trabalho nesses programas legados horrivelmente procedimentais Java (e Python um pouco menos legado) deixados para mim por meus colegas de trabalho. Eu poderia reclamar sobre como ter objetos não necessariamente torna um programa orientado a objetos, mas, em vez de fazer isso, continuarei eliminando meus problemas no Racket.
Steven H.

Hmm ... eu definitivamente simpatizo, e é possível e divertido escrever Python funcional, mas o Java é simplesmente Fawful. Talvez você consiga que seus superiores deixem você usar o Scala para a implementação e o Java como cola. :)
cat

A propósito, se você gosta de Forth e seus olhos se cansam de ler Lisp de dentro para fora, deve conferir o Factor , que é Lisp e o CLOS, mas com um postfix de Forth-y e disfarce sem pontos.
cat

1

TSQL, 260 bytes

Usou classificação de bolha reversa para evitar referência ao comprimento e salvar alguns bytes

Golfe:

DECLARE @ varchar(99)=101

,@i INT=99,@j INT=98WHILE @i>1SELECT
@=IIF(CHARINDEX(x,'598327614')>CHARINDEX(y,'598327614'),STUFF(STUFF(@,@j,1,x),@i,1,y),@),@i-=IIF(@j=1,1,0),@j=IIF(@j=1,@i,@j-1)FROM(SELECT
SUBSTRING(@,@i,1)x,SUBSTRING(@,@j,1)y)z
PRINT @

Ungolfed:

DECLARE @s BIGINT=1234567890

DECLARE @ char(99)=@s,@i INT=99,@j INT=98
WHILE @i>1
  SELECT 
    @=IIF(CHARINDEX(x,'236719458')>CHARINDEX(y,'236719458'),
        STUFF(STUFF(@,@j,1,x),@i,1,y),@), 
    @i-=IIF(@j=1,1,0),
    @j=IIF(@j=1,@i,@j-1)
  FROM(SELECT SUBSTRING(@,@i,1)x,SUBSTRING(@,@j,1)y)z
PRINT CAST(@ as bigint)

Insistir em usar tipos inteiros como entrada e saída adicionou 37 bytes


DECLARE @ varchar(99)=1010.o é 101transformado em uma string automaticamente?
cat

Além disso, stuffé um nome de função objetivamente terrível. squashou shoveou packseria melhor: P
cat

@cat sim, ele é convertido automaticamente em uma string, mas isso seria trapaça de acordo com o descritivo. Eu concordo, o material é um nome bobo
t-clausen.dk 08/07/16

11
Quero dizer, é melhor chamarmos todas as funções stuffporque é isso que as funções fazem: elas fazem coisas. Em seguida, seu código pode ser parecido comstuff(stuff(4, 5, stuff), stuff(stuff()).(stuff())()); stuff(stuff)
cat

1

ClojureScript, 45 bytes

#(apply str(sort-by(vec"9487216503")(str %)))

Utiliza alguma conversão de string-> int de vazamento de Javascript, por isso não é um Clojure válido.


1

Firebird, 317 bytes

Golfe:

select list(s,'')from(with recursive q as(select 1 p,substring(:a from 1 for 1)s from rdb$database q union all select q.p+1 p,substring(:a from q.p+1 for 1)s from q where q.p<char_length(:a))select s from q order by iif(s=8,0,iif(s=5,1,iif(s=4,2,iif(s=9,3,iif(s=1,4,iif(s=7,5,iif(s=3,7,iif(s=2,8,iif(s=0,9,6))))))))))

Ungolfed:

select list(s, '')
from (
   with recursive q as (
      select 1 as p, substring(:a from 1 for 1) s
      from rdb$database q
      union all
      select q.p + 1 as p, substring(:a from q.p + 1 for 1) as s
      from q
      where q.p < char_length(:a)
   )
   select s
   from q
   order by iif(s = 8, 0,
               iif(s = 5, 1,
                  iif(s = 4, 2,
                     iif(s = 9, 3,
                        iif(s = 1, 4,
                           iif(s = 7, 5,
                              iif(s = 3, 7,
                                 iif(s = 2, 8,
                                    iif(s = 0, 9, 6)))))))))
)

Não há funcionalidade dividida no Firebird. Em vez disso, criei uma consulta recursiva para obter o próximo caractere repetidamente. Em seguida, selecione novamente aqueles ao classificar por nossa ordem correta. Por fim, concatene esses resultados novamente em uma lista. Substitua o delimitador de vírgula padrão por em branco. Eu poderia economizar 11 bytes criando uma nova tabela fictícia em vez derdb$database mas pensei que isso poderia ser contra as regras.


1

ZX Spectum, código da máquina, 53 48 47 45 44 bytes

    org 49200 ; #c030

; table converts ascii to alfabetical order
; start from BASIC with any number as : PRINT "1234567890" AND USR 49208

convtab defb 249 ; zero defb 244 ; one defb 248 ; two defb 247 ; three defb 2+205 ; four defb 1+205 ; five defb 246 ; six defb 245 ; seven ; defb 0 ; eight ; defb 3 ; nine ; last 2 conversions hidden in call-command

start Call #2bf1    ; fetch stackindex
    call #2ab2 ; store back
    ld h,#c0    ; set highbyte of table


Sort Push de
loop ld b,d
    ld c,e
    inc de
    ld a,(bc)   ; fetch number
    Ld l,a
    ld a,(de)
    cp 34       ; endmarker "
    Jr z,exit   ; end reached?
    push hl     ; save number
    ld l,a
    Ld a,(hl)   ; convert second number
    pop hl
    cp (hl)     ; compare numbers
    jr nc,loop  ; in order, no swap
swap ld a,(bc)  ; swap original numbers
    ld l,a
    ld a,(de)
    ld (bc),a
    ld a,l
    ld (de),a
Exit pop de
    Ret z
    jr sort     ; check number for order


Com o Gnome-sort, ele pode ser reduzido e a tabela pode ser 1 byte menor. Nova versão que está por vir ...
Johan Koelman

A classificação do Gnome aqui é mais longa, mas outras otimizações.
Johan Koelman

0

Fator, 128

[ 10 base> [ 48 - ] { } map-as dup [ number>text ] map zip [ second first ] sort-with [ first ] map [ 48 + ] ""map-as 10 >base ]

Viva as construções! : D


0

PHP, 126 bytes

Até onde eu sei, o php não tem nenhum built-in que realmente ajude com isso (o melhor que eu poderia fazer usando um usort (str_split ()) tinha 5 bytes a mais), então a única coisa que estou feliz nessa resposta é a seguinte: jogos jogados com $ i para salvar alguns bytes na iteração.

<?php for($i=-1;$i<9;)$a[++$i]=preg_replace("/[^$i]/","",$argv[1]);array_multisort([9,4,8,7,2,1,6,5,0,3],$a);echo implode($a);

0

APL, 23 bytes

{⍎n['8549176320'⍋n←⍕⍵]}

Explicação:

  • n←⍕⍵: obtenha a representação de string ne armazene-a emn
  • '8549176320'⍋: encontre uma permutação ndesse tipo, ndada a ordem 8549176320.
  • n[... ]: reordenar npor essa permutação
  • : avalie o resultado (para transformá-lo novamente em um número)

Como E / S podem ser cadeias, você pode remover e . Converter para tradfn removendo {e }e substituindo por . Por fim, remova 0como os tipos não listados no final:n['854917632'⍋n←⍞]
Adám 29/08/16

0

Clojure, 53 bytes

Bem, a ideia de compreensão de lista da solução Haskell parece ser a mais curta:

#(apply str(for[p"8549176320"b(str %):when(= p b)]p))

Minha abordagem original tem 1 byte a mais:

#(apply str(sort-by(zipmap"549176320"(range))(str %)))

Você pode ver as duas funções on-line aqui: https://ideone.com/afac5n


0

Lisp comum, 104

(lambda(n)(#1=parse-integer(sort(format()"~A"n)'string<= :key(lambda(u)(format()"~R"(#1#(string u)))))))

Ungolfed

(lambda (n)
  (parse-integer
   (sort (format nil "~A" n)
         #'string<=
         :key (lambda (u) (format nil "~R" (parse-integer (string u)))))))

Converta inteiro como string, classifique caracteres usando a string<=comparação enquanto usa uma :keyfunção personalizada que converte um determinado caractere como a representação em inglês do valor numérico que representa. Normalmente, eu não usaria uma função-chave que faça tanto quanto essa, mas custa menos em bytes do que decorar / classificar / não decorar.


0

Python 3, 234 bytes

Esta é uma tradução direta da minha resposta do fator , apenas por diversão.

def f(n):
 s=list(map(int,str(n)))
 return int("".join(list(map(str,list(map(lambda x:x[1],sorted(list(zip(list(map(lambda t:{0:"zero",1:"one",2:"two",3:"three",4:"four",5:"five",6:"six",7:"seven",8:"eight",9:"nine"}[t],s)),s)))))))))

A semântica da avaliação dos objetos "preguiçosos" do mapa e do zip é a peça mais sutil e difícil de encontrar nos excrementos de cavalos genuínos e difíceis de encontrar no universo. Às vezes, s = map(f, x)não permitirá sque seja usado corretamente ou de forma alguma.



0

C, 80 bytes

Pega uma sequência que contém um número na base 10 e imprime em stdio:

F(char*i){for(char*p,d,*o="8549176320";*o;++o)for(p=i;d=*p++;d-*o||putchar(d));}

0

Python 2.7.11, 67 bytes

lambda n:''.join(sorted(list(n),key=lambda s:"9487216503"[int(s)]))

Pega uma string como entrada e gera uma string.


0

Python 3, 74 bytes

lambda x:''.join(i[1]for i in sorted(['9487216503'[int(j)],j]for j in x))

Você pode ser capaz de salvar alguns bytes usando um lambda
Daniel

0

PHP , 107 bytes

function($a){usort($a,function($a,$b){return($z=array_flip([8,5,4,9,1,7,6,3,2,0]))[$a]-$z[$b];});return$a;}

Experimente online!

Usa uma função de comparação definida pelo usuário para ajustar a ordem de classificação.

Saída

101         110
31948       84913
5544        5544
1234567890  8549176320
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.