Ordnen Sie eine Zahl in alphabetischer Reihenfolge


24

nErstellen Sie bei einer nicht negativen Ganzzahl ( ) eine Funktion, die nin alphabetischer Reihenfolge entsprechend der Literalschreibung jeder Ziffer in zurückgegeben wird n.

Beispiele:

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

Hinweis: Die Operationen in diesem Beispiel dienen nur der Veranschaulichung und müssen nicht in die Ausgabe einbezogen werden. Es muss nur die alphabetisch sortierte Nummer zurückgegeben werden.

Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.

Bearbeiten: Die Eingabe kann in einem beliebigen Format erfolgen, das am besten zu Ihrer Sprache passt, und die Ausgabe kann auf ähnliche Weise erstellt werden, indem Sie von der Funktion zurückkehren oder drucken. Die Eingabe ist immer eine natürliche Zahl (einschließlich 0) und enthält keine führenden 0en.

Relevanter OEIS-Eintrag (A057846) gefunden von @DomHastings


1
Kann ich die Zahl auch als Zeichenfolge verwenden und eine Zeichenfolge ausgeben?
ThreeFx

1
@ Nimi 00....
TuxCrafting

5
Vielleicht möchten Sie angeben, dass die Eingabe dezimal ist, oder Sie erhalten einige freche Antworten mit unary ...
Martin Ender

6
Das ist etwas verwirrend: Sie haben in den Kommentaren geschrieben, dass Sie einen numerischen Typ als Ein- und Ausgabe der Funktion erwarten, aber auch, dass es in Ordnung ist, stattdessen das Ergebnis auszudrucken. Heißt das, wenn die Ausgabe so ist 849, dass wir die Nummer, 849aber nicht die Zeichenfolge drucken dürfen "849"? IMO, dies ist nur ein umständliches E / A-Format (schlecht!), Zusätzlich zu einer perfekten Herausforderung.
Lynn

1
Führende Nullen signifikant oder nicht? zB was wird 001ausgegeben? Wenn sie signifikant sind und das Ergebnis nicht ist 1, erfordern die meisten Sprachen Zeichenfolgen als Eingabe, da es grob, unpraktisch und in der Regel so gut wie unmöglich ist, den Parser aufzufordern, führende Nullen in Basis-10-Literalzahlen beizubehalten.
Katze

Antworten:


12

Perl 6 ,  32  28 Bytes

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

Erläuterung:

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

Prüfung:

#! /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

Erklärt

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

Probieren Sie es online aus

Dank Adnan 1 Byte gespeichert


8

JavaScript (ES6), 54

Bearbeiten Sie dieselbe Zeichenanzahl, aber vermeiden Sie die globale Variablez

Eingabe / Ausgabe als Zeichenketten

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

Prüfung

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
Lieben Sie dies, mit den Eingabestellen als Indizes der Zeichenfolge z...
Dom Hastings

6

Haskell, 62 51 44 Bytes

Wie @nimi angedeutet hat, ist die Verwendung eines Listenverständnisses kürzer als das Verfassen von Funktionen:

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

Als referenz meine version:

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

Die pointfree Version ist etwas länger:

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

Ganz einfach: Filtern Sie die Ziffern in der richtigen Reihenfolge und verketten Sie das Ergebnis.


5

Pyth, 12 10 Bytes

ox`C" Ȁ\0

Ich bin mir nicht sicher, ob ich weiter Golf spielen kann. Die Eingabe muss in Anführungszeichen gesetzt werden.

2 Bytes gespart dank @isaacg!

Im pythonischen Pseudocode:

                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 es hier .


@busukxuan bekomme ich auch 14 Bytes : p.
Adnan

@Adnan dann auf Zahlen zurückgreifen. Es scheint, es gibt keine Möglichkeit, diese Zahlen zu komprimieren ...
Busukxuan

2
Speichern 2 Bytes durch den Austausch 549176320mitC" Ȁ\0
isaacg

@isaacg Danke! Ich habe ein paar Mal versucht, es auf Basis 256 zu konvertieren, aber das Ergebnis war falsch. Wie hast du es richtig gemacht?
Busukxuan

1
Sie müssen Null-Bytes durch Ersetzen durch entkommen \0. Das ist wahrscheinlich das Problem, auf das Sie gestoßen sind.
Isaacg

4

Perl, 37 Bytes

36 Byte Code + 1 Byte Befehlszeile (-F)

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

Anwendungsbeispiel:

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

3

MATL , 19 Bytes

Vt'8549176320'&m2$S

Probieren Sie es online!

Erläuterung

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

Jelly, 11 Bytes

“U1°ŀ”OṾf@€

Probieren Sie es hier aus.

Erläuterung

“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 gespart dank eines Vorschlags von LIAMnYP!

FromDigits@SortBy[IntegerDigits@#,IntegerName]&

IntegerDigitszerlegt die Nummer in Ziffern, die dann in Englisch nach ihren Namen sortiert werden. FromDigitssetzt die Ziffern zu einer Zahl zur Basis 10 zusammen.


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

8549176320


Mit "SortBy" haben Sie nicht das Problem, die Wörter wieder in Ziffern umzuwandeln. FromDigits@SortBy[IntegerName]@IntegerDigits@#&
LLlAMnYP

InterpreterIst auch schmerzhaft langsam, das ist also ein zusätzlicher Bonus.
LLlAMnYP

Fantastische Verbesserung.
DavidC

11 Bytes in Mtmca, wann immer das entsteht.
Michael Stern

3

C 142, 141, 117

Parameter übergeben long long *an f(); Die Funktion ändert den Parameter:

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 longist notwendig, da der letzte Testfall intbeim Sortieren übergelaufen ist .


2

Python 2 - 95 Bytes

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

Weiteres Golfen versuchen ... Ich denke, die Linie 2 ist unnötig und dies kann zu 1 Lambda werden.

BEARBEITEN: 49 char Version in Kommentaren, danke an xnor und vaultah für Hilfe.


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

4
@vaultah Schöne Lösung, du solltest es posten! Ich denke man kann das weglassen 8damit das find-1 gibt.
XNOR

1
Oh, das ist schlau, @xnor. Das kürzeste, was ich bekommen habe, war lambda n: "".join(sorted(n,key="549176320".find)), was dem, was Sie vorgeschlagen haben, Vaultah, wirklich ähnlich ist. Du solltest es posten!
Jeremy

1
@ Jeremy Sie sollten diese Version in Ihrem Beitrag bearbeiten.
DJMcMayhem

2
Zumindest das überflüssige Leerzeichen loswerden ... Einrücken kann mit einem einzelnen Leerzeichen erfolgen. Auch dies ist ungültig, da das OP angab, dass der Ausgang ein numerischer Typ sein muss.
Mego

2

- Oracle 11 (SQL): 164 Byte

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

Lange Form und Erklärung

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

Holen Sie sich die Eingabe als Parameter zum Skript:

  SELECT &1 FROM dual

"Erstelle" Zeilen mit connect by basierend auf der Länge der Eingabe:

  CONNECT BY LEVEL <= LENGTH(&1)

Ziehen Sie jede Ziffer für jede Position aus der Zeichenfolge heraus:

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

Konvertieren Sie die Ziffer in das julianische Datum und zurück zu Char, um die Rechtschreibung zu erhalten:

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

Auf Null prüfen - Sonderfall.

  DECODE(s,0,'zero'

Verwenden Sie die LISTAGG-Funktion, um die Zeilen wieder in eine einzelne Zeilenliste zu verknüpfen, die durch Kommas getrennt und alphabetisch sortiert ist

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

Es macht immer Spaß, SQL für solche Dinge zu optimieren ... :) testet wirklich mein Wissen über den Bugger ...


1

Ruby, 60 Bytes

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

1

Schläger, 142 130 Bytes

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

Davon Umwandlungen sind über fast die Hälfte der Länge ( 76 64 Bytes).


(+ 1 answer)für Schläger!
Katze

@cat Es ist nützlich für mich, weiterhin mit Racket zu üben, da es eine Möglichkeit ist, funktionale Programmierkenntnisse zu bewahren, während ich an diesen schrecklich prozeduralen Legacy-Java-Programmen (und etwas weniger Legacy-Python-Programmen) arbeite, die mir von meinen Mitarbeitern überlassen wurden. Ich könnte mich darüber austoben, dass Objekte ein Programm nicht unbedingt objektorientiert machen, aber anstatt das zu tun, werde ich meine Probleme einfach weiter in Racket spielen.
Steven H.

Hmm ... ich sympathisiere auf jeden Fall, und es ist möglich und macht Spaß, funktionierendes Python zu schreiben, aber Java ist einfach furchterregend. Vielleicht können Sie Ihre Vorgesetzten dazu bringen, Scala für die Implementierung und Java nur als Klebstoff zu verwenden. :)
Katze

Übrigens, wenn Sie Forth mögen und Ihre Augen ein wenig müde werden, wenn Sie Lisp von innen nach außen lesen, sollten Sie Factor ausprobieren , das ist Lisp und das CLOS, aber in einem Forth-y-Postfix und einer punktfreien Verkleidung.
Katze

1

TSQL, 260 Bytes

Verwendet umgekehrte Blasensortierung, um die Länge zu vermeiden und einige Bytes zu sparen

Golf gespielt:

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)

Indem Sie darauf bestehen, Integer-Typen als Ein- und Ausgabe zu verwenden, werden 37 Byte hinzugefügt


DECLARE @ varchar(99)=1010.o wird 101automatisch in einen String umgewandelt?
Katze

Ist auch stuffein objektiv schrecklicher Funktionsname. squashoder shoveoder packwäre besser: P
Katze

@cat ja, es wird automatisch in einen String umgewandelt, aber das wäre laut descriptino Betrug. Ich stimme zu, Zeug ist ein alberner Name
t-clausen.dk

1
Ich meine, wir könnten genauso gut jede Funktion aufrufen, denn stuffdas ist, was Funktionen tun: Sie machen Sachen. Dann kann Ihr Code aussehen wiestuff(stuff(4, 5, stuff), stuff(stuff()).(stuff())()); stuff(stuff)
Katze

1

ClojureScript, 45 Bytes

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

Verwendet eine beschissene String-> Int-Konvertierung von Javascript, so dass es kein gültiges Clojure ist.


1

Firebird, 317 Bytes

Golf gespielt:

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

In Firebird gibt es keine Split-Funktionalität. Stattdessen habe ich eine rekursive Abfrage erstellt, um das nächste Zeichen immer wieder abzurufen. Wählen Sie diese dann erneut aus, während Sie nach der richtigen Reihenfolge sortieren. Verketten Sie diese Ergebnisse schließlich wieder zu einer Liste. Überschreiben Sie das Standardkommatrennzeichen mit Leerzeichen. Ich könnte 11 Bytes einsparen, indem rdb$databaseich stattdessen eine neue Dummy-Tabelle erstelle, aber ich dachte, das verstößt möglicherweise gegen die Regeln.


1

ZX Spectum, Maschinencode, 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


Mit Gnome-sort kann es gekürzt und table um 1 Byte gekürzt werden. Neue Version folgt ...
Johan Koelman

Gnome-Sortierung hier ist länger, aber andere Optimierungen.
Johan Koelman

0

Faktor 128

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

Hurra für Builtins! : D


0

PHP, 126 Bytes

Soweit ich weiß, hat PHP keine eingebauten Funktionen, die wirklich helfen könnten (das Beste, was ich mit einem Usort (str_split ()) tun konnte, war 5 Bytes länger). Das Einzige, worüber ich mich in dieser Antwort freue, ist die Spiele, die mit $ i gespielt wurden, um ein paar Bytes bei der Iteration zu sparen.

<?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←⍕⍵]}

Erläuterung:

  • n←⍕⍵: Liefert die String-Darstellung von n und speichere sie inn
  • '8549176320'⍋: finden Sie eine Permutation ndieser Artn angegebenen Reihenfolge 8549176320.
  • n[...] : Nach ndieser Permutation neu ordnen
  • : bewerte das Ergebnis (um es wieder in eine Zahl umzuwandeln)

Da es sich bei E / A möglicherweise um Zeichenfolgen handelt, können Sie und entfernen . Konvertieren in tradfn durch Entfernen {und }und ersetzt für . Schließlich entfernen Sie 0als nicht aufgeführte Sortierungen am Ende:n['854917632'⍋n←⍞]
Adám

0

Clojure, 53 Bytes

Nun, die Idee des Listenverständnisses aus der Haskell-Lösung scheint die kürzeste zu sein:

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

Mein ursprünglicher Ansatz ist 1 Byte länger:

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

Sie können beide Funktionen online hier sehen: https://ideone.com/afac5n


0

Common Lisp, 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)))))))

Ganzzahl als Zeichenfolge konvertieren, Zeichen anhand des string<=Vergleichs sortieren und dabei eine benutzerdefinierte :keyFunktion verwenden, mit der ein bestimmtes Zeichen als englische Darstellung des von ihm repräsentierten numerischen Werts konvertiert wird. Normalerweise würde ich keine Schlüsselfunktion verwenden, die so viel bewirkt wie diese, aber sie kostet weniger Byte als dekorieren / sortieren / undekorieren.


0

Python 3, 234 Bytes

Dies ist eine direkte Übersetzung meiner Factor-Antwort , nur zum Spaß.

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

Die Semantik der Auswertung von "faulen" Karten- und Zip-Objekten ist das subtilste, schwer zu findende, Fehler auslösende Stück echter Pferdekot im Universum. Manchmal kann s = map(f, x)es nicht srichtig oder überhaupt nicht verwendet werden.



0

C 80 Bytes

Nimmt eine Zeichenfolge mit einer Zahl in der Basis 10 und druckt auf 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)]))

Nimmt einen String als Eingabe und gibt einen String aus.


0

Python 3, 74 Bytes

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

Sie könnten in der Lage sein, einige Bytes mit einem Lambda zu sparen
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;}

Probieren Sie es online!

Verwendet eine benutzerdefinierte Vergleichsfunktion, um die Sortierreihenfolge anzupassen.

Ausgabe

101         110
31948       84913
5544        5544
1234567890  8549176320
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.