Mengurutkan nomor seri yang dieja

17

Diberikan daftar dua atau lebih nomor seri yang dieja dengan panjang yang sama lebih besar dari dua, misalnya

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

urutkan daftar dengan angka-angka yang diwakili kata-kata:

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

Anda mungkin perlu angka dieja dalam huruf kecil atau huruf besar, tetapi tidak bercampur.

Uji kasus

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

[["two","seven"],["one","eight"],["two","eight"],["one","eight"],["two","eight"],["four","five"]]
memberi
[["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"]]
memberi
[["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"]]
memberi
[["zero","six","one"],["three","nine","eight"],["four","eight","four"],["eight","zero","three"],["eight","seven","four"],["nine","eight","nine"]]

Adm
sumber
Tidak yakin apakah saya mengerti ini dengan benar, bukan ["three","one","four"] === 314?
Nit
@Na Ya, itu benar.
Adám
@Nit Dengan angka-angka yang mereka sebutkan. Misalnya [314,159,265,358][159,265,314,358].
Adám
Bisakah kita mengasumsikan kapitalisasi angka-angka tertentu?
dylnan
@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
totallyhuman

Jawaban:

14

Sekam , 9 8 byte

Ö†€¨tfṡn

Cobalah online!

Algoritma "diilhami" oleh jawaban Stax rekursif (saya baru saja mengubah string pencarian sedikit), pergilah angkat dia!

Caranya adalah memetakan setiap huruf ke posisinya dalam string tfsen (dikompresi di akhir program ini). Daftar sekam berbasis 1, dan item yang hilang menghasilkan 0, jadi kami mendapatkan pemetaan ini:

"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]

Seperti yang Anda lihat, daftar tersebut tertata dengan sempurna.


Agar lebih jelas, inilah cara perbandingan daftar bekerja di Husk (dan dalam banyak bahasa lain):

  1. Jika salah satu dari dua daftar kosong, itu yang lebih kecil.
  2. Jika elemen pertama dari dua daftar berbeda, elemen dengan elemen pertama yang lebih kecil adalah daftar yang lebih kecil.
  3. Jika tidak, buang elemen pertama dari kedua daftar dan kembali ke poin 1.
Leo
sumber
Jika saya tidak salah, huruf "w" dapat dijatuhkan juga, karena hanya berguna membandingkan "dua" dengan "tiga", tetapi Anda sudah memiliki "h". Tidak yakin apakah itu membantu Anda. Saya belum menemukan cara untuk mengintegrasikan fakta ini ke dalam program stax yang sebenarnya lebih kecil.
rekursif
... jika itu hanya surat-surat itu bisa tfrsentapi saya kira memiliki kata-kata seperti withdan sendi sana membantu kompresi
Jonathan Allan
Terima kasih teman-teman, Anda mengilhami saya untuk menemukan string yang lebih pendek: D
Leo
Jadi, itu seperti mengganti koma dengan titik desimal setelah koma pertama?
Strawberry
@Strawberry Tidak juga, [1,0,0]dianggap lebih kecil dari [1,0,0,0](tetapi untuk program ini tidak akan ada bedanya)
Leo
10

Stax , 24 22 17 16 14 byte

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

Jalankan dan debug itu

Program ini mengambil array angka dieja huruf kecil untuk input. Output dipisahkan oleh baris seperti itu.

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

Program ini mengurutkan input menggunakan urutan yang diperoleh di bawah transformasi tertentu. Setiap karakter di setiap kata digantikan oleh indeksnya dalam string"wo thif sen" . Array asli diurutkan berdasarkan urutan ini. Kemudian hasilnya dicetak setelah bergabung dengan spasi.

Spasi tidak memiliki tujuan, tetapi sebenarnya memungkinkan kompresi yang lebih besar dalam string literal.

rekursif
sumber
Pengodean apa yang digunakan Stax? Ini adalah 32 byte di UTF-8.
OldBunny2800
5
CP437 yang dimodifikasi, seperti yang dijelaskan oleh hyperlink "byte".
rekursif
Apakah ada beberapa algoritma / metode standar untuk menghasilkan string seperti itu? Apakah konsep itu punya nama?
Itai
@ Itai: Sepertinya begitu, tapi saya tidak tahu apa itu.
rekursif
6

Jelly , 12 byte

OḌ%⁽Т%147µÞ

Tautan monadik.

Cobalah online! ... atau lihat test-suite

Bagaimana?

Mengkonversi digit ke ordinals dan kemudian dari base 10 kemudian mengambil modulos pada 4752 lalu 147 memberikan urutan naik:

 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

Ini kemudian dapat digunakan sebagai fungsi utama untuk mengurutkan:

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
sumber
Itu adalah beberapa modulos luar biasa yang Anda temukan di sana, saya berasumsi itu sungguh melelahkan.
Erik the Outgolfer
Tidak semua yang melelahkan - saya memang melihat biner dulu.
Jonathan Allan
Seperti, kamu dengan paksa memaksa modulos, bukan?
Erik the Outgolfer
Ya, tapi itu cepat.
Jonathan Allan
6

Python , 62 byte

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

Cobalah online! ... atau lihat test-suite

catatan:

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

yang bekerja di Python 2 (tetapi bukan 3) lebih panjang dua byte.

Jonathan Allan
sumber
1
Bagaimana Anda menemukan angka ajaib?
mbomb007
1
Hanya loop bersarang memeriksa peningkatan ketat atas hasil. Meskipun saya mungkin membatasi panjang digit bagian dalam mengingat bagian luar.
Jonathan Allan
5

APL (Dyalog Classic) , 12 byte

'nesft'∘⍒⌷¨⊂

Cobalah online!

Ini adalah bagaimana saya menemukan argumen kiri yang cocok untuk diad (saya mencoba dan panjang 6 pertama):

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

Perl 6 , 37 byte

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

Cobalah

Diperluas:

*\     # 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
}

Blok kode akan mengambil nilai formulir ("three","one","four")dan menerjemahkannya ke ("3","1","4")nilai yang .sortdapat digunakan dengan mudah.

Brad Gilbert b2gills
sumber
3

APL (Dyalog) , 38 byte

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

Cobalah online!

Berdasarkan solusi hebat Jonathan Allan .

Uriel
sumber
1
@ Jonathan Allan Saya mengedit kredit selama masa ganti awal .. Saya tidak tahu mengapa itu tidak berubah. diperbaiki sekarang
Uriel
1
31:, ⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨tetapi Anda dapat melakukan ini lebih sederhana dalam waktu kurang dari setengah dari jumlah byte Anda saat ini.
Adám
@ Adm jadi, Anda menoleransi input dan output dalam format yang berbeda (campuran vs tidak dicampur)?
ngn
@ ngn Tentu. Tapi solusi yang ada dalam pikiran saya telah sepenuhnya dicampur I / O.
Adám
3

Ruby, 48 byte

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

Menyalahgunakan fakta yaitu "zero".to_i(35)0 (karena 'z' bukan angka yang valid pada basis 35), jadi jauh lebih mudah untuk memaksa paksa rumus untuk sembilan digit lainnya.

histokrat
sumber
2

Ruby , 47 byte

->x{x.sort_by{|y|y.map{|s|s.to_i(32)%774%538}}}

Cobalah online!

Memanfaatkan fakta bahwa menggunakan basis kurang dari digit maksimum menghasilkan hasil nol (seperti yang ditunjukkan oleh histokrat dalam jawaban mereka )

Jonathan Allan
sumber
2

Python 2 , 85 81 80 byte

Cukup gunakan dua huruf pertama dari setiap kata untuk menentukan angka, kemudian mengurutkan setiap daftar menggunakan fungsi pengindeksan sebagai kunci.

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

Cobalah online!

Disimpan 4 byte, terima kasih kepada Jonathan Allan

mbomb007
sumber
Pemahaman daftar loop dalam fungsi tombol adalah 4 byte lebih pendek.
Jonathan Allan
1

05AB1E , 27 byte

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

Cobalah 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.
Guci Gurita Ajaib
sumber
25 byte
Kaldo
@Kaldo ah ... menyandikan masing-masing 2 huruf awal? Saya merasa seperti itu harus menjadi jawabannya sendiri.
Guci Gurita Ajaib
1

Haskell , 133 122 109 107 106 byte

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

Tidak Disatukan:

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
pengguna9549915
sumber
1

Java (JDK 10) , 132 byte

l->{l.sort((a,b)->s(a)-s(b));}
int s(String[]a){int v=0;for(var s:a)v=v*99+"zeontwthfofisiseini".indexOf(s.substring(0,2));return v;}

Cobalah online!

Olivier Grégoire
sumber
0

Ruby , 64 byte

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

Cobalah online!

Sebuah lambda menerima array string 2D dan mengembalikan array string 2D.

Piggybacking off dari mbomb007's Python 2 jawaban untuk -26 byte dari apa yang akan saya posting.

benj2240
sumber
0

Perl 5 , 103 byte

sub c{pop=~s%(..)\w+\s*%zeontwthfofisiseeini=~/$1/;$`=~y///c/2%ger}say s/\R//gr for sort{c($a)<=>c$b}<>

Cobalah online!

Xcali
sumber
0

Retina 0.8.2 , 38 byte

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

Cobalah online! Tautan termasuk test suite. Bekerja dengan mengganti sementara surat-surat zowithfsendengan posisi mereka di string itu, yang memungkinkan angka untuk diurutkan secara leksikal.

Neil
sumber
0

Jelly , 30 28 27 byte

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

Cobalah online!

-1 terima kasih kepada Jonathan Allan.

Menemukan indeks setiap digit dalam string 'onetwo ... sembilan' lalu mengurutkan menggunakan ini sebagai fungsi kunci Þ. Tidak perlu memasukkan 'zero'di awal karena pencarian untuk dua karakter pertama 'zero'akan gagal dan 0akan dikembalikan sebagai ganti indeks, membuat 'zero'leksikografis "awal".

dylnan
sumber
Menggunakan kompresi 'satu dua ... sembilan' kurang satu byte
Jonathan Allan
@ Jonathan Allan Ah, terima kasih. Saya tidak berpikir untuk memeriksanya. Mengompresi 'zeontw...ni'akhirnya menjadi lebih lama.
dylnan
... tidak lagi "... dua huruf pertama".
Jonathan Allan
0

Python 3, 141 byte

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

Cobalah online!

hakr14
sumber
131 byte
caird coinheringaahing
0

C (dentang) , 229 byte

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

Cobalah online!

Tidak ada cara mudah untuk mengirim berbagai array string ke fungsi C, jadi dalam semangat kode-golf, saya telah mengambil kebebasan kecil dalam format input.

f()menerima deretan pointer ke string, di mana setiap string adalah angka, diwakili oleh digit yang dipisahkan dengan angka koma dalam huruf kecil. Selain itu, perlu jumlah string dalam array di parameter kedua. Saya harap ini bisa diterima.

f()mengganti pointer di tempat dalam urutan yang diurutkan menggunakan qsort().
r()membaca nomor input dari string angka yang dipisah koma. Ini hanya membandingkan dua karakter pertama untuk mengidentifikasi angka.
c()adalah fungsi perbandingan

GPS
sumber
1
207 byte
ceilingcat
@ceilingcat Bisakah Anda jelaskan strstr("i"-19,t)-"zeontwthfofisiseeini"? Apakah ini khusus untuk kompiler atau standar?
GPS
Yang mengandalkan tidak ada pola lain .rodatayang terlihat seperti 0x69 0x00dan kompiler menempatkan alamat "i"di akhir"zeo..."
ceilingcat
pikir begitu .. apakah ada cara untuk memastikan compiler melakukannya? Saya tahu aturan di sini akan memungkinkan ini tetapi, bisakah saya bergantung pada ini dalam bentuk nyata?
GPS
Naluri saya adalah untuk menghindari ini di "dunia nyata" tetapi ini mungkin akan bekerja dengan baik jika fragmen string Anda cukup unik. Sebenarnya mungkin ada beberapa kasus penggunaan yang sah mungkin terkait dengan tumpukan kenari tapi saya juga mungkin berhalusinasi.
ceilingcat