Cetak jam kata

59

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.

Jam Kata

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

  1. Waktu yang dicetak adalah varian ke-12, tetapi tanpa AM / PM.
  2. 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 XXkelipatan lima, XXakan digunakan dari HH: (XX-2): 00 hingga HH: (XX + 2): 59. Kata tersebut MINUTESharus muncul jika FIVE, TENatau TWENTYmenyala di bagian menit (sebelum "TO" atau "MASA LALU").
  3. 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.
  4. Garis trailing juga dapat dipangkas. Baris kosong yang relevan masih diperlukan untuk muncul. Contoh:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. Jangan menyalakan TENbaris pertama atau FIVEbaris ketiga saat nilai-nilai ini merujuk pada jam.

  6. 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;)
  7. Kode Anda bisa berupa program, fungsi, lambda tetapi bukan cuplikan.
  8. 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.
  9. Celah standar berlaku.
  10. Ini adalah kode-golf sehingga kode terpendek menang!
  11. 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
Olivier Grégoire
sumber
8
Tantangan besar, saya sangat menyukainya!
Timtech

Jawaban:

14

PHP, 387 384 353 352 342 323 310 306 298 293 291 byte

Terima 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!

IT IS <?foreach([HALF,TEN,QUARTER,TWENTY,FIVE,MINUTES,TO,PAST,TWO,THREE,ONE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE,"O'CLOCK"]as$w)echo strstr([w,ghj,dhj,ej,fhj,fghj,cj,fghi,fhi,ei,dhi,ghi][$m=date(i)/5+.5].mklnopqrstuvm[date(h)-($m<7)],99+$i)?$w:$w^$w^"       ","
  "[$i++%3^$i<3];

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

IT IS <?
foreach([HALF,TEN,QUARTER,TWENTY,FIVE,MINUTES,TO,PAST,  // loop through words
TWO,THREE,ONE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE,"O'CLOCK"]as$w)
    echo strstr(                    // search word index in ...
        [w,ghj,dhj,ej,fhj,fghj,cj,fghi,fhi,ei,dhi,ghi][$m=date(i)/5+.5] // minutes & co
        .mklnopqrstuvm[date(h)-($m<7)]                          // hours (-1 if minutes<33)
    ,99+$i                          // (map 0..20 to c..w)
    )?$w:$w^$w^"       ",           // if found, print string, else print spaces
    "\n  "[$i++%3^$i<3];            // if $i in [3,5,8,...], print newline, else space

Golf :

  • $x/5+.5|0dua byte lebih pendek dari round($x/5).
  • Dua panggilan date(h)adalah satu byte lebih pendek daripada menugaskan datehasilnya ke variabel.
  • Dengan menggunakan satu assigment menghilangkan variabel yang digunakan untuk menyimpan indeks cahaya.
  • String untuk indeks penyalaan alih-alih array yang disimpan sekitar 30 byte .
  • $w<Atiga byte lebih pendek dari $w=="\n"- pastikan tidak ada ruang setelah pembatas!
  • abs disimpan 8 byte pada kata menit.
  • Terima kasih @Christoph: Pindah dari angka ke huruf untuk peta membuat pemisah menjadi usang dan memungkinkan satu string lebih daripada array; disimpan 23 + 8 byte .
    Menggunakan garis bawah sebagai indeks pertama diizinkan untuk memasukkannya ke dalam "itu" alternatif; dan itu membuat kutipan untuk jam sudah usang.
  • Menggandakan 1nilai dalam peta jam membuat modulo usang dan dengan golf tambahan disimpan 10 byte. Terinspirasi oleh @Christoph.
  • Menghitung garis dan spasi alih-alih hardcoding, mencukur 19 byte .
  • Logika bit pada string menghemat 7 byte: str_pad("",strlen($w))-> $w^$w^" ". (Christoph)
  • Jika strtrparameter kedua bukan string, maka akan ditafsirkan sebagai kode ascii. menghemat 5 byte.
Titus
sumber
Ini sangat bagus! Saya mencoba implementasi ini di Jawa ketika memastikan pertanyaannya dapat dipecahkan, tetapi akhirnya menjadi sangat rumit sehingga saya menyerah dan menggunakan pendekatan yang lebih lama, tetapi lebih langsung! Jadi selamat atas keberhasilan di mana saya gagal;)
Olivier Grégoire
1
Mengalahkan sisanya: $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!
Christoph
1
@Christoph Kamu ... HEBAT sepertinya sepatah kata. \ o /
Titus
18

TI-Basic, 335 334 byte

Cukup 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, Inputdapatkan input secara default ke Xdan Y, mirip dengan Prompt X,Y. Jadi Xjadilah jam (segala sesuatu >=0akan bekerja dengan benar) dan miliki Ybeberapa menit.

Input 
ClrHome
int(Y/5-5.6
Output(1,1,"IT IS
If Ans=~6
Output(8,8,"O'CLOCK
If 2=abs(3-abs(Ans
Output(3,1,"FIVE
If 4=abs(Ans
Output(1,12,"TEN
If 3=abs(Ans
Output(2,1,"QUARTER
If 2=abs(Ans
Output(2,8,"TWENTY
If sum(abs(Ans)={1,2,4,5
Output(3,5,"MINUTES
If not(Ans
Output(1,7,"HALF
If Ans<1 and Ans+6
Output(4,1,"PAST
If Ans>0
Output(3,14,"TO
12fPart(12(^~1)(X+(Y>32->A
If not(Ans
12->A
{21,6,10,25,30,41,45,51,61,66,70,81
.05Ans(A
Output(int(4+Ans),20fPart(Ans),sub("ONE   TWO   THREE FOUR  FIVE  SIX   SEVEN EIGHT NINE  TEN   ELEVENTWELVE",6A-5,6

Catatan 1: Untuk TI-84 + Anda dapat menggantinya Inputdengan sesuatu seperti getTime:Ans(1->X:getTime:Ans(2->Y. Juga, int(Y/5-5.6setara dengan round(Y/5,0)-6. Dan tidak, dalam hal ini int(tidak bisa dipertukarkan dengan iPart(.

Catatan 2: Ini mencetak input dengan baik, tetapi untuk alasan asetis Anda mungkin ingin Pausedi akhir program untuk menghindari Donepesan 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 adalah sub(.

Timtech
sumber
Sepertinya saya setelah mengeluarkan O'CLOCKkode akan melanjutkan ke keluaran PASTjuga ...
Neil
2
Saya menghitung 545 byte, bisakah Anda memberi tahu saya?
Christoph
2
@Christoph Menemukan pos meta terkait: meta.codegolf.stackexchange.com/a/4764/29637
Christoph
1
@ OlivierGrégoire Sebenarnya tidak ada hubungannya dengan kalimat sebelumnya sama sekali. Apa yang dilakukannya adalah mengkonversi waktu 24 jam menjadi 12 jam dan juga ke jam terdekat (mis. Pembulatan dengan menit dicatat). Pada dasarnya, dalam bahasa normal akan terlihat seperti x+(y>32) mod 12jika perbandingan menghasilkan 1 atau 0 seperti di TI-Basic.
Timtech
1
Jadi @Christoph sepertinya Anda menjawab pertanyaan Anda sendiri dengan tautan itu, apakah Anda masih ingin saya jelaskan? Jika Anda ingin melihat di mana saya beralih dari penilaian ASCII menjadi tokenized, periksa revisi # 4.
Timtech
11

JavaScript (ES6), 291 303 295 byte

Mengambil input sebagai dua bilangan bulat dengan sintaks currying (h)(m)

h=>m=>console.log(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>(k/=2)&1?w:w.replace(/./g,' '),k=[x=1<<19,88,81,66,84,92,64.5,60,52,34,49,56,x,h=(m<33?h+11:h)%12][m/5+.4|0]*16|6|2048<<(h?h-(h<3):2)))

Bagaimana itu bekerja

Seluruh jam dapat dilihat sebagai 23 LED baik ON atau OFF. Jadi, status jam adalah bilangan bulat 23-bit.

Bit | Word        Bit | Word
----+--------     ----+--------
00  | IT          12  | ONE
01  | IS          13  | FOUR
02  | HALF        14  | FIVE
03  | TEN         15  | SIX
04  | QUARTER     16  | SEVEN
05  | TWENTY      17  | EIGHT
06  | FIVE        18  | NINE
07  | MINUTES     19  | TEN
08  | TO          20  | ELEVEN
09  | PAST        21  | TWELVE
10  | TWO         22  | O'CLOCK
11  | THREE             

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:

Minutes | Words                    | Enabled bits | Value   | Value / 8
--------+--------------------------+--------------+---------+----------
  00    | O'CLOCK                  | 22           | 4194304 | 524288
  05    | FIVE MINUTES PAST        | 6, 7, 9      | 704     | 88
  10    | TEN MINUTES PAST         | 3, 7, 9      | 648     | 81
  15    | QUARTER PAST             | 4, 9         | 528     | 66
  20    | TWENTY MINUTES PAST      | 5, 7, 9      | 672     | 84
  25    | TWENTY FIVE MINUTES PAST | 5, 6, 7, 9   | 736     | 92
  30    | HALF PAST                | 2, 9         | 516     | 64.5
  35    | TWENTY FIVE MINUTES TO   | 5, 6, 7, 8   | 480     | 60
  40    | TWENTY MINUTES TO        | 5, 7, 8      | 416     | 52
  45    | QUARTER TO               | 4, 8         | 272     | 34
  50    | TEN MINUTES TO           | 3, 7, 8      | 392     | 49
  55    | FIVE MINUTES TO          | 6, 7, 8      | 448     | 56

Uji kasus

Arnauld
sumber
2
Sangat pintar. Saya mencoba untuk memotong beberapa byte lagi dari milik saya, kemudian saya melihat ini dan tidak ada harapan untuk bersaing.
edc65
Tugas (aturan 8) mengatakan bahwa itu harus dicetak, tidak hanya dikembalikan
smls
@ mls Oh, Anda benar. Itu sudah diperbaiki.
Arnauld
Sangat keren. Kecuali waktunya salah :-( Tampilan: h = 13 m = 15 Waktu aktual: 14:43
Strawberry
@Strawberry Silakan lihat aturan # 6. Implementasi ini menggunakan input secara eksklusif, bukan waktu setempat.
Arnauld
6

Batch, 789 byte

@echo off
if not "%1"=="" setlocal&set time=%1
set/a"h=%time:~0,2%,m=6%time:~3,2%%%60+2,h+=m/35,h%%=12,m=6-m/5%%12,n=m%%3,o=m%%2
set p=
set s=
call:c %m:-=% "IT IS HALF" 0 "IT IS      TEN" 4 "IT IS"
call:c %m:-=% QUARTER 3 "        TWENTY" 2 "        TWENTY" 1
if %m% lss 0 set s= TO
call:c 0 "            " %n% "     MINUTES" %o% "FIVE MINUTES"
set s=
set p=PAST 
if %m%==6 set p=     
if %m% lss 0 set p=     
call:c %h% TWO 2 "    THREE" 3
set p=
call:c %h% ONE 1 "    FOUR" 4 "          FIVE" 5
call:c %h% SIX 6 "    SEVEN" 7 "          EIGHT" 8
call:c %h% NINE 9 "     TEN" 10 "         ELEVEN" 11
if %m%==6 set s= O'CLOCK
call:c %h% TWELVE 0 "      "
exit/b
:c
set t=%1
:l
if %t%==%3 echo(%p%%~2%s%&exit/b
shift
shift
if not "%3"=="" goto l
echo(%p%%~2%s%

Catatan: Trailing space after PASTdan 5 trailing space pada masing-masing dari dua baris berikut.

Neil
sumber
Aku berlari dan itu baik-baik saja (batalkan satu ruang yang hilang selama jam 3)! Saya hanya tidak mengerti apa yang sedang terjadi ( call:cmisalnya)! Saya mungkin harus belajar beberapa batch :)
Olivier Grégoire
@ OlivierGrégoire Sayangnya ada ruang yang hilang tapi itu sudah diperbaiki sekarang.
Neil
4

JavaScript, 567 564 551 542 529 527 519 byte

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!

Hristiyan Dodov
sumber
Ya, ide di balik aturan itu adalah Anda dapat mengambil argumen, tetapi hanya jika mereka berhubungan dengan input, yang merupakan waktu untuk mencetak.
Olivier Grégoire
1
Mengenai golf, Anda mungkin bisa golf beberapa byte jika Anda mempertimbangkan membagi menit Anda dengan 5. Juga, Anda mungkin ingin pindah ke cdalam 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).
Olivier Grégoire
4

JavaScript (ES6) 360

Fungsi dengan parameter input jam (0..23) dan menit (0..59).
Menggunakan alertuntuk keluaran, karena ini adalah fungsi keluaran standar dalam javascript meskipun tidak nyaman. (Dan pendek)

(k,n,m=(n+2)/5|0,h=(k+(m>6))%12,i=0)=>alert(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>[,,m-6,m-2&&m-10,m-3&&m-9,m-4&&m-8&&m-5&&m-7,m-1&&m-11&&m-5&&m-7,!(m%3),m<7|m==12,!m|m>6,h-2,h-3,h-1,h-4,h-5,h-6,h-7,h-8,h-9,h-10,h-11,h%12,m%12][i++]?w.replace(/./g,' '):w))

Catatan Tes : untuk ketenangan pikiran Anda, dalam cuplikan uji, keluaran tanda diarahkan ke teks halaman

F=
(k,n,m=(n+2)/5|0,h=(k+(m>6))%12,i=0)=>alert(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>[,,m-6,m-2&&m-10,m-3&&m-9,m-4&&m-8&&m-5&&m-7,m-1&&m-11&&m-5&&m-7,!(m%3),m<7|m==12,!m|m>6,h-2,h-3,h-1,h-4,h-5,h-6,h-7,h-8,h-9,h-10,h-11,h%12,m%12][i++]?w.replace(/./g,' '):w))

function alert(x) { O.textContent=x }
function update() { F(+H.value,+M.value) }

update()
input { width:3em }
Hours<input id=H type=number min=0 max=23 value=17 oninput='update()'>
Minutes<input id=M type=number min=0 max=59 value=37 oninput='update()'>
<pre id=O></pre>

edc65
sumber
Saya suka jawaban Anda! Saya belajar banyak hal dari itu! Namun, apa yang terjadi dengan fungsi panah yang memiliki tanda kurung? Juga, apa perannya 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-2itu hanya salah ketika h == 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!
Hristiyan Dodov
Pembaruan - Saya hampir menyadari apa yang Anda lakukan. Anda memiliki array elemen nol dan non-nol dan Anda gunakan iuntuk 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.
Hristiyan Dodov
3
@HristiyanDodov fungsi panah yang dibuat hanya dari ekspresi hanya mengembalikan nilai ekspresi itu. Contohnya (a,b)=>{ return a+b }sama dengan(a,b)=>a+b
edc65
4

Python 2, 466 , 460 , 449 , 452 , 459 449 byte

Karena diizinkan menjadi fungsi yang menerima h dan m sebagai bilangan bulat, kita dapat menyimpan beberapa byte. Cobalah online .

def t(h,m):


m=(2+m)//5
 h=h%12
 n=0
 if m>6:n,m=1,12-m;h+=1
 a="""IT IS _HALF _TEN_
 _QUARTER _TWENTY_
 _FIVE _MINUTES _TO_
 _PAST _TWO _THREE_
 _ONE _FOUR _FIVE_
 _SIX _SEVEN _EIGHT_
 _NINE _TEN _ELEVEN_
 _TWELVE _O'CLOCK""".split("_")
 b=[1,m==6,m==2,1,m==3,3<m<6,1,m in[1,5],m in[1,2,4],n*m,1,(1-n)*m,h==2,h==3,1,h==1,h==4,h==5,1,h==6,h==7,h==8,1,h==9,h==10,h==11,1,h==0,m==0]
 for i,c in enumerate(a):
  if b[i]:print c,
  else:print' '*len(c),

Aku punya beberapa bug (sekarang tetap) dengan logika untuk TO/ PASTvs O'CLOCK. Juga menyimpan beberapa byte untuk enumerate, mengubah import, dan 19<m<26bukannya m 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.

Chris H.
sumber
Mengambil trik dari jawaban PHP @Titus. Saya kalah dengan python ==sebagai pembanding dan saya rasa saya bisa meningkatkan beberapa htes
Chris H
Anda dapat hanya print cpada baris terakhir, csudah memegang a[i]karenaenumerate
Rod
1
Format output rusak, printtambahkan baris baru setelah setiap cetak, Anda dapat menekannya menambahkan ,setelah c. Juga harus mencetak spasi kosong ketika sebuah kata tidak dicetak, Anda dapat memperbaikinya dengan yang lain jikaelse:print' '*len(c),
Rod
1
Urutan byte lebih baik jika turun.
Gurupad Mamadapur
@Rod, terima kasih untuk bug-spotnya, meskipun itu membuatnya lebih lama
Chris H
2

Perl 6 , 308 296 293 byte

->\h,\m{my \n=round(m/5)%12;say "IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK".subst: /\S+/,{++$==1|2|(0,7,4,5,6,(6|7),3)[min n,12-n]|8*?(n%3)|(23,10,9)[(n+5)/6]|(13,11,12,|(14..*))[(h+m/33-1)%12]??$_!!" "x.comb},:g}

Cobalah online!

Penjelasan

Struktur dasar adalah sebagai berikut:

-> \h, \m {                             # A lambda taking two args (hour and minute).
    my \n = round(m / 5) % 12;          # Index from 0 to 11, representing the minutes.
    say "...".subst: /\S+/, {           # Print the template with each word replaced:
        ++$ == ...|...|...|...          # If counter equals one of expected indices,
            ?? $_                       # then replace the word with itself,
            !! " " x .comb              # else replace it with spaces.
    }, :g                               # (Use global matching.)
}

Ungkapan yang dikesampingkan seperti di ...|...|...|...atas, adalah Persimpangan bilangan bulat yang mewakili indeks kata berbasis 1, dan dibuat sebagai berikut:

  1|2                                   # IT IS
| (0,7,4,5,6,(6|7),3)[min n,12-n]       # FIVE / TEN / QUARTER / TWENTY / TWENTY FIVE / HALF
| 8*?(n%3)                              # MINUTES
| (23,10,9)[(n+5)/6]                    # O'CLOCK / PAST / TO
| (13,11,12,|(14..*))[(h+m/33-1)%12]    # ONE / TWO / THREE / FOUR / FIVE / SIX / SEVEN / ...
seseorang
sumber
2

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.

H,M=input().split()
w="""HALF _TEN_
_QUARTER _TWENTY_
_FIVE _MINUTES _TO_
_PAST _TWO _THREE_
_ONE _FOUR _FIVE_
_SIX _SEVEN _EIGHT_
_NINE _TEN _ELEVEN_
_TWELVE _O'CLOCK""".split("_")
h,m=int(H),int(M)
if h>12:h-=12
m=(m//5+1)*5 if m%5>2.5 else m//5*5
if m>30:
    m=60-m
    h=(h+1)%12
X=[m==30,m==10,1,m==15,m in[20,25],1,m in[5,25],m not in[0,15,30],int(M)>30 and m!=0,1,m!=0 and int(M)<31,h==2,h==3,1,h==1,h==4,h==5,1,h==6,h==7,h==8,1,h==9,h==10,h==11,1,h in[0,12],m==0]
t="IT IS "
for i in range(0,28):
    if(X[i]):t+=w[i]
    else:t+=" "*len(w[i])
print(t.strip())

Cobalah secara Online

EffyCoder
sumber
Bisakah Anda menggabungkan w menjadi satu string dan kemudian gunakan .split(',')? Harus menyimpan beberapa.
ElPedro
Ambil juga input Anda karena 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 :-)
ElPedro
Terima kasih @ ElPedro. Menyimpan 57 byte. H,M=input()tidak bekerja karena Anda ragu.
EffyCoder
1

Python 2 , 443 440 byte

R=range
w="HALF TEN QUARTER TWENTY FIVE MINUTES TO PAST TWO THREE ONE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE O'CLOCK".split(' ')
h=[10,8,9]+R(11,20)
c=['IT','IS']+[' '*len(x)for x in w]
i,j=input()
i=(i,i+1)[j>30]%13-1
j=int(round(j/5.0)*5.0)%60
for z in[[20],[4,5,7],[1,5,7],[2,7],[3,5,7],[3,4,5,7],[0,7],R(3,7),[3,5,6],[2,6],[1,5,6],R(4,7)][j/5]:c[z]=w[z]
c[h[i]]=w[h[i]]
x=0
for y in[4]+R(6,22,3)+[23]:print' '.join(c[x:y]);x=y

Cobalah online!

Mungkin masih bisa mendapat manfaat dari bermain golf lagi. Input adalah daftar bilangan bulat misalnya 7,23 = 7:23

ElPedro
sumber
1

SimpleTemplate , 737 708 byte

Ya, verbositas dan kurangnya "nyata" matematika sangat merugikan bytecount.

{@seth argv.0}{@php$DATA[m]=ceil($DATA[argv][1]/5)*5%60|0}{@ifm}{@ifm is30}{@setA"HALF"}{@/}{@if"@[15]0$@"is matchesm}{@setB"TEN"}{@/}{@if"@[14]5$@"is matchesm}{@setC"QUARTER"}{@/}{@if"@[24]0$@"is matchesm}{@setD"TWENTY"}{@/}{@if"@^[25]?5$@"is matchesm}{@setE"FIVE"}{@/}{@if"@^([235]?5|[1245]0)$@" is matchesm}{@setF"MINUTES"}{@/}{@ifm is greater30}{@setG"TO"}{@else}{@setH"PAST"}{@/}{@else}{@setU"O\'CLOCK"}{@/}{@setZ"","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN","ELEVEN","TWELVE"}{@setY"J"}{@incbyh Y}{@php$DATA[$DATA[Y]]=$DATA[Z][$DATA[h]]}{@print"IT IS%-6s%s\n%8s%s\n%-5s%-7s %s\n%4s %3s %s\n%3s %4s %s\n%3s %5s %s\n%4s %3s %s\n%6s %s",A,B,C,D,E,F,G,H,J,K,I,L,M,N,O,P,Q,R,S,T,U}

Ini mengharapkan jam dan menit sebagai parameter 1 dan 2 di kelas.


Tidak Disatukan:

{@set hour argv.0}

{@//The bitwise is required for the `@if minutes is 30`}
{@//Otherwise, I would be forced to write `@if minutes is equal to 30`}
{@php $DATA['minutes'] = ((ceil($DATA['argv'][1] / 5) * 5) % 60) | 0}

{@if minutes}
    {@if minutes is 30}
        {@set A "HALF"}
    {@/}
    {@if "@[15]0$@" is matches minutes}
        {@set B "TEN"}
    {@/}
    {@if "@[14]5$@" is matches minutes}
        {@set C "QUARTER"}
    {@/}
    {@if "@[24]0$@" is matches minutes}
        {@set D "TWENTY"}
    {@/}
    {@if "@^[25]?5$@" is matches minutes}
        {@set E "FIVE"}
    {@/}
    {@if "@^([235]?5|[1245]0)$@" is matches minutes}
        {@set F "MINUTES"}
    {@/}
    {@if m is greater than 30}
        {@set G "TO"}
    {@else}
        {@set H "PAST"}
    {@/}
{@else}
    {@set U "O\'CLOCK"}
{@/}


{@set numbers "", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE"}
{@set key "J"}
{@inc by hour key}
{@php $DATA[$DATA['key']] = $DATA['numbers'][$DATA['hour']]}

{@print "IT IS%-6s%s\n%8s%s\n%-5s%-7s %s\n%4s %3s %s\n%3s %4s %s\n%3s %5s %s\n%4s %3s %s\n%6s %s", A, B, C, D, E, F, G, H, J, K, I, L, M, N, O, P, Q, R, S, T, U}

Cara menjalankan:

  1. Dapatkan kode dari https://github.com/ismael-miguel/SimpleTemplate
  2. Jalankan kode berikut:

    <?php
        include 'SimpleTemplate.php';
    
        $template = new SimpleTemplate('<code>');
    
        $template->render($hour, $minutes);
    
        //system-time: $template->render(date('g'), date('i'));
    
  3. Selesai!

Ismael Miguel
sumber
1

Java (OpenJDK 9) , 437 byte

(h,m)->{h=(h+m/35+11)%12+1;Object[]s="HALF TEN QUARTER TWENTY FIVE MINUTES TO PAST TWO THREE ONE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE O'CLOCK".split(" ");for(int i=s.length,M[]={1<<20,176,162,132,168,184,129,120,104,68,98,112};i-->0;)s[i]=(7<i&i<20?h==i-(h>3?7:h>1?6:9):(M[(m+2)/5%12]&(1<<i))>0)?s[i]:"";System.out.printf("IT IS %4s %3s%n%7s %6s%n%4s %7s %2s%n%4s %3s %5s%n%3s %4s %4s%n%3s %5s %5s%n%4s %3s %6s%n%6s %7s",s);}

Cobalah online!

Saya pikir saya akhirnya akan mencoba tantangan saya;)

Olivier Grégoire
sumber
1

Perl 5 , 487 449 byte

($a,$_,$h)=localtime;s/[3-7]$/5/;s/[12]$/0/;$m=s/(.?)[89]$/($1+1)*10/er;$_="IT IS half ten
quarter tw
five minutes to
past 2two 3three
1one 4four 5five
6six 7seven 8eight
9nine 10ten 11eleven
12twelve oc";if($m>30){s/to/TO/;$h++;$m=60-$m}elsif($m){s/past/PAST/}$h=$h%12||12;$m!=30?$m%15?s/m\w+/uc$&/e:$m?s/q\w+/uc$&/e:s/oc/O'CLOCK/:s/half/HALF/;$m%10&&!/Q/&&s/five/FIVE/;$m>15&&$m<30?s/tw/TWENTY/:$m==10&&s/ten/TEN/;s/\b$h\w+/uc$&/es;y/a-z0-9/ /;say

Cobalah online!

Xcali
sumber