Zmień kolejność liczb w kolejności alfabetycznej

24

Biorąc pod uwagę nieujemną liczbę całkowitą ( n), utwórz funkcję zwracającą się nw kolejności alfabetycznej, zgodnie z literalną pisownią każdej cyfry w n.

Przykłady:

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

Uwaga: operacje w tym przykładzie mają jedynie charakter ilustracyjny i nie muszą być uwzględniane w danych wyjściowych. Należy zwrócić tylko posortowaną alfabetycznie liczbę.

To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach.

Edycja: dane wejściowe można zapisać w dowolnym formacie, który najlepiej odpowiada Twojemu językowi, a dane wyjściowe można wygenerować podobnie, wracając z funkcji lub drukowania. Dane wejściowe zawsze będą liczbami naturalnymi (w tym 0) i nie będą zawierać wiodących zer.

Odpowiedni wpis OEIS (A057846) znaleziony przez @DomHastings

atlasolog
źródło
1
Czy mogę również traktować liczbę jako ciąg i wyprowadzać ciąg?
ThreeFx,
1
@nimi 00....
TuxCrafting
5
Możesz sprecyzować, że dane wejściowe są dziesiętne, albo uzyskasz bezczelne odpowiedzi przy użyciu jednoargumentowej ...
Martin Ender
6
Jest to nieco mylące: w komentarzach napisałeś, że oczekujesz typu liczbowego jako wejścia i wyjścia funkcji, ale także, że zamiast tego można wydrukować wynik. Jeśli wynik jest taki 849, czy oznacza to , że możemy wydrukować numer, 849ale nie ciąg "849"? IMO to po prostu nieporęczny format I / O (zły!), Który stanowi doskonałe wyzwanie.
Lynn,
1
Zera wiodące znaczące czy nie? np. co daje 001wynik? Jeśli są znaczące, a wynik nie jest taki 1, większość języków będzie wymagała ciągów jako danych wejściowych, ponieważ jest to prosty, niepraktyczny i zwykle prawie nie można poprosić parsera o zachowanie wiodących zer w liczbach podstawowych 10.
kot

Odpowiedzi:

12

Perl 6 ,  32  28 bajtów

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

Wyjaśnienie:

{
  # 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)
}

Test:

#! /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
Brad Gilbert b2gills
źródło
8

05AB1E, 12 11 10 bajtów

•OWÿ¾•vy†J

Wyjaśnił

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

Wypróbuj online

Zaoszczędzono 1 bajt dzięki Adnanowi

Emigna
źródło
8

JavaScript (ES6), 54

Edytuj tę samą liczbę znaków, ale unikaj zmiennej globalnejz

Wejście / wyjście jako ciągi

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

Test

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>

edc65
źródło
2
Uwielbiam to, używając cyfr wejściowych jako wskaźników ciągu z...
Dom Hastings
6

Haskell, 62 51 44 bajtów

Jak sugeruje @nimi, użycie rozumienia listy jest krótsze niż komponowanie funkcji:

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

Dla odniesienia moja wersja:

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

Wersja pointfree jest nieco dłuższa:

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

Prosto: Filtruj cyfry we właściwej kolejności, a następnie połącz wynik.

ThreeFx
źródło
5

Pyth, 12 10 bajtów

ox`C" Ȁ\0

Nie jestem pewien, czy można dalej grać w golfa. Dane wejściowe należy ująć w cudzysłów.

2 bajty zapisane dzięki @isaacg!

W pythonowym pseudokodzie:

                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
                )

Sprawdź to tutaj .

busukxuan
źródło
@busukxuan dostaję również 14 bajtów : p.
Adnan,
@Adnan powróć do liczb. Wygląda na to, że nie ma sposobu na skompresowanie tych liczb ...
busukxuan,
2
Zapisz 2 bajty zamieniając 549176320zC" »Ä\0
isaacg
@isaacg Thanks! Kilka razy próbowałem przekonwertować go na bazę 256, ale wynik był zły. Jak to zrobiłeś dobrze?
busukxuan
1
Musisz uciec przed bajtami zerowymi, zastępując je \0. To prawdopodobnie problem, na który natrafiłeś.
isaacg
4

Perl, 37 bajtów

Kod 36 bajtów + 1 bajt wiersz poleceń (-F)

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

Przykład użycia:

echo -n "04823" | perl -F -M5.010 entry.pl
Jarmex
źródło
3

MATL , 19 bajtów

Vt'8549176320'&m2$S

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
3

Galaretka, 11 bajtów

“U1°ŀ”OṾf@€

Wypróbuj tutaj.

Wyjaśnienie

“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.
Lynn
źródło
3

Mathematica 35 78 47 bajtów

31 bajtów zapisanych dzięki sugestii LIAMnYP!

FromDigits@SortBy[IntegerDigits@#,IntegerName]&

IntegerDigitsdzieli liczbę na cyfry, które są następnie sortowane według ich nazw w języku angielskim. FromDigitsłączy cyfry w liczbę podstawową 10.


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

8549176320

DavidC
źródło
Używając „SortBy”, nie masz problemu z konwersją słów z powrotem na cyfry. FromDigits@SortBy[IntegerName]@IntegerDigits@#&
LLlAMnYP
InterpreterJest również boleśnie powolny, więc jest to dodatkowy bonus.
LLlAMnYP
Fantastyczna poprawa.
DavidC
11 bajtów w Mtmca, ilekroć to powstanie.
Michael Stern
3

C, 142 141 117

Przejść parametr w long long *celu f(); funkcja modyfikuje parametr:

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 longjest konieczne, ponieważ ostatni przypadek testowy przepełnił się intpodczas sortowania.

owacoder
źródło
2

Python 2 - 95 bajtów

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

Próba dalszego gry w golfa ... Myślę, że linia 2 jest niepotrzebna i może to być 1 lambda.

EDYCJA: 49 znaków w komentarzach, dzięki xnor i vaultah za pomoc.

Jeremy
źródło
lambda n:''.join(sorted(`n`,key="8549176320".find))
vaultah
4
@vaultah Ładne rozwiązanie, powinieneś je opublikować! Myślę, że można pominąć 8tak, aby finddaje -1.
xnor
1
ooo to sprytne @xnor. Najkrótszy, jaki udało mi się to zrobić lambda n: "".join(sorted(n,key="549176320".find)), to bardzo podobne do tego, co zasugerowałeś, vaultah. Powinieneś to opublikować!
Jeremy
1
@Jeremy Powinieneś edytować tę wersję w swoim poście.
DJMcMayhem
2
Przynajmniej pozbądź się zbędnych białych znaków ... Wcięcia można wykonać za pomocą pojedynczej spacji. Jest to również nieprawidłowe, ponieważ OP stwierdził, że dane wyjściowe muszą być typu liczbowego.
Mego
2

- Oracle 11 (SQL): 164 bajty

  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));

Długa forma i wyjaśnienie

  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)
        );

Uzyskaj dane wejściowe jako parametr do skryptu:

  SELECT &1 FROM dual

„twórz” wiersze za pomocą Connect przez na podstawie długości danych wejściowych:

  CONNECT BY LEVEL <= LENGTH(&1)

Oderwij każdą cyfrę z łańcucha dla każdej pozycji:

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

Konwertuj cyfrę na datę Juliana i wróć do Char, aby uzyskać pisownię:

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

Sprawdź zero - przypadek specjalny.

  DECODE(s,0,'zero'

Użyj funkcji LISTAGG, aby połączyć wiersze z powrotem w listę pojedynczych wierszy, rozdzielaną przecinkami, uporządkowaną alfabetycznie

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

Zawsze fajnie jest poprawiać SQL dla takich rzeczy ... :) naprawdę testuje moją wiedzę na temat buggera ...

Tak samo
źródło
1

Rubinowy, 60 bajtów

->n{n.to_s.chars.sort_by{|c|'8549176320'.index c}.join.to_i}
Wartość tuszu
źródło
1

Rakieta, 142 130 bajtów

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

Od konwersji, które są bardziej niż prawie połowę długości ( 76 64 bajtów).

Steven H.
źródło
(+ 1 answer)do rakiety!
kot
@cat Przydatne jest dla mnie, aby ćwiczyć Racket, ponieważ jest to sposób na utrzymanie funkcjonalnej wiedzy programistycznej podczas pracy nad tymi okropnie proceduralnymi starszymi programami Java (i nieco mniej starszymi programami Python) pozostawionymi mi przez moich współpracowników. Mógłbym narzekać na to, że posiadanie obiektów niekoniecznie sprawia, że ​​program jest zorientowany obiektowo, ale zamiast tego będę po prostu grał w golfa w swoich problemach w Racket.
Steven H.
Hmm ... Zdecydowanie sympatyzuję i pisanie funkcjonalnego Pythona jest fajne i przyjemne, ale Java jest po prostu Fawful. Być może możesz poprosić swoich przełożonych, aby pozwolili ci używać Scali do implementacji i Javy jako kleju. :)
kot
Nawiasem mówiąc, jeśli lubisz Fortha, a twoje oczy są trochę zmęczone czytaniem Lisp na wylot, powinieneś sprawdzić Factor , którym jest Lisp i CLOS, ale w post-Fix-y po fiksacji i bezcelowym przebraniu.
kot
1

TSQL, 260 bajtów

Użyto odwróconego sortowania bąbelkowego, aby uniknąć odniesienia do długości, aby zaoszczędzić niektóre bajty

Gra w golfa:

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 @

Nie golfowany:

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)

Nalegając na użycie typów całkowitych jako danych wejściowych i wyjściowych dodano 37 bajtów

t-clausen.dk
źródło
DECLARE @ varchar(99)=1010. o czy 101automatycznie zmienia się w ciąg?
kot
Ponadto, stuffjest obiektywnie okropna nazwa funkcji. squashlub shovelub packbyłoby lepiej: P
kot
@cat tak, jest automatycznie konwertowany na ciąg, ale byłoby to oszustwo zgodnie z descriptino. Zgadzam się, rzeczy to głupie imię
t-clausen.dk
1
Chodzi o to, że moglibyśmy równie dobrze wywołać każdą funkcję, stuffponieważ to właśnie funkcje: robią różne rzeczy. Wówczas twój kod może wyglądać następującostuff(stuff(4, 5, stuff), stuff(stuff()).(stuff())()); stuff(stuff)
cat
1

ClojureScript, 45 bajtów

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

Wykorzystuje konwersję screwy string-> int z wycieku JavaScript, więc nie jest to poprawne Clojure.

MattPutnam
źródło
1

Firebird, 317 bajtów

Gra w golfa:

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))))))))))

Nie golfowany:

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)))))))))
)

W Firebird nie ma podzielonej funkcjonalności. Zamiast tego utworzyłem zapytanie rekurencyjne, aby uzyskać kolejny znak w kółko. Następnie wybierz je ponownie, sortując według naszej właściwej kolejności. Na koniec połącz wyniki z powrotem na liście. Zastąp domyślny separator przecinkiem spacją. Mógłbym zaoszczędzić 11 bajtów, tworząc nowy fikcyjny stół zamiast, rdb$databaseale pomyślałem, że może to być niezgodne z regułami.

Paweł
źródło
1

ZX Spectum, kod maszynowy, 53 48 47 45 44 bajtów

    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

Johan Koelman
źródło
Dzięki sortowaniu według Gnome można go skrócić, a tabela może być o 1 bajt krótsza. Nowa wersja już
wkrótce
Sortowanie według Gnome jest tutaj dłuższe, ale inne optymalizacje.
Johan Koelman,
0

Współczynnik, 128

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

Brawo dla wbudowanych! :RE

kot
źródło
0

PHP, 126 bajtów

O ile wiem, php nie ma żadnych wbudowań, które naprawdę by w tym pomogły (najlepsze, co mogłem zrobić przy użyciu usortu (str_split ()) było o 5 bajtów dłużej), więc jedyną rzeczą, którą cieszę się w tej odpowiedzi, jest gry rozgrywane za pomocą $ i, aby zaoszczędzić kilka bajtów na iteracji.

<?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);
użytkownik55641
źródło
0

APL, 23 bajty

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

Wyjaśnienie:

  • n←⍕⍵: pobierz reprezentację ciągu n i zapisz jąn
  • '8549176320'⍋: znajdź permutację ntego rodzaju, nbiorąc pod uwagę kolejność8549176320 .
  • n[... ]: zmiana kolejności nwedług tej permutacji
  • : oceń wynik (aby zamienić go z powrotem w liczbę)
marinus
źródło
Ponieważ I / O mogą być łańcuchami, możesz je usunąć i . Konwersja do tradfn usuwając {a }i podstawiając do . Na koniec usuń 0jako niepubliczne sortowania na końcu:n['854917632'⍋n←⍞]
Adám
0

Clojure, 53 bajty

Cóż, pomysł na zrozumienie listy z rozwiązania Haskell wydaje się być najkrótszy:

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

Moje oryginalne podejście jest dłuższe o 1 bajt:

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

Możesz zobaczyć obie funkcje online tutaj: https://ideone.com/afac5n

Cliffroot
źródło
0

Common Lisp, 104

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

Bez golfa

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

Konwertuj liczbę całkowitą na ciąg, sortuj znaki przy użyciu string<=porównania, używając :keyfunkcji niestandardowej, która konwertuje dany znak jako angielską reprezentację reprezentowanej przez niego wartości liczbowej. Zwykle nie używałbym funkcji kluczowej, która działa tak samo jak ta, ale kosztuje mniej bajtów niż dekorowanie / sortowanie / undecorate.

rdzeń rdzeniowy
źródło
0

Python 3, 234 bajty

To jest bezpośrednie tłumaczenie mojej odpowiedzi Factor , dla zabawy.

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)))))))))

Semantyka oceny „leniwych” map i obiektów zip jest najbardziej subtelnym, trudnym do znalezienia, powodującym błędy, fragmentem prawdziwych odchodów koni we wszechświecie. Czasami s = map(f, x)nie pozwala sna prawidłowe użycie lub wcale.

kot
źródło
0

C, 80 bajtów

Pobiera ciąg zawierający liczbę w podstawie 10 i drukuje stdio:

F(char*i){for(char*p,d,*o="8549176320";*o;++o)for(p=i;d=*p++;d-*o||putchar(d));}
Stefano Sanfilippo
źródło
0

Python 2.7.11, 67 bajtów

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

Pobiera ciąg jako dane wejściowe i wyprowadza ciąg.

Daniel
źródło
0

Python 3, 74 bajty

lambda x:''.join(i[1]for i in sorted(['9487216503'[int(j)],j]for j in x))
8BitTRex
źródło
Możesz być w stanie zaoszczędzić trochę bajtów, używając lambda
Daniel
0

PHP , 107 bajtów

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;}

Wypróbuj online!

Korzysta ze zdefiniowanej przez użytkownika funkcji porównania, aby dostosować porządek sortowania.

Wydajność

101         110
31948       84913
5544        5544
1234567890  8549176320
640 KB
źródło