एक साधारण स्टॉपवॉच को लागू करें


25

चुनौती

आपका कार्य एक कार्यक्रम लिखना है, जो एक बार एक सेकंड (आपके कार्यक्रम शुरू होने पर तुरंत सहित), उस समय से बीत चुके समय को प्रिंट करता है जब आपका कार्यक्रम शुरू किया गया था।

नियम

  • समय hh:mm:ssप्रारूप में मुद्रित होना चाहिए । (एकल अंकों के मूल्यों के लिए अग्रणी शून्य)
  • समय टिकटों को सीआर, एलएफ या सीआरएलएफ द्वारा अलग किया जाना चाहिए। (कोई प्रमुख व्हाट्सएप नहीं)
  • प्रत्येक सेकंड में एक नया समय दिखाई देना चाहिए। (स्टडआउट को एक सेकंड के लिए बफर नहीं किया जा सकता है)
  • कार्यक्रम का व्यवहार यदि इसे 23:59:59 से पहले चलाया जाता है तो अपरिभाषित है।
  • sleep(1)जब भी ओवरहेड को प्रिंट करने, गणना करने, लूप इत्यादि जमा करने के लिए एक विशिष्ट सेकंड को छोड़ा जा सकता है, तब भी आप इसका उपयोग कर सकते हैं ।

उदाहरण आउटपुट:

00:00:00
00:00:01
00:00:02
00:00:04
00:00:05
⋮

ध्यान दें कि 00:00:03ओवरहेड प्रसंस्करण के कारण यहां गायब है। वास्तविक छोड़े गए मूल्य (यदि हो तो) निश्चित रूप से कार्यान्वयन और / या प्रणाली पर निर्भर हैं।

C में संदर्भ कार्यान्वयन: (केवल POSIX- संगत सिस्टम)

#include <unistd.h> // sleep()
#include <tgmath.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#ifndef __STDC_IEC_559__
#error "unsupported double"
#endif
static_assert(sizeof(double) == 8, "double must have double precision");
#define MAX_PRECISE_DOUBLE ((double)(1ULL << 52))

int main(void) {
    time_t start = time(NULL);
    if (start == (time_t)-1) return EXIT_FAILURE;
    while (1) {
        time_t now = time(NULL);
        if (now == (time_t)-1) return EXIT_FAILURE;

        double diff = difftime(now, start);
        if (isnan(diff) || diff < 0) return EXIT_FAILURE;
        if (diff > MAX_PRECISE_DOUBLE) return EXIT_FAILURE;

        unsigned long long seconds = diff;
        unsigned long long h = seconds / 3600;
        seconds %= 3600;
        unsigned long long m = seconds / 60;
        seconds %= 60;
        unsigned long long s = seconds;

        (void)printf("\r%02llu:%02llu:%02llu", h, m, s);
        (void)fflush(stdout);

        (void)sleep(1);
    }
}

मानदंड जीतना

यह , बाइट्स जीत में सबसे छोटा कोड!


बाद की चुनौतियों के लिए ध्यान दें, टिप्पणियों में स्पष्टीकरण एक बुरी बात है। संदर्भ
user202729 3

जवाबों:


9

MATL , 17 16 बाइट्स

`Z`12L/13XOD1Y.T

MATL ऑनलाइन पर यह कोशिश करो !

यह काम किस प्रकार करता है

`         % Do...while loop
  Z`      %   Push seconds elapsed since start of program
  12L     %   Push 86400 (predefined literal)
  /       %   Divide. This transforms seconds into days
  13XO    %   Convert to date string with format 13, which is 'HH:MM:SS'
  D       %   Display
  1Y.     %   Pause for 1 second
  T       %   True. Used as loop condition for infinite loop
          % End loop (implicit)

4
इसे बंद करने के 37 मिनट बाद आपने दुनिया में कैसे जवाब दिया? o_O दोषी कैशिंग
श्री Xcoder

9
@ Mr.Xcoder मैंने हाल ही
लुइस

29

ऑपरेशन फ्लैशपॉइंट स्क्रिप्टिंग भाषा,  174  171 बाइट्स

s=""
#l
t=_time
t=t-t%1
a=t%60
c=(t-a)/60
b=c%60
c=(c-b)/60
d=""
e=d
f=d
?a<10:d=0
?b<10:e=0
?c<10:f=0
s=s+format["%1%2:%3%4:%5%6\n",f,c,e,b,d,a]
hint s
@t+1<_time
goto"l"

कार्रवाई में:

पिछली बार अगली बार ओवरराइट होने पर 158 बाइट्स:

#l
t=_time
t=t-t%1
a=t%60
c=(t-a)/60
b=c%60
c=(c-b)/60
d=""
e=d
f=d
?a<10:d=0
?b<10:e=0
?c<10:f=0
hint format["%1%2:%3%4:%5%6",f,c,e,b,d,a]
@t+1<_time
goto"l"

तकनीकी रूप से, कोई गाड़ी वापसी का उपयोग नहीं किया जाता है, इसलिए मुझे यकीन नहीं है कि यह संस्करण नियमों तक सीमित है।


5
मुझे ऑपरेशन फ्लैशपॉइंट की उम्मीद नहीं थी।
पोलीडुकस

10
@Polyducks में किसी को भी उम्मीद नहीं है कि ऑपरेशन फ्लैशपॉइंट
प्योरफ्रेट


चूंकि यूनिक्स में, एक सीआर लाइन को अधिलेखित कर देगा, मुझे लगता है कि दूसरा जवाब 'या तो सीआर, एलएफ, या सीआरएलएफ द्वारा मान्य है'
स्टेन स्ट्रम

1
@StanStrum कम से कम मेरे उबंटू CRमें लाइन को अधिलेखित नहीं किया जाएगा। वास्तव में CRLF, LFCRऔर LFसभी शब्दार्थ समतुल्य हैं।

13

बैश + कोरुटिल्स, 28 26 बाइट्स

date -s0|yes date +c%T|sh

के बीच unprintable चरित्र +और %एक ESC बाइट है।

यह सिस्टम समय 00:00:00 पर सेट करता है और इस प्रकार रूट विशेषाधिकारों की आवश्यकता होती है। यह भी मानता है कि टाइमज़ोन UTC है और कोई अन्य प्रक्रिया सिस्टम क्लॉक में हस्तक्षेप नहीं करेगी।

प्रत्येक नया समय टर्मिनल को रीसेट करता है, इस प्रकार पिछले एक को अधिलेखित करता है।


बैश + कोरुटिल्स, 38 29 बाइट्स

date -s0|yes date +%T|sh|uniq

लागू करने से पहले के रूप में ही प्रतिबंध। प्रत्येक नई टाइमिंग को एक नई लाइन पर दिखाया गया है।


चूंकि यह बाईटेकाउंट नहीं बदलता है इसलिए मैं पहले वाले dateको एक छोटे से लाइनफीड के साथ आराम से अलग कर दूंगा । लेकिन यह भी अच्छा हो सकता है किसी को सक्षम अपने दूसरे समाधान की तरह कुछ के साथ आने के लिए> :-(
हारून

date -s0STDOUT में नया समय प्रिंट करता है; मैं उस आउटपुट को चुप करने के लिए पाइप का उपयोग कर रहा हूं।
डेनिस

ओह ठीक है, स्पष्टीकरण के लिए धन्यवाद!
आरोन

5

एपीएल (डायलॉग यूनिकोड) , 51 बाइट्स

पूरा कार्यक्रम निकाय

s←⎕AI
1↓∊':'@1∘⍕¨100+30 60 60 1E33⊃⎕AI-s
DL 1
2

इसे ऑनलाइन आज़माएं! (Ctrl + शुरू करने के लिए दर्ज करें, और फिर से बंद करने के लिए।)

⎕AIएक ccount I nformation (उपयोगकर्ता आईडी, गणना समय, कनेक्ट समय, कुंजीयन समय)

s← करने के लिए आवंटित s(के लिए रों तीखा समय)
⎕AI-s घटाना sसे⎕AI

3⊃ तीसरा तत्व (मिलीसेकेंड में कनेक्ट समय) लेने
0 60 60 1E3⊤के लिए इस मिश्रित मूलांक को परिवर्तित
3↑ पहले 3 लेने (मिलीसेकेंड चला जाता है)
100+ एक सौ प्रत्येक (पैड शून्य करने के लिए) को जोड़ा गया
':'@1∘⍕¨ प्रत्येक की स्ट्रिंग प्रतिनिधित्व के पहले अक्षर पर को कोलन से संशोधन
ε nlist (समतल)
1↓ पहले कोलन को छोड़ें (और स्टैडआउट को स्पष्ट रूप से प्रिंट करें)

⎕DL 1D e l ay एक सेकंड

→2 लाइन नंबर दो पर जाएं


5

आर , 59 44 बाइट्स

Fआर में चूक FALSE, लेकिन यह एक नियमित चर है और इसे फिर से परिभाषित किया जा सकता है। जब अंकगणित में उपयोग किया जाता है, के FALSEलिए मजबूर है 0F+1इसलिए रिटर्न मांगना 1। हम Fहोना चाहते हैं F+1, इसे अच्छी तरह से प्रारूपित करें, प्रिंट करें, और एक सेकंड के लिए प्रतीक्षा करें। अनिश्चित काल तक जारी रहता है।

repeat{print(hms::hms(F<-F+1))
Sys.sleep(1)}

TIO पर काम नहीं करता ( hmsपैकेज की कमी के कारण ), लेकिन यहाँ मेरी मशीन से एक नमूना आउटपुट है:

00:00:00
00:00:01
00:00:02
00:00:03
00:00:04
00:00:05
00:00:06
00:00:07
00:00:08
00:00:09
00:00:10
00:00:11
00:00:12
00:00:13

5

बैश + नींद + तिथि, भी 50 49 47 46 45 41 बाइट्स

while date -ud@$[s++] +%T;do sleep 1;done

एक गोद समय लेने के लिए, जल्दी से ^ C मारा, इसे चलाएं और फिर ऊपर फिर से दौड़ें:

laps=("${laps[@]}" $s) ; echo ${laps[-1]}

दुबारा सेट करने के लिए:

s=0; unset laps

$ [S ++] सिंटैक्स अभी भी काम करने के लिए प्रकट होता है, लेकिन अब (AFAICS) bashमैन पेज में प्रलेखित नहीं है । और यह अभी भी (...)) लूप का उपयोग करने की तुलना में कम है, एक बार जब मैंने इसके आसपास के उद्धरण हटा दिए।


AFAICT, $[]एक पदावनत / अविवादित लेकिन अभी भी समर्थित रूप है$(()) । मुझे यकीन नहीं है कि यह आमतौर पर कोड-गोल्फ उत्तरों में उपयोग किया जाता है, लेकिन सामान्य नियम यह है कि आपके कोड को केवल आपकी भाषा के लिए दुभाषिया के कम से कम एक संस्करण पर काम करना होगा। IMO यह ठीक है।
पीटर कॉर्ड्स

s=0आवश्यक नहीं है, क्योंकि अंकगणितीय प्रतिस्थापन 0 के रूप में एक अस्थिर चर का इलाज करेगा । -uयह भी आवश्यक नहीं है कि आप बस डिफ़ॉल्ट समयक्षेत्र (UTC) मान लें।
डेनिस

-मुझे मेरी मशीन पर जरूरत है :)
विल क्रॉफर्ड

4

स्विफ्ट , 144 बाइट्स

import Foundation
let s=Date()
while 1>0{let d=Int(-s.timeIntervalSinceNow)
print(String(format:"%02d:%02d:%02d",d/3600,d/60%60,d%60))
sleep(1)}

व्याख्या

import Foundation                       // Import `Date` and `sleep()`
let s = Date()                          // Get the time at the start of the program
while 1 > 0 {                           // While 1 > 0 (forever):
  let d = Int(-s.timeIntervalSinceNow)  //   Calculate time difference
  print(String(format:"%02d:%02d:%02d", //   Print the time
      d/3600,d/60%60,d%60))
  sleep(1)                              //   Sleep one second
}

4

जावास्क्रिप्ट (ईएस 6), 99 बाइट्स

f=_=>console.log(new Date(new Date-d).toUTCString().slice(17,25))
f(d=Date.now(setInterval(f,1e3)))


2
घंटे मेरे लिए 0 पर शुरू नहीं होते हैं। सिस्टम क्लॉक टाइमज़ोन के आधार पर ऑफ़सेट बदलता है। (
विन 10

@ लक्स व्हाट्स, फिक्स्ड!
darrylyeo

4

मैटलैब (R2016b), 50 बाइट्स

t=now;while 1,disp(datestr(now-t,13)),pause(1),end

स्पष्टीकरण:

t=now; % Stores the current time
while 1 % Loops forever
    disp(datestr(now-t,13)) % Computes the difference since the program started
    % And prints with format 13 ('HH:MM:SS') - this may change between versions
    pause(1) % Waits one second
end

वैकल्पिक संस्करण (50 बाइट्स: P):

now;while 1,disp(datestr(now-ans,13)),pause(1),end

साइट पर आपका स्वागत है! :)
डीजेएमसीएम

धन्यवाद दोस्त:)
थियागो ओलीनिक

@LuisMendo सुझाव के लिए धन्यवाद, लेकिन मुझे समझ नहीं आया ... आपके उदाहरण में, चर क्या है t? इसके अलावा, इनपुट datestrदिनों में है, इसलिए मुझे इसे विभाजित 86400करना होगा, जो बाइट की संख्या को दो से बढ़ाएगा ...
थियागो ओलेनिक

3

जूलिया 0.6 , 75 68 बाइट्स

for h=0:23,m=0:59,s=0:59;@printf "%02i:%02i:%02i
" h m s;sleep(1)end

इसे ऑनलाइन आज़माएं!

नींद (1) की अनुमति के साथ, सरल नेस्टेड-लूप्स जूलियास में निर्मित समय से निपटने के तरीकों का उपयोग करने से कम हैं।

नींद के बिना पुराना समाधान (1) डेटाइम का उपयोग करना

t=now()-DateTime(0);Timer(x->println(Dates.format(now()-t,"HH:MM:SS")),0,1)

tकार्यक्रम शुरू होने पर 'दिन 0' से गुजरे समय की राशि है। समयnow()-t का एक क्षण है , जिसका उपयोग करके स्वरूपित किया जाता है Dates.format()

t0=now(); ...; now()-t0एक समय अंतर प्राप्त होगा , जिसका उपयोग नहीं किया जा सकता है Dates.format()

बिल्ड-इन के साथ समय स्वयं ही तुच्छ है Timer


3

पायथन 2 , 85 बाइट्स

import time
t=0
while 1:print(":%02d"*3)[1:]%(t/3600,t/60%60,t%60);time.sleep(1);t+=1

क्रेडिट


आप को बदल कर एक बाइट बचा सकता है "%02d:%02d:%02d"के साथ(":%02d"*3)[1:]
wnnmaw

1
आप की जरूरत नहीं है %24, के बाद व्यवहार अपरिभाषित है 23:59:59
एरिक आउटफोलर

@EriktheOutgolfer अच्छा बिंदु, अपडेट किया गया।
नील

3

जावास्क्रिप्ट (ईएस 6), 88 बाइट्स

f=_=>console.log(new Date(i++*1e3).toUTCString().slice(17,25))
f(i=0,setInterval(f,1e3))

अनिवार्य रूप से @ darrylyeo के उत्तर के समान दृष्टिकोण , लेकिन सभी टाइमज़ोन के लिए काम करता है और 0 प्राप्त करने के लिए थोड़ा अलग तरीके का उपयोग करता है।

[संपादित करें] डैरिल का जवाब तय हो गया है। यह अभी भी कम है, हालांकि।


3

> <> , 82 + 7 = 89 बाइट्स

0\!
:/+1oan~?=3ln?$0(a:o":"n~?=4ln?$0(a:ro":"n~?=5ln?$0(a:,*a6-}:%*a6:,*a6-}:%*a6:

इसे ऑनलाइन आज़माएं!

झंडे का उपयोग करने के लिए +7 बाइट्स -t.0125प्रत्येक निर्देश को सेकंड का 1/80 वां हिस्सा लेने के लिए। प्रत्येक लूप में 80 निर्देश होते हैं, जिससे प्रत्येक लूप एक सेकंड लंबा हो जाता है। अभिकलन समय के कारण, यह वास्तव में व्यवहार में लंबा है।

मुझे वास्तव में 100 तक के सभी रास्तों को बफ़र करना पड़ा जब तक कि मैंने @ नॉट ए ट्री के उत्तर को नहीं देखा, जिसमें घंटों और मिनटों को उत्पन्न करने के लिए 7 बाइट का बेहतर तरीका था, इसे 80 से नीचे ट्रिम करना था। उन्होंने इसके उपयोग को भी प्रेरित किया, \/जिसे दो बार निष्पादित किया गया। प्रति पाश।

यह काम किस प्रकार करता है

0\...
./...
Initialises the stack with a 0 to represent the time

0\!
:/....................................................,*a6-}:%*a6:,*a6-}:%*a6:
Puts the hours, minutes and seconds in the stack

0\!
:/....n~?=3ln?$0(a:o":"n~?=4ln?$0(a:ro":"n~?=5ln?$0(a:...
Print out the hours, minutes, seconds separated by colons. 
If the number is below 0, print a leading 0. 
If the number is not, then there is an extra 0 on the stack, which is popped.

0\!
./+1oa...
Print a newline and increment the counter
And restart the loop

बोनस:

एक ही आकार का एक लाइन संस्करण, 80 + 9 बाइट्स:

0::6a*%:}-6a*,:6a*%:}-6a*,:a(0$?nl5=?~n":"or:a(0$?nl4=?~n":"o:a(0$?nl3=?~nao1+>!

यह -aफ़्लैग किए गए निर्देशों के लिए टिक जोड़ने के लिए ध्वज का उपयोग करता है ।


3

PHP 4+, 70 64 बाइट्स

$x=time();while(1){sleep(1);echo date('H:i:s',time()-$x)."\n";}

PHP 5.3+, 69 63 बाइट्स

$x=time();a:sleep(1);echo date('H:i:s',time()-$x)."\n";goto a;

PHP ओपन टैग आपको 6 बाइट्स की बचत के जवाब में छोड़ा जा सकता है।
डैनियल डब्ल्यू।

2

पायथन 3 , 112 बाइट्स

1-सेकंड की देरी का उपयोग करना ठीक है, भले ही यह (शायद ही कभी) एक दूसरे को छोड़ सकता है।

from time import*;a=0
while 1:d=divmod;m,s=d(a,60);print(":".join(f"{k:02d}"for k in(*d(m,60),s)));a+=1;sleep(1)

2

VBA, 90

t=0:while(1):?format(t,"hh:mm:ss"):t=t+timeserial(0,0,1):q=timer:while q-timer<1:wend:wend

तत्काल विंडो में चलाएं: लगभग 23 मिलियन वर्षों में अपेक्षित विफलता बिंदु (अस्थायी बिंदु रिज़ॉल्यूशन विफल ~ ~ 8.5e9 दिन)


2

जेली , 23 बाइट्स

:⁽½c,60;%60d⁵j”:ṄœS1ṛ‘ß

इसे ऑनलाइन आज़माएं!


क्या यह 1 मिनट से ऊपर के समय के साथ काम करता है?
एच। वाइज

@ H.PWiz इसे, कुछ परीक्षण चलाने चाहिए। संपादित करें: ऐसा लगता है कि लाभांश कुछ घंटों के लिए गलत है ... थोड़ा बचत के लिए तय किया गया है!
आउटगॉल्फ

2

AWK , 110 87 86 बाइट्स

BEGIN{for(;;i++){printf("%02d:%02d:%02d\n",i/3600%60,i/60%60,i%60);system("sleep 1")}}

TIO में काम नहीं करता है।


आपका कार्यक्रम 00:00:00उस समय शुरू होता है , जिस पर वह प्रिंट नहीं करता है ।
user202729

ठीक कर दिया। धन्यवाद
Noskcaj

2

APL (Dyalog) , 37 बाइट्स

{∇⍵+×⎕DL 1⊣⎕←1↓∊':'@1∘⍕¨100+⍵⊤⍨360}0

इसे ऑनलाइन आज़माएं!

पूरा कार्यक्रम।

Admm के उत्तर के समान सुंदर, हालांकि स्वतंत्र रूप से लिखा गया है और एक गैर- ⎕AIआधारित दृष्टिकोण का उपयोग करता है ।


2

बैश + कोरुटिल्स + जीएनयू तिथि, 50 बाइट्स

o=`date +"%s"`;yes date +%X -ud\"-$o sec\"|sh|uniq

@ डेनिस से प्रेरित, इस समाधान को बदलने के लिए समय की आवश्यकता नहीं है। यह अब से प्रारंभिक ऑफसेट को UNIX युग (1 जनवरी 1970 00:00:00 UTC), 'o' में संग्रहीत करता है, और फिर UTC तिथि में [-ud विकल्प] (वर्तमान समय - ऑफसेट) प्रदर्शित करता है, लेकिन केवल [+% X विकल्प] HH: MM: SS। यह उन देशों में काम करना चाहिए जहां वर्तमान समय-क्षेत्र UTC नहीं है।


2

क्लीन , 173 172 168 बाइट्स

import StdEnv,System.Time
$n i#i=(i/60^n)rem 60
=(i/10,i rem 10)
f i w#(Clock j,w)=clock w
#j=j/1000
|j>i=[j:f j w]=f i w
Start w=[($2i,':',$1i,':',$0i,'
')\\i<-f -1 w]

यह केवल विंडोज क्लीन बंडलों के तहत काम करता है।

3 बाइट्स जोड़ें यदि आप चाहते हैं कि यह लिनक्स के तहत काम करे, जैसा कि क्लीन CLK_PER_TICK :== 1000000ऑन * निक्स है। यदि आप चाहते हैं कि यह क्रॉस-प्लेटफ़ॉर्म हो, तो इसके बजाय 8 बाइट्स जोड़ें, क्योंकि आपको CLK_PER_TICKइसके लिए निर्धारित मूल्य के बजाय उपयोग करने की आवश्यकता है। ( उपरोक्त के कारण TIO लिंक बड़ा है )

इसे ऑनलाइन आज़माएं!


2

पायथन 2 , 69 + 3 ( TZ=) = 72 बाइट्स

from time import*;s=time()
while 1:print ctime(time()-s)[11:19]+'\r',

यह एक निरंतर लूप में चलता है, बिना सोए, प्रत्येक सेकंड में नई लाइन प्रिंट करने के बजाय उसी लाइन पर समय को अपडेट करता है। (अभी भी नियमों द्वारा अनुमति दी गई है, मुझे उम्मीद है)

यह थोड़ा लंबा संस्करण (72 + 3 = 75 बाइट्स) हर सेकंड एक नई लाइन पर प्रिंट करता है:

from time import*;s=time()
while 1:print ctime(time()-s)[11:19];sleep(1)

इन दोनों को आपको यूटीसी समयक्षेत्र में होना चाहिए। लिनक्स पर आप TZपर्यावरण चर को सेट करके इसे प्राप्त कर सकते हैं । जैसे TZ= python


2

> <> , 106 बाइट्स 82 + 9 = 91 बाइट्स

-aझंडा सुझाने के लिए जो किंग को धन्यवाद ! की जाँच करें उनके जवाब भी।

0v+1oan<n0/
:/<</?(a:,*a6-}:%*a6:,*a6-}:%*a6:\\
n<n0/<</?(a:ro":"
":"n<n0/<</?(a:o

इसे ऑनलाइन आज़माएं! (लेकिन आपको 60 सेकंड के समय के लिए इंतजार करना होगा)।

मुझे> <> की एक विशेषता का उपयोग करने के लिए मिला है, जिसकी मुझे पहले कभी आवश्यकता नहीं थी: इस कोड को ध्वज की आवश्यकता होती है -t.0125, जो निष्पादन की गति को 0.0125 सेकंड प्रति टिक या प्रति सेकंड 80 टिक करता है। -aध्वज भी है , जो व्हाट्सएप की गिनती को एक टिक के रूप में बनाता है (कुछ मामलों में - दुभाषिया इस बारे में थोड़ा अजीब है)।

मूल रूप से, कोड एक काउंटर रखता है जो मछली के लूप के माध्यम से जाने पर हर बार बढ़ जाता है, और शेष लूप काउंटर को hh:mm:ssप्रारूप में बदल देता है और इसे प्रिंट करता है। लूप बिल्कुल 80 टिक्स लेता है।

यह सिद्धांत में काम करना चाहिए, लेकिन व्यवहार में, प्रत्येक टिक 0.0125 सेकंड से थोड़ा अधिक है, क्योंकि गणना समय है। TIO पर अधिक सटीक समय \\देने के लिए दूसरी पंक्ति में परिवर्तन करना <<

आप मछली के खेल के मैदान में कोड को कार्रवाई में भी देख सकते हैं , सिवाय इसके कि यह दुभाषिया व्हाट्सएप को आधिकारिक दुभाषिया से थोड़ा अलग तरीके से व्यवहार करता है। वैकल्पिक रूप से, आप कोड को शीर्ष गति पर चलाने के लिए, एक मिनट के बाद के समय के लिए व्यवहार को सत्यापित करने के लिए TIO पर झंडे हटा सकते हैं।


-1 बाइट को पहली पंक्ति में v को बदलकर \!और दो को हटाकर <। यदि आप -aध्वज का उपयोग करते हैं , तो बाइट्स का एक और जोड़ा , जो व्हाट्सएप और स्किप किए गए निर्देशों को टिक के रूप में गिनता है
Jo King

@JoKing, -aध्वज मुझे थोड़ा और गोल्फ देगा, धन्यवाद! मुझे लगता है कि आप \!अपने कोड में भी इस ट्रिक का उपयोग कर सकते हैं : इसे ऑनलाइन आज़माएं!
एक पेड़ नहीं

2

जावा 8, पूर्ण कार्यक्रम, 150 बाइट्स

interface M{static void main(String[]a)throws Exception{for(int i=0;;Thread.sleep(1000))System.out.printf("%02d:%02d:%02d%n",i/3600,i/60%60,i++%60);}}

इसे यहाँ आज़माएँ (60 सेकंड के बाद का समय, इसलिए मैंने अधिक आउटपुट देखने के लिए नींद को 1 पर सेट कर दिया है)।

स्पष्टीकरण:

interface M{                    // Program:
  static void main(String[]a)   //  Mandatory main-method
     throws Exception{          //    Mandatory throws for Thread.sleep
    for(int i=0;                //   Start at 0
        ;                       //   Loop indefinitely
         Thread.sleep(1000))    //     After every iteration: Sleep for 1 sec
      System.out.printf("%02d:%02d:%02d%n",
                                //    Print in the format "HH:mm:ss\n":
        i/3600,i/60%60,i++%60); //     The hours, minutes and seconds
                                //     (and increase `i` by 1 afterwards with `i++`)
                                //   End of loop (implicit / single-line body)
  }                             //  End of mandatory main-method
}                               // End of program

जावा 8, फ़ंक्शन, 94 बाइट्स

v->{for(int i=0;;Thread.sleep(1000))System.out.printf("%02d:%02d:%02d%n",i/3600,i/60%60,i++%60);}

इसे यहाँ आज़माएँ (60 सेकंड के बाद का समय, इसलिए मैंने अधिक आउटपुट देखने के लिए नींद को 1 पर सेट कर दिया है)।

स्पष्टीकरण:

v->{   // Method with empty unused parameter and no return-type
  ...  //  Same as the program above
}      // End of method

यहाँ यह देखने के लिए एक छोटा सा जिफ है कि यह काम करता है जब 1000 एमएस का उपयोग किया जाता है:

यहाँ छवि विवरण दर्ज करें


2

PHP, 59 48 बाइट्स

while(1){sleep(1);echo date('H:i:s',$i++)."\n";}

डैरेन एच के जवाब से प्रेरित ।

पुराना संस्करण :

<?php while(1){sleep(1);echo date('H:i:s',$i++-3600)."\n";}

PHP ओपन टैग आपको 6 बाइट्स की बचत के जवाब में छोड़ा जा सकता है।
डैनियल डब्ल्यू।

बहुत अच्छा सोचा, लेकिन 3600 को 86400 होने की आवश्यकता है अन्यथा काउंटर 23:00:00 पर शुरू होता है इसलिए दुर्भाग्य से आप एक बाइट हासिल करते हैं, फिर भी मुझे 9 से हराते हैं, हालांकि!
डैरेन एच

@ डेरेनह मुझे लगता है कि यह आपके स्थान पर निर्भर करता है, मैंने उस बारे में नहीं सोचा था। मैं GMT + 1 में हूं, इसलिए मैंने 3600 जोड़े हैं, लेकिन मुझे लगता है कि अंग्रेजी लोगों के लिए, आप -3600पूरी तरह से हटा सकते हैं, जो 5 बाइट्स को बचाएगा।
रोबर्टो 06

1

शैल , 177 बाइट्स

ध्यान दें कि यह पूरी तरह से POSIX अनुरूप नहीं है क्योंकि यह उपयोग करता है date +%s, जो एक सामान्य dateविस्तार है।

a=`date +%s`;while true;do b=`date +%s`;s=`expr $b - $a`;h=`expr $s / 3600`;s=`expr $s % 3600`;m=`expr $s / 60`;s=`expr $s % 60`;printf '\r%02d:%02d:%02d' $h $m $s;sleep 1;done

7
आम तौर पर, आपको लोगों को खुद को जवाब देने से पहले अपनी चुनौती का जवाब देने का मौका देना चाहिए। मैं एक सप्ताह की सिफारिश करता हूं क्योंकि कुछ केवल सप्ताह के दौरान निश्चित समय पर यहां हो सकते हैं।
18

1
@ Adám मैंने अपना उत्तर स्वीकार नहीं किया है, और उस समय मैंने बहुत छोटे उत्तर पोस्ट किए थे (जैसे आपके)।
मार्कवेस्टन

1

रूबी, 192 117 बाइट्स (क्रेडिट दादा के लिए)

t=Time.now
loop do
m,s=(Time.now-t).to_i.divmod(60)
h,m=m.divmod(60)
printf"%02d:%02d:%02d
",h,m,s
sleep 1
end

यह कैसे काम करता है?

विस्तारित संस्करण का उपयोग करने के लिए जा रहे हैं (एक समय में रूपांतरण एक अलग फ़ंक्शन के रूप में दिया गया है और एक अलग आउटपुट प्रारूप का उपयोग करता है):

def format_secs(s) # Converts the value in seconds to the required format
    mins, secs = s.divmod(60) # divmod returns the quotient and the remainder of a number
    hours, mins = mins.divmod(60)
    [hours,mins,secs].map { |e| e.to_s.rjust(2,'0') }.join ':'

    =begin
    [hours,mins,secs] -Creates a new array using the values allready provided for hours, minutes and seconds
    .map { - Creates a new array based on a operation on each of an array's values
    .to_s.rjust(2,'0')} - Turns the number into a string, and then adds "0" if needed to make the timer's result at least two digits
    .join ':' - Combines the result of the operation into a single string with a ":" in between the two numbers
    =end
end

t = Time.now # Saves the time at the program's (Rough) start

loop do
    puts format_secs((Time.now - t).to_i) # Returns the result of  the "format_secs" operation on the difference between the two times (in seconds) converted to a pure integer
    sleep 1 # Waits for one second
end

6
साइट पर आपका स्वागत है! एक कोड-गोल्फ चुनौती के हर जवाब को गोल्फ होना चाहिए। आपको कम से कम बेकार व्हाट्सएप को हटाना चाहिए, और 1-वर्ण चर नामों का उपयोग करना चाहिए। यह आपको लगभग 120 बाइट्स मिलेगा, और printfइसके बजाय putsकुछ और बाइट्स बचा सकता है: इसे ऑनलाइन आज़माएं! । PPCG पर हैप्पी गोल्फिंग!
दादा

1

एपीएल नार, 109 63 57 चार्ट

q;t
t←0
{∊⍵,¨':: '}{1<⍴x←⍕⍵:x⋄'0',x}¨(3⍴60)⊤⌊t+←⎕DL 1⋄→2

3 + 3 + 48 + 3 = 57 (दूसरों को भी Apl समाधानों को देखा)

{1<⍴x←⍕⍵:x⋄'0',x}

INT the को अंकों के स्ट्रिंग में इस तरह से रूपांतरित करें यदि उस स्ट्रिंग का लेन्थ इसके सामने एक '0' को जोड़ने से 1 है

{∊⍵,¨':: '}

सरणी में सरणी को :: :: ’के साथ संयोजित करें

00:00:01 
00:00:02 
00:00:03 
00:00:04 
00:00:05 
00:00:06 
00:00:07 
00:00:08 
00:00:09 

1

x86-64 मशीन कोड (लिनक्स सिस्टम कॉल): 78 बाइट्स

आरडीटीसीएस स्पिन-लूप टाइमिंग, लिनक्स sys_writeसिस्टम कॉल।

x86-64 रन टाइम पर आरडीसीएस "रेफरेंस क्लॉक" फ्रीक्वेंसी को क्वेरी करने का एक सुविधाजनक तरीका प्रदान नहीं करता है। आप एक एमएसआर पढ़ सकते हैं (और उस पर आधारित गणना कर सकते हैं) , लेकिन इसके लिए कर्नेल मोड, या रूट + ओपनिंग की आवश्यकता होती है /dev/cpu/%d/msr, इसलिए मैंने आवृत्ति को बिल्ड-टाइम स्थिर बनाने का निर्णय लिया। ( FREQ_RDTSCआवश्यक रूप से समायोजित करें : कोई भी 32-बिट स्थिरांक मशीन कोड के आकार को नहीं बदलेगा)

ध्यान दें कि कई वर्षों के लिए x86 सीपीयू ने आरडीटीसीटी आवृत्ति को निर्धारित किया है इसलिए यह एक टाइमसोर्स के रूप में उपयोग करने योग्य है, न कि एक कोर घड़ी चक्र प्रदर्शन काउंटर जब तक आप आवृत्ति परिवर्तनों को अक्षम करने के लिए कदम नहीं उठाते हैं। (वास्तविक सीपीयू चक्रों की गिनती के लिए वास्तविक पूर्ण काउंटर हैं।) आमतौर पर यह नाममात्र स्टिकर आवृत्ति पर टिक करता है, जैसे कि टर्बो या पावरस्वाइनिंग की परवाह किए बिना मेरे i7-6700k के लिए 4.0GHz। वैसे भी, यह व्यस्त-प्रतीक्षा समय लोड औसत (एक कैलिब्रेटेड देरी-लूप की तरह) पर निर्भर नहीं करता है, और सीपीयू बिजली की बचत के लिए भी संवेदनशील नहीं है।

यह कोड किसी भी x86 के लिए 2 ^ 32 हर्ट्ज से नीचे के संदर्भ आवृत्ति के साथ काम करेगा, यानी ~ 4.29 गीगाहर्ट्ज़ तक। इसके अलावा, टाइमस्टैम्प का कम 32 1 सेकंड में सभी तरह से लपेट जाएगा, इसलिए मुझे edxपरिणाम के उच्च 32 बिट्स पर भी ध्यान देना होगा।

सारांश :

00:00:00\nस्टैक पर धक्का । फिर एक पाश में:

  • sys_write सिस्टम कॉल
  • एडीसी-लूप अंकों पर (आखिरी के साथ शुरू) समय को बढ़ाने के लिए 1. रैपिंग / कैरी-आउट एक cmp/ के साथ संभाला cmov, सीएफ परिणाम के साथ अगले अंक के लिए ले-इन प्रदान करते हैं।
  • rdtsc और शुरू समय बचाने के लिए।
  • rdtscजब तक डेल्टा है पर स्पिन > आरडीटीसीटी आवृत्ति के प्रति सेकंड टिक्स।

NASM लिस्टिंग:

 1  Address                            ; mov  %1, %2       ; use this macro to copy 64-bit registers in 2 bytes (no REX prefix)
 2           Machine code           %macro MOVE 2
 3           bytes                      push  %2
 4                                      pop   %1
 5                                  %endmacro
 6                                  
 7                                      ; frequency as a build-time constant because there's no easy way detect it without root + system calls, or kernel mode.
 8                                      FREQ_RDTSC equ 4000000000
 9                                  global _start
10                                  _start:
11 00000000 6A0A                        push     0xa                       ; newline
12 00000002 48BB30303A30303A3030        mov      rbx, "00:00:00"
13 0000000C 53                          push     rbx
14                                      ; rsp points to  `00:00:00\n`
20                                  
21                                      ; rbp = 0                (Linux process startup.  push imm8 / pop is as short as LEA for small constants)
22                                      ; low byte of rbx = '0'
23                                  .print:
24                                      ; edx potentially holds garbage (from rdtsc)
25                                  
26 0000000D 8D4501                      lea      eax, [rbp+1] ; __NR_write = 1
27 00000010 89C7                        mov      edi, eax     ; fd = 1 = stdout
28                                      MOVE     rsi, rsp
28 00000012 54                  <1>  push %2
28 00000013 5E                  <1>  pop %1
29 00000014 8D5008                      lea      edx, [rax-1 + 9]     ; len = 9 bytes.
30 00000017 0F05                        syscall               ; sys_write(1, buf, 9)
31                                  
32                                      ;; increment counter string:  least-significant digits are at high addresses (in printing order)
33 00000019 FD                          std                        ;  so loop backwards from the end, wrapping each digit manually
34 0000001A 488D7E07                    lea      rdi, [rsi+7]
35                                      MOVE     rsi, rdi
35 0000001E 57                  <1>  push %2
35 0000001F 5E                  <1>  pop %1
36                                  
37                                      ;; edx=9 from the system call
38 00000020 83C2FA                      add   edx, -9 + 3      ; edx=3 and set CF (so the low digit of seconds will be incremented by the carry-in)
39                                      ;stc
40                                  .string_increment_60:          ; do {
41 00000023 66B93902                    mov    cx, 0x0200 + '9'    ; saves 1 byte vs. ecx.
42                                      ; cl = '9' = wrap limit for manual carry of low digit.  ch = 2 = digit counter
43                                    .digitpair:
44 00000027 AC                          lodsb
45 00000028 1400                        adc      al, 0           ; carry-in = cmp from previous iteration; other instructions preserve CF
46 0000002A 38C1                        cmp      cl, al          ; manual carry-out + wrapping at '9' or '5'
47 0000002C 0F42C3                      cmovc    eax, ebx        ; bl = '0'.  1B shorter than JNC over a MOV al, '0'
48 0000002F AA                          stosb
49                                  
50 00000030 8D49FC                      lea     ecx, [rcx-4]    ; '9' -> '5' for the tens digit, so we wrap at 59
51 00000033 FECD                        dec     ch
52 00000035 75F0                        jnz    .digitpair
53                                      ; hours wrap from 59 to 00, so the max count is 59:59:59
54                                  
55 00000037 AC                          lodsb                        ; skip the ":" separator
56 00000038 AA                          stosb                        ; and increment rdi by storing the byte back again.  scasb would clobber CF
57                                  
58 00000039 FFCA                        dec     edx
59 0000003B 75E6                        jnz   .string_increment_60
60                                  
61                                      ; busy-wait for 1 second.  Note that time spent printing isn't counted, so error accumulates with a bias in one direction
62 0000003D 0F31                        rdtsc                         ; looking only at the 32-bit low halves works as long as RDTSC freq < 2^32 = ~4.29GHz
63 0000003F 89C1                        mov      ecx, eax             ; ecx = start
64                                  .spinwait:
65                                  ;    pause
66 00000041 0F31                        rdtsc                      ; edx:eax = reference cycles since boot
67 00000043 29C8                        sub      eax, ecx          ; delta = now - start.  This may wrap, but now we have the delta ready for a normal compare
68 00000045 3D00286BEE                  cmp      eax, FREQ_RDTSC   ; } while(delta < counts_per_second)
69                                   ;   cmp      eax, 40  ; fast count to test printing
70 0000004A 72F5                        jb     .spinwait
71                                  
72 0000004C EBBF                        jmp .print
  next address = 0x4E = size = 78 bytes.

pauseमहत्वपूर्ण शक्ति को बचाने के लिए निर्देश को रद्द करें : यह एक कोर को ~ 15 डिग्री सेल्सियस के बिना गर्म करता है pause, लेकिन केवल ~ 9 के साथ pause। (स्काइलेक पर, जहां pause~ 5 के बजाय ~ 100 चक्रों के लिए नींद आती है । मुझे लगता है कि यह अधिक बचत करेगा यदि rdtscधीमी-ईश भी नहीं था इसलिए सीपीयू बहुत अधिक समय नहीं कर रहा है)।


एक 32-बिट संस्करण कुछ बाइट्स छोटा होगा, उदाहरण के लिए प्रारंभिक 00: 00: 00 \ n स्ट्रिंग को पुश करने के लिए 32-बिट संस्करण का उपयोग करना।

16                          ;    mov      ebx, "00:0"
17                          ;    push     rbx
18                          ;    bswap    ebx
19                          ;    mov      dword [rsp+4], ebx    ; in 32-bit mode, mov-imm / push / bswap / push would be 9 bytes vs. 11

और 1-बाइट का उपयोग करके भी dec edxint 0x80सिस्टम कॉल ABI का उपयोग नहीं होता ईएसआई / ईडीआई, तो syscall बनाम lodsb / stosb के लिए रजिस्टर सेटअप सरल हो सकता है।


मैं एक nanosleepसिस्टम कॉल का उपयोग कर सकता था, लेकिन यह अधिक दिलचस्प था। लिनक्स पर रूट के साथ, सही एमएसआर को पढ़ना और प्रोग्रामेटिक रूप से आरडीटीसीटी आवृत्ति प्राप्त करना संभव है।
पीटर कॉर्डेस

1

क्यू / केडीबी + , 40 बाइट्स

समाधान:

.z.ts:{-1($)18h$a+:1};a:-1;(.)"\\t 1000"

उदाहरण:

q).z.ts:{-1($)18h$a+:1};a:-1;(.)"\\t 1000"
q)00:00:00
00:00:01
00:00:02
00:00:03
00:00:04
00:00:05

स्पष्टीकरण:

यहां तीन कमांड निष्पादित किए जा रहे हैं:

  1. .z.ts:{-1($)18h$a+:1}; / override timer function
  2. a:-1; / initialise variable a to -1
  3. (.)"\\t 1000" / start the timer with 1000ms precision

टाइमर समारोह का टूटना:

.z.ts:{-1 string 18h$a+:1} / ungolfed timer function
      {                  } / lambda function
                     a+:1  / add 1 to variable a
                 18h$      / cast to seconds
          string           / cast to string
       -1                  / write to stdout
.z.ts:                     / assign this function to .z.ts

बोनस:

41 बाइट्स के लिए वैकल्पिक 1 :

a:.z.t;.z.ts:{-1($)18h$x-a};(.)"\\t 1000"

26 + 7 बाइट्स के लिए वैकल्पिक 2 = 33 बाइट्स

.z.ts:{-1($)18h$a+:1};a:-1

और -t 1000q बाइनरी के तर्क के रूप में जोड़ना ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.