Dalam buku Vernor Vinge yang sangat bagus dan mempesona A Deepness in the Sky (yang, omong-omong, saya sangat merekomendasikan 1 ), Qeng Ho , budaya yang mencakup berbagai sistem bintang, tidak memiliki gagasan tentang "hari," "bulan," " tahun, "dll., dan karenanya memiliki sistem ketepatan waktu yang unik yang mengukur waktu sepenuhnya dalam hitungan detik. Unit yang paling umum digunakan adalah Ksec (kilosecond), Msec (megasecond), dan Gsec (gigasecond). Berikut adalah bagan berguna dari salinan buku saya sendiri (karena saya tidak dapat menemukannya online):
Anda saat ini terbang di Pham Nuwen , dan Anda baru saja menerima pesan dari planet aneh dan tidak dikenal yang disebut " Bumi ." 2 Mereka menggunakan unit waktu yang berbeda dari yang Anda lakukan, dan komputer Anda tidak mengenali mereka. Sebagai Programmer-Archaeologist dari kapal, tugas Anda adalah menambal kode penanganan waktu sehingga ia mengenali satuan waktu Bumi .
Tentu saja, karena Anda hanya kekurangan tidur selama beberapa Ksec, Anda ingin membuat kode sesingkat mungkin sehingga dapat ditulis dengan cepat. Untungnya, sebagai budaya perdagangan antarbintang, Qeng Ho memiliki akses ke setiap bahasa pemrograman yang diciptakan.
Memasukkan
Input akan berupa string tunggal yang mengandung satu atau lebih komponen yang dipisahkan ruang
. Sebuah komponen didefinisikan sebagai angka integer> 0 dan ≤ 255, lalu spasi, dan kemudian salah satu dari second
, minute
, hour
, day
, week
, month
,
year
, decade
, atau century
, mungkin jamak (dengan menambahkan s
, atau
centuries
untuk kasus terakhir).
Berikut adalah beberapa contoh input yang valid:
10 days 12 hours
1 year
184 centuries 1 second
9 weeks 6 days 2 hours 1 minute 20 seconds
Anda dapat mengasumsikan berikut tentang input:
Pluralisasi unit akan selalu setuju dengan nomor yang relevan.
Jika ada beberapa komponen dalam input, mereka akan selalu dalam urutan panjang.
Berikut adalah arti berbagai unit input, untuk keperluan tantangan ini:
unit relative absolute
---------------------------------------
second 1 second 1 second
minute 60 seconds 60 seconds
hour 60 minutes 3600 seconds
day 24 hours 86400 seconds
week 7 days 604800 seconds
month 30 days 2592000 seconds
year 365 days 31536000 seconds
decade 10 years 315360000 seconds
century 10 decades 3153600000 seconds
Keluaran
Berikut adalah unit Qeng Ho yang harus didukung kode Anda:
unit relative absolute
----------------------------------------
second 1 second 1 second
Ksec 1000 seconds 1000 seconds
Msec 1000 Ksecs 1000000 seconds
Gsec 1000 Msecs 1000000000 seconds
Gunakan algoritma berikut untuk menentukan output kode Anda:
Pertama, tambahkan jumlah total waktu yang diwakili oleh input.
Temukan unit Qeng Ho terbesar yang lebih pendek atau jumlah waktu yang sama dengan input — intinya, temukan unit terbesar yang setidaknya ada satu.
Konversi jumlah total waktu yang diberikan dalam input ke dalam unit ini, dan hasilkan hasilnya, dibulatkan menjadi tiga tempat desimal.
Anda dapat memilih metode mana yang akan digunakan: pembulatan ke atas, pembulatan ke bawah, pembulatan dari nol, atau pembulatan ke arah ∞ atau -∞. Jika hasil bulat berakhir 0
, Anda bisa menghapus trailing nol atau menyimpan sebanyak yang Anda inginkan (atau melakukan keduanya, tergantung pada input).
Jika hasil bulat adalah persis 1.000
, Anda harus menggunakan bentuk tunggal ( second
, Ksec
, Msec
, Gsec
); jika tidak, menggunakan bentuk jamak ( seconds
,
Ksecs
, Msecs
, Gsecs
).
Dalam kasus tepi tertentu, Anda mungkin menggunakan unit, misalnya, Ksec, tetapi dapatkan hasil bulat 1000.000 Ksec. Dalam hal ini, Anda mungkin hanya keluaran
1000.000 Ksecs
bukan 1 Msec
.
Anda mungkin selalu menganggap bahwa input dalam urutan unit (abad, dekade, tahun, dll); lebih jauh lagi, komponen yang datang setelah unit tertentu akan selalu lebih pendek (yaitu, 1 decade 20 years
input tidak valid).
Uji kasus
Catatan: hasil yang ditandai dengan tanda bintang ( *
) dapat bervariasi dengan jumlah yang dapat diabaikan karena perbedaan pembulatan.
input output
-------------------------------------------------------------
1 hour 3.600 Ksecs
1 day 86.400 Ksecs
2 weeks 1.210 Msecs
1 year 31.536 Msecs
32 years 1.009 Gsecs *
1 second 1.000 second
1 century 6 decades 5.046 Gsecs *
255 centuries 804.168 Gsecs
2 weeks 6 days 1 hour 19 minutes 4 seconds 1.733 Msecs
1 week 3 days 3 hours 7 minutes 875.220 Ksecs
1 week 4 days 13 hours 46 minutes 40 seconds 1.000 Msec
2 months 2 hours 5.191 Msecs *
16 minutes 39 seconds 999.000 seconds
Aturan
- Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
1: hanya jika Anda suka hard scifi, tentu saja. Dalam hal ini saya sarankan membaca A Fire Upon the Deep pertama, yang (menurut saya) bahkan lebih fantastis.
2: yah, secara teknis "Bumi Tua" disebutkan beberapa kali dalam A Deepness in the Sky , tapi ...
2 months 2 hours
sebagai "2 bulan * 2 jam."Jawaban:
APL (Dyalog APL) ,
157156154151154141142 byteTerima kasih kepada ngn untuk mencukur 13 byte.
Harus ada
⎕IO←0
, yang merupakan standar di banyak APL.Cobalah online!
sumber
⌊1E3⍟
→⌊(z←1E3)⍟
dan kemudian simpan 2 untuk masing-masing1E3
→ berikutnyaz
.JavaScript (ES6) 255
sumber
Python,
366363 bytesumber
q=eval(i,d);f={};l=1
baris, yang memecah kode. Selain itu, Anda dapat menyimpan 2 byte dengan menggunakan10.
dan73.
bukannya10.0
dan73.0
. Juga, tidak perlu ruang setelahprint
.SpecBAS -
476471 byteKarena tidak ada yang mengatakan "meringkuk di depan keunggulan teknologi kami" lebih baik dari nomor baris dan pernyataan GOTO :-)
sumber
C # (dalam LinqPad sebagai Fungsi), 460 Bytes
ungolfed:
sumber
Mathematica
296281 byteh
: Setelah memecah string input menjadi daftar besaran dan unit kuantitas,Capitalize
danPluralize
mengonversi unit input ke dalam MathematicaQuantity
, dari mana total jumlah detik diturunkan.d
mengkonversi detik ke unit yang sesuai. Finals
dihapus jika waktunya sesuai dengan 1 unit (dalam bentuk apa pun).Dengan sedikit penyesuaian dalam kode, pendekatan ini harus bekerja untuk konversi input bahasa alami ke sistem pengukuran apa pun, konvensional atau tidak.
Dimasukkan ke dalam bentuk tabel:
sumber
Haskell,
565555 byteSaya cukup yakin saya kehilangan begitu banyak peluang golf di sini ... Harga menjadi pemula golf kurasa.
Jawaban saya adalah fungsi mengambil string yang berisi waktu Bumi sebagai parameter input dan mengembalikan waktu Qeng Ho.
PS: Saya dengan bodohnya lupa tentang ketepatan 3 digit ... yang membuat jumlah byte bertambah.
PPS: Ekspresi tingkat atas yang dipilih lebih baik mencukur 10 byte ... dan sekarang harus akurat untuk boot.
sumber
Matlab 315 byte
Uji:
Keluaran:
sumber