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


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.

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.


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

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.


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

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.


3

APL (Dyalog) , 38 byte

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

Cobalah online!

Berdasarkan solusi hebat Jonathan Allan .


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.





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


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.


@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





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.


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


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

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



@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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.