In đồng hồ từ


59

Kể từ khi tôi nhìn thấy cái đầu tiên cách đây vài năm, tôi luôn bị khuất phục bởi loại đồng hồ từ này, nơi thời gian thực sự được đánh vần bởi những từ được thắp sáng hoặc không thành một câu có ý nghĩa.

Một chiếc đồng hồ Word

Văn bản hiển thị trên đồng hồ đó là như sau.

IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK

Nhiệm vụ của bạn là viết một chiếc đồng hồ làm việc như vậy. Các từ được thắp sáng nếu và chỉ khi chúng có liên quan đến việc in thời gian hiện tại. Mặt khác, chúng sáng lên. Các từ được "thắp sáng" bằng cách được in và được "thắp sáng" bằng cách được thay thế bằng một số khoảng trắng là chiều dài của từ.

Ví dụ: nếu thời gian hiện tại là 17:23, văn bản in phải chính xác như sau:

IT IS 
        TWENTY
FIVE MINUTES
PAST
         FIVE

Quy tắc

  1. Thời gian in là biến thể 12h, nhưng không có AM / PM.
  2. Việc làm tròn được thực hiện chỉ dựa trên số phút (giây hoàn toàn không liên quan). Việc làm tròn được thực hiện theo bội số gần nhất của 5. Vì vậy, ví dụ, mặc dù 17:52:38 thực sự là gần nhất với 17:55, nhưng vì các giây không liên quan, 17:52 thực sự được làm tròn xuống 17:50, và văn bản được in là "NÓ LÀ TỪ PHÚT ĐỂ SIX" (với khoảng cách phù hợp). Vì vậy, nếu XXlà bội số của năm, XXsẽ được sử dụng từ HH: (XX-2): 00 cho đến khi HH: (XX + 2): 59. Từ MINUTESphải xuất hiện nếu FIVE, TENhoặc TWENTYđược thắp sáng trong phần phút (trước "TO" hoặc "PAST").
  3. Tất cả các từ không liên quan được thay thế bằng nhiều khoảng trống cần thiết để giữ văn bản nơi nó nằm trong mẫu ở trên. Không gian lưu trữ có thể được cắt. Không gian liên quan để giữ văn bản ở vị trí dự kiến ​​phải được giữ.
  4. Đường kẻ có thể được cắt là tốt. Các dòng trống có liên quan vẫn được yêu cầu xuất hiện. Thí dụ:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. Không bật sáng TENtrên dòng đầu tiên hoặc FIVEtrên dòng thứ ba khi các giá trị này đề cập đến giờ.

  6. Bạn có thể chấp nhận một đầu vào. Nếu bạn chấp nhận đầu vào, đầu vào sẽ là thời gian để in ở bất kỳ định dạng hợp lệ nào bạn muốn (chuỗi, danh sách số nguyên, nhập thời gian gốc hỗ trợ ngôn ngữ của bạn, ...), nhưng không được phép tham số nếu chúng không liên quan đến thời điểm để in. Nếu bạn hỗ trợ không có đầu vào, thì bạn phải sử dụng thời gian hiện tại. Nếu bạn hỗ trợ cả hai, điều đó tốt hơn nhưng không có tiền thưởng;)
  7. Mã của bạn có thể là một chương trình, một chức năng, một lambda nhưng không phải là đoạn trích.
  8. Nếu ngôn ngữ của bạn hỗ trợ in theo bất kỳ cách nào, nó phải in kết quả (trong một tệp, trên đầu ra tiêu chuẩn, tôi không bận tâm). Nếu ngôn ngữ của bạn không hỗ trợ in theo bất kỳ cách nào, nó được phép chỉ đơn giản là "trả lại" văn bản dự kiến. Kết quả có thể là tất cả chữ hoa hoặc chữ thường, không phải là kết hợp của cả hai.
  9. Tiêu chuẩn áp dụng.
  10. Đây là môn đánh gôn, vì vậy đoạn mã ngắn nhất sẽ thắng!
  11. Trong các biện pháp có thể, vui lòng cung cấp một liên kết đến một thông dịch viên trực tuyến về ngôn ngữ của bạn.

Các trường hợp thử nghiệm

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

8
Thử thách lớn, tôi thực sự thích nó!
TimTech

Câu trả lời:


14

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

Cảm ơn @Christoph đã chơi golf cùng với những phát hiện tuyệt vời của anh ấy !
Ít nhất 45 byte trên tài khoản của anh ấy; 16 hoặc nhiều cảm hứng từ anh ấy.

Một đội Marvel lên!

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

các vòng lặp thông qua dữ liệu và kiểm tra xem chỉ mục hiện tại có trong chuỗi được tạo có chứa các chỉ mục của các từ để làm sáng không (ánh xạ tới các chữ cái); nối dòng hoặc dấu cách tùy thuộc vào chỉ mục.

Có thể mang lại thông báo nếu bạn không sử dụng giá trị mặc định cho error_reporting(22519).

Kiểm tra nó trực tuyến.

phá vỡ

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

Sân gôn :

  • $x/5+.5|0là hai byte ngắn hơn round($x/5).
  • Hai cuộc gọi date(h)ngắn hơn một byte so với việc gán datekết quả cho một biến.
  • Sử dụng một phân tích duy nhất đánh bại biến số mà các chỉ số phát sáng được lưu trữ trong đó.
  • Một chuỗi cho các chỉ mục sáng lên thay vì một mảng được lưu khoảng 30 byte .
  • $w<Angắn hơn ba byte $w=="\n"- đảm bảo rằng không có khoảng trắng nào sau dấu phân cách!
  • abs lưu 8 byte trên từ phút.
  • Cảm ơn @Christoph: Chuyển từ số sang chữ cái cho bản đồ khiến các dấu phân cách bị lỗi thời và cho phép thêm một chuỗi thay vì mảng; đã lưu 23 + 8 byte .
    Sử dụng dấu gạch dưới làm chỉ mục đầu tiên được phép đưa nó vào các lựa chọn thay thế "nó là"; và nó đưa ra báo giá cho giờ đã lỗi thời.
  • Sao chép 1giá trị trong bản đồ giờ làm cho modulo bị lỗi thời và với việc chơi gôn bổ sung được lưu 10 byte. Lấy cảm hứng từ @Christoph.
  • Tính toán ngắt dòng và dấu cách thay vì mã hóa chúng đã loại bỏ 19 byte .
  • Logic bit trên chuỗi tiết kiệm 7 byte: str_pad("",strlen($w))-> $w^$w^" ". (Christoph)
  • Nếu strtrtham số thứ hai của NES không có chuỗi, nó sẽ được hiểu là mã ascii. tiết kiệm 5 byte.

Điều này là rất tốt đẹp! Tôi đã thử triển khai Java này khi đảm bảo rằng câu hỏi có thể giải được, nhưng cuối cùng nó quá phức tạp, tôi đã từ bỏ và sử dụng một cách tiếp cận dài hơn, nhưng đơn giản hơn! Vì vậy, xin chúc mừng thành công nơi tôi đã thất bại;)
Olivier Grégoire

1
Đánh bại phần còn lại: $i++%3^($i<3)để $i++%3^$i<3. Tôi chính thức hoàn toàn lãng phí bây giờ. Tôi sẽ nghỉ ngơi cho đến khi ai đó phù hợp với chúng tôi. Nó thật sự rất vui Cảm ơn Titus vì tinh thần đồng đội của bạn!
Christoph

1
@Christoph Bạn là ... TUYỆT VỜI dường như nhỏ một từ. \ o /
Tít

18

TI-Basic, 335 334 byte

Khá nhiều hoàn hảo, vì các calcs TI-84 có màn hình chữ cái 8x16, và đây là 8x15. Ngày được lấy làm đầu vào để hỗ trợ calcs sớm hơn TI-84, không có đồng hồ bên trong. Không có đối số, Inputđược nhập theo mặc định vào XY, tương tự như Prompt X,Y. Vì vậy, hãy làm cho Xgiờ (bất cứ điều gì >=0sẽ hoạt động chính xác) và có Yphút.

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

Lưu ý 1: Đối với TI-84 +, bạn có thể thay thế Inputbằng một cái gì đó như getTime:Ans(1->X:getTime:Ans(2->Y. Ngoài ra, int(Y/5-5.6tương đương với round(Y/5,0)-6. Và không, trong trường hợp int(này không thể thay thế được iPart(.

Lưu ý 2: Điều này in đầu vào tốt, nhưng vì lý do đạo đức mà bạn có thể muốn Pauseở cuối chương trình để tránh Donethông báo khi kết thúc chương trình.

Chỉnh sửa: Số lượng byte bị giảm vì mã thông báo (xem ghi chú về lần sửa đổi trước), cũng có một lỗi được sửa nhờ @Neil. Thứ ba, đã sửa một lỗi tôi thấy mình sẽ tốn 2 byte nhưng việc tối ưu hóa thực sự đã tiết kiệm được 1 byte tổng thể và tôi cũng nhận ra rằng tôi đang nhận được đầu vào nên tôi không cần phải gọi getTime(duh?). Cuối cùng, đối với bất kỳ ai muốn xác nhận số byte này, mã thông báo hai byte duy nhất là sub(.


Dường như với tôi rằng sau khi xuất O'CLOCKmã, nó cũng sẽ xuất ra PAST...
Neil

2
Tôi đếm 545 byte bạn có thể vui lòng khai sáng cho tôi?
Christoph

2
@Christoph Tìm thấy bài đăng meta có liên quan: meta.codegolf.stackexchange.com/a/4764/29637
Christoph

1
@ OlivierGrégoire Thật ra nó không liên quan đến dòng trước đó. Những gì nó đang làm là chuyển đổi thời gian 24 giờ sang 12 giờ và cả giờ gần nhất (ví dụ: làm tròn với số phút chiếm). Về cơ bản, trong một ngôn ngữ bình thường, nó sẽ trông giống như x+(y>32) mod 12nếu so sánh mang lại 1 hoặc 0 như trong TI-Basic.
TimTech

1
Vì vậy, @Christoph có vẻ như bạn đã trả lời câu hỏi của riêng bạn với liên kết đó, bạn có muốn tôi giải thích không? Nếu bạn muốn xem nơi tôi đã thực hiện chuyển đổi từ tính điểm ASCII sang mã thông báo, hãy kiểm tra phiên bản số 4.
TimTech

11

JavaScript (ES6), 291 303 295 byte

Lấy đầu vào là hai số nguyên với cú pháp 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)))

Làm thế nào nó hoạt động

Toàn bộ đồng hồ có thể được xem là 23 đèn LED BẬT hoặc TẮT. Vì vậy, trạng thái đồng hồ là một số nguyên 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             

Các phút logic mà chúng ta cần phải thực hiện để cho phép những từ thích hợp là không đơn giản như người ta có thể nghĩ rằng ở cái nhìn đầu tiên. Một công thức chơi golf ma thuật có thể tồn tại nhưng tôi đã đi một cách dễ dàng và quyết định chỉ mã hóa từng cấu hình có thể:

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

Các trường hợp thử nghiệm


2
Rất thông minh. Tôi đã cố gắng cắt thêm một số byte từ tôi, sau đó tôi thấy điều này và không có hy vọng cạnh tranh.
edc65

Nhiệm vụ (quy tắc 8) nói rằng nó phải được in, không chỉ được trả lại
smls

@smls Ồ, bạn nói đúng. Điều đó đã được sửa.
Arnauld

Rất tuyệt. Ngoại trừ thời gian là sai :-( Hiển thị: h = 13 m = 15 Thời gian thực tế: 14:43
Dâu

@Strawberry Vui lòng xem quy tắc # 6. Việc thực hiện này là sử dụng đầu vào độc quyền, không phải giờ địa phương.
Arnauld

6

Mẻ, 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%

Lưu ý: Trailing space sau PASTvà 5 trailing trên mỗi hai dòng sau.


Tôi đã chạy nó và nó chỉ hoạt động tốt (thanh một không gian bị thiếu trong 3 giờ)! Tôi chỉ không hiểu những gì đang xảy ra ( call:cví dụ)! Tôi có lẽ nên học một số đợt :)
Olivier Grégoire

@ OlivierGrégoire Đáng buồn là một không gian đã bị mất nhưng hiện đã được sửa.
Neil

4

JavaScript, 567 564 551 542 529 527 519 byte

Tôi không biết liệu có ổn không khi mất hàng giờ và phút để tranh luận. Bạn nói "danh sách các số nguyên". Nó vẫn còn tính?

Nhân tiện, đây là lần đầu tiên tôi chơi golf. Bạn nghĩ sao?


Chỉnh sửa: Đã lưu một vài byte bằng cách chia phút. Cảm ơn, Olivier!


Vâng, ý tưởng đằng sau quy tắc đó là bạn có thể lấy các đối số, nhưng chỉ khi chúng liên quan đến đầu vào, đó là thời gian để in.
Olivier Grégoire

1
Về việc chơi gôn, bạn có thể chơi gôn một số byte nếu bạn cân nhắc chia số phút của mình cho 5. Ngoài ra, bạn có thể muốn di chuyển cbên trong chức năng của mình. Bạn không nên mất bất kỳ byte nào bằng cách làm như vậy, tôi đoán vậy, nhưng điều này làm cho nó giống như một đoạn trích hơn là một hàm (ít nhất là với tôi, có thể các bậc thầy về JS sẽ nói khác).
Olivier Grégoire

4

JavaScript (ES6) 360

Một hàm có tham số đầu vào giờ (0,23) và phút (0..59).
Sử dụng alertcho đầu ra, vì đó là chức năng đầu ra tiêu chuẩn trong javascript ngay cả khi nó bất tiện. (Và nó ngắn)

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

Lưu ý kiểm tra : để bạn yên tâm, trong đoạn kiểm tra, đầu ra cảnh báo được chuyển hướng đến văn bản trang

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>


Tôi thích câu trả lời của bạn! Tôi đã học được một loạt các công cụ từ nó! Tuy nhiên, điều gì đang xảy ra với chức năng mũi tên có dấu ngoặc vuông? Ngoài ra, vai trò của là igì? Tôi có thể thấy bạn nhận được tất cả các nhóm không phải khoảng trắng ("đèn LED") và bạn thay thế chúng bằng khoảng trắng dựa trên các điều kiện bạn đã viết cho từng nhóm. Ví dụ, h-2nó chỉ sai khi nào h == 2, vì vậy tôi đoán bạn đảo ngược nó ở đâu đó? Bạn có thể giải thích một chút làm thế nào điều này hoạt động? Có lẽ như là một chỉnh sửa cho câu trả lời của bạn? Tôi thực sự biết ơn!
Hristiyan Dodov

Cập nhật - Tôi gần như nhận ra những gì bạn đang làm. Bạn có một mảng gồm các phần tử 0 và khác không và bạn sử dụng iđể tham chiếu đến phần tử bên phải bằng cách tăng nó sau mỗi lần so khớp regex. Nếu đó là sự thật, bạn thay thế chuỗi phù hợp bằng khoảng trắng, nếu không, bạn để nguyên chuỗi đó. Tôi không hiểu một điều, mặc dù. replace()sử dụng giá trị trả về của hàm đã chỉ định (hàm mũi tên trong trường hợp này). Nơi nào bạn trả lại một giá trị? Tôi chỉ thấy một nhà điều hành ternary.
Hristiyan Dodov

3
@HristiyanDodov một hàm mũi tên được tạo thành chỉ bằng một biểu thức chỉ trả về giá trị của biểu thức đó. Ví dụ (a,b)=>{ return a+b }giống như(a,b)=>a+b
edc65

4

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

Vì nó được phép là một hàm chấp nhận h và m dưới dạng số nguyên, chúng ta có thể lưu một vài byte. Hãy thử trực tuyến .

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

Tôi đã có một vài lỗi (nay là cố định) với logic cho TO/ PASTvs O'CLOCK. Cũng lưu một vài byte cho enumerate, thay đổi import19<m<26thay vì m in [20,25]. Tiết kiệm thêm 8 để làm việc trong rater 5 phút hơn phút. Rod đã chỉ ra một số lỗi khác khiến tôi mất khá nhiều chi phí, nhưng tôi đã phục hồi một chút với các bài tập hiệu quả hơn và một lỗi đã hoạt động có lợi cho tôi.


Có một mẹo từ câu trả lời PHP của @Titus. Tôi đang thua cuộc so với trăn để ==so sánh và tôi nghĩ tôi có thể cải thiện một số hthử nghiệm
Chris H

bạn chỉ có thể print cở dòng cuối cùng, cđã a[i]đến hạnenumerate
Rod

1
Định dạng đầu ra bị hỏng, printthêm một dòng mới sau mỗi lần in, bạn có thể loại bỏ nó ,sau khi thêm c. Ngoài ra, nó sẽ in các khoảng trắng khi một từ không được in, bạn có thể sửa bằng một từ khác trong lần cuối nếuelse:print' '*len(c),
Rod

1
Thứ tự của byte là tốt hơn nếu giảm dần.
Gurupad Mamadapur

@Rod, cảm ơn vì các điểm lỗi, mặc dù nó làm cho nó dài hơn nhiều
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}

Hãy thử trực tuyến!

Giải trình

Cấu trúc cơ bản như sau:

-> \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.)
}

Khái niệm elided như ...|...|...|...ở trên, là một Junction các số nguyên đại diện cho các chỉ số từ 1-based, và được tạo thành như sau:

  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 / ...

2

Python3, (569 byte)

Câu trả lời này yêu cầu thời gian ở định dạng hh mm (số nguyên được phân tách bằng dấu cách). Tôi đã quản lý để in '\ n', được lấy cảm hứng từ phương pháp của Chris . Xin cảm ơn, Chris! Bất kỳ trợ giúp giảm mã được đánh giá cao.

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

Dùng thử trực tuyến


Bạn có thể kết hợp w thành một chuỗi duy nhất và sau đó sử dụng .split(',')không? Nên tiết kiệm một ít.
ElPedro

Cũng lấy đầu vào của bạn là H,M=input()nơi đầu vào là H, M. Hai chuỗi số nguyên được cho phép theo quy tắc, Không chắc điều này có hoạt động như dự định trong Python 3. Tôi vẫn là một chàng trai 2 :-)
ElPedro

Cảm ơn @ElPedro. Đã lưu 57 byte. H,M=input()đã không làm việc như bạn nghi ngờ.
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

Hãy thử trực tuyến!

Nó có thể vẫn có thể hưởng lợi từ việc chơi gôn nhiều hơn. Đầu vào là danh sách các số nguyên, ví dụ 7,23 = 7:23


1

SimpleTemplate , 737 708 byte

Vâng, tính dài dòng và thiếu toán học "thực sự" đã làm tổn thương đến cộng đồng.

{@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}

Điều này mong đợi giờ và phút là tham số thứ 1 và thứ 2 trên lớp.


Ung dung:

{@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}

Cách chạy:

  1. Nhận mã từ https://github.com/ismael-miguel/SimpleTemplate
  2. Chạy đoạn mã sau:

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


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

Hãy thử trực tuyến!

Tôi nghĩ rằng cuối cùng tôi đã đưa ra một thử thách cho thử thách của mình;)


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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.