打印字时钟


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. 打印的时间为12h,但没有AM / PM。
  2. 四舍五入仅以分钟为单位(秒完全无关)。舍入到最接近的5的倍数。因此,例如,即使17:52:38实际上最接近17:55,但是由于秒数无关紧要,因此17:52实际上被舍入为17:50,并且打印的文本是“六到十分钟”(具有相关的间距)。因此,如果XX为5的倍数,XX则将从HH:(XX-2):00到HH:(XX + 2):59使用。MINUTES如果或在分钟部分点亮(在“ TO”或“ PAST”之前)FIVE,则必须出现该单词。TENTWENTY
  3. 所有不相关的单词都将替换为所需的任意空格,以将文本保留在上方模板中的位置。尾随空格可能会被修剪。必须保留与将文本保持在预期位置相关的空间。
  4. 尾随线也可能被修剪。仍需要出现相关的空行。例:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. 当这些值表示小时数时,请勿TEN在第一行或FIVE第三行上点亮。

  6. 您可以接受输入。如果您接受输入,则输入将是您想要的任何有效格式(字符串,整数列表,本地时间类型,语言支持等)的打印时间,但是如果参数不相关,则不允许使用到打印时间为止。如果不支持任何输入,则必须使用当前时间。如果两者都支持,那会更好,但是没有任何奖金;)
  7. 您的代码可能是程序,函数,lambda,但不是代码段。
  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 '17

Answers:


14

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

感谢@Christoph打高尔夫球以及他出色的发现!
他的帐户上至少有45个字节;16岁或以上受他启发。

奇迹团队!

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

遍历数据并检查当前索引是否在包含要点亮的单词的索引(映射为字母)的生成的字符串中;根据索引追加换行符或空格。

如果不使用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|0比短2个字节round($x/5)
  • 两次调用date(h)比将date结果分配给变量短一个字节。
  • 使用单个组件打散存储点亮指数的变量。
  • 点亮索引的字符串,而不是保存大约30个字节的数组。
  • $w<A比3个字节短$w=="\n"-确保分隔符后没有空格!
  • abs 在分钟字上节省了8个字节。
  • @Christoph,谢谢:从数字到字母的映射使分隔符变得过时,并允许再有一个字符串而不是数组。保存了23 + 8个字节
    使用下划线作为第一个索引,可以将其包括在“它是”替代项中;并且它使小时的报价过时了。
  • 1在小时图中复制该值将使模过时,而进行额外的高尔夫球运动则可节省10个字节。受到@Christoph的启发。
  • 计算换行符和空格,而不是对其进行硬编码,可以减少19个字节
  • 字符串的位逻辑节省7个字节:str_pad("",strlen($w))-> $w^$w^" "。(克里斯托夫)
  • 如果strtr第二个参数不是字符串,则将其解释为ASCII码。节省5个字节。

太好了!当确保问题可以解决时,我尝试使用Java实现此方法,但是最终结果变得如此复杂,以至于我放弃并使用了更长但更简单的方法!因此,恭喜我在失败的地方成功了;)
OlivierGrégoire17年

1
其余的打:$i++%3^($i<3)$i++%3^$i<3。我现在完全被浪费了。我会休息一下,直到有人匹配我们。这真的很有趣。感谢Titus的团队合作!
克里斯多夫(Christoph)

1
@Christoph你是... GREAT似乎很小。\ o /
泰特斯(Titus),

18

TI-Basic中,335个 334字节

由于TI-84 Calc具有8x16字母显示,因此它是8x15,因此非常完美。为了支持早于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...
Neil

2
我数了545个字节,您能启发我吗?
克里斯多夫(Christoph)

2
@Christoph找到了相关的元发布:meta.codegolf.stackexchange.com/a/4764/29637
Christoph

1
@OlivierGrégoire实际上,它与上一行完全无关。它所做的是将24小时制转换为12小时制,也转换为最近的小时数(例如,以分钟为单位的舍入)。基本上,在正常语言中,x+(y>32) mod 12如果比较产生的结果是1或0,则类似于TI-Basic。
Timtech '17

1
因此,@ Christoph似乎您通过该链接回答了您自己的问题,您仍然要我解释一下吗?如果要查看我从ASCII评分切换到标记化的位置,请查看版本4。
Timtech '17

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

这个怎么运作

整个时钟可以看作是23个LED,这些LED点亮或熄灭。因此,时钟状态为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             

我们为实现正确的单词而需要执行的分钟逻辑并不像乍一看那样简单。可能存在一个神奇的公式,但是我走了简单的路,决定只对每种可能的配置进行硬编码:

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
草莓

@草莓请参阅规则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例如,发生了什么)!我可能应该学一些:)
OlivierGrégoire17年

@OlivierGrégoire不幸的是,一个空间已经消失了,但是现在已经修复。
尼尔

4

JavaScript,567564551551542529527519字节

我不知道以小时和分钟为参数是否可以。您说的是“整数列表”。还算吗?

顺便说一句,这是我第一次打高尔夫球。你怎么看?


编辑:除以分钟节省了几个字节。谢谢,奥利维尔!


是的,该规则背后的思想是您可以接受参数,但前提是它们与输入有关,这是打印的时间。
奥利维尔·格雷戈尔

1
关于打高尔夫球,如果您考虑将分钟数除以5,则可能可以打高尔夫球一些字节。此外,您可能想c在函数内部移动。我猜您不应该这样丢失任何字节,但这会使它更像是一个片段而不是一个函数(至少对我来说,也许JS专家会说其他的话)。
奥利维尔·格雷戈尔

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什么?我可以看到您获得了所有非空白组(“ LED”),并根据为每个非空白组编写的条件将它们替换为空白。例如,h-2仅当时为假h == 2,因此我想您将其反转到某个地方?您能解释一下这是如何工作的吗?也许是对您的答案的修改?我真的很感激!
Hristiyan Dodov '17

更新-我几乎意识到您在做什么。您有一个由零和非零元素组成的数组,并且您i经常通过在每个正则表达式匹配之后将其递增来引用右一个。如果是事实,则将匹配的字符串替换为空格,否则将其保留原样。 我不明白一件事。 replace()使用指定函数的返回值(在这种情况下为箭头函数)。您在哪里返回值?我只是看到一个三元运算符。
Hristiyan Dodov '17

3
@HristiyanDodov仅由表达式组成的箭头函数仅返回该表达式的值。示例(a,b)=>{ return a+b }(a,b)=>a+b
edc65 '17

4

Python 2中, 466460449452459个 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/ PASTvs 逻辑时遇到了两个错误(现已修复)O'CLOCK。还保存了一些字节,用于enumerate更改import19<m<26而不是m in [20,25]。节省了另外8个工作时间,而不是5分钟的块评估程序。Rod指出了一些其他的错误,使我付出了很多代价,但我通过更高效的分配和对我有利的错误修复使自己有所恢复。


从@Titus的PHP答案中获取技巧。==作为比较,我输给了python ,我认为我可以改善一些h测试
Chris H

您可以print c在最后一行,c已经a[i]到期enumerate
Rod

1
输出格式已损坏,请print在每次打印后添加换行符,您可以禁止在,其后添加after c。同样,当没有打印单词时,它也应该打印空格,如果出现以下情况,您可以在最后用else修复else:print' '*len(c),
Rod

1
如果降序,则字节顺序更好。
Gurupad Mamadapur

@Rod,感谢它的bug点,尽管它的时间更长了
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 mm(空格分隔的整数)格式表示的时间。我设法打印了'\ 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输入。该规则允许使用两个整数序列,不确定在Python 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

SimpleTemplate737个 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}

这期望将小时和分钟作为类的第一和第二参数。


取消高尔夫:

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

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.