Abjad Bilangan Bulat
Untuk satu set angka, letakkan dalam urutan abjad ketika angka-angka itu dieja (yaitu 1: satu, 2: dua, 90: sembilan puluh, 19: sembilan belas). Kode Anda harus bekerja untuk rentang tersebut [-999999, 999999]
. Output harus memiliki pembatas antar angka. Spasi akan berfungsi, seperti spasi dan koma seperti yang ditunjukkan pada contoh di bawah ini. Input dapat berupa array bilangan bulat, serangkaian angka terbatas, atau sesuai keinginan Anda. Semua bilangan bulat dianggap unik.
Angka tidak ditulis dgn tanda penghubung untuk tujuan tantangan ini dan spasi diurutkan berdasarkan karakter sebelum karakter lain. Angka negatif diasumsikan diekspresikan dengan menggunakan kata minus
. Misalnya, four
akan mendahului four thousand
dan nomor -40
akan diurutkan menggunakan string minus forty
. Asumsikan semua angka hanya akan terdiri dari kata-kata angka dan tidak ada kata hubung (misalnya penggunaan two thousand forty two
bukan two thousand and forty two
).
Uji Kasus
Integer Digit Tunggal:
Memasukkan:
1, 2, 3, 4, 5
Keluaran:
5, 4, 1, 3, 2
Beberapa Digit Integer:
Memasukkan:
-1002, 5, 435012, 4, 23, 81, 82
Keluaran:
81, 82, 5, 4, 435012, -1002, 23
Spasi antara kata, tanpa tanda hubung, koma, atau "dan":
Memasukkan:
6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804
Keluaran:
6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204
Ingat, ini adalah kode-golf , jadi kode dengan byte paling sedikit menang. Tidak ada celah yang diizinkan!
Jawaban:
JavaScript (ES6),
189179186 byteIde dasarnya adalah untuk mengubah setiap nomor input menjadi string pendek yang berada dalam posisi leksografis yang benar dibandingkan dengan semua pasangan nomor-string lainnya. Berikut kamus yang digunakan: (Jangan jalankan cuplikan; itu hanya digunakan untuk menyembunyikan daftar panjang.)
Tampilkan cuplikan kode
Ini menciptakan cara yang sangat ringkas untuk memetakan setiap angka ke posisi yang benar secara leksografis. Itulah
q
fungsi fungsi rekursif :Bagian
0
awal string adalah untuk memastikan bahwa mis. 100 (one hundred
, dikonversi kePK0
) diurutkan sebelum101
(one hundred one
, dikonversi kePKP
). Ini menciptakan skenario aneh di mana 0 (zero
) diurutkan ke depan array, jadi untuk menyiasatinya, dalam fungsi pengurutan kita pertama-tama menyortir nol apa pun ke kanan!x-!y||(...
.sumber
[1100, 1000]
. Saya harapkan outputnya1000 (one thousand), 1100 (one thousand one hundred)
, tetapi outputnya sama dengan input.1000
sedang diurai sebagaione thousand zero
; Saya akan memperbaiki ini sebentar. Haruskah kita mendukungnya0
sendiri? Ini adalah kasus unik yang akan menambah 15 byte ke kode saya.Menginformasikan 7,
214201118 byteInform 7 adalah bahasa yang sangat mengerikan untuk bermain golf, jadi saya ingin memberikannya kesempatan di sini.
Lekukan harus menggunakan
\t
karakter tab ( ), tetapi HTML tidak menyukainya. Sebaliknya, Inform tidak suka spasi untuk indentasi, jadi Anda harus mengganti spasi dengan tab jika Anda menyalin-tempel kode dari sini untuk mengujinya. Atau cukup salin-tempel dari sumber penurunan harga.Golf:
Input harus berupa tabel Inform, seperti (dengan di
\t
antara kolom):Keluaran:
Fungsi ini berjalan melalui tabel satu kali, menambahkan representasi tekstual dari setiap angka di kolom baru. Kemudian mengurutkan baris tabel sesuai dengan kolom teks; di Inform, string diurutkan secara leksikografis. Akhirnya, ia mencetak kolom asli dalam orde baru. Dengan mudah, format Inform 7 "kasar tapi terkadang berguna" untuk mencetak kolom tabel ternyata dipisahkan koma, persis seperti yang diminta.
Tidak disatukan, dengan boilerplate yang menunjukkan cara memanggil fungsi:
sumber
words
referensi versi angka yang dieja, dibangun pada Inform 7?say "[R entry] "
cukuplah.Mathematica, 67 byte
Fungsi yang tidak disebutkan namanya mengambil daftar bilangan bulat sebagai argumennya dan mengembalikan daftar bilangan bulat sebagai nilainya.
#~IntegerName~"Words"
adalah built-in yang mengubah bilangan bulat ke namanya dalam bahasa Inggris.IntegerName
kadang-kadang memiliki koma dan tanda hubung dalam outputnya, sehinggaStringReplace
panggilan menghilangkan itu. (Sayangnya tanda hubung sebenarnya adalah karakter 3-byte, 8208, dalam UTF-8.) KemudianSortBy
mengurutkan daftar asli menurut abjad sesuai dengan nilai nama integer yang dimodifikasi.Sebuah kebetulan yang bagus:
IntegerName
menggunakannegative
alih-alihminus
dalam outputnya — tetapi tidak ada kata yang muncul dalam nama-nama nomor yang diizinkan secara alfabetis di antara kedua kata itu, jadi tidak diperlukan penggantian!(Hat tip to ngenisis untuk mengingatkan saya
Sortby
.)sumber
IntegerName
. Dokumentasi Wolfram mengatakan bahwa itu adalah karakter unicode 2010 .Bash + GNU utils + bsdgames, 52
I / O adalah baris yang dibatasi baris baru.
number
), diikuti oleh:
bentuk numerik nomor tersebut.sort
diedit.sed
strip kedua mengarah karakter hingga dan termasuk:
, meninggalkan bentuk numerik diurutkan sesuai kebutuhan.number
dengan benar menangani "minus", dan hasilnya cukup dekat dengan format khusus yangsort
berfungsi seperti yang diperlukan. Itu memang menghasilkan "empat puluh empat" bukannya "empat empat empat", tetapi ini seharusnya tidak masalah dari perspektif pengurutan.Paket bsdgames mungkin perlu instalasi:
The
sed
dansort
utilitas hampir pasti sudah di distro Anda.sumber
-t:
tidak berguna dan Anda dapat menggunakannumber<<<&
-t:
. Namun,e
fitur val sed menjalankan perintah menggunakansh
, jadi fitur bash like<<<
tidak akan berfungsi.sh
mencoba meniru Posix sh sebanyak mungkin, yang berarti bashism seperti<<<
dimatikan. GNUsed
'se
fitur val dimulai perintah dengan/bin/sh -c ...
dan tidak/bin/bash -c ...
. Sudahkah Anda mencoba ini?<<<
, bahkan dalam modePython + inflect,
979189 byteMenggunakan
inflect
perpustakaan untuk mengubahwords
array bilangan bulat menjadi representasi fonetik / string mereka. Disimpan ke kamus pasangan k / v di mana kunci adalah representasi numerik dan nilai adalah representasi string. Mengembalikan daftar kunci yang diurutkan berdasarkan nilai.EDIT: Disimpan 5 dan 3 byte, terima kasih untuk produk ETH dan Alex.S!
sumber
a={x:inflect.engine().number_to_words(x)for x in words}
.from inflect import*
dan membuanginflect.
di baris kedua.Mathematica, 30 byte
Jawaban di bawah ini menghasilkan fungsi murni yang akan mengambil daftar bilangan bulat sebagai input dan mengurutkannya berdasarkan nama alfabetnya. Seperti yang diperintahkan dokter;)
Ini adalah versi yang tidak disunat:
Dan berikut adalah contoh penggunaannya:
Yang juga bisa ditulis sebagai
Mereka menghasilkan keluaran yang identik - dalam
f[x]
mathatica, sama denganf@x
.Ada jawaban yang jauh lebih lama dari yang diposting pengguna lain di Mathematica. Jawaban itu mencoba untuk mengoreksi beberapa perbedaan kecil antara cara matematika mengabjadkan angka agar lebih sesuai dengan cara angka yang dinyatakan OP harus disejajarkan, namun hal-hal yang mereka perbaiki tidak memengaruhi urutan pengurutan, dan jawaban saya menghasilkan identik dengan milik mereka:
sumber
TheirF
dengan benar mengurutkan 888 sebelum 880.000, sementaraMyF
tidak. Mungkin masalahnya adalah copy-paste dari tanda hubung aneh: versi AndaTheirF
mungkin menggantikan tanda hubung normal (yang tidak ada), sedangkan versi yang sebenarnya menggantikan tanda hubung Unicode 3-byte yang aneh. (Masih menarik untuk melihat apakah menghilangkan koma diperlukan.)Common Lisp, 113 byte
Tidak diperlukan perpustakaan eksternal.
Output jika
x
adalah'(1 2 3 4 5)
:sumber