现在是时候挑战时钟了!


25

我希望您为我制造一个时钟,以这种格式显示时间:

18 ----------
19 --------------------------------------------------

这将显示“ 18:10”。当前小时和下一个小时显示在该行的前面,后跟一个空格和一些破折号:在第一行中,该小时中经过的分钟数,第二行显示了还有多少分钟在这个小时内去。

澄清

  • 时钟应显示系统时间。如果从其他来源获取时间更方便,那也很好。它可能不作为输入提供。
  • 18:00,最上面的行是18(允许但不要求尾随空格)
  • 18:59的底线是19 -
  • <10小时可以用001 -----)或右对齐( 1 -----)预先填充。即使破折号从正确的位置开始(1 -----无效),也不允许左对齐的一位数字。
  • 时钟应以24h格式显示小时。
  • 尽管它被称为24h格式,但实际上没有24。在第23小时内,第二行以00或开头 0
  • 显示至少需要每分钟更新一次,但这不必在精确的00几秒钟内进行。如果方便的话,您可以更频繁地/连续地进行更新,但是结果当然仍然必须清晰可辨-屏幕上不会出现任何拖尾现象。

输入项

没有。

输出量

  • 如上所述。两行都允许使用尾随空格将时钟填充到60位置,还允许尾随换行符。
  • 在显示下一分钟时,需要清除屏幕:使用清除屏幕命令或添加不少于30个换行符。

附加规则


在数字和破折号之间可以有两个空格吗?
亚当

6
“每分钟更新一次”-是否可以更频繁地更新?
smls

1
@smls是的,您可以随时更新。我将规格更改为“至少每分钟一次”。
steenbergh

1
@KritixiLithos这将中断两位数的小时对齐(9、10或23,00),所以不行,不允许。
steenbergh

1
23点之后,下一小时是24还是0?
Kritixi Lithos

Answers:


2

MATL,41字节

感谢@Kundor注意错误,现已更正

`XxFT"4&Z'@+24\OH&YAO'-'60@*5&Z'-|Y"hhD]T

在线尝试在MATL!但是请注意,该程序会在30秒后被终止,因此很难捕获输出中的任何更改。

怎么运行的

`           % Do...while
  Xx        %   Clear screen
  FT        %   Push [0 1]
  "         %   For each k in [0 1]
    4&Z'    %     Push current hour
    @+      %     Add k
    24\     %     Modulo 24. This transforms 24 into 0
    OH&YA   %     Convert to base-10 string with 2 digits
    O       %     Push 0. Concatenating with chars will convert this to char,
            %     and char(0) will be displayed as a space
    '-'     %     Push '-'
    60@*    %     Push 60*k
    5&Z'    %     Push current minute
    -|      %     Absolute difference. This gives current minute for k==0,
            %     or 60 minus that for k==1
    Y"      %     Repeat '-' that many times
    hh      %     Concatenate the top three elements into a string
    D      %      Display
  ]         %   End
  T         %   Push true
            % End (implicit). Since the top of the stack contains true, this
            % gives an infinite loop

可能是我,但是在第二次迭代中,只打印了第一行...
steenbergh

@steenbergh它对我有用,只需几分钟和几秒钟,而不是几小时和几分钟,因此更改很容易看到: matl.suever.net/...
路易斯Mendo

1
是的,工作。-实际上,将其作为我自己时钟的第3行和第4行可能会很酷。
斯坦伯格

@steenbergh:您接受了这个答案,但是它是无效的-它显示23以后的小时数是24。我相信最短的正确答案是Value Ink的Ruby。
尼克·马特奥

@kundor感谢您的注意。在3个字节的成本更正
路易斯Mendo

11

TI-Basic,94个字节

" 
Repeat 99<length(Ans
Ans+"-
End
Ans→Str1
Repeat 0
getTime
ClrDraw
Ans{Ans(1)≠24,1,1
Text(0,0,Ans(1),sub(Str1,1,1+Ans(2
Text(6,0,Ans(1)+1,sub(Str1,1,61-Ans(2
End

比较简单。那是一个字符串,开头有一个空格。时间是右对齐的。由于TI-83没有内部时钟,因此只能在TI-84 +计算器上使用。

编辑:感谢@kundor注意到我没有关闭最后一个循环。已修复(+2字节)。

编辑2:第一个小时应该为零,而不是二十四。已以+14字节为代价进行了更正。


每个命令都算作一个字节吗?
Sygmei

@Sygmei大多数令牌是一个字节,是的。然而,令牌如Str1getTime,和sub(是两个字节的每个。您可以在tibasicdev.wikidot.com/tokens
Timtech '17

您不会碰巧拥有仿真器的链接,对吗?
steenbergh

我建议使用cemetech.net/projects/jstified,但请记住,除非您自己拥有该类型的计算器,否则从道德上使用互联网上的ROM与此模拟器是错误的。
Timtech '17

1
不要害怕单击链接,因为仿真器是合法的,会要求您上传自己的ROM,然后它才能起作用。TI曾经免费提供它们,但现在不再可用。如果您可以从朋友那里找到TI-84,那将是最好的选择。
Timtech '17

9

批次,197个字节

@echo off
set/ah=100+%time:~0,2%,m=1%time:~3,2%
cls
call:l
set/ah=(h-3)%%24+100,m=260-m
call:l
timeout/t>nul 60
%0
:l
set s=%h:~1% 
for /l %%i in (101,1,%m%)do call set s=%%s%%-
echo %s%

注意:第10行有一个尾随空格。对我来说,%time%小时格式的前导空格,而分钟格式的前导零。我认为前导零是一种更简单的输出格式,因为我要做的就是增加100小时并删除第一个数字。分钟如棘手0809将导致八进制解析错误,所以前缀一个1有效加入100分钟,通过偏移适当地循环,这是一个字节比减去100较短的调整此。


7

蟒3.6,110个 114 112字节

from time import*
while[sleep(9)]:h,m=localtime()[3:5];print('\n'*50+'%2d '%h+'-'*m+f'\n{-~h%24:2} '+'-'*(60-m))

这使用新的f字符串格式来保存一个字节(f'\n{h+1:2} 'vs)'\n%2d '%(h+1)。您可以更改[sleep(9)]1挽救8个字节,但当时它只是修建垃圾屏幕。

保存一个字节更改 while 1:...;sleep 60while[sleep(60)]:...感谢TuukkaX,将为,为。

我不得不再使用5个字节才能使23点之后的下一小时显示为0,而不是24,正如OP刚刚评论的那样。:-(

通过仅休眠9秒而不是60秒恢复一个字节。

(h+1)%24Value Ink的Ruby答案借用了位修饰来节省了两个字节。


您能解释一下为什么要在if条件周围加上方括号吗?难道不只是在while和sleep之间留出1个字节的空间,而不是在两侧留出2个字节的空间?编辑:没关系,这是事实。很公平。
阴影阴影

1
@shadow:sleep返回None,这是虚假的。
尼克·马特奥

@ToivoSäwén:sleep也在time模块中,因此导入*更好。
尼克·马特奥

5

Ruby,98 95 91字节

每5秒更新一次。仅适用于Unix风格的终端。

loop{t=Time.now;puts`clear`+"%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}

Windows命令提示符版本,95 92字节:

loop{t=Time.now;puts"\e[H\e[2J%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}

您可以使用反引号代替系统吗?`cls`vssystem'cls'
IMP1

似乎没有,但是您可以使用h=t.hour,然后使用h代替第二个t.hour,它可以节省3个字节。
IMP1

@ IMP1实际上,反引号不适用于cls。不过,感谢您的其他建议!
价值墨水

事实证明,puts`clear`如果使用Unix终端,@ IMP1 是必经之路。它不适用于Windows命令提示符cls
价值墨水

对于Windows,您可以puts"\e[H\e[2J"清除控制台,我认为它可以节省四个字节。这会使您的第一行显示为loop{t=Time.now;puts"\e[H\e[2J%02d %s
IMP1

4

Perl 6、113字节

loop {$_=DateTime.now;.put for |('' xx 30),|([\+](.hour,1)».fmt('%2s')Z('-' Xx[\-](.minute,60)».abs));sleep 60}

一秒钟超时尝试一次

或尝试更改版本以输出运行几个小时的结果。

展开:

loop {                  # keep repeating forever

  $_ = DateTime.now;    # assign an object representing the current time

    .put                # print with trailing newline
                        # ( adds a space between numbers and dashes )

  for                   # for each of the following

    |(                  # make it a slip so that it is all part of one list

      '' xx 30          # 30 empty strings (30 empty lines)
    ),

    |(

        [\+](           # triangle produce
          .hour,        # the hour
          1             # the hour plus one

        )».fmt( '%2s' ) # both formatted to two element string ( space padded )

      Z                 # zipped with

        (
            '-'         # a dash

          Xx            # cross (X) using string repeat (x) operator

            [\-](       # triangle produce
              .minute,  # the minute
              60        # the minute minus 60

            )».abs      # absolute value of both
        )
    );

  sleep 60              # wait until the next minute
}

“三角形产生”支持哪些运算符?在[\+]增加和[\-]减少之间。这可以和乘法一起使用吗?
Yytsi '17

@TuukkaX它应该与几乎所有infix运算符一起使用。它与[+] LISTreduce 基本上相同,除了它为您提供中间值。有关农产品的信息,
Brad Gilbert b2gills

4

QBasic中,120个 127 121字节

请勿长时间运行,否则笔记本电脑会着火。现在,CPU效率提高了99.several9s%。

CLS
m=TIMER\60
h=m\60
m=m MOD 60
FOR i=1TO 2
?USING"## ";h MOD 24;
FOR j=1TO m
?"-";
NEXT
?
h=h+1
m=60-m
NEXT
SLEEP 1
RUN

脱节和解释

DO
    CLS
    totalMinutes = TIMER \ 60
    hour = totalMinutes \ 60
    minute = totalMinutes MOD 60

    FOR row = 1 TO 2
        PRINT USING "## "; hour MOD 24;
        FOR j = 1 TO minute
            PRINT "-";
        NEXT j
        PRINT

        hour = hour + 1
        minute = 60 - minute
    NEXT row

    SLEEP 1
LOOP

我们先清除屏幕,然后从 TIMER,这将返回自午夜以来的秒数。

这是我第一次尝试PRINT USING,所以我很高兴发现它不会受到通常的QBasic怪异的困扰,即正数印有前导空格。##作为格式说明符,可确保根据需要将一位数字右对齐并用空格填充。不幸的是,由于QBasic没有字符串重复功能,我们必须对连字符使用循环。(如果我弄错了,请告诉我!)

所有PRINT语句都;以禁止换行符结尾;但是在连字符后,我们需要换行符;因此,?FOR循环之后是孤独的。

现在SLEEP 1是必须的。没有它,打印后屏幕很快就会被清除,以至于只是一团糟。(出于这个原因,我最初使用LOCATE 1而不是使用CLS它,直到我意识到CLSwith SLEEP总是更短。)RUN从顶部重新启动程序,这是获得无限循环的最短方法。


如何处理一天的最后一小时?顶行显示为23,但底行是几小时?
斯坦伯格

我正在使用Note7,并考虑在可预见的将来运行该程序来代替状态栏时钟。这是一个好主意吗?
猫头鹰

@steenbergh糟糕,已修复。在问题中提到这种极端情况将对您有所帮助。
DLosc

@DLosc Nah,我只是在开玩笑:))。但是,是的,聪明!
owlswipe

1
@steenbergh他打印h MOD 24,如果最初是h = 23,则下一个循环将其循环为24,并修改为0。但是我很好奇它是否也能正常工作。CLS清除第一行,因此屏幕上永远不会同时显示两个打印行,对吗?
詹斯(Jens)

4

Java的8,313个 300 299字节

import java.time.*;()->{for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>30){c=0;String l="",u,d;for(i=0;i++<60;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}

这只会在while循环中每30次迭代更新一次。其他29个迭代仅打印新行。

更新

在凯文·克鲁伊森(Kevin Cruijssen)的帮助下,节省了13个 14字节!谢谢!


嗨,欢迎来到PPCG!首先,仅允许使用程序/功能,并且您当前的代码为摘录。您必须用一种方法将它包围起来(即void f(){...},需要添加所需的导入(在您的情况下import java.time.*;)。也就是说,您的代码可以在多个地方使用,以将其降低到311个字节(即使使用添加的方法) -声明和导入)(由于此评论的时间太长,我将其放在下一个评论中
。.xD

import java.time.*;void f(){for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>99){c=0;String l="",u,d;for(i=0;i++<61;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}303字节)我建议阅读Java 高尔夫技巧<all language>高尔夫技巧。入住愉快。
凯文·克鲁伊森

@KevinCruijssen我更新了我的答案,并使用lambda表示法节省了3个字节。另外,我还更改了一些代码,以符合规范要求(例如,for(i=0;i++<60代替61而(h<10?不是9)。感谢您向我介绍方法声明和一些打高尔夫球的技巧!
CraigR8806

啊,61而不是60确实是我的错误。我以为是我写的,for(i=0;++i<61而不是for(i=0;i++<61(在第二种情况下,它的确应该是60,即使字节数相同,也可能更明显/可读)。不过h<9,我的代码中的正确。您以前有h+1<10过,我只是h<9通过在两侧都删除1 来将其更改为。:)
Kevin Cruijssen

1
@KevinCruijssen哈,我没有接!h<9。我将对其进行编辑以节省1个字节。再次感谢!
CraigR8806

4

C,176个 162 161 160 156字节

这是一个 对指针严重滥用,但是会按照指定的方式进行编译和运行。确保编译时没有优化,否则您可能会遇到段错误。

main(){int*localtime(),b[9],*t;memset(b,45,60);for(;;)time(&t),t=localtime(&t),usleep(printf("\e[2J%.2d %.*s\n%.2d %.*s\n",t[2],t[1],b,t[2]+1,60-t[1],b));}

取消高尔夫:

#import<time.h>
main()
{
 int *t,b[60];
 memset(b,45,60);
 for(;;) {
  time(&t);
  t=localtime(&t);
  usleep(printf("\e[2J%.2d %.*s\n%.2d %.*s\n",t[2],t[1],b,t[2]+1,60-t[1],b));
 }
}

3

JavaScript(ES6),162个字节

每秒更新一次

setInterval(c=>{c.clear(d=new Date,m=d.getMinutes(),h=d.getHours(),H=_=>`0${h++}`.slice(-2)),c.log(H()+` ${'-'.repeat(m)}
${H()} `+'-'.repeat(60-m))},1e3,console)


通过重组代码,您可以节省很多字节,所以它只是一个语句(可以console.clear()console.log参数内部调用)并尽可能多地分配未使用的括号。154B版本:setInterval(c=>c.log(H(h,c.clear(d=new Date))+` ${'-'.repeat(m)} ${H(h+1)} `+'-'.repeat(60-m)),1e3,console,m=d.getMinutes(h=d.getHours(H=$=>$<9?'0'+$:$)))
路加福音

通过将小时和分钟放入单个函数中,可以节省很多字节m=>`0${h++} \.slice(-3)+'-'.repeat(m)
尼尔

3

Python 2中,131个 129 127字节

from time import*
while[sleep(9)]:exec(strftime("a='%H';b=int('%M')"));print "\n"*30+a+" "+"-"*b+"\n"+`int(a)+1`+" "+"-"*(60-b)

@TuukkaX节省了一个字节


2
while 1:
Wheat Wizard

我从19:55开始您的代码。在20:01,我看到了19 - \n 20 -----------------------------------------------------------。时间没有更新……
steenbergh

@steenbergh我自己手动设置了时钟,对我有用。
ovs

@ovs并不是时钟挑战的乐趣:-)。无论如何,然后可能是带有repl.it的东西……
steenbergh

总部 Repl.it服务器比我的本地时间晚了一个小时...甚至在控制台的顶部也是如此。我会告诉自己的,谢谢...
steenbergh

3

Ç 251 267 251字节

 #include<time.h>f(){time_t t;struct tm *t1;h,m,i;while(1){time(&t);t1=localtime(&t);h=t1->tm_hour;m=t1->tm_min;printf("%d ",h);for(i=1;i<=m;i++)printf("-");puts("");printf("%d ",h+1);for(i=0;i<=59-m;i++)printf("-");puts("");sleep(1);system("clear");}}

非高尔夫版本

#include<time.h>
void f()
{
 time_t t;
 struct tm *t1;
 int h,m,i;

 while(1)
 {
  time(&t);     
  t1=localtime(&t);
  h=t1->tm_hour;
  m=t1->tm_min;

  printf("%d ",h);
  for(i=1;i<=m;i++)
   printf("-");

  puts("");
  printf("%d ",h+1);

  for(i=0;i<=59-m;i++)
   printf("-");

  puts("");    

  sleep(1);
  system("clear");    
 }
}

完成工作!绝对可以以某种方式缩短。假设unistd.h包括文件。

@Neil感谢您的信息。

@Seth感谢您保存8个字节。


IIRC你必须包括一切必要让代码编译(在这种情况下,定义time_tstruct tm)在你的字节数。
尼尔

取而代之的是,printf("\n");您可以使用puts("");
赛斯

3

第一次打高尔夫球...

Powershell,116个字节(之前为122个字节)

while($d=date){$f="{0:D2}";$h=$d.Hour;$m=$d.Minute;cls;"$($f-f$h)$("-"*$m)`n$($f-f(++$h%24))$("-"*(60-$m))";Sleep 9}

编辑:根据@AdmBorkBork的建议,将Get-Date更改为日期,并将Clear更改为cls,以节省6个字节。


欢迎使用PPCG,好答案
乔治

欢迎来到PPCG!一对夫妇轻松打高尔夫球-你可以使用cls,而不是clear和(只要你使用的是Windows)date来代替get-date。我还确定有一些更简单的方法来输出格式-我正在使用它,如果有什么建议,我会通知您。
AdmBorkBork

真好 试试这个:108个字节while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}。在编辑器中使用LF换行符代替“ n”
mazzy

3

PHP,104个 105字节

<? for(;;sleep(6))printf("%'
99s%2d %'-".($m=date(i))."s
%2d %'-".(60-$m).s,"",$h=date(H),"",++$h%24,"");

用于展示printf的自定义填充字符:
"%'-Ns"=左垫字符串-N字符。

将打印99行(每6秒)换行符,而不是清除屏幕。

第一换行符必须是单个字符。因此,在Windows上,必须将其替换为\n


2

GameMaker语言,134个字节

s=" "while 1{s+="-"a=current_hour b=current_minute draw_text(0,0,string(a)+string_copy(s,1,b+1)+"#"+string(a+1)+string_copy(s,0,61-b)}

在设置中,您必须忽略非致命错误才能使其正常运行。同样,在GML中,#等效\n于大多数语言。


2

Perl 6、104字节

DateTime.now.&{"\ec{.hour.fmt: '%2s'} {'-'x.minute}\n{(.hour+1).fmt: '%2s'} {'-'x 60-.minute}"}.say xx*

需要在ANSI兼容终端上运行,以便重置终端的控制序列起作用。

很基本(因为我尝试的方法更加混淆):

  • DateTime.now.&{" "}.say xx*:将当前时间转换为字符串(请参见下文)并说出来,然后重复所有无穷多次。字符串是这样构建的:
    • \ec<ESC>c用于重置终端的ANSI控制代码,可清除屏幕。
    • {.hour.fmt: '%2s'}:小时,右对齐2列
    • : 空间
    • {'-'x.minute}:短划线重复分钟
    • \n: 新队
    • {(.hour+1).fmt: '%2s'}:下一小时,右对齐2列
    • : 空间
    • {'-'x 60-.minute}:重复破折号60减去分钟

2

AWK,190字节

#!/bin/awk -f
func p(x,y,c){printf("%2s ",x)
for(j=0;j<y;j++)printf(c)
print}BEGIN{for(;;){split(strftime("%H %M"),t)
m=t[2]
if(o!=m){p(a,30,"\n")
p(t[1],m,"-")
p((t[1]+1)%24,60-m,"-")}o=m}}

由于AWK没有内置sleep功能,因此我只是不断地检查时钟以查看分钟是否已更改。关键是它可以工作...对吗?:)


2

蟒3.5,127个 120 117字节

from time import*
while[sleep(9)]:h,m=localtime()[3:5];print('\n'*88,*['%2d '%x+'-'*y+'\n'for x,y in[(h,m),(h+1,60-m)]])

1
你不能只是print('\n'*50)代替os.system('cls')所以它适用于双方的* nix和Windows?将节省几个字节,因为您可能会丢失os导入,OP表示允许这样做。
ElPedro

哦,那我当时没看清楚。非常感谢。
Gurupad Mamadapur

仅出于信息方面的考虑,大多数人倾向于在旧字节数之前使用<s> </ s>,然后在其后放置新字节数,因为有趣的是,随着答案的改进,可以看到进度:-)必须尝试3.5倍时间。我仍在使用Python2。–
ElPedro

1
@ElPedro是的,我忘记这样做了。我现在编辑。
Gurupad Mamadapur

2

Python,第115个 113字节

@kundor和@Phlarx节省了几个字节

import time
while 1:h,m=time.localtime()[3:5];print("\x1b[0;H{:02} {}\n{:02} {} ".format(h,"-"*m,h+1,"-"*(60-m)))

至少在我的系统上,这不会删除基础字符,因此第二行的破折号不会随着时间的流逝而减少。另外:您可以通过将while循环放在一行上来节省三个字节,并通过将:02格式更改为just 来节省两个字节:2
Nick Matteo

2
您可以通过在相应的{}之后添加一个空格来解决@kundor在1个字节中描述的问题。
Phlarx

@kundor固定!谢谢。我将:02格式保留为零,右数字一位小时。
dfernan '17

@kundor *左键输入零的数字小时。
dfernan'1

@dfernan:好吧,:2左边有空格,挑战说还可以。
尼克·马特奥

2

C#交互式(138字节)

while(true){var d=DateTime.Now;Console.WriteLine($"{d.Hour:00} {new string('-',d.Minute)}\n{d.Hour+1:00} {new string('-',60-d.Minute)}");}

1
您是否可以通过以下方式打高尔夫球:1)将日期命名为var d而不是dt?和2)使用sleep(1e3)999代替1000
steenbergh

@steenbergh查看更新
series0ne

几件事...这只是一个片段,而不是方法或程序(虽然不确定它在C#Interactive中是否有效),它实质上是我的代码的简化版本,如果应该将其注释为改进而不是单独的解决方案(尽管这是推测),您可以在此处进行很多小的改进,您甚至需要睡觉吗?
TheLethalCoder

@TheLethalCoder我专门放置了C#Interactive,因为它只能在交互式控制台中使用。这不能作为标准C#程序使用。
series0ne

另请注意,当小时为23且分钟为0时,此功能将不起作用
TheLethalCoder

2

PHP,112120字节

for(;;sleep(9))echo($s=str_pad)($h=date(H),99,"\n",0).$s(" ",1+$m=date(i),"-")."\n".$s(++$h%24,2,0,0).$s(" ",61-$m,"-");

由于无法清除屏幕(我可以找到),因此不得不使用一堆换行符。同样,每分钟更新为“至少”一次的问题将保存一个字节,9而不是60

编辑:@Titus注意到第二个小时的填充中的错误。修复它需要8个字节。


这将在stdout上显示警告文本以及正确的输出:Notice: Use of undefined constant str_pad - assumed 'str_pad' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant H - assumed 'H' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant i - assumed 'i' in C:\wamp64\www\my-site\a.php on line 2。关于Meta的任何信息?
steenbergh

@steenbergh这是一个通知;如果使用默认值(命令行参数-nerror_reporting(22519);
Titus,

小时必须填充为长度2
Titus

好的,H日期设置从00-23开始,但是第二个小时我忘记了。
user59178

使用物理换行符保存两个字节。
泰特斯

2

Bash(3和4):90个字节

d=(`sed s/./-/g<$0`);let `date +h=%H,m=%M`;echo $h ${d:0:m}'
'$[++h%24] ${d:m}
sleep 5
$0

由于使用$0,必须将此脚本放入文件中,而不是粘贴到交互式bash shell中。

第一个命令设置$d为60个连字符。它依赖于此脚本的第一行长60个字符的事实。这比我能想到的下一个最佳选择短三个字符:

d=`printf %060d|tr 0 -`

如果您不希望它最终使框用完PID或内存,则可以添加eval到最后一行的开头,这将使这95个字节成为可能。


给我错误let: h=09: value too great for base (error token is "09")。问题在于前导零被解释为八进制常量,因此09无效。
尼克·马特奥

嗯,这意味着我的脚本在几种方面被破坏了。谢谢。
埃文·克拉尔

2

BASH,165个 141 155字节

while :
do
clear
m=`date +%-M`
a=`printf %${m}s`
b=`printf %$((60-m))s`
h=`date +%H`
echo $h ${a// /-}
printf "%02d %s" $((10#$h+1)) ${b// /-}
sleep 9
done

1
我可以再节省8个字节来消除睡眠,但是我对在计算机上运行不定时间的while循环感到不舒服;-)
pLumo

一些优化:移动sleep 9到while循环的条件;删除第-4行格式字符串中M的前面。您也不需要在算术表达式中的变量名之前使用$,因此$((60-$m))可以是$((60-m))
Evan Krall

我不确定第9行的数学是否正确:h=23; echo $((10#$h+1))为我打印24。
埃文·克拉尔

24怎么了?
pLumo '17

我需要-M,因为$((60-08))给出错误。
pLumo '17

1

古拉,138个字节

k(a,b)={if(a<10){a="0"+a;}println(a," ","-"*b)};repeat{t=datetime.now();k(t.hour,t.min);k(t.hour+1,60-t.min);os.sleep(60);print("\n"*30);}

相当简短明了:)


哇...好快。关于运行Gura的任何提示?刚刚下载了二进制文件,但是运行Gura.exe并粘贴此代码给我带来了语法错误symbol k is not defined
steenbergh

忘了分号!您可以尝试再次运行它:)
Sygmei

1
这会每分钟更新一次吗?控制台似乎只运行一次此代码...
steenbergh

哎呀,没看到那部分,应该现在工作!
Sygmei

更新时,它应该清除屏幕或添加30个换行符。老兄,我在你的案子上……
steenbergh

1

好的,已经有一段时间没有进行代码高尔夫了,所以这是我可悲的尝试:)

UNIX Korn外壳:177 171 170字节

while :
do
clear
h=`date +%H`
m=`date +%M`
d=-----
d=$d$d$d$d
d=$d$d$d
a=`echo $d|cut -b-$m`
let m=60-$m
b=`echo $d|cut -b-$m`
let i=h+1
echo "$h $a\n$i $b"
sleep 9
done

将2个回波拼接成1个,节省了几个字节...(用sleep 9代替sleep 10保存了1个字节:P)大声笑
同上,2017年

1

Mathematica,235个字节

d=UpdateInterval;e=Dynamic;f=Refresh;g=AbsoluteTime;Grid[Partition[Riffle[e[f[Floor@Mod[g[]/3600+#,24],d->1]]&/@{0,1},With[{t=#},e[f[""<>Array["-"&,If[t==60,60-#,#]]&@Setting@Floor@Mod[g[]/60+#,60],d->1]]]&/@{0,60}],2],Alignment->Left]

1

处理中,204 200 198 197字节

@L节省了5个字节。通过使用更智能的三元体系

void draw(){int i;String s=((i=hour())>9?i:" "+i)+" ";for(i=0;i<minute();i++)s+="-";s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";for(i=0;i<60-minute();i++)s+="-";print(s);for(;i++<99;)println();}

每次更新输出30多个换行符(当框架更新时发生)

不打高尔夫球

void draw(){
  int i;
  String s=((i=hour())>9?i:" "+i)+" ";
  for(i=0;i<minute();i++)
    s+="-";
  s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";
  for(i=0;i<60-minute();i++)
    s+="-";print(s);
  for(;i++<99;)
    println();
}

更改((i=hour())<10?" ":"")+i((i=hour())>9?i:" "+i)将节省2B两次......祝你好运与进一步高尔夫!
路加福音

@ L.Serne感谢您的提示:)
Kritixi Lithos

可能起作用的另一个改进:((i=hour()+1)>24?i=0:i)>9变为(i=hour()+1)>9hour有用的,因为输出的数字范围为0-23,即使加上1,也永远不会大于24。而且,您应该ifor循环中移动条件内部的增量就像您在最后一个循环中所做的一样。总共应该节省13B。
路加福音

@L.Serné首先,我仍然必须包括三进制,因为24小时制中的23 + 1变为0(或者至少我认为)。接下来,如果我i在for循环的条件下移动了内部的增量,i则将从开始,1而不是,0我需要再添加一个字节i++<=minute(),字节数仍将相同。但是,尽管如此,感谢您帮助我
再打

1

C,239字节

#include<time.h>
#include<unistd.h>
#define F printf(
void d(n,p){for(;n--;F"%c",p));}int main(){time_t*t;for(;;){d(30,10);time(t);int*m=localtime(t);F"%2d ",m[2]);d(m[1],45);F"\n%2d ",(m[2]+1)%24);d(60-m[1],45);F"\n");sleep(1);}return 0;}

受塞思(Seth)和亚伯(Abel)条目的启发,根据需要,此函数将在下一个小时输出0而不是24,并将使用30行清除屏幕。


1

SmileBASIC,55个字节

TMREAD OUT H,M,
CLS?H,"-"*M?(H+1)MOD 24,"-"*(60-M)EXEC.

说明:

TMREAD OUT HOUR,MINUTE,
CLS
PRINT HOUR,"-"*MINUTE
PRINT (HOUR+1) MOD 24,"-"*(60-MINUTE)
EXEC 0 'runs the code stored in slot 0 (the default)

注意:SmileBASIC只有50列文字,因此看起来不太好...


1

C#181 176

for(;;){Console.Clear();var t=DateTime.Now;var h=t.Hour;var m=t.Minute;Console.Write("{0,2} {1}\n{2,2} {3}",h,"".PadLeft(m,'-'),++h%24,"".PadLeft(60-m,'-'));Thread.Sleep(100);}

此代码假定包含该using System.Threading;行。

全班:

class Program
{
    static void Main(string[] args)
    {
        Console.Title = string.Format("Started the app at: {0}", DateTime.Now.TimeOfDay);
        //new Timer((o) => { Console.Clear(); var t = DateTime.Now; var h = t.Hour; var m = t.Minute; Console.Write("{0,2} {1}\n{2,2} {3}", h, "".PadLeft(m, '-'), ++h % 24, "".PadLeft(60 - m, '-')); }, null, 0, 60000);

        for (; ; ) { Console.Clear(); var t = DateTime.Now; var h = t.Hour; var m = t.Minute; Console.Write("{0,2} {1}\n{2,2} {3}", h, "".PadLeft(m, '-'), ++h % 24, "".PadLeft(60 - m, '-')); Thread.Sleep(100); }

        Console.ReadKey(true);
    }
}

该解决方案无法退出循环(原始的,注释的代码在单独的线程上运行),因此该Console.ReadKey语句是多余的。退出的唯一方法是关闭控制台窗口,或Ctrl+Break...
nurchi

这只是一个代码片段,不是方法或程序,using System.Threading;如果使用它,也需要包含在字节数中。与相同Using System;
TheLethalCoder
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.