PengucapanSort ™

24

Kita semua tahu tentang algoritma pengurutan mewah yang berbeda, tetapi tidak ada yang memberikan angka dengan cara yang mudah diucapkan. Untuk mengatasinya, saya usulkan menggunakan PengucapanSort ™, cara paling alami untuk mengurutkan daftar angka.

Pengucapan

Aturan resmi untuk mengucapkan angka (dalam tantangan ini) adalah bahwa angka diucapkan satu per satu, dan string yang dihasilkan diurutkan dalam urutan leksikografis. Sebagai contoh, ini berarti bahwa jumlahnya 845diucapkan "eight four five", dan harus diurutkan sesuai.

Angka negatif

Angka negatif diucapkan dengan mengawali kata "minus". Jadi, -23dilafalkan sebagai "minus two three". Perhatikan bahwa ini menyebabkan angka negatif berakhir di tengah-tengah output, tepat di antara angka-angka yang dimulai dengan 4(empat) dan 9(sembilan).

Sebagai panduan, urutan kata resmi untuk PengucapanSort ™ adalah:

  • delapan
  • lima
  • empat
  • minus
  • sembilan
  • satu
  • tujuh
  • enam
  • tiga
  • dua
  • nol

Itu adalah,

8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0

Memasukkan

Daftar bilangan bulat dalam rentang [999,999] , berisi paling banyak 100 elemen. Masukan sebagai daftar string tidak diizinkan. Jika bahasa Anda tidak mendukung input sebagai daftar, maka diperbolehkan untuk memberikan input sebagai bilangan bulat terpisah.

Input tidak akan berisi angka yang tidak valid, atau angka apa pun yang dimulai dengan 0 (kecuali angka 0 itu sendiri). Input umumnya tidak akan diurutkan, itu dapat diberikan dalam urutan apa pun.

Keluaran

Bilangan bulat yang sama, dalam urutan PengucapanSort ™. Perhatikan bahwa angka-angka hanya harus dikonversi ke pengucapannya untuk mendapatkan penyortiran, output tidak boleh mengandung string.

Contohnya

Sebagai contoh, langkah tengah (dibungkus dengan tanda kurung) hanya berfungsi sebagai panduan, dan bukan bagian dari output.

[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]

Ada juga skrip untuk memverifikasi hasil Anda .

maks
sumber
5
Mengapa "satu" (diucapkan "menang") tidak muncul setelah dua dan sebelum nol?
Ben Miller - Pasang kembali Monica
3
@BenMiller Saya tidak ingat apakah Anda yang berkomentar di kotak pasir, tetapi komentar itu memberi saya deja vu. Untuk menjawabnya di sini, saya merenungkannya, tetapi saya pergi dengan mengeja untuk menghindari diskusi pengejaan (mis. "Dua" vs "juga", "menang" atau "
lemah
17
Jadi itu sebenarnya lebih "pengejaan" daripada "pengejaan" :-)
Paŭlo Ebermann
3
gelandangan. Saya berharap mereka akan diurutkan berdasarkan seberapa sulit mereka untuk mengucapkan ...
NH.
2
Tantangan ini benar-benar harus diganti namanya, karena penyortiran di sini hampir tidak ada hubungannya dengan pengucapan. Akan jauh lebih kompleks jika itu berbasis pengucapan (misalnya, empat mungkin datang sebelum lima jika Anda mengurutkan monophthong ⟨ɔː⟩ sebelum diphthong ⟨a⟨, tetapi lima sebelum empat jika Anda mengurutkan turunan ⟨a⟩ sebelum o -diberikan ⟨ɔ⟩ - setahu saya, tidak ada urutan penyortiran yang ditetapkan untuk pengucapan, baik dalam IPA maupun skema lainnya).
Janus Bahs Jacquet

Jawaban:

8

05AB1E (warisan) , 15 byte

Σε•Koéa₃•'-3ǝsk

Cobalah online!

Penjelasan

Σ                 # sort by
 ε                # apply to each
             sk   # index of the element in
  •Koéa₃•         # "85409176320"
         '-3ǝ     # with "-" inserted at index 3
Emigna
sumber
Tampaknya ada bug dalam bilangan bulat terkompresi •ĆU‘•.. Ia menambahkan baris baru selama pemetaan / penyortiran untuk alasan apa pun. Σ•ĆU‘•"54-ÿ"sSkbisa menjadi alternatif 15 byte yang sedang saya kerjakan, jika bukan karena bug aneh itu .. Jika saya mengubah •ĆU‘•ke literal 9176320 itu berfungsi dengan baik ..
Kevin Cruijssen
1
@KevinCruijssen: Itu aneh. Milik Anda akan berusia 14 tahun …54-ìbahkan
Emigna
@KevinCruijssen: Anda bisa melakukannya Σ•RT‹•Á…54-ìsSkselama 15
Emigna
•t∍ýJ•'-ìÁÁjuga akan bekerja
Emigna
8

Haskell , 57 byte

import Data.List
sortOn$map(`elemIndex`"54-9176320").show

Cobalah online!

Vincent
sumber
1
Ini sangat bersih dan mudah dibaca! Pasti yang menang dalam hal kemudahan memahami.
Stephen Belden
8

Jelly ,  15  13 byte

ṾV€ị“Þ⁽3Z6»µÞ

Cobalah online!

Tautan monadik yang menerima daftar bilangan bulat yang menghasilkan daftar bilangan bulat.

Bagaimana?

Urutkan oleh nilai-nilai ordinal digit bilangan bulat (di mana -"digit" -1) dikonversi menjadi string menggunakan karakter pada indeks modular & berbasis-1 dalam string ajaib "murgeon lix".

Pengurutan ini secara alfabet efektif di mana spasi dianggap kurang dari huruf apa pun.

String sihir "murgeon lix" ditemukan dengan memeriksa kamus Jelly yang digunakan dalam kompresi. Tidak ada kata-kata dari 11 huruf yang memenuhi persyaratan (dan tidak ada yang lebih dari itu pada saat duplikasi). karena spasi memilah sebelum huruf, pilihan berikutnya yang paling jelas adalah kata dengan panjang tujuh diikuti oleh spasi diikuti oleh kata dengan panjang tiga. "murgeon" dan "lix" adalah satu-satunya kombinasi yang memuaskan, walaupun tanpa spasi yang lain dimungkinkan (mis. “£Py:ƥ»adalah "murgeonalix" yang bekerja untuk byte-count yang sama)

ṾV€ị“Þ⁽3Z6»µÞ - Link: list of integers
            Þ - sort by:
           µ  -   the monadic link: -- i.e. do this for each integer, then sort by that
Ṿ             -     unevaluate  (e.g. -803 -> ['-','8','0','3'])
 V€           -     evaluate each as Jelly code  (e.g. ['-','8','0','3'] -> [-1,8,0,3])
    “Þ⁽3Z6»   -     "murgeon lix" (compression of words in Jelly's dictionary plus a space)
   ị          -     index into (1-indexed & modular) (e.g. [-1,8,0,3] -> "i xr")

Sebelumnya @ 15 byte :

ṾV€ị“¡Zo⁶’Œ?¤µÞ

Di sini “¡Zo⁶’Œ?¤ditemukan permutasi bilangan asli yang akan berada pada indeks 21.340.635 ketika semua permutasi bilangan diurutkan secara leksikografis - yaitu [6,10,9,3,2,8,7,1,5,4,11]. ( “¡Zo⁶’adalah representasi dasar 250 dari 21340635, sambil Œ?melakukan perhitungan dan ¤mengelompokkan instruksi ini bersama-sama)

Jonathan Allan
sumber
Bahkan dengan penjelasannya, saya tidak merasa sangat pintar. Solusi yang luar biasa!
maks.
Versi yang lebih pendek mungkin juga lebih mudah dimengerti!
Jonathan Allan
7

Perl 6 , 30 byte

*.sort:{TR/0..9-/a5982176043/}

Cobalah online!

Port solusi Ruby GB.

Versi 35 byte asli

*.sort: (~*).uninames».&{S/\w*.//}

Cobalah online!

Konversikan setiap angka menjadi string, dapatkan nama Unicode dari setiap karakter, lepas kata pertama ("DIGIT" atau "HYPHEN"), lalu urutkan.

nwellnhof
sumber
6

JavaScript (SpiderMonkey) , 69 byte

a=>a.sort((a,b)=>(g=n=>[...n+''].map(c=>':598217604'[c]||3))(a)>g(b))

Cobalah online!

Arnauld
sumber
Sepertinya Anda dapat menghapus +'', melihat saat Anda mengambil input sebagai array string.
Shaggy
@ Shaggy Saya tidak akan mengambil string lagi, karena saya tidak yakin apakah itu diizinkan di sini.
Arnauld
Ah ... Kamu benar. Itu akan menambahkan beberapa byte ke solusi saya.
Shaggy
6

K (ngn / k) , 21 20 byte

{x@<"54-9176320"?$x}

Cobalah online!

{ } berfungsi dengan argumen x

$ memformat sebagai string

""?263"8"

< menghitung permutasi sort-ascending

x@ argumen di indeks tersebut

ngn
sumber
6

Python 3, 68 byte 67 byte 64 byte

lambda x:sorted(x,key=lambda y:[*map('54-9176320'.find,str(y))])

Menggunakan sortedfungsi bawaan dengan lambda anonim untuk kunci. Kode-keras urutan sortir dan bandingkan setiap digit pada setiap nilai dalam daftar input dengan posisinya dalam daftar sortir urutan.

Sunting: Disimpan 1 byte dengan menghapus 8dari daftar sortir untuk mengambil keuntungan dari str.findpengembalian -1ketika parameter tidak ditemukan. Berkat maxb.

Sunting2: Disimpan 3 byte dengan menggunakan sintaks membongkar berbintang dalam listliteral bukan listkonstruktor

Cobalah online!

mypetlion
sumber
1
Bisakah Anda menghapus 8 pertama dalam string? Sebagai Python mengembalikan -1 jika substring tidak ditemukan.
Maks
@ Maxax Tangkapan yang bagus. Diedit.
mypetlion
2
Port Python 2 adalah 58:lambda x:sorted(x,key=lambda y:map('54-9176320'.find,`y`))
Jonathan Allan
5

Pyth, 17 16 byte

oxL"54-9176320"`

Cobalah online sini , atau verifikasi semua uji sekaligus di sini .

oxL"54-9176320"`NQ   Implicit: Q=eval(input())
                     Trailing N, Q inferred
o                Q   Order the elements of Q, as N, using...
               `N      Convert N to string
 xL                    Get the index of each character of that string...
   "54-9176320"        ... in the lookup ordering
                       (if character missing, returns -1, so 8 is still sorted before 5)

Disimpan 1 byte berkat @ngn dan jawaban K mereka , dengan menghilangkan 8 dari awal string kamus

Sok
sumber
4

Japt, 19 byte

ñ_s ®n"54-9176320

Cobalah

  • Hemat 2 byte berkat produk ETH .
Shaggy
sumber
Solusi bagus! Sayangnya, input sebagai daftar string tidak diizinkan.
Maks.
Anda dapat menghemat beberapa dengan menyalahgunakan S.n(s): ñ_s ®n"54-9176320(tampaknyaS.n(s) persis sama dengan s.b(S)untuk Spanjang 1, kecuali itu kembali 0di tempat-1 )
ETHproductions
Trik yang bagus, @ETHproductions, terima kasih :) Saya harus mengingatnya untuk masa depan.
Shaggy
3

Retina 0.8.2 , 36 byte

T`-d`3:598217604
O`
T`3:598217604`-d

Cobalah online! Tautan termasuk test suite. Penjelasan:

T`-d`3:598217604

Terjemahkan tanda minus dan digit ke posisi mereka dalam urutan pengucapan, gunakan :untuk posisi ke-10.

O`

Urutkan dalam urutan pengucapan.

T`3:598217604`-d

Terjemahkan urutan kembali ke tanda minus dan angka asli.

Neil
sumber
3

R , 58 byte

function(x)x[order(mapply(chartr,"-0-9","dkfjicbhgae",x))]

Cobalah online!

Input adalah daftar angka yang secara implisit dikonversi sebagai string menggunakan chartr. orderkemudian menggunakan urutan lexigographic untuk mengambil urutan daftar asli harus diurutkan.

JayCe
sumber
3

Java (JDK 10) , 123 byte

l->l.sort(java.util.Comparator.comparing(n->{var r="";for(var c:(""+n).split(""))r+=11+"54-9176320".indexOf(c);return r;}))

Cobalah online!

Ini adalah implementasi Java yang naif. Seharusnya lebih banyak golf.

Kredit

Olivier Grégoire
sumber
1
Mengubah .chars-IntStream dan .reduceuntuk loop biasa menyimpan 2 bytes: n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}. Selain itu, satu byte lagi dapat disimpan dengan mengubah 10+"85ke 20+"5, karena .indexOfdigit untuk 8kemudian menghasilkan -1. Cobalah secara online 123 byte
Kevin Cruijssen
2

JavaScript (SpiderMonkey) , 87 73 byte

a=>a.sort((p,q,F=b=>[...""+b].map(x=>"54-9176320".search(x)))=>F(p)>F(q))

Cobalah online!

Terima kasih @Arnauld karena mengatakan bahwa jenis di SpiderMonkey stabil, sehingga ||-(F(q)>F(p))bagian akhirnya dapat dibatalkan.

Shieru Asakoto
sumber
2

Merah , 114 byte

func[n][g: func[a][collect[foreach c form a[keep index? find"854-9176320"c]]]sort/compare n func[x y][(g x)< g y]]

Cobalah online!

Lebih mudah dibaca:

f: func [ n ] [
    g: func [ a ] [
        collect [ 
            foreach c form a [ 
                keep index? find "854-9176320" c
            ]
        ]
    ]
    sort/compare n func [ x y ] [ (g x) < g y ]
]
Galen Ivanov
sumber
2

C ++, 353 byte

Ini semacam entri komedi, tapi saya membuang-buang waktu dan menulisnya, jadi saya tidak bisa mempostingnya ... Nikmati tertawa kecil, dan beri tahu saya jika ada penghemat ruang yang saya lewatkan!

#include<algorithm>
#include<iostream>
#include<iterator>
#include<numeric>
#include<string>
using namespace std;auto f(int i){auto s=to_string(i);for(auto&c:s)c='A'+"854-9176320"s.find(c);return s;}int main(){int a[100];auto b=begin(a);auto e=end(a);iota(b,e,-50);sort(b,e,[](int l,int r){return f(l)<f(r);});copy(b,e,ostream_iterator<int>(cout," "));}

Keluaran:

8 5 4 48 45 44 49 41 47 46 43 42 40 -8 -5 -50 -4 -48 -45 -44 -49 -47 -47 -46 -43 -42 -40 -9 -1 -18 -15 - 14 -19 -11 -17 -16 -13 -12 -10 -7 -6 -3 -38 -35 -34 -39 -31 -37 -36 -32 -30 -2 -30 -2 -28 -25 -24 - 29 -21 -27 -26 -23 -22 -20 9 1 18 15 14 19 11 17 16 13 12 10 7 6 3 38 35 34 39 31 37 36 33 32 30 2 28 25 24 29 21 27 26 23 22 20 0 0

underscore_d
sumber
Saya melihat Anda juga hidup dengan moto "jika saya tidak menekan enter ada lebih sedikit baris untuk debug"
maxb
1
Hei, saya tidak bisa membeli ruang kosong sembrono dalam bahasa ini! Sangat lucu harus melakukan ini, mengingat sebagai sisa waktu, beberapa hal membuat saya marah seperti membuka kode orang lain, yang tampaknya berpikir menulis dinding monolitik yang mengerikan akan membuat mereka tampak lebih pintar, dan / atau secara aktif berlabuh membayar untuk setiap baris baru yang mereka ketikkan.
underscore_d
1
Halo! Diperas solusi Anda ke 195 karakter
Max Yekhlakov
@ Maxyekhlakov Keren, terima kasih telah merenungkannya! Saya sadar setelah membaca sedikit lebih banyak; sepertinya saya tidak perlu menyediakan program kompilasi yang lengkap, tetapi hanya fungsi yang akan memproses input dan output yang ditentukan. Doh!
underscore_d
2

Mathematica, 68 byte

SortBy[If[# < 0,"m ",""]<>StringRiffle@IntegerName@IntegerDigits@#&]

Fungsi. Mengambil daftar bilangan bulat sebagai input dan mengembalikan daftar yang diurutkan sebagai output. Hanya memisahkan digit dari setiap angka dengan IntegerDigits, mengonversi setiap digit ke"zero" ,, "one"dll., Dengan IntegerName, mengubah daftar menjadi string yang dipisahkan oleh spasi StringRiffle, menambahkan sebuah "m "jika angka negatif, dan mengurutkan berdasarkan string ini. Memang, ini adalah pendekatan terpendek yang dapat saya temukan, karena Mathematica hanya menggunakan penyortiran leksikografis untuk daftar dengan panjang yang sama; dengan demikian, sebuah pendekatan berdasarkan pada 854-9176320akhirnya mengambil lebih banyak byte karena fungsi string sangat mahal.

LegionMammal978
sumber
Selalu percayai Mathematica untuk memiliki kombinasi bawaan. Solusi pintar!
Maks.
1

05AB1E , 15 14 byte

Σ•ĆU‘•…54-ìsSk

-1 byte terima kasih kepada @Emigna .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Σ                 # Sort by:
 •ĆU‘•            #  Push the compressed integer 9176320
      54-        #  Push the string "54-"
          ì       #  Prepend this string before the integer: "54-9176320"
           s      #  Swap so the current number to sort is at the top of the stack
            S     #  Convert it to a list of characters
             k    #  Check for each its index in the string (resulting in -1 for '8')

Lihat ini ujung 05AB1E saya (bagian Cara kompres bilangan bulat besar ) untuk memahami mengapa •ĆU‘•adalah 9176320.

Kevin Cruijssen
sumber