Abjad Bilangan Bulat


19

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, fourakan mendahului four thousanddan nomor -40akan 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 twobukan 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 , jadi kode dengan byte paling sedikit menang. Tidak ada celah yang diizinkan!


Berikut ini tautan ke pos kotak pasir yang relevan.
wubs

Apakah input akan mengandung lebih dari satu bilangan bulat tunggal?
ETHproduksi

@ ETHproductions Tidak, tidak akan. Saya akan menjelaskannya dalam pertanyaan.
wubs

8
Selamat datang di PPCG. Avatar yang bagus. : D Pertanyaan pertama yang bagus.
AdmBorkBork

@TimmyD Terima kasih! Saya menantikan PowerShell-ing segala yang saya bisa di sekitar sini.
wubs

Jawaban:


5

JavaScript (ES6), 189 179 186 byte

let f =

a=>a.sort((x,y)=>!x-!y||(X=q(x),Y=q(y),X>Y)-(X<Y),q=n=>n<0?"L"+q(-n):n>999?q(n/1e3)+"Z"+q(n%1e3):n>99?q(n/100)+"K"+q(n%100):n>19?"  cYHFVSCO"[n/10|0]+q(n%10):"0PdaIGTQAMWDbXJEURBN"[n|0])

let g = a => console.log(`[${f(a)}]`)

g([1,2,3,4,5])
g([-1002,5,435012,4,23,81,82])
g([0,1000,1100])
<input id=I value="1 2 3 4 5"><button onclick="g(I.value.match(/\d+/g)||[])">Run</button>

Ide 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.)

Ini menciptakan cara yang sangat ringkas untuk memetakan setiap angka ke posisi yang benar secara leksografis. Itulah qfungsi fungsi rekursif :

q(-X)        => "L" + q(X)
q(XYYY)      => q(X) + "Z" + q(YYY)
q(XYY)       => q(X) + "K" + q(YY)
q(XY >= 20)` => "  cYHFVSCO"[X] + q(Y)
q(X)         => "0PdaIGTQAMWDbXJEURBN"[X]

Bagian 0awal string adalah untuk memastikan bahwa mis. 100 ( one hundred, dikonversi ke PK0) diurutkan sebelum 101( one hundred one, dikonversi ke PKP). 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||(....


Sepertinya itu tidak berhasil [1100, 1000]. Saya harapkan outputnya 1000 (one thousand), 1100 (one thousand one hundred), tetapi outputnya sama dengan input.
susu

@milk Hmm ... Saya tidak yakin mengapa ini terjadi, tapi saya akan memeriksanya.
ETHproduksi

@milk Ah, 1000sedang diurai sebagai one thousand zero; Saya akan memperbaiki ini sebentar. Haruskah kita mendukungnya 0sendiri? Ini adalah kasus unik yang akan menambah 15 byte ke kode saya.
ETHproduksi

11

Menginformasikan 7, 214 201 118 byte

Inform 7 adalah bahasa yang sangat mengerikan untuk bermain golf, jadi saya ingin memberikannya kesempatan di sini.

Lekukan harus menggunakan \tkarakter 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:

Ke X:
    ulangi melalui Tabel 1:
        sekarang entri Q adalah "[entri R dalam kata-kata]";
    sortir Tabel 1 dalam urutan Q;
    katakan "[R dalam Tabel 1]".

Input harus berupa tabel Inform, seperti (dengan di \tantara kolom):

Tabel 1
R (angka) Q (teks)
-1002
5
435012
4
23
81
82

Keluaran:

81, 82, 5, 4, 435012, -1002, 23

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:

Untuk mencetak angka dalam urutan abjad:
    ulangi melalui Table of Sortable Numbers:
        sekarang entri nama adalah "[entri indeks dalam kata-kata]";
    urutkan Table of Sortable Numbers dalam urutan nama;
    katakan "[kolom indeks dalam Daftar Angka yang Dapat Diurutkan]".

Daftar Nomor yang Dapat Diurutkan
indeks (nomor) nama (teks)
-1002
5
435012
4
23
81
82

Ada kamar.
Saat bermain dimulai: cetak angka dalam urutan abjad.

1
Saya sedikit bingung dengan ini. Apakah wordsreferensi versi angka yang dieja, dibangun pada Inform 7?
Pavel

1
@Pavel Memang! "(angka) dalam kata-kata" mengembalikan string dengan representasi tekstual dari angka. Ini dengan mudah menggunakan "minus" untuk angka negatif, dan meskipun menempatkan tanda hubung di antara kata-kata, ia melakukannya secara konsisten dan mengabjadkan tanda hubung sebelum semua huruf (sehingga hasil akhirnya sama).
Draconis

2
+1 untuk pilihan bahasa. Saya harus memeriksanya, tetapi saya curiga ada beberapa peluang golf yang tersisa; misalnya, apakah parser benar-benar membutuhkan semua artikel "itu"? Dan Anda harus bertanya kepada OP, tetapi saya tidak melihat alasan yang jelas mengapa "dan" tidak akan menjadi pembatas yang valid. Bahkan jika tidak, satu ruang diperbolehkan secara eksplisit, jadi say "[R entry] "cukuplah.
Ilmari Karonen

Saya akan mengatakan "dan" pada akhirnya baik-baik saja. Saya tidak mengatakan bahwa pembatas harus seragam, jadi ini adalah jawaban yang bisa diterima. Jika saya bisa memberikan poin untuk jawaban yang paling menarik, saya akan memberikannya kepada Anda. Saya sangat menikmati keterbacaan bahasa ini, bahkan bermain golf. Pekerjaan yang baik!
wubs

Saya akhirnya mendapat sedikit kesempatan untuk bermain dengan Inform7, dan berhasil memasukkan kembali entri Anda menjadi hanya 118 byte. Karena memposting kode Inform dalam komentar tidak berfungsi dengan baik, saya melanjutkan dan mengeditnya langsung ke jawaban Anda. Saya harap Anda tidak keberatan, silakan kembali dan / atau mengubah edit saya sesuka Anda jika Anda mau.
Ilmari Karonen

4

Mathematica, 67 byte

SortBy[#,#~IntegerName~"Words"~StringReplace~{","->"","-"->""}&]&

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. IntegerNamekadang-kadang memiliki koma dan tanda hubung dalam outputnya, sehingga StringReplacepanggilan menghilangkan itu. (Sayangnya tanda hubung sebenarnya adalah karakter 3-byte, 8208, dalam UTF-8.) Kemudian SortBymengurutkan daftar asli menurut abjad sesuai dengan nilai nama integer yang dimodifikasi.

Sebuah kebetulan yang bagus: IntegerNamemenggunakan negativealih-alih minusdalam 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.)


Pujian! Saya nyaris mendapatkan solusi ini, tetapi dasbor itu membuat saya sakit kepala!
ngenisis

Apakah jawaban Anda di sini benar-benar menggunakan tanda hubung yang benar? Jika saya menyalin apa yang Anda miliki di sini ke dalam Mathematica, itu tidak menggantikan tanda hubung dari IntegerName. Dokumentasi Wolfram mengatakan bahwa itu adalah karakter unicode 2010 .
ngenisis

Mungkin tidak, kalau begitu — saya mencoba mendapatkan tanda hubung yang benar dalam jawaban ini, tetapi sepertinya saya tidak berhasil.
Greg Martin

Saya memotong jawaban Anda menjadi dua;)
J. Antonio Perez

Dan kemudian beberapa ... Anda membuat modifikasi pada string.
J. Antonio Perez

4

Bash + GNU utils + bsdgames, 52

  • 4 byte disimpan berkat @izabera.
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

I / O adalah baris yang dibatasi baris baru.

  • Ekspresi sed pertama menggantikan setiap nomor numerik dengan perintah shell yang menampilkan bentuk kata dari nomor tersebut (seperti yang diberikan oleh utilitas bsdgamesnumber ), diikuti oleh :bentuk numerik nomor tersebut.
  • Ini kemudian sortdiedit.
  • Kemudian sedstrip kedua mengarah karakter hingga dan termasuk :, meninggalkan bentuk numerik diurutkan sesuai kebutuhan.

numberdengan benar menangani "minus", dan hasilnya cukup dekat dengan format khusus yang sortberfungsi 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:

sudo apt-get install bsdgames

The seddan sortutilitas hampir pasti sudah di distro Anda.


-t:tidak berguna dan Anda dapat menggunakannumber<<<&
izabera

@izabera Ya - terima kasih - Saya menghapus -t:. Namun, efitur val sed menjalankan perintah menggunakan sh, jadi fitur bash like <<<tidak akan berfungsi.
Digital Trauma

itu berfungsi dengan baik selama sh Anda adalah bash: P
izabera

@izabera Tidak - jika bash sudah dimulai karena shmencoba meniru Posix sh sebanyak mungkin, yang berarti bashism seperti <<<dimatikan. GNU sed's efitur val dimulai perintah dengan /bin/sh -c ...dan tidak /bin/bash -c .... Sudahkah Anda mencoba ini?
Digital Trauma

bash tidak pernah mati <<<, bahkan dalam mode
posix

1

Python + inflect, 97 91 89 byte

from inflect import*
a={x:engine().number_to_words(x)for x in words}
sorted(a,key=a.get)

Menggunakan inflectperpustakaan untuk mengubah wordsarray 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!


Selamat datang di PPCG! Anda dapat bermain golf ini dengan menghapus spasi ; misalnya, baris kedua bisa a={x:inflect.engine().number_to_words(x)for x in words}.
ETHproductions

Anda dapat menyimpan dua byte menggunakan from inflect import*dan membuang inflect.di baris kedua.
Alex.

Sayangnya, sepertinya ini juga gagal menyortir daftar 40, 44, 40000, 40804, 40004, 40204 dengan benar (yang seharusnya tetap dalam urutan itu).
Ilmari Karonen

0

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

SortBy[#~IntegerName~"Words"&]

Ini adalah versi yang tidak disunat:

SortBy[IntegerName[#, "Words"]&]

Dan berikut adalah contoh penggunaannya:

SortBy[#~IntegerName~"Words"&][{0,1,2,3,4,5,6,7,8,9,10}]

Yang juga bisa ditulis sebagai

SortBy[#~IntegerName~"Words"&]@{0,1,2,3,4,5,6,7,8,9,10}

Mereka menghasilkan keluaran yang identik - dalam f[x]mathatica, sama dengan f@x.

Outputs: {8, 5, 4, 9, 1, 7, 6, 10, 3, 2}

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:

MyF = SortBy[#~IntegerName~"Words"&];
TheirF = SortBy[#, #~IntegerName~"Words"~ StringReplace~{"," -> "", "-" -> ""} &] &;
MyF[Range[-999999, 999999]] == TheirF[Range[-999999, 999999]]
(*Outputs True*)

Investigasi hebat! —Sayangnya, mereka sebenarnya tidak memberikan urutan yang sama. TheirFdengan benar mengurutkan 888 sebelum 880.000, sementara MyFtidak. Mungkin masalahnya adalah copy-paste dari tanda hubung aneh: versi Anda TheirFmungkin 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.)
Greg Martin

Saya mengujinya pada Range [999999]. Sepertinya menghilangkan koma tidak perlu, tetapi mengganti "[Tanda hubung]" dengan "" jelas diperlukan.
ngenisis

0

Common Lisp, 113 byte

Tidak diperlukan perpustakaan eksternal.

(print(mapcar #'cdr(sort(loop for i in x collect(cons(format()"~r"i)i))(lambda(y z)(string-lessp(car y)(car z))))))

Output jika xadalah '(1 2 3 4 5):

(5 4 1 3 2)
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.