Sejak saya melihat yang pertama beberapa tahun yang lalu, saya selalu ditaklukkan oleh semacam jam kata di mana waktu sebenarnya dieja dengan kata-kata yang menyala atau tidak menjadi kalimat yang bermakna.
Teks yang ditampilkan pada jam itu adalah sebagai berikut.
IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK
Tugas Anda adalah menulis jam kerja seperti itu. Kata-kata menyala jika dan hanya jika mereka relevan untuk mencetak waktu saat ini. Kalau tidak, mereka menyala. Kata-kata "menyala" dengan dicetak dan "menyala" dengan digantikan oleh sejumlah spasi sebagai panjang kata.
Contoh: jika waktu saat ini adalah 17:23, teks yang dicetak harus persis sebagai berikut:
IT IS
TWENTY
FIVE MINUTES
PAST
FIVE
Aturan
- Waktu yang dicetak adalah varian ke-12, tetapi tanpa AM / PM.
- Pembulatan dilakukan atas dasar menit saja (detik sama sekali tidak relevan). Pembulatan dilakukan ke kelipatan terdekat dari 5. Jadi, misalnya, meskipun 17:52:38 benar-benar paling dekat dengan 17:55, tetapi karena detik tidak relevan, 17:52 sebenarnya dibulatkan ke 17:50, dan teks yang dicetak adalah "SEPULUH MENIT KE ENAM" (dengan spasi yang relevan). Jadi jika
XX
kelipatan lima,XX
akan digunakan dari HH: (XX-2): 00 hingga HH: (XX + 2): 59. Kata tersebutMINUTES
harus muncul jikaFIVE
,TEN
atauTWENTY
menyala di bagian menit (sebelum "TO" atau "MASA LALU"). - Semua kata-kata yang tidak relevan digantikan oleh spasi sebanyak yang diperlukan untuk menyimpan teks di mana ia berada dalam templat di atas. Ruang tambahan dapat dipangkas. Spasi yang relevan untuk menjaga teks pada posisi yang diharapkan harus dijaga.
Garis trailing juga dapat dipangkas. Baris kosong yang relevan masih diperlukan untuk muncul. Contoh:
IT IS TEN MINUTES PAST TWO
Jangan menyalakan
TEN
baris pertama atauFIVE
baris ketiga saat nilai-nilai ini merujuk pada jam.- Anda dapat menerima input. Jika Anda menerima input, input tersebut akan menjadi waktu untuk mencetak dalam format valid apa pun yang Anda inginkan (string, daftar integer, waktu asli ketik dukungan bahasa Anda, ...), tetapi tidak ada parameter yang dibolehkan jika tidak terkait ke waktu untuk mencetak. Jika Anda tidak mendukung input, maka Anda harus menggunakan waktu saat ini. Jika Anda mendukung keduanya, itu lebih baik tetapi tidak ada bonus;)
- Kode Anda bisa berupa program, fungsi, lambda tetapi bukan cuplikan.
- Jika bahasa Anda mendukung pencetakan dengan cara apa pun, itu harus mencetak hasilnya (dalam file, pada output standar, saya tidak keberatan). Jika bahasa Anda tidak mendukung pencetakan dengan cara apa pun, itu diperbolehkan untuk hanya "mengembalikan" teks yang diharapkan. Hasilnya mungkin semua huruf besar atau semua huruf kecil, bukan campuran keduanya.
- Celah standar berlaku.
- Ini adalah kode-golf sehingga kode terpendek menang!
- Jika memungkinkan, berikan tautan ke juru bahasa online Anda.
Uji kasus
Input: <no input> (the current local time is 19:20)
Output:
IT IS
TWENTY
MINUTES
PAST
SEVEN
Input: 13:15
Output: (empty line is being printed)
IT IS
QUARTER
PAST
ONE
Input: 13:58
Output: (rounding)
IT IS
TWO
O'CLOCK
Input: 14:30
Output: (half is always a edge-case)
IT IS HALF
PAST TWO
Input: 15:35
Output: (light up "TO")
IT IS
TWENTY
FIVE MINUTES TO
FOUR
Input: 10:00
Output: (do not use the TEN or FIVE on the first line when referring to the hours)
IT IS
TEN
O'CLOCK
Input: 12:00
Output: (O'CLOCK and a lot of empty lines)
IT IS
TWELVE O'CLOCK
Jawaban:
PHP,
387384353352342323310306298293291 byteTerima kasih @Christoph untuk bermain golf bersama dengan penemuannya yang luar biasa !
Setidaknya 45 byte ada di akunnya; 16 atau lebih terinspirasi olehnya.
A Marvel Team Up!
loop melalui data dan memeriksa apakah indeks saat ini dalam string yang dihasilkan yang berisi indeks kata-kata untuk menyala (dipetakan ke huruf); menambahkan linebreak atau spasi tergantung pada indeks.
Dapat menghasilkan pemberitahuan jika Anda tidak menggunakan nilai default untuk
error_reporting
(22519).Uji secara online.
kerusakan
Golf :
$x/5+.5|0
dua byte lebih pendek dariround($x/5)
.date(h)
adalah satu byte lebih pendek daripada menugaskandate
hasilnya ke variabel.$w<A
tiga byte lebih pendek dari$w=="\n"
- pastikan tidak ada ruang setelah pembatas!abs
disimpan 8 byte pada kata menit.Menggunakan garis bawah sebagai indeks pertama diizinkan untuk memasukkannya ke dalam "itu" alternatif; dan itu membuat kutipan untuk jam sudah usang.
1
nilai dalam peta jam membuat modulo usang dan dengan golf tambahan disimpan 10 byte. Terinspirasi oleh @Christoph.str_pad("",strlen($w))
->$w^$w^" "
. (Christoph)strtr
parameter kedua bukan string, maka akan ditafsirkan sebagai kode ascii. menghemat 5 byte.sumber
$i++%3^($i<3)
untuk$i++%3^$i<3
. Saya secara resmi benar-benar sia-sia sekarang. Saya akan istirahat sampai ada yang cocok dengan kita. Sangat menyenangkan. Terima kasih Titus atas kerja tim Anda!TI-Basic,
335334 byteCukup sempurna, karena kalibrasi TI-84 memiliki tampilan huruf 8x16, dan ini 8x15. Tanggal diambil sebagai input untuk mendukung calcs lebih awal dari TI-84, yang tidak memiliki jam internal. Tanpa argumen,
Input
dapatkan input secara default keX
danY
, mirip denganPrompt X,Y
. JadiX
jadilah jam (segala sesuatu>=0
akan bekerja dengan benar) dan milikiY
beberapa menit.Catatan 1: Untuk TI-84 + Anda dapat menggantinya
Input
dengan sesuatu sepertigetTime:Ans(1->X:getTime:Ans(2->Y
. Juga,int(Y/5-5.6
setara denganround(Y/5,0)-6
. Dan tidak, dalam hal iniint(
tidak bisa dipertukarkan denganiPart(
.Catatan 2: Ini mencetak input dengan baik, tetapi untuk alasan asetis Anda mungkin ingin
Pause
di akhir program untuk menghindariDone
pesan setelah penghentian program.Sunting: Jumlah byte diturunkan karena tokenized (lihat catatan pada revisi sebelumnya), juga bug diperbaiki berkat @Neil. Ketiga, memperbaiki bug yang saya temukan sendiri yang biayanya 2 byte tetapi optimasi sebenarnya menyelamatkan 1 byte secara keseluruhan, dan saya juga menyadari bahwa saya mendapatkan input sehingga saya tidak perlu menelepon
getTime
(ya?). Terakhir, bagi siapa saja yang ingin mengkonfirmasi jumlah byte ini, token dua byte hanya adalahsub(
.sumber
O'CLOCK
kode akan melanjutkan ke keluaranPAST
juga ...x+(y>32) mod 12
jika perbandingan menghasilkan 1 atau 0 seperti di TI-Basic.JavaScript (ES6),
291303295 byteMengambil input sebagai dua bilangan bulat dengan sintaks currying
(h)(m)
Bagaimana itu bekerja
Seluruh jam dapat dilihat sebagai 23 LED baik ON atau OFF. Jadi, status jam adalah bilangan bulat 23-bit.
The menit logika yang kita perlu untuk mengimplementasikan untuk mengaktifkan kata yang tepat tidak sesederhana sebagai salah satu mungkin berpikir pada pandangan pertama. Formula golf-sihir mungkin ada tetapi saya pergi dengan cara mudah dan memutuskan untuk hanya meng-hardcode setiap konfigurasi yang mungkin:
Uji kasus
Tampilkan cuplikan kode
sumber
Batch, 789 byte
Catatan: Trailing space after
PAST
dan 5 trailing space pada masing-masing dari dua baris berikut.sumber
call:c
misalnya)! Saya mungkin harus belajar beberapa batch :)JavaScript,
567 564 551 542 529 527519 byteTampilkan cuplikan kode
Saya tidak tahu apakah OK untuk mengambil jam dan menit sebagai argumen. Anda mengatakan "daftar bilangan bulat". Apakah masih dihitung?
Ngomong-ngomong, ini pertama kalinya aku bermain golf. Bagaimana menurut anda?
Sunting: Disimpan beberapa byte dengan membagi menit. Terima kasih, Olivier!
sumber
c
dalam fungsi Anda. Anda seharusnya tidak kehilangan byte dengan melakukannya, saya kira, tetapi ini membuatnya lebih seperti potongan daripada fungsi (bagi saya, setidaknya, mungkin guru JS akan mengatakan sebaliknya).JavaScript (ES6) 360
Fungsi dengan parameter input jam (0..23) dan menit (0..59).
Menggunakan
alert
untuk keluaran, karena ini adalah fungsi keluaran standar dalam javascript meskipun tidak nyaman. (Dan pendek)Catatan Tes : untuk ketenangan pikiran Anda, dalam cuplikan uji, keluaran tanda diarahkan ke teks halaman
sumber
i
? Saya dapat melihat Anda mendapatkan semua kelompok non-spasi putih ("LED") dan Anda menggantinya dengan ruang kosong berdasarkan kondisi yang Anda tulis untuk masing-masing kelompok. Sebagai contoh,h-2
itu hanya salah ketikah == 2
, jadi saya kira Anda membalikkannya di suatu tempat? Bisakah Anda jelaskan sedikit cara kerjanya? Mungkin sebagai edit untuk jawaban Anda? Saya akan sangat berterima kasih!i
untuk merujuk yang benar dengan menambahkannya setelah setiap kecocokan regex. Jika benar, Anda mengganti string yang cocok dengan spasi kosong, jika tidak, biarkan saja apa adanya. Tapi saya tidak mengerti satu hal.replace()
menggunakan nilai balik dari fungsi yang ditentukan (fungsi panah dalam kasus ini). Di mana Anda mengembalikan nilai? Saya hanya melihat operator ternary.(a,b)=>{ return a+b }
sama dengan(a,b)=>a+b
Python 2,
466,460,449,452,459449 byteKarena diizinkan menjadi fungsi yang menerima h dan m sebagai bilangan bulat, kita dapat menyimpan beberapa byte. Cobalah online .
Aku punya beberapa bug (sekarang tetap) dengan logika untuk
TO
/PAST
vsO'CLOCK
. Juga menyimpan beberapa byte untukenumerate
, mengubahimport
, dan19<m<26
bukannyam in [20,25]
. Menyimpan 8 lainnya untuk bekerja di rater potongan 5 menit daripada menit. Rod menunjukkan beberapa bug lebih mahal, tetapi saya sedikit pulih dengan tugas yang lebih efisien dan perbaikan bug yang menguntungkan saya.sumber
==
sebagai pembanding dan saya rasa saya bisa meningkatkan beberapah
tesprint c
pada baris terakhir,c
sudah memeganga[i]
karenaenumerate
print
tambahkan baris baru setelah setiap cetak, Anda dapat menekannya menambahkan,
setelahc
. Juga harus mencetak spasi kosong ketika sebuah kata tidak dicetak, Anda dapat memperbaikinya dengan yang lain jikaelse:print' '*len(c),
Perl 6 ,
308296293 byteCobalah online!
Penjelasan
Struktur dasar adalah sebagai berikut:
Ungkapan yang dikesampingkan seperti di
...|...|...|...
atas, adalah Persimpangan bilangan bulat yang mewakili indeks kata berbasis 1, dan dibuat sebagai berikut:sumber
Python3, (569 bytes)
Jawaban ini membutuhkan waktu dalam format jj mm (spasi dipisahkan bilangan bulat) .Saya berhasil memiliki '\ n' dicetak, yang terinspirasi oleh Chris method.Thanks, Chris! Setiap bantuan pengurangan kode dihargai.
Cobalah secara Online
sumber
.split(',')
? Harus menyimpan beberapa.H,M=input()
inputnya adalah H, M. Dua urutan bilangan bulat diizinkan berdasarkan aturan, Tidak yakin apakah ini berfungsi sebagaimana dimaksud dengan Python 3. Saya masih seorang pria 2 :-)H,M=input()
tidak bekerja karena Anda ragu.Python 2 ,
443440 byteCobalah online!
Mungkin masih bisa mendapat manfaat dari bermain golf lagi. Input adalah daftar bilangan bulat misalnya 7,23 = 7:23
sumber
SimpleTemplate ,
737708 byteYa, verbositas dan kurangnya "nyata" matematika sangat merugikan bytecount.
Ini mengharapkan jam dan menit sebagai parameter 1 dan 2 di kelas.
Tidak Disatukan:
Cara menjalankan:
Jalankan kode berikut:
Selesai!
sumber
Java (OpenJDK 9) , 437 byte
Cobalah online!
Saya pikir saya akhirnya akan mencoba tantangan saya;)
sumber
Perl 5 ,
487449 byteCobalah online!
sumber