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 845
diucapkan "eight four five"
, dan harus diurutkan sesuai.
Angka negatif
Angka negatif diucapkan dengan mengawali kata "minus"
. Jadi, -23
dilafalkan 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 , 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 .
Jawaban:
05AB1E (warisan) , 15 byte
Cobalah online!
Penjelasan
sumber
•ĆU‘•
.. Ia menambahkan baris baru selama pemetaan / penyortiran untuk alasan apa pun.Σ•ĆU‘•"54-ÿ"sSk
bisa menjadi alternatif 15 byte yang sedang saya kerjakan, jika bukan karena bug aneh itu .. Jika saya mengubah•ĆU‘•
ke literal9176320
itu berfungsi dengan baik ..…54-ì
bahkanΣ•RT‹•Á…54-ìsSk
selama 15•t∍ýJ•'-ìÁÁ
juga akan bekerjaHaskell , 57 byte
Cobalah online!
sumber
Jelly ,
1513 byteCobalah 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)Sebelumnya @ 15 byte :
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)sumber
Perl 6 , 30 byte
Cobalah online!
Port solusi Ruby GB.
Versi 35 byte asli
Cobalah online!
Konversikan setiap angka menjadi string, dapatkan nama Unicode dari setiap karakter, lepas kata pertama ("DIGIT" atau "HYPHEN"), lalu urutkan.
sumber
JavaScript (SpiderMonkey) , 69 byte
Cobalah online!
sumber
+''
, melihat saat Anda mengambil input sebagai array string.K (ngn / k) ,
2120 byteCobalah online!
{
}
berfungsi dengan argumenx
$
memformat sebagai string"
"?
"8"
<
menghitung permutasi sort-ascendingx@
argumen di indeks tersebutsumber
Python 3,
68 byte67 byte64 byteMenggunakan
sorted
fungsi 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
8
dari daftar sortir untuk mengambil keuntungan daristr.find
pengembalian-1
ketika parameter tidak ditemukan. Berkat maxb.Sunting2: Disimpan 3 byte dengan menggunakan sintaks membongkar berbintang dalam
list
literal bukanlist
konstruktorCobalah online!
sumber
lambda x:sorted(x,key=lambda y:map('54-9176320'.find,`y`))
Pyth,
1716 byteCobalah online sini , atau verifikasi semua uji sekaligus di sini .
Disimpan 1 byte berkat @ngn dan jawaban K mereka , dengan menghilangkan 8 dari awal string kamus
sumber
Japt, 19 byte
Cobalah
sumber
S.n(s)
:ñ_s ®n"54-9176320
(tampaknyaS.n(s)
persis sama dengans.b(S)
untukS
panjang 1, kecuali itu kembali0
di tempat-1
)Retina 0.8.2 , 36 byte
Cobalah online! Tautan termasuk test suite. Penjelasan:
Terjemahkan tanda minus dan digit ke posisi mereka dalam urutan pengucapan, gunakan
:
untuk posisi ke-10.Urutkan dalam urutan pengucapan.
Terjemahkan urutan kembali ke tanda minus dan angka asli.
sumber
Rubi , 50 byte
Cobalah online!
sumber
R , 58 byte
Cobalah online!
Input adalah daftar angka yang secara implisit dikonversi sebagai string menggunakan
chartr
.order
kemudian menggunakan urutan lexigographic untuk mengambil urutan daftar asli harus diurutkan.sumber
Java (JDK 10) , 123 byte
Cobalah online!
Ini adalah implementasi Java yang naif. Seharusnya lebih banyak golf.
Kredit
sumber
.chars
-IntStream dan.reduce
untuk 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 mengubah10+"85
ke20+"5
, karena.indexOf
digit untuk8
kemudian menghasilkan -1. Cobalah secara online 123 byteJavaScript (SpiderMonkey) ,
8773 byteCobalah online!
Terima kasih @Arnauld karena mengatakan bahwa jenis di SpiderMonkey stabil, sehingga
||-(F(q)>F(p))
bagian akhirnya dapat dibatalkan.sumber
Merah , 114 byte
Cobalah online!
Lebih mudah dibaca:
sumber
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!
Keluaran:
sumber
Mathematica, 68 byte
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., DenganIntegerName
, mengubah daftar menjadi string yang dipisahkan oleh spasiStringRiffle
, 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 pada854-9176320
akhirnya mengambil lebih banyak byte karena fungsi string sangat mahal.sumber
05AB1E ,
1514 byte-1 byte terima kasih kepada @Emigna .
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Lihat ini ujung 05AB1E saya (bagian Cara kompres bilangan bulat besar ) untuk memahami mengapa
•ĆU‘•
adalah9176320
.sumber