Sortieren Sie die ausgeschriebenen Seriennummern

17

Bei einer Liste von zwei oder mehr buchstabierten Seriennummern gleicher Länge größer als zwei, z

[[ "three" , "one"  , "four"  ],
 [ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "five" , "eight" ]]

sortiere die Liste nach den Zahlen, die die Wörter darstellen:

[[ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "one"  , "four"  ],
 [ "three" , "five" , "eight" ]]

Möglicherweise müssen die Zahlen in Groß- oder Kleinschreibung geschrieben sein, jedoch nicht gemischt.

Testfälle

[["three","one","four"],["one","five","nine"],["two","six","five"],["three","five","eight"]]
gibt
[["one","five","nine"],["two","six","five"],["three","one","four"],["three","five","eight"]]

[["two","seven"],["one","eight"],["two","eight"],["one","eight"],["two","eight"],["four","five"]]
gibt
[["one","eight"],["one","eight"],["two","seven"],["two","eight"],["two","eight"],["four","five"]]

[["one","four","one","four","two"],["one","three","five","six","two"],["three","seven","three","zero","nine"]]
gibt
[["one","three","five","six","two"],["one","four","one","four","two"],["three","seven","three","zero","nine"]]

[["zero","six","one"],["eight","zero","three"],["three","nine","eight"],["eight","seven","four"],["nine","eight","nine"],["four","eight","four"]]
gibt
[["zero","six","one"],["three","nine","eight"],["four","eight","four"],["eight","zero","three"],["eight","seven","four"],["nine","eight","nine"]]

Adam
quelle
Nicht sicher, ob ich das richtig verstanden habe ["three","one","four"] === 314?
Nit
@Nit Ja, das stimmt.
Adám
@Nit Durch die Zahlen, die sie buchstabieren. ZB [314,159,265,358][159,265,314,358].
Adám
Können wir eine gewisse willkürliche Großschreibung der Zahlen annehmen?
Dylnan
@ DylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
totalhuman

Antworten:

14

Schale , 9 8 Bytes

Ö†€¨tfṡn

Probieren Sie es online!

Algorithmus "inspiriert" durch die rekursive Stax-Antwort (ich habe gerade die Suchzeichenfolge ein wenig geändert), stimme ihm zu!

Der Trick besteht darin, jeden Buchstaben seiner Position in der Zeichenfolge zuzuordnen tfsen(am Ende dieses Programms komprimiert). Hüllenlisten basieren auf 1, und fehlende Elemente geben 0 zurück, sodass wir diese Zuordnung erhalten:

"one"        [0,5,4]
"two"        [1,0,0]
"three"      [1,0,0,4,4]
"four"       [2,0,0,0]
"five"       [2,0,0,4]
"six"        [3,0,0]
"seven"      [3,4,0,4,5]
"eight"      [4,0,0,0,1]
"nine"       [5,0,5,4]

Wie Sie sehen, sind die Listen perfekt sortiert.


Um klar zu sein, funktioniert der Listenvergleich in Husk (und in vielen anderen Sprachen) wie folgt:

  1. Wenn eine der beiden Listen leer ist, ist dies die kleinere.
  2. Wenn die ersten Elemente der beiden Listen unterschiedlich sind, ist das mit dem kleineren ersten Element die kleinere Liste.
  3. Anderenfalls verwerfen Sie das erste Element aus beiden Listen und kehren zu Punkt 1 zurück.
Löwe
quelle
Wenn ich mich nicht irre, kann das "w" auch fallengelassen werden, da es nur nützlich ist, "zwei" mit "drei" zu vergleichen, aber Sie haben bereits "h". Ich bin mir nicht sicher, ob das dir hilft. Ich habe nicht herausgefunden, wie ich diese Tatsache in ein Stax-Programm integrieren kann, das tatsächlich noch kleiner ist.
rekursive
... wenn es nur die Buchstaben wären tfrsen, könnte es sein, aber ich vermute, Wörter wie withund sendarin zu haben, hilft der Kompression.
Jonathan Allan
Vielen Dank, Sie haben mich dazu inspiriert, eine noch kürzere Saite zu finden: D
Leo
Es ist also so, als würde man die Kommas durch ein Komma nach dem ersten Komma ersetzen.
Strawberry
@Strawberry Nicht wirklich, [1,0,0]gilt als kleiner als [1,0,0,0](aber für dieses Programm würde es keinen Unterschied machen)
Leo
10

Stax , 24 22 17 16 14 Bytes

▄Ωφ▐╧Kìg▄↕ñ▼!█

Führen Sie es aus und debuggen Sie es

Dieses Programm verwendet Felder mit Kleinbuchstaben zur Eingabe. Die Ausgabe ist wie folgt durch Zeilenumbrüche getrennt.

one five nine
two six five
three one four
three five eight

Dieses Programm sortiert die Eingaben anhand der Reihenfolge, die bei einer bestimmten Umwandlung erhalten wurde. Jedes Zeichen in jedem Wort wird durch seinen Index in der Zeichenfolge ersetzt "wo thif sen". Die ursprünglichen Arrays werden nach dieser Reihenfolge sortiert. Anschließend werden die Ergebnisse nach dem Verbinden mit einem Leerzeichen gedruckt.

Die Leerzeichen dienen keinem Zweck, ermöglichen jedoch eine stärkere Komprimierung des String-Literal.

rekursiv
quelle
Welche Codierung verwendet Stax? Dies sind 32 Bytes in UTF-8.
OldBunny2800
5
Modifizierter CP437, wie der Hyperlink "Bytes" erläutert.
rekursive
Gibt es einen Standardalgorithmus / eine Standardmethode, um einen solchen String zu entwickeln? Hat das Konzept einen Namen?
Itai
@Itai: Es scheint so, aber ich weiß nicht, was es ist.
rekursive
6

Gelee , 12 Bytes

OḌ%⁽Т%147µÞ

Eine monadische Verbindung.

Probieren Sie es online! ... oder sehen Sie sich die Testsuite an

Wie?

Das Umwandeln der Ziffern in Ordnungszahlen und dann von der Basis 10 zu Modulos mit 4752 und 147 ergibt eine aufsteigende Reihenfolge:

 zero            , one         , two         , three               , four
[122,101,114,111],[111,110,101],[116,119,111],[116,104,114,101,101],[102,111,117,114]
 133351          , 12301       , 12901       , 1276511             , 114384
 295             , 2797        , 3397        , 2975                , 336
 1               , 4           , 16          , 35                  , 42

 five            , six         , seven               , eight               , nine
[102,105,118,101],[115,105,120],[115,101,118,101,110],[101,105,103,104,116],[110,105,110,101]
 113781          , 12670       , 1263920             , 1126456             , 121701
 4485            , 3166        , 4640                , 232                 , 2901
 75              , 79          , 83                  , 85                  , 108

Dies kann dann als Schlüsselfunktion zum Sortieren verwendet werden:

OḌ%⁽Т%147µÞ - Link: list of lists of lists of characters
          µÞ - sort (Þ) by the mondadic chain to the left (µ):
O            -   ordinals of the characters
 Ḍ           -   convert from base 10
   ⁽Т       -   literal 4752
  %          -   modulo
      %147   -   modulo by 147
Jonathan Allan
quelle
Das sind einige wunderbare Module, die Sie genau dort gefunden haben, ich nehme an, das war mühsam.
Erik der Outgolfer
Nicht allzu akribisch - ich habe mir jedoch zuerst die Binärdatei angesehen.
Jonathan Allan
Wie, du hast die Module brutal gezwungen, nein?
Erik der Outgolfer
Ja, aber es ging schnell.
Jonathan Allan
6

Python , 62 Bytes

lambda m:sorted(m,key=lambda r:[int(s,36)%6779%531for s in r])

Probieren Sie es online! ... oder sehen Sie sich die Testsuite an

Hinweis:

lambda m:sorted(m,key=lambda r:[map("trfsen".find,s)for s in r])

Was in Python 2 (aber nicht in 3) funktioniert, ist um zwei Bytes länger.

Jonathan Allan
quelle
1
Wie haben Sie die magischen Zahlen entdeckt?
mbomb007
1
Nur eine verschachtelte Schleife, die auf strikte Erhöhung der Ergebnisse prüft. Obwohl ich möglicherweise die Ziffernlänge des Inneren in Anbetracht des Äußeren eingeschränkt habe.
Jonathan Allan
5

APL (Dyalog Classic) , 12 Byte

'nesft'∘⍒⌷¨⊂

Probieren Sie es online!

So habe ich ein passendes linkes Argument für dyadisch gefunden (ich habe es zuerst versucht und Länge 6):

A←⊖a←↑'zero' 'one' 'two' 'three' 'four' 'five' 'six' 'seven' 'eight' 'nine'
{(aa[⍵⍒a;])∧Aa[⍵⍒A;]:⎕←⍵}¨,⊃∘.,/5⍴⊂∪∊a
ngn
quelle
3

Perl 6 , 37 Bytes

*.sort:{('digit 'X~$_)».parse-names}

Versuch es

Erweitert:

*\     # WhateverCode lambda (this is the parameter)
.sort:
{  # block with implicit parameter 「$_」
  (
    'digit ' X~ $_  # concatenate 'digit ' to each named digit
  )».parse-names    # call .parse-names on each
}

Der Codeblock nimmt einen Wert des Formulars ("three","one","four")und übersetzt ihn in ("3","1","4")einen Wert, der .sortleicht verwendet werden kann.

Brad Gilbert b2gills
quelle
3

APL (Dyalog) , 38 Bytes

{⍵[⍋(531∘⊥⍤1)(531|6779|369+⎕A⍳⊢)¨↑⍵]}

Probieren Sie es online!

Basierend auf Jonathan Allans großartiger Lösung .

Uriel
quelle
1
@ JonathanAllan Ich habe eine Gutschrift während der ersten Änderung bearbeitet. Ich habe keine Ahnung, warum sie unverändert war. Jetzt behoben
Uriel
1
31:, ⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨aber Sie können dies viel einfacher in weniger als der Hälfte Ihrer aktuellen Byteanzahl tun.
Adám
@Adám also, tolerierst du Input und Output in verschiedenen Formaten (gemischt vs ungemischt)?
ngn
Sicher. Aber die Lösung, die ich vorhabe, hat vollständig gemischte E / A.
Adám
3

Ruby, 48 Bytes

->x{x.sort_by{|y|y.map{|s|s.to_i(35)**2%47394}}}

Missbraucht die Tatsache, dass "zero".to_i(35)0 ist (da 'z' keine gültige Ziffer in Basis 35 ist), so ist es viel einfacher, eine Formel für die anderen neun Ziffern zu erzwingen.

Histokrat
quelle
2

Python 2 , 85 81 80 Bytes

Verwenden Sie einfach die ersten beiden Buchstaben jedes Wortes, um die Nummer zu bestimmen, und sortieren Sie dann jede Liste mit dieser Indexierungsfunktion als Schlüssel.

lambda _:sorted(_,key=lambda L:['zeontwthfofisiseeini'.find(s[:2])/2for s in L])

Probieren Sie es online!

4 Bytes gespart, dank Jonathan Allan

mbomb007
quelle
Ein for-Schleifenlisten-Verständnis in der Tastenfunktion ist 4 Bytes kürzer.
Jonathan Allan
1

05AB1E , 27 Bytes

Σ“¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“#skJ

Probieren Sie es online!


Σ                           # Sort input by...
 “¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“     # "zero one two three four five size seven eight nine"
                       #    # Split on spaces.
                        sk  # Find index of each input...
                          J # Join up.
Magische Kraken-Urne
quelle
25 Bytes
Kaldo
@ Kaldo ah ... Codierung der beiden Anfangsbuchstaben von jedem? Ich denke, das sollte seine eigene Antwort sein.
Magic Octopus Urn
1

Haskell , 133 122 109 107 106 Bytes

import Data.List
sortOn$abs.read.(>>=show.head.(`elemIndices`words"ze on tw th fo fi si se ei ni").take 2)

Ungolfed:

import Data.List

nums = ["ze","on","tw","th","fo","fi","si","se","ei","ni"]

lookup' :: Eq a => a -> [a] -> Int
lookup' v = head . elemIndices v

wordToInt :: String -> Int
wordToInt (x:y:_) = lookup' [x,y] nums

wordsToInt :: [String] -> Int
wordsToInt = read . concatMap (show . wordToInt)

sortN :: [[String]] -> [[String]]
sortN = sortOn wordsToInt
user9549915
quelle
0

Ruby , 64 Bytes

->a{a.sort_by{|b|b.map{|n|"zeontwthfofisiseeini".index n[0,2]}}}

Probieren Sie es online!

Ein Lambda, das ein 2D-Array von Zeichenfolgen akzeptiert und ein 2D-Array von Zeichenfolgen zurückgibt.

Huckepack von mbomb007's Python 2 Antwort für -26 Bytes von dem, was ich gerade posten wollte.

benj2240
quelle
0

Retina 0.8.2 , 38 Bytes

T`z\o\wit\hfsen`d
O`
T`d`z\o\wit\hfsen

Probieren Sie es online! Link enthält Testsuite. Ersetzt vorübergehend die Buchstaben zowithfsendurch ihre Position in der Zeichenfolge, sodass die Zahlen lexikalisch sortiert werden können.

Neil
quelle
0

Jelly , 30 28 27 Bytes

w@€“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»µÞ

Probieren Sie es online!

-1 Danke an Jonathan Allan.

Findet den Index jeder Ziffer in der Zeichenfolge 'onetwo ... nine' und sortiert diese mit Þ. Muss nicht 'zero'am Anfang eingeschlossen werden, da die Suche nach den ersten beiden Zeichen von 'zero'fehlschlägt und 0anstelle eines Index zurückgegeben wird, wodurch 'zero'lexikographisch "früh" wird.

dylnan
quelle
Eine Komprimierung von 'eins zwei ... neun' ist ein Byte weniger
Jonathan Allan
@ JonathanAllan Ah, danke. Ich hatte nicht daran gedacht, das zu überprüfen. Die Komprimierung 'zeontw...ni'dauerte länger.
Dylnan
... nicht mehr "... die ersten beiden Buchstaben".
Jonathan Allan
0

Python 3, 141 Bytes

print(sorted(eval(input()),key=lambda l:int(''.join([str("zero one two three four five six seven eight nine".split().index(i))for i in l]))))

Probieren Sie es online!

hakr14
quelle
131 Bytes
Caird Coinheringaahing
0

C (clang) , 229 Bytes

y,j,k,t[9];char *s="zeontwthfofisiseeini";r(char **x){for(j=y=k=0;k+1<strlen(*x);k+=j,y=y*10+(strstr(s,t)-s)/2)sscanf(*x+k,"%2[^,]%*[^,]%*[,]%n",t,&j);return y;}c(*x,*y){return r(x)-r(y);}f(*x[],l){qsort(&x[0],l,sizeof(x[0]),c);}

Probieren Sie es online!

Es gibt keine einfache Möglichkeit, ein Array von Strings an C-Funktionen zu senden, daher habe ich mir im Sinne von Code-Golf eine kleine Freiheit im Eingabeformat genommen.

f()Akzeptiert ein Array von Zeigern auf Zeichenfolgen, wobei jede Zeichenfolge eine Zahl ist, die durch durch Kommas getrennte, in Kleinbuchstaben geschriebene Ziffern dargestellt wird. Darüber hinaus benötigt es die Anzahl der Zeichenfolgen im Array im zweiten Parameter. Ich hoffe das ist akzeptabel.

f()ersetzt die vorhandenen Zeiger in sortierter Reihenfolge mit qsort().
r()Liest die eingegebene Nummer aus einer durch Kommas getrennten Zeichenfolge. Es werden nur die ersten beiden Zeichen verglichen, um die Nummer zu identifizieren.
c()ist Vergleichsfunktion

Geographisches Positionierungs System
quelle
1
207 Bytes
Ceilingcat
@ceilingcat Kannst du das bitte erklären strstr("i"-19,t)-"zeontwthfofisiseeini"? Ist es compilerspezifisch oder standard?
GPS
Das hängt davon ab, dass es keine anderen Muster gibt .rodata, die so aussehen, 0x69 0x00und dass der Compiler die Adresse von "i"am Ende von"zeo..."
ceilingcat
Dachte mir das. Gibt es eine Möglichkeit, sicherzustellen, dass der Compiler das tut? Ich weiß, dass Regeln hier dies erlauben würden, aber könnte ich mich wirklich darauf verlassen?
GPS
Mein Instinkt ist, dies in der "realen Welt" zu vermeiden, aber dies wird wahrscheinlich gut funktionieren, wenn Ihre Saitenfragmente ausreichend eindeutig sind. Es kann tatsächlich einen legitimen Anwendungsfall geben, der vielleicht mit Stapelkanarien zusammenhängt, aber ich kann auch nur halluzinieren.
Ceilingcat