พิมพ์นาฬิกาคำ


59

เมื่อฉันเห็นคนแรกไม่กี่ปีที่ผ่านมาฉันมักจะปราบปรามด้วยนาฬิกาคำชนิดนี้ที่จริงเวลาสะกดด้วยคำที่สว่างขึ้นหรือไม่เป็นประโยคที่มีความหมาย

นาฬิกาคำ

ข้อความที่ปรากฏบนนาฬิกานั้นมีดังต่อไปนี้

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

งานของคุณคือการเขียนนาฬิกาที่ใช้งานได้ คำจะสว่างขึ้นหากว่าเกี่ยวข้องกับการพิมพ์เวลาปัจจุบันเท่านั้น ไม่เช่นนั้นจะติดสว่าง คำว่า "สว่างขึ้น" โดยการพิมพ์และเป็น "ไฟลง" โดยถูกแทนที่ด้วยจำนวนช่องว่างความยาวของคำ

ตัวอย่าง: หากเวลาปัจจุบันคือ 17:23 ข้อความที่พิมพ์จะต้องตรงตามดังต่อไปนี้:

IT IS 
        TWENTY
FIVE MINUTES
PAST
         FIVE

กฎระเบียบ

  1. เวลาที่พิมพ์คือตัวแปร 12 ชม. แต่ไม่มี AM / PM
  2. การปัดเศษจะกระทำบนฐานของนาทีเท่านั้น (วินาทีไม่เกี่ยวข้องทั้งหมด) การปัดเศษทำเพื่อผลคูณที่ใกล้เคียงที่สุดของ 5 ดังนั้นแม้ว่า 17:52:38 จะใกล้เคียงที่สุดกับ 17:55 แต่เนื่องจากวินาทีนั้นไม่เกี่ยวข้อง 17:52 จะถูกปัดเศษลงเป็น 17:50 และข้อความที่พิมพ์คือ "มันเป็นสิบนาทีถึงหก" (ด้วยระยะห่างที่เกี่ยวข้อง) ดังนั้นถ้าXXเป็นทวีคูณของห้าXXจะถูกใช้จาก HH: (XX-2): 00 จนถึง HH: (XX + 2): 59 คำMINUTESต้องปรากฏถ้าFIVE, TENหรือTWENTYจะสว่างขึ้นในส่วนนาที (ก่อนที่จะ "เป็น" หรือ "อดีต")
  3. คำที่ไม่เกี่ยวข้องทั้งหมดจะถูกแทนที่ด้วยช่องว่างให้มากที่สุดเท่าที่จำเป็นเพื่อเก็บข้อความไว้ในแม่แบบด้านบน ช่องว่างต่อท้ายอาจถูกตัดออก ช่องว่างที่เกี่ยวข้องกับการรักษาข้อความในตำแหน่งที่คาดหวังจะต้องเก็บไว้
  4. เส้นต่อท้ายอาจถูกตัดแต่งเช่นกัน จะต้องปรากฏบรรทัดว่างที่เกี่ยวข้อง ตัวอย่าง:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. อย่าเปิดไฟTENในบรรทัดแรกหรือบรรทัดFIVEที่สามเมื่อค่าเหล่านี้อ้างถึงชั่วโมง

  6. คุณอาจยอมรับอินพุต หากคุณยอมรับอินพุตอินพุตจะเป็นเวลาที่จะพิมพ์ในรูปแบบที่ถูกต้องที่คุณต้องการ (สตริงรายการจำนวนเต็มเวลาท้องถิ่นพิมพ์การสนับสนุนภาษาของคุณ ... ) แต่ไม่อนุญาตให้ใช้พารามิเตอร์หากไม่เกี่ยวข้องกัน ถึงเวลาที่จะพิมพ์ หากคุณไม่รองรับอินพุตคุณต้องใช้เวลาปัจจุบัน หากคุณสนับสนุนทั้งสองจะดีกว่า แต่ไม่มีโบนัส;)
  7. รหัสของคุณอาจเป็นโปรแกรมฟังก์ชั่นแลมบ์ดา แต่ไม่ใช่ตัวอย่าง
  8. หากภาษาของคุณรองรับการพิมพ์ในทางใดทางหนึ่งมันจะต้องพิมพ์ผลลัพธ์ (ในไฟล์ในผลลัพธ์มาตรฐานฉันไม่รังเกียจ) หากภาษาของคุณไม่รองรับการพิมพ์ในทางใดทางหนึ่งก็อนุญาตให้ "ส่งคืน" ข้อความที่คาดหวัง ผลลัพธ์อาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กทั้งหมดไม่ใช่ทั้งสองอย่าง
  9. ช่องโหว่มาตรฐานใช้
  10. นี่คือโค้ดกอล์ฟเพื่อให้โค้ดที่สั้นที่สุดชนะ!
  11. ในการวัดความเป็นไปได้โปรดระบุลิงก์ไปยังล่ามออนไลน์ของภาษาของคุณ

กรณีทดสอบ

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
ความท้าทายที่ยิ่งใหญ่ฉันชอบจริงๆ!
Timtech

คำตอบ:


14

PHP, 387 384 353 352 342 323 310 306 298 293 291 ไบต์

ขอบคุณ @Christophสำหรับการเล่นกอล์ฟพร้อมกับการค้นพบที่ยอดเยี่ยมของเขา!
มีอย่างน้อย 45 ไบต์ในบัญชีของเขา 16 หรือมากกว่าแรงบันดาลใจจากเขา

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

วนรอบข้อมูลและตรวจสอบว่าดัชนีปัจจุบันอยู่ในสตริงที่สร้างขึ้นซึ่งมีดัชนีของคำที่จะสว่างขึ้น (แมปกับตัวอักษร); ผนวก linebreak หรือช่องว่างขึ้นอยู่กับดัชนี

อาจแจ้งให้ทราบหากคุณไม่ได้ใช้ค่าเริ่มต้นสำหรับerror_reporting(22519)

ทดสอบออนไลน์

ชำรุด

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

กอล์ฟ :

  • $x/5+.5|0round($x/5)เป็นสองไบต์สั้นกว่า
  • การเรียกสองdate(h)ครั้งสั้นกว่าหนึ่งไบต์กว่าการกำหนดdateผลลัพธ์ให้กับตัวแปร
  • การใช้ชุดคำสั่งเดียวทำให้ตัวแปรที่ดัชนีแสงถูกเก็บไว้
  • สตริงสำหรับดัชนีแสงขึ้นแทนของอาร์เรย์ที่บันทึกไว้ประมาณ 30 ไบต์
  • $w<Aสั้นกว่าสามไบต์$w=="\n"- ตรวจสอบให้แน่ใจว่าไม่มีช่องว่างหลังจากตัวคั่น!
  • abs บันทึก 8 ไบต์ในคำนาที
  • ขอบคุณ @Christoph: การย้ายจากตัวเลขเป็นตัวอักษรสำหรับแผนที่ที่แสดงว่าตัวแยกนั้นล้าสมัยและอนุญาตให้มีอีกหนึ่งสตริงแทนที่จะเป็นอาร์เรย์ บันทึก23 + 8 ไบต์
    การใช้ขีดเส้นใต้เป็นดัชนีแรกที่อนุญาตให้รวมไว้ในตัวเลือก "มันคือ" และมันทำให้ใบเสนอราคาสำหรับชั่วโมงล้าสมัย
  • การทำสำเนา1ค่าในแผนที่ชั่วโมงแสดงโมดูโลล้าสมัยและด้วยการเล่นกอล์ฟเพิ่มเติมที่บันทึกไว้ 10 ไบต์ แรงบันดาลใจจาก @Christoph
  • การคำนวณการแบ่งบรรทัดและช่องว่างแทน hardcoding พวกเขาโกนไบต์ 19
  • ตรรกะบิตสตริงประหยัด 7 ไบต์: ->str_pad("",strlen($w)) $w^$w^" "(คริสโต)
  • หากstrtrพารามิเตอร์ตัวที่สองไม่ใช่สตริงจะถูกตีความว่าเป็นรหัส ascii บันทึก 5 ไบต์

นี่เป็นสิ่งที่ดีมาก! ฉันลองใช้งานใน Java เมื่อตรวจสอบให้แน่ใจว่าคำถามนั้นแก้ไขได้ แต่มันซับซ้อนมากจนฉันยอมแพ้และใช้วิธีที่ยาวกว่า แต่ตรงไปตรงมามากกว่านี้! ดังนั้นขอแสดงความยินดีกับการประสบความสำเร็จในตำแหน่งที่ฉันล้มเหลว;)
Olivier Grégoire

1
การเต้นของส่วนที่เหลือ: ไป$i++%3^($i<3) $i++%3^$i<3ฉันเสียไปอย่างเป็นทางการแล้ว ฉันจะหยุดพักจนกว่าจะมีคนตรงกับเรา มันสนุกมากจริงๆ. ขอบคุณ Titus สำหรับการทำงานเป็นทีมของคุณ!
Christoph

1
@Christoph คุณเป็น ... ดูเหมือนคำน้อยมาก \ o /
ติตัส

18

TI-Basic, 335 334 ไบต์

ค่อนข้างสมบูรณ์แบบมากเนื่องจาก cal-TI-84 มีตัวอักษร 8x16 ตัวและนี่คือ 8x15 วันที่ถูกป้อนเข้าเพื่อสนับสนุน calcs ก่อนหน้า TI-84 ซึ่งไม่มีนาฬิกาภายใน กับการขัดแย้งใดInputได้รับการป้อนข้อมูลโดยค่าเริ่มต้นเข้าXและคล้ายกับY Prompt X,Yดังนั้นจงXใช้เวลาหลายชั่วโมง (ทุกอย่าง>=0จะทำงานได้อย่างถูกต้อง) และYเป็นนาที

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

หมายเหตุ 1: สำหรับ TI-84 + คุณสามารถแทนที่กับสิ่งที่ต้องการInput getTime:Ans(1->X:getTime:Ans(2->Yนอกจากนี้จะเทียบเท่ากับint(Y/5-5.6 round(Y/5,0)-6และไม่มีในกรณีนี้ไม่สามารถสบตากับint(iPart(

หมายเหตุ 2: สิ่งนี้พิมพ์อินพุตได้ดี แต่ด้วยเหตุผลที่ไม่สมเหตุสมผลคุณอาจต้องการPauseที่ส่วนท้ายของโปรแกรมเพื่อหลีกเลี่ยงDoneข้อความเมื่อสิ้นสุดโปรแกรม

แก้ไข: นับไบต์ลดลงเนื่องจากโทเค็น (ดูหมายเหตุในการแก้ไขครั้งก่อน) และยังแก้ไขข้อบกพร่องด้วย @Neil ประการที่สามแก้ไขข้อผิดพลาดที่ฉันพบว่าตัวเองมีค่าใช้จ่าย 2 ไบต์ แต่การเพิ่มประสิทธิภาพจริง ๆ แล้วบันทึกไว้ 1 ไบต์โดยรวมและฉันก็ตระหนักว่าฉันกำลังรับอินพุตดังนั้นฉันไม่จำเป็นต้องโทรgetTime(duh?) sub(ที่ผ่านมาสำหรับคนที่ต้องการที่จะยืนยันการนับไบต์นี้เพียงสองโทเค็นไบต์คือ


สำหรับฉันแล้วดูเหมือนว่าหลังจากการส่งO'CLOCKออกรหัสจะไปยังเอาท์พุทPASTเกินไป ...
23411 Neil

2
ฉันนับได้ 545 ไบท์คุณช่วยสอนฉันได้ไหม
Christoph

2
@Christoph พบโพสต์ meta ที่เกี่ยวข้อง: meta.codegolf.stackexchange.com/a/4764/29637
Christoph

1
@ OlivierGrégoireจริงๆแล้วมันไม่ได้เกี่ยวข้องกับบรรทัดก่อนหน้าเลย สิ่งที่กำลังทำอยู่คือการแปลงเวลา 24 ชั่วโมงถึง 12 ชั่วโมงและเป็นชั่วโมงที่ใกล้ที่สุด (เช่นการปัดเศษด้วยจำนวนนาทีที่คิด) โดยพื้นฐานแล้วในภาษาปกติมันจะดูเหมือนกับx+(y>32) mod 12ว่าการเปรียบเทียบให้ผล 1 หรือ 0 เหมือนใน TI-Basic
Timtech

1
@Christoph ดูเหมือนว่าคุณจะตอบคำถามของคุณเองด้วยลิงก์นั้นคุณยังต้องการให้ฉันอธิบายหรือไม่? หากคุณต้องการดูว่าฉันได้เปลี่ยนจากการให้คะแนน ASCII ไปเป็นโทเค็นหรือไม่ให้ตรวจสอบการแก้ไข # 4
Timtech

11

JavaScript (ES6), 291 303 295 ไบต์

รับอินพุตเป็นเลขจำนวนเต็มสองรายการพร้อมกับรูปแบบ 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)))

มันทำงานอย่างไร

ทั้งนาฬิกาสามารถมองเห็นได้เป็นไฟ LED 23 ดวงที่เปิดหรือปิด ดังนั้นสถานะของนาฬิกาจึงเป็นจำนวนเต็ม 23 บิต

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             

นาทีตรรกะที่เราจำเป็นต้องดำเนินการเพื่อให้สามารถใช้คำพูดที่เหมาะสมไม่เป็นง่ายๆเป็นหนึ่งอาจคิดได้อย่างรวดเร็วก่อน อาจมีสูตรเวทย์มนตร์การตีกอล์ฟ แต่ฉันได้วิธีที่ง่ายและตัดสินใจที่จะ hardcode แต่ละการกำหนดค่าที่เป็นไปได้:

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

กรณีทดสอบ


2
ฉลาดมาก. ฉันพยายามที่จะลดจำนวนไบต์จากฉันจากนั้นฉันเห็นสิ่งนี้และไม่มีความหวังที่จะแข่งขัน
edc65

ภารกิจ (กฎ 8) บอกว่าจะต้องพิมพ์ไม่ใช่แค่ส่งคืน
smls

@smls โอ้คุณพูดถูก นั่นคือการแก้ไข
Arnauld

เด็ดมาก ยกเว้นเวลาผิด :-( จอแสดงผล: h = 13 m = 15 เวลาจริง: 14:43
สตรอเบอร์รี่

@Strawberry โปรดดูกฎ # 6 การนำไปใช้งานนี้ใช้เฉพาะข้อมูลเข้าไม่ใช่เวลาท้องถิ่น
Arnauld

6

แบตช์ 789 ไบต์

@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%

หมายเหตุ: ช่องว่างต่อท้ายหลังPASTและ 5 ช่องว่างต่อท้ายในสองบรรทัดต่อไปนี้


ฉันวิ่งและมันก็ใช้ได้ (บาร์หนึ่งที่ขาดหายไปเป็นเวลา 3 ชั่วโมง)! ฉันไม่เข้าใจว่าเกิดอะไรขึ้น ( call:cเช่น)! ฉันอาจจะเรียนรู้บางชุด :)
34432 Olivier Grégoire

@ OlivierGrégoireน่าเสียดายที่พื้นที่หายไป แต่ตอนนี้ได้รับการแก้ไขแล้ว
Neil

4

JavaScript, 567 564 551 542 529 527 519 ไบต์

ฉันไม่ทราบว่าจะใช้เวลาเป็นชั่วโมงและนาทีเป็นข้อโต้แย้ง คุณพูดว่า "list of integers" มันยังคงนับหรือไม่

มันเป็นครั้งแรกที่ฉันเล่นกอล์ฟ คุณคิดอย่างไร?


แก้ไข:บันทึกสองสามไบต์โดยแบ่งนาที ขอบคุณโอลิเวียร์!


ใช่แนวคิดเบื้องหลังกฎนั้นคือคุณสามารถโต้แย้งได้ แต่เฉพาะถ้าเกี่ยวข้องกับอินพุตซึ่งเป็นเวลาที่จะพิมพ์
Olivier Grégoire

1
เกี่ยวกับการเล่นกอล์ฟคุณสามารถเล่นกอล์ฟได้หลายไบท์หากคุณพิจารณาหารนาทีด้วย 5 นอกจากนี้คุณอาจต้องการย้ายcภายในฟังก์ชั่นของคุณ คุณไม่ควรสูญเสียไบต์ใด ๆ ด้วยการทำเช่นนั้นฉันเดาว่า แต่มันทำให้มันเป็นเหมือนตัวอย่างมากกว่าฟังก์ชั่น
Olivier Grégoire

4

JavaScript (ES6) 360

ฟังก์ชั่นที่มีพารามิเตอร์อินพุตชั่วโมง (0..23) และนาที (0..59)
ใช้alertสำหรับเอาต์พุตเนื่องจากเป็นฟังก์ชันเอาต์พุตมาตรฐานใน javascript แม้ว่าจะไม่สะดวก (และมันสั้น)

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

หมายเหตุการทดสอบ : เพื่อความอุ่นใจของคุณในตัวอย่างการทดสอบเอาต์พุตแจ้งเตือนจะถูกเปลี่ยนเส้นทางไปยังข้อความหน้า

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>


ฉันรักคำตอบของคุณ! ฉันได้เรียนรู้สิ่งต่าง ๆ มากมายจากมัน! อย่างไรก็ตามสิ่งที่เกิดขึ้นกับฟังก์ชั่นลูกศรที่มีวงเล็บเหลี่ยม นอกจากนี้บทบาทของiคืออะไร? ฉันเห็นว่าคุณได้รับกลุ่มที่ไม่ใช่ช่องว่างทั้งหมด ("LEDs") และคุณแทนที่พวกเขาด้วยช่องว่างตามเงื่อนไขที่คุณเขียนสำหรับแต่ละกลุ่ม ตัวอย่างเช่นh-2มันเป็นเรื่องผิดพลาดก็ต่อเมื่อh == 2ดังนั้นฉันจึงทึกทักเอาเอง คุณช่วยอธิบายได้นิดหน่อยว่ามันทำงานอย่างไร อาจเป็นการแก้ไขคำตอบของคุณ? ฉันจะขอบคุณจริงๆ!
Hristiyan Dodov

อัปเดต - ฉันเกือบรู้ว่าคุณกำลังทำอะไร คุณมีอาร์เรย์ขององค์ประกอบที่เป็นศูนย์และไม่เป็นศูนย์และคุณใช้iในการอ้างถึงหนึ่งที่เหมาะสมโดยการเพิ่มขึ้นหลังจากแต่ละการแข่งขัน regex ถ้ามันเป็นความจริงคุณแทนที่สตริงที่ตรงกันด้วยช่องว่างมิฉะนั้นคุณจะปล่อยมันตามที่เป็นอยู่ แม้ว่าฉันไม่เข้าใจสิ่งหนึ่ง แต่ replace()ใช้ค่าส่งคืนของฟังก์ชันที่ระบุ (ฟังก์ชันลูกศรในกรณีนี้) คุณส่งคืนค่าที่ใด ฉันเพิ่งเห็นผู้ประกอบการที่สาม
Hristiyan Dodov

3
@HristiyanDodov ฟังก์ชั่นลูกศรที่ทำจากเพียงแค่การแสดงออกเพียงแค่ส่งกลับค่าของการแสดงออกนั้น ตัวอย่าง(a,b)=>{ return a+b }เหมือนกับ(a,b)=>a+b
edc65

4

Python 2, 466 , 460 , 449 , 452 , 459 449 ไบต์

เนื่องจากได้รับอนุญาตให้เป็นฟังก์ชั่นที่ยอมรับ h และ m เป็นจำนวนเต็มเราสามารถบันทึกไม่กี่ไบต์ ลองมันออนไลน์

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

ฉันมีคู่ของข้อบกพร่อง (ตอนนี้คงที่) กับตรรกะสำหรับTO/ VSPAST O'CLOCKนอกจากนี้ยังบันทึกไม่กี่ไบต์สำหรับenumerateเปลี่ยนimportและแทน19<m<26 m in [20,25]บันทึกไว้อีก 8 สำหรับการทำงานใน 5 ชิ้นต่อนาทีกว่านาที Rod ชี้ให้เห็นข้อบกพร่องเพิ่มเติมบางอย่างที่ทำให้ฉันมีค่าใช้จ่ายเล็กน้อย แต่ฉันกู้คืนได้เล็กน้อยด้วยการมอบหมายที่มีประสิทธิภาพมากขึ้นและตัวแก้ไขข้อบกพร่องที่ทำงานได้ตามความต้องการ


ใช้เคล็ดลับจากคำตอบ PHP ของ @Titus ฉันแพ้==การเปรียบเทียบของ python และฉันคิดว่าฉันสามารถปรับปรุงการhทดสอบบางอย่างได้
Chris H

คุณสามารถที่จะprint cอยู่ในบรรทัดสุดท้ายcได้a[i]กำหนดแล้วenumerate
ร็อด

1
รูปแบบการออกเสียprintเพิ่มขึ้นบรรทัดใหม่หลังจากที่แต่ละพิมพ์คุณสามารถระงับมันเพิ่มหลัง, cนอกจากนี้ควรพิมพ์ช่องว่างเมื่อไม่มีการพิมพ์คำคุณสามารถแก้ไขได้ด้วยวิธีอื่นถ้าหากelse:print' '*len(c),
Rod

1
ลำดับของไบต์จะดีกว่าถ้ามากไปหาน้อย
Gurupad Mamadapur

@Rod ขอบคุณสำหรับจุดบกพร่องถึงแม้ว่ามันจะทำให้มันอีกต่อไป
Chris H

2

Perl 6 , 308 296 293 ไบต์

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

นิพจน์ที่นำมา...|...|...|...ด้านบนเป็นจุดเชื่อมต่อของจำนวนเต็มซึ่งเป็นตัวแทนของดัชนีคำที่ใช้ 1 และประกอบด้วยดังนี้:

  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 ไบต์)

คำตอบนี้ต้องใช้เวลาในรูปแบบhh มม. (จำนวนเต็มคั่นด้วยช่องว่าง) ฉันได้พิมพ์ '\ n' ซึ่งได้รับแรงบันดาลใจจากวิธีการของ Chrisขอบคุณ Chris! ความช่วยเหลือในการลดรหัสใด ๆ ที่ชื่นชม

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

ลองใช้ออนไลน์


คุณสามารถรวม w เป็นสตริงเดียวแล้วใช้.split(',')หรือไม่ ควรบันทึกไว้เล็กน้อย
ElPedro

นำอินพุตของคุณเช่นเดียวกับH,M=input()ที่อินพุตคือ H, M สองลำดับจำนวนเต็มได้รับอนุญาตภายใต้กฎระเบียบที่ไม่แน่ใจว่านี้ทำงานตามที่ตั้งใจไว้ภายใต้หลาม 3. ฉันยังคงเป็นคนที่ 2 :-)
ElPedro

ขอบคุณ @ElPedro. บันทึก 57 ไบต์ H,M=input()ไม่ทำงานตามที่คุณสงสัย
EffyCoder

1

Python 2 , 443 440 ไบต์

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

ลองออนไลน์!

มันอาจจะยังคงได้ประโยชน์จากการเล่นกอล์ฟเพิ่มขึ้น อินพุตคือรายการจำนวนเต็มเช่น 7,23 = 7:23


1

SimpleTemplate , 737 708 ไบต์

ใช่การใช้คำฟุ่มเฟื่อยและการขาดคณิตศาสตร์ "ของจริง" ทำร้ายคนจำนวนมาก

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

สิ่งนี้คาดว่าชั่วโมงและนาทีเป็นพารามิเตอร์ที่ 1 และ 2 ในชั้นเรียน


Ungolfed:

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

วิธีการใช้งาน:

  1. รับรหัสจากhttps://github.com/ismael-miguel/SimpleTemplate
  2. เรียกใช้รหัสต่อไปนี้:

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


1

Java (OpenJDK 9) , 437 ไบต์

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

ลองออนไลน์!

ฉันคิดว่าในที่สุดฉันก็จะยิงที่ท้าทายของฉัน;)


1

Perl 5 , 487 449 ไบต์

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

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.