I'd like you to build me a clock that displays time in this format:
18 ----------
19 --------------------------------------------------
This displays '18:10'. The current hour and the next hour are shown at the front of the line, followed by a space and a number of dashes: on the first line the number of minutes that have passed in this hour, and the second line shows how many more minutes to go in this hour.
To clarify
- The clock should display the system's time. If fetching the time from another source is more convenient, that's fine too. It may not be supplied as input.
- At
18:00, the top line is just18(Trailing spaces allowed but not required) - At
18:59, the bottom line is19 - - The hours < 10 are either pre-padded with a
0(01 -----) or right-aligned (1 -----). A left-aligned single digit is not allowed, not even if the dashes start at the right place (1 -----is invalid). - The clock should display the hours in a 24h-format.
- Although it's called the 24h format, there is not actually a
24on it. During the 23rd hour, the second line starts with00or0. - The display needs to be updated at least once a minute, but that doesn't have to happen at exactly
00seconds. You may update more frequently / continuously if that is more convenient, but the result must of course still be legible - not one smear all over the screen.
Input
None.
Output
- As described above. Trailing spaces to pad the clock to 60-ish positions is allowed on both lines, a trailing newline is also allowed.
- The screen needs to be cleared when displaying the next minute: either with a clear-screen command or by adding no less than 30 newlines.
Additional rules
- Standard loopholes are forbidden
- code-golf, shortest answer in bytes wins.
-
\$\begingroup\$ may we have two spaces between the number and the dashes? \$\endgroup\$Adám– Adám2017年01月17日 16:48:59 +00:00Commented Jan 17, 2017 at 16:48
-
6\$\begingroup\$ "updated once a minute" -- Can it be updated more often? \$\endgroup\$smls– smls2017年01月17日 16:49:59 +00:00Commented Jan 17, 2017 at 16:49
-
2\$\begingroup\$ @smls Yes, you may update as often as you like. I'll change the specs to 'at least once a minute'. \$\endgroup\$steenbergh– steenbergh2017年01月17日 17:52:17 +00:00Commented Jan 17, 2017 at 17:52
-
1\$\begingroup\$ @KritixiLithos That would break alignment with two-digit hours (9, 10 or 23, 00), so no, not allowed. \$\endgroup\$steenbergh– steenbergh2017年01月17日 19:04:29 +00:00Commented Jan 17, 2017 at 19:04
-
1\$\begingroup\$ After 23, is the next hour 24 or 0? \$\endgroup\$user41805– user418052017年01月18日 15:43:40 +00:00Commented Jan 18, 2017 at 15:43
37 Answers 37
TI-Basic, 94 bytes
"
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
Relatively straightforward. That's a string with one space at the beginning. The hours are right-aligned. This only works on TI-84+ calculators since the TI-83 does not have an internal clock.
Edit: Thanks @kundor for noticing that I didn't close the last loop. Fixed now (+2 bytes).
Edit #2: First hour should be zero, not twenty-four. Corrected at a cost of +14 bytes.
-
\$\begingroup\$ Every command count as one byte ? \$\endgroup\$Sygmei– Sygmei2017年01月17日 16:39:48 +00:00Commented Jan 17, 2017 at 16:39
-
\$\begingroup\$ @Sygmei Most tokens are one byte, yes. However, tokens such as
Str1,getTime, andsub(are two bytes each. You can learn more at tibasicdev.wikidot.com/tokens \$\endgroup\$Timtech– Timtech2017年01月17日 16:41:04 +00:00Commented Jan 17, 2017 at 16:41 -
\$\begingroup\$ You wouldn't happen to have a link to an emulator, would you? \$\endgroup\$steenbergh– steenbergh2017年01月17日 16:43:41 +00:00Commented Jan 17, 2017 at 16:43
-
\$\begingroup\$ I would recommend cemetech.net/projects/jstified but do remember that it's morally wrong to use a ROM from the internet with this emulator unless you own that type of calculator yourself. \$\endgroup\$Timtech– Timtech2017年01月17日 16:45:43 +00:00Commented Jan 17, 2017 at 16:45
-
1\$\begingroup\$ Don't be scared to click the link, because the emulator is legit and asks you to upload your own ROM before it will work. TI used to have them freely available but they're not any more. If you can find a TI-84 from a friend, that would be the best option. \$\endgroup\$Timtech– Timtech2017年01月17日 16:51:32 +00:00Commented Jan 17, 2017 at 16:51
Batch, 197 bytes
@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%
Note: 10th line has a trailing space. For me, %time% formats hours with a leading space but minutes with a leading zero. I decided a leading zero was an easier output format, since all I have to do for that is to add 100 hours and remove the first digit. Minutes are trickier as 08 or 09 will cause octal parse errors, so I prefix a 1 effectively adding 100 minutes, adjusting for this by offsetting the loop appropriately, which is a byte shorter than subtracting the 100.
Python 3.6, (削除) 110 (削除ここまで) (削除) 114 (削除ここまで) 112 bytes
from time import*
while[sleep(9)]:h,m=localtime()[3:5];print('\n'*50+'%2d '%h+'-'*m+f'\n{-~h%24:2} '+'-'*(60-m))
This uses the new f-string formatting to save one byte (f'\n{h+1:2} ' vs '\n%2d '%(h+1).) You can change [sleep(9)] to 1 to save 8 bytes, but then it just spams the screen.
Saved one byte changing while 1:...;sleep 60 to while[sleep(60)]:..., thanks to TuukkaX.
I had to use 5 more bytes to get the next hour displayed after 23 to be 0, instead of 24, as OP just commented. :-(
Recovered one byte by only sleeping 9 seconds instead of 60.
Saved two bytes using a bit-fiddling to shorten (h+1)%24, borrowed from Value Ink's Ruby answer.
-
\$\begingroup\$ Could you please explain why you've put square brackets around the if condition? Wouldn't just having the space between while and sleep be 1 byte, as opposed to the 2 on either side? EDIT: Never mind, it's to make it truthy. Fair enough. \$\endgroup\$Shadow– Shadow2017年01月19日 03:22:54 +00:00Commented Jan 19, 2017 at 3:22
-
1\$\begingroup\$ @shadow:
sleepreturnsNone, which is falsy. \$\endgroup\$Nick Matteo– Nick Matteo2017年01月19日 03:24:32 +00:00Commented Jan 19, 2017 at 3:24 -
\$\begingroup\$ @ToivoSäwén:
sleepis also in thetimemodule, so importing * is better. \$\endgroup\$Nick Matteo– Nick Matteo2017年01月19日 16:50:33 +00:00Commented Jan 19, 2017 at 16:50
Ruby, (削除) 98 (削除ここまで) (削除) 95 (削除ここまで) 91 bytes
Updates every 5 seconds. Only works in Unix-style terminals.
loop{t=Time.now;puts`clear`+"%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}
Windows command prompt version, (削除) 95 (削除ここまで) 92 bytes:
loop{t=Time.now;puts"\e[H\e[2J%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}
-
\$\begingroup\$ Can you use backticks instead of system?
`cls`vssystem'cls'\$\endgroup\$IMP1– IMP12017年01月18日 10:14:59 +00:00Commented Jan 18, 2017 at 10:14 -
\$\begingroup\$ It seems not, but you can use
h=t.hourand then usehinstead of the secondt.hour, which saves 3 bytes. \$\endgroup\$IMP1– IMP12017年01月18日 10:26:24 +00:00Commented Jan 18, 2017 at 10:26 -
\$\begingroup\$ @IMP1 indeed, backticks don't work for
cls. Thanks for your other suggestion, though! \$\endgroup\$Value Ink– Value Ink2017年01月18日 11:53:04 +00:00Commented Jan 18, 2017 at 11:53 -
\$\begingroup\$ @IMP1 as it turns out,
puts`clear`is the way to go if you use Unix terminals. It just doesn't work with the Windows command promptcls. \$\endgroup\$Value Ink– Value Ink2017年01月18日 11:58:13 +00:00Commented Jan 18, 2017 at 11:58 -
\$\begingroup\$ For windows, you can
puts"\e[H\e[2J"to clear the console, which I think shaves four bytes. It would make your first line readloop{t=Time.now;puts"\e[H\e[2J%02d %s\$\endgroup\$IMP1– IMP12017年01月18日 12:03:48 +00:00Commented Jan 18, 2017 at 12:03
Perl 6, 113 bytes
loop {$_=DateTime.now;.put for |('' xx 30),|([\+](.hour,1)».fmt('%2s')Z('-' Xx[\-](.minute,60)».abs));sleep 60}
Try it once with a one second timeout.
Or try an altered version that outputs the result of running for several hours.
Expanded:
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
}
-
\$\begingroup\$ What operators does the 'triangle produce' support? In
[\+]it adds and in[\-]it seems to subtract. Does this work with multiplication and such? \$\endgroup\$Yytsi– Yytsi2017年01月17日 17:50:11 +00:00Commented Jan 17, 2017 at 17:50 -
\$\begingroup\$ @TuukkaX It should work with almost all infix operators. It is basically the same as
[+] LISTwhich is reduce, except it gives you the intermediate values. See the docs page for produce \$\endgroup\$Brad Gilbert b2gills– Brad Gilbert b2gills2017年01月17日 20:28:25 +00:00Commented Jan 17, 2017 at 20:28
QBasic, (削除) 120 (削除ここまで) (削除) 127 (削除ここまで) 121 bytes
(削除) Don't run this for very long or your laptop will catch fire. (削除ここまで) Now 99.several9s% more CPU-efficient.
CLS
m=TIMER60円
h=m60円
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
Ungolfed and explanation
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
We start by clearing the screen, then get the current hours and minutes from TIMER, which returns the number of seconds since midnight.
This is the first time I've tried PRINT USING, so I was delighted to discover that it doesn't suffer from the usual QBasic quirk that positive numbers are printed with a leading space. ## as the format specifier ensures that single-digit numbers are right-aligned and padded with a space, as required. We have to use a loop for the hyphens, unfortunately, since QBasic does not have a string repetition function. (If I'm mistaken, please let me know!)
All the PRINT statements end with ; to suppress the newline; but after the hyphens, we need a newline; thus, the solitary ? after the inner FOR loop.
The SLEEP 1 is now necessary. Without it, the screen gets cleared so quickly after printing that it's just a flickering mess. (I used LOCATE 1 instead of CLS at first for that reason, until I realized that CLS with SLEEP is shorter anyway.) RUN restarts the program from the top--the shortest way to get an infinite loop.
-
\$\begingroup\$ How does this handle the last hour of the day? Top line reads 23, but what;'s the hour on the bottom line? \$\endgroup\$steenbergh– steenbergh2017年01月17日 21:04:47 +00:00Commented Jan 17, 2017 at 21:04
-
\$\begingroup\$ I'm using the Note7 and thinking of running this program for the foreseeable future in place of my status bar clock. Is that a good idea? \$\endgroup\$owlswipe– owlswipe2017年01月17日 21:39:01 +00:00Commented Jan 17, 2017 at 21:39
-
\$\begingroup\$ @steenbergh Whoops, fixed. It would be helpful for you to mention that edge case in the question. \$\endgroup\$DLosc– DLosc2017年01月17日 22:03:18 +00:00Commented Jan 17, 2017 at 22:03
-
\$\begingroup\$ @DLosc Nah, I'm just joking :)). But yeah, smart!! \$\endgroup\$owlswipe– owlswipe2017年01月18日 00:16:11 +00:00Commented Jan 18, 2017 at 0:16
-
1\$\begingroup\$ @steenbergh He prints h MOD 24, if initially h=23 then the next loop cycle its 24 and gets modded to 0. But I'm curious if it works as well. The CLS clears the first line so there are never both printed lines on the screen, right? \$\endgroup\$Jens– Jens2017年01月18日 07:18:26 +00:00Commented Jan 18, 2017 at 7:18
Java 8, (削除) 313 (削除ここまで) (削除) 300 (削除ここまで) 299 bytes
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();}}
This only updates every 30 iterations of the while loop. The other 29 iterations just print new lines.
Updated
Saved (削除) 13 (削除ここまで) 14 bytes due to Kevin Cruijssen's help! Thanks!
-
\$\begingroup\$ Hi, welcome to PPCG! First of all, only programs/functions are allowed, and your current code is a snippet. You'll have to surround it with a method (i.e.
void f(){...}and need to add the imports it required (in your caseimport java.time.*;). That being said, your code can be golfed at multiple places to lower it to 311 bytes (even with the added method-declaration and import). (Since it's too long for this comment, I've placed it in the next comment.. xD) \$\endgroup\$Kevin Cruijssen– Kevin Cruijssen2017年01月18日 08:02:42 +00:00Commented Jan 18, 2017 at 8:02 -
\$\begingroup\$
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 bytes) I recommend reading Tips for Golfing in Java and Tips for golfing in <all languages>. Enjoy your stay. \$\endgroup\$Kevin Cruijssen– Kevin Cruijssen2017年01月18日 08:20:16 +00:00Commented Jan 18, 2017 at 8:20 -
\$\begingroup\$ @KevinCruijssen I updated my answer and was able to save 3 more bytes by using lambda notation. Also I changed a few pieces to the code you provided, as well, to meet the specifications (e.g.
for(i=0;i++<60instead of 61 and(h<10?instead of 9. Thanks for informing me about method declaration and some golfing tips! \$\endgroup\$CraigR8806– CraigR88062017年01月18日 12:36:26 +00:00Commented Jan 18, 2017 at 12:36 -
\$\begingroup\$ Ah, the 61 instead of 60 was indeed my mistake. I thought I had written it as
for(i=0;++i<61instead offor(i=0;i++<61(in this second case it should indeed be 60, and even though it's the same amount of bytes, it's probably more obvious/readable). Theh<9in my code is correct, though. You hadh+1<10before and I simply changed this toh<9by removing 1 on both sides. :) \$\endgroup\$Kevin Cruijssen– Kevin Cruijssen2017年01月18日 13:52:36 +00:00Commented Jan 18, 2017 at 13:52 -
1\$\begingroup\$ @KevinCruijssen Ha I didn't pick up on that!
h<9. I will edit it to save 1 more byte. Thanks again! \$\endgroup\$CraigR8806– CraigR88062017年01月18日 13:54:31 +00:00Commented Jan 18, 2017 at 13:54
C, (削除) 176 (削除ここまで) (削除) 162 (削除ここまで) (削除) 161 (削除ここまで) (削除) 160 (削除ここまで) 156 bytes
This is a gross abuse of pointers but compiles and runs as specified. Be sure to compile without optimization otherwise you are likely to hit a segfault.
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));}
Ungolfed:
#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));
}
}
JavaScript (ES6), 162 bytes
Updates once per second
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)
-
\$\begingroup\$ You can save quite a few bytes by restructuring the code so it is only one statement (it's possible to call
console.clear()inside theconsole.logargument) and assigning in unused parentheses as much as possible. Version for 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'+$:$))). \$\endgroup\$Luke– Luke2017年01月17日 19:56:07 +00:00Commented Jan 17, 2017 at 19:56 -
\$\begingroup\$ You can save a bunch of byte by putting the hours and minutes into a single function
m=>`0${h++} \.slice(-3)+'-'.repeat(m). \$\endgroup\$Neil– Neil2017年01月17日 21:31:07 +00:00Commented Jan 17, 2017 at 21:31
Python 2, (削除) 131 (削除ここまで) (削除) 129 (削除ここまで) 127 bytes
from time import*
while[sleep(9)]:exec(strftime("a='%H';b=int('%M')"));print "\n"*30+a+" "+"-"*b+"\n"+`int(a)+1`+" "+"-"*(60-b)
saved a byte thanks to @TuukkaX
-
2\$\begingroup\$ You don't need the newline and space after the
while 1:\$\endgroup\$2017年01月17日 19:02:27 +00:00Commented Jan 17, 2017 at 19:02 -
\$\begingroup\$ I started your code @19:55. At 20:01, I see
19 - \n 20 -----------------------------------------------------------. The hours aren't updating... \$\endgroup\$steenbergh– steenbergh2017年01月17日 19:02:40 +00:00Commented Jan 17, 2017 at 19:02 -
\$\begingroup\$ @steenbergh I tried it myself by setting the clock manually and it works for me. \$\endgroup\$ovs– ovs2017年01月17日 19:07:24 +00:00Commented Jan 17, 2017 at 19:07
-
\$\begingroup\$ @ovs aren't clock challenges fun :-). Anyway, probably something with repl.it then... \$\endgroup\$steenbergh– steenbergh2017年01月17日 19:09:13 +00:00Commented Jan 17, 2017 at 19:09
-
\$\begingroup\$ head-desk The Repl.it server is one hour behind to my local time... And it even says so at the very top of the console. I'll see myself out, thanks... \$\endgroup\$steenbergh– steenbergh2017年01月17日 19:14:36 +00:00Commented Jan 17, 2017 at 19:14
C (削除) 251 (削除ここまで) (削除) 267 (削除ここまで) 251 bytes
#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");}}
Ungolfed version
#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");
}
}
Gets the work done! Can definitely be shortened in some way.
Assume unistd.h file is included.
@Neil Thanks for the info.
@Seth Thanks, for saving 8 bytes.
-
\$\begingroup\$ IIRC you have to include everything necessary to get the code to compile (in this case, the definitions of
time_tandstruct tm) in your byte count. \$\endgroup\$Neil– Neil2017年01月17日 21:33:02 +00:00Commented Jan 17, 2017 at 21:33 -
\$\begingroup\$ Instead of
printf("\n");you can useputs("");\$\endgroup\$Seth– Seth2017年01月19日 04:04:47 +00:00Commented Jan 19, 2017 at 4:04
First time golfing...
Powershell, 116 bytes (was 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}
Edit: From @AdmBorkBork's advice, changed Get-Date to date, and Clear to cls, for a saving of 6 bytes.
-
\$\begingroup\$ Welcome to PPCG, good answer \$\endgroup\$george– george2017年01月19日 15:28:25 +00:00Commented Jan 19, 2017 at 15:28
-
\$\begingroup\$ Welcome to PPCG! A couple easy golfs -- you can use
clsinstead ofclearand (so long as you're on Windows)dateinstead ofget-date. I'm also sure there's some easier way to output the formatting -- I'm playing with it and I'll let you know if I come up with anything. \$\endgroup\$AdmBorkBork– AdmBorkBork2017年01月19日 18:19:20 +00:00Commented Jan 19, 2017 at 18:19 -
\$\begingroup\$ Nice. Try this: 108 bytes
while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}. Use LF line break in your editor instead ``n` \$\endgroup\$mazzy– mazzy2018年08月09日 21:57:26 +00:00Commented Aug 9, 2018 at 21:57
PHP, (削除) 104 (削除ここまで) 105 bytes
<? for(;;sleep(6))printf("%'
99s%2d %'-".($m=date(i))."s
%2d %'-".(60-$m).s,"",$h=date(H),"",++$h%24,"");
showcase for printf ́s custom padding characters:
"%'-Ns"=left pad string with - to N characters.
will print 99 newlines (every 6 seconds) instead of clearing the screen.
First newline must be a single character. So, on Windows, it must be replaced with \n.
MATL, 41 bytes
Thanks to @Kundor for noticing a mistake, now corrected
`XxFT"4&Z'@+24\OH&YAO'-'60@*5&Z'-|Y"hhD]T
Try it at MATL online! But note that the program is killed after 30 seconds, so it's difficult to catch any changes in the output.
How it works
` % 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
-
\$\begingroup\$ Could be me, but at the second iteration, only the top line is printed... \$\endgroup\$steenbergh– steenbergh2017年01月17日 17:28:08 +00:00Commented Jan 17, 2017 at 17:28
-
\$\begingroup\$ @steenbergh It works for me with minutes and seconds instead of hours and minutes, so the changes are easily seen: matl.suever.net/… \$\endgroup\$Luis Mendo– Luis Mendo2017年01月17日 17:56:12 +00:00Commented Jan 17, 2017 at 17:56
-
1\$\begingroup\$ Yep, works. - in fact, might be cool to have this as lines 3 and 4 of my own clock. \$\endgroup\$steenbergh– steenbergh2017年01月17日 18:01:15 +00:00Commented Jan 17, 2017 at 18:01
-
\$\begingroup\$ @steenbergh: you accepted this answer, but it's not valid—it shows the hour after 23 as 24. I believe the shortest correct answer is the Ruby one by Value Ink. \$\endgroup\$Nick Matteo– Nick Matteo2017年01月22日 23:06:37 +00:00Commented Jan 22, 2017 at 23:06
-
\$\begingroup\$ @kundor Thanks for noticing. Corrected at the cost of 3 bytes \$\endgroup\$Luis Mendo– Luis Mendo2017年01月23日 00:31:38 +00:00Commented Jan 23, 2017 at 0:31
GameMaker Language, 134 bytes
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)}
In the settings, you must be ignoring non-fatal errors in order for this to work. Also, in GML, # is equivalent to \n in most languages.
AWK, 190 bytes
#!/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}}
Since AWK doesn't have a built-in sleep function, I simply have it continually check the clock to see if the minute has changed yet. The key thing is that it works... right? :)
Python 3.5, (削除) 127 (削除ここまで) 120 (削除) 117 (削除ここまで) bytes
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\$\begingroup\$ Can you not just
print('\n'*50)instead ofos.system('cls')so it works on both *nix and Windows? Would save a couple of bytes as you can lose theosimport and OP says that this is allowed. \$\endgroup\$ElPedro– ElPedro2017年01月17日 20:57:42 +00:00Commented Jan 17, 2017 at 20:57 -
\$\begingroup\$ Oh, I didn't read it properly then. Thanks a lot man. \$\endgroup\$Gurupad Mamadapur– Gurupad Mamadapur2017年01月17日 21:25:13 +00:00Commented Jan 17, 2017 at 21:25
-
\$\begingroup\$ Just for info, most people tend to use <s></s> around their old byte count and then put the new byte count after it because it is interesting to see the progress as an answer is improved :-) Must try 3.5 some time. I'm still working with Python 2. \$\endgroup\$ElPedro– ElPedro2017年01月17日 21:57:59 +00:00Commented Jan 17, 2017 at 21:57
-
1\$\begingroup\$ @ElPedro Yea I forgot to do it. I'll edit now. \$\endgroup\$Gurupad Mamadapur– Gurupad Mamadapur2017年01月17日 21:59:31 +00:00Commented Jan 17, 2017 at 21:59
Python, (削除) 115 (削除ここまで) 113 bytes
saved a couple of bytes thanks to @kundor and @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)))
-
\$\begingroup\$ At least on my system, this doesn't erase underlying characters, so that the number of dashes on the second line doesn't go down as time passes. Also: you can save three bytes by putting your while loop on one line, and two bytes by changing the
:02formats to just:2. \$\endgroup\$Nick Matteo– Nick Matteo2017年01月17日 20:58:39 +00:00Commented Jan 17, 2017 at 20:58 -
2\$\begingroup\$ You can fix the issue described by @kundor in 1 byte by adding a space after the corresponding {}. \$\endgroup\$Phlarx– Phlarx2017年01月17日 21:23:19 +00:00Commented Jan 17, 2017 at 21:23
-
\$\begingroup\$ @kundor fixed! Thanks. I kept the
:02format to right-pad one digit hours with zeroes. \$\endgroup\$dfernan– dfernan2017年01月18日 08:35:25 +00:00Commented Jan 18, 2017 at 8:35 -
\$\begingroup\$ @kundor *left-pad one digit hours with zeroes. \$\endgroup\$dfernan– dfernan2017年01月18日 11:00:03 +00:00Commented Jan 18, 2017 at 11:00
-
\$\begingroup\$ @dfernan: Well,
:2left-pads with spaces, which the challenge says is OK. \$\endgroup\$Nick Matteo– Nick Matteo2017年01月18日 16:11:35 +00:00Commented Jan 18, 2017 at 16:11
C# Interactive (138 Bytes)
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\$\begingroup\$ Can you golf this down by 1) naming the date var
dinstead ofdt? and 2) usesleep(1e3)or999instead of1000? \$\endgroup\$steenbergh– steenbergh2017年01月18日 14:10:58 +00:00Commented Jan 18, 2017 at 14:10 -
\$\begingroup\$ @steenbergh see update \$\endgroup\$Matthew Layton– Matthew Layton2017年01月18日 14:13:33 +00:00Commented Jan 18, 2017 at 14:13
-
\$\begingroup\$ A few things... This is just a snippet not a method or program (not sure if it's valid in C# Interactive though), it is essentially a golfed version of my code, and if it is should have been commented as improvements not a separate solution (though this is speculation) and there are lots of small improvements you can make here, and do you even need the sleep? \$\endgroup\$TheLethalCoder– TheLethalCoder2017年01月18日 14:15:27 +00:00Commented Jan 18, 2017 at 14:15
-
\$\begingroup\$ @TheLethalCoder I specifically put C# Interactive because this works in the interactive console ONLY. This would not work as a standard C# program. \$\endgroup\$Matthew Layton– Matthew Layton2017年01月18日 14:16:53 +00:00Commented Jan 18, 2017 at 14:16
-
\$\begingroup\$ Also note that this won't work when the hour is 23 and when the minute is 0 \$\endgroup\$TheLethalCoder– TheLethalCoder2017年01月18日 14:21:04 +00:00Commented Jan 18, 2017 at 14:21
PHP, (削除) 112 (削除ここまで) 120 bytes
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,"-");
As there's no way to clear the screen (that I can find) I had to go with a pile of newlines. Also the question being updated to "at least" once a minute saves a byte with 9 instead of 60.
edit: @Titus noticed a bug in the padding of the second hour. Fixing it cost 8 bytes.
-
\$\begingroup\$ This displays warning text on stdout along with the correct output:
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. Anything on Meta about that? \$\endgroup\$steenbergh– steenbergh2017年01月17日 18:46:11 +00:00Commented Jan 17, 2017 at 18:46 -
\$\begingroup\$ @steenbergh That´s a notice; it will not be displayed if you use default values (command line parameter
-norerror_reporting(22519);\$\endgroup\$Titus– Titus2017年01月17日 19:39:30 +00:00Commented Jan 17, 2017 at 19:39 -
\$\begingroup\$ hours must be padded to length 2 \$\endgroup\$Titus– Titus2017年01月17日 20:27:11 +00:00Commented Jan 17, 2017 at 20:27
-
\$\begingroup\$ Good point, the
Hsetting for date goes from 00-23, but I forgot about it for the second hour. \$\endgroup\$user59178– user591782017年01月18日 15:51:14 +00:00Commented Jan 18, 2017 at 15:51 -
\$\begingroup\$ Save two bytes with physical linebreaks. \$\endgroup\$Titus– Titus2017年02月02日 03:08:44 +00:00Commented Feb 2, 2017 at 3:08
Bash (3 and 4): 90 bytes
d=(`sed s/./-/g<0ドル`);let `date +h=%H,m=%M`;echo $h ${d:0:m}'
'$[++h%24] ${d:m}
sleep 5
0ドル
Due to the use of 0ドル, this script must be put into a file, not pasted into an interactive bash shell.
The first command sets $d to 60 hyphens; it relies on the fact that the first line of this script is 60 characters long. This is three characters shorter than the next best thing I could come up with:
d=`printf %060d|tr 0 -`
If you don't want this to run your box out of PIDs or memory eventually, you can add eval to the beginning of the last line, which would make this 95 bytes.
-
\$\begingroup\$ Gives me the error
let: h=09: value too great for base (error token is "09"). Problem is that leading zeros are interpreted as octal constants, so 09 is invalid. \$\endgroup\$Nick Matteo– Nick Matteo2017年01月20日 16:26:38 +00:00Commented Jan 20, 2017 at 16:26 -
\$\begingroup\$ Hrm, that means my script is broken in several ways. Thanks. \$\endgroup\$Evan Krall– Evan Krall2017年01月26日 18:03:54 +00:00Commented Jan 26, 2017 at 18:03
BASH, (削除) 165 (削除ここまで) (削除) 141 (削除ここまで) 155 bytes
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\$\begingroup\$ I could save another 8 bytes removing the sleep, but I'm not comfortable with an indefinite while loop running on my computer without a sleep ;-) \$\endgroup\$pLumo– pLumo2017年01月17日 21:46:32 +00:00Commented Jan 17, 2017 at 21:46
-
\$\begingroup\$ Some optimizations: move
sleep 9to the condition of the while loop; remove the-in front of M in the format string on line 4. You also don't need to use $ in front of variable names in arithmetic expressions, so$((60-$m))can be$((60-m))\$\endgroup\$Evan Krall– Evan Krall2017年01月19日 00:52:43 +00:00Commented Jan 19, 2017 at 0:52 -
\$\begingroup\$ I'm not sure whether your math on line 9 is accurate:
h=23; echo $((10#$h+1))prints 24 for me. \$\endgroup\$Evan Krall– Evan Krall2017年01月19日 00:52:49 +00:00Commented Jan 19, 2017 at 0:52 -
\$\begingroup\$ Whats wrong with 24? \$\endgroup\$pLumo– pLumo2017年01月19日 06:34:12 +00:00Commented Jan 19, 2017 at 6:34
-
\$\begingroup\$ I need the -M because $((60-08)) gives an error. \$\endgroup\$pLumo– pLumo2017年01月19日 06:35:56 +00:00Commented Jan 19, 2017 at 6:35
Raku (aka Perl 6), 104 bytes
DateTime.now.&{"\ec{.hour.fmt: '%2s'} {'-'x.minute}\n{(.hour+1).fmt: '%2s'} {'-'x 60-.minute}"}.say xx*
Needs to be run on a ANSI compatible terminal so that the control sequence for resetting the terminal works.
Pretty basic (because the more obfuscated approaches I tried turned out longer):
DateTime.now.&{" "}.say xx*: Transform the current time into a string (see below) and say it, and repeat all of that an infinite number of times. The string is built like this:\ec: ANSI control code<ESC>cfor resetting the terminal, which clears the screen.{.hour.fmt: '%2s'}: hour, right-aligned to 2 columns- : space
{'-'x.minute}: dash repeated times the minute\n: newline{(.hour+1).fmt: '%2s'}: next hour, right-aligned to 2 columns- : space
{'-'x 60-.minute}: dash repeated times 60 minus the minute
Prolog (SWI), 154 bytes
S+N:-get_time(A),format_time(atom(O),S,A),atom_number(O,N).
:-repeat,"%H"+H,"%M"+M,format("~t~d~2+ ~|~45t~*+
~|~t~d~2+ ~|~45t~*+
",[H,H,M,M]),\+sleep(60).
Welp, what a mess.
Gura, 138 bytes
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);}
Pretty short and straightforward :)
-
\$\begingroup\$ Wow ... That's fast. Any tips on running Gura? Just downloaded the binaries, but running
Gura.exeand pasting in this code gives me a syntax errorsymbol k is not defined. \$\endgroup\$steenbergh– steenbergh2017年01月17日 16:17:01 +00:00Commented Jan 17, 2017 at 16:17 -
\$\begingroup\$ Forgot a semicolon ! You can try to run it again :) \$\endgroup\$Sygmei– Sygmei2017年01月17日 16:19:05 +00:00Commented Jan 17, 2017 at 16:19
-
1\$\begingroup\$ Does this update every minute? The console seems to run this code just once... \$\endgroup\$steenbergh– steenbergh2017年01月17日 16:30:50 +00:00Commented Jan 17, 2017 at 16:30
-
\$\begingroup\$ Woops, did not saw that part, should be working now ! \$\endgroup\$Sygmei– Sygmei2017年01月17日 16:38:29 +00:00Commented Jan 17, 2017 at 16:38
-
\$\begingroup\$ When it updates, it should either clear the screen or add 30 newlines. Man, I'm on your case... \$\endgroup\$steenbergh– steenbergh2017年01月17日 16:43:00 +00:00Commented Jan 17, 2017 at 16:43
Ok, haven't done a code golf in a while, so here goes my sad attempt :)
Unix Korn Shell: (削除) 177 (削除ここまで) (削除) 171 (削除ここまで) 170 bytes
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
-
\$\begingroup\$ spliced the 2 echos into 1, saved a few bytes ... (sleep 9 instead of sleep 10 saves 1 byte :P ) lol \$\endgroup\$Ditto– Ditto2017年01月17日 21:27:59 +00:00Commented Jan 17, 2017 at 21:27
Mathematica, 235 bytes
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]
Processing, (削除) 204 (削除ここまで) (削除) 200 (削除ここまで) (削除) 198 (削除ここまで) 197 bytes
5 bytes saved thanks to @L. Serné by using smarter ternaries
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();}
This outputs 30+ newlines for each update (which takes place when the frame gets updated)
Ungolfed
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();
}
-
\$\begingroup\$ Changing
((i=hour())<10?" ":"")+iinto((i=hour())>9?i:" "+i)would save 2B twice... Good luck with further golfing! \$\endgroup\$Luke– Luke2017年01月17日 20:14:09 +00:00Commented Jan 17, 2017 at 20:14 -
\$\begingroup\$ Another improvement that might work:
((i=hour()+1)>24?i=0:i)>9becomes(i=hour()+1)>9, sincehouroutputs a number in the range 0-23, and even with 1 added to that, it'll never be greater than 24. Also, you should move the increment ofiinside the condition in theforloop like you did in the very last loop. Should save 13B in total. \$\endgroup\$Luke– Luke2017年01月17日 22:57:35 +00:00Commented Jan 17, 2017 at 22:57 -
\$\begingroup\$ @L.Serné For the first point, I still have to include the ternary because 23+1 in a 24-hour clock becomes 0 (or at least I think). Next, if I move the increment of
iinside the condition of the for-loop,iwill start as1instead of0and I need to add one more bytei++<=minute()and the bytecount will still be the same. But nonetheless, thanks for helping me golf 1 more bytes :) \$\endgroup\$user41805– user418052017年01月18日 15:48:04 +00:00Commented Jan 18, 2017 at 15:48
C, 239 bytes
#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;}
Inspired by Seth's and Abel's entries, this will output 0 instead of 24 for the next hour, as required, and will use 30 lines to clear the screen.
SmileBASIC, 55 bytes
TMREAD OUT H,M,
CLS?H,"-"*M?(H+1)MOD 24,"-"*(60-M)EXEC.
Explanation:
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)
Note: SmileBASIC only has 50 columns of text, so it won't look good...