Bir saat mücadelesi zamanı!


25

Bana bu formatta zamanı gösteren bir saat kurmanızı istiyorum:

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

Bu '18: 10 'gösterir. Geçerli saat ve bir sonraki saat satırın önünde, ardından boşluk ve birkaç çizgi ile gösterilir: ilk satırda bu saatte geçen dakika sayısı ve ikinci satır kaç dakika daha kaldığını gösterir bu saatte gitmek için.

Netleşmeştirmek

  • Saat sistemin saatini göstermelidir. Zamanı başka bir kaynaktan almak daha uygunsa, bu da iyi. O olmayabilir girdi olarak tedarik edilebilir.
  • At 18:00, en üst satırda sadece 18(Firar boşlukları izin ancak gerekli değil)
  • At 18:59, alt satırda19 -
  • <10 saatleri ya 0( 01 -----) ile önceden doldurulur ya da sağa hizalanır ( 1 -----). Sola hizalı tek bir rakama izin verilmez, çizgiler doğru yerden başlasa bile ( 1 -----geçersiz).
  • Saat 24 saat biçiminde göstermelidir.
  • 24 saat formatı olarak adlandırılmasına rağmen, aslında 24üzerinde bir şey yok. 23. saat boyunca, ikinci satır 00veya ile başlar 0.
  • Ekranın en az dakikada bir kez güncellenmesi gerekiyor, ancak tam olarak 00saniyeler içinde gerçekleşmesi gerekmiyor . Daha uygunsa daha sık / sürekli güncelleme yapabilirsiniz, ancak sonuç elbette hala okunaklı olmalıdır - ekranın her tarafına bulaşmaz.

Giriş

Yok.

Çıktı

  • Yukarıda tanımlandığı gibi. Saati her iki satırda 60-ish pozisyonlarına kaydırmak için izleyen boşluklara izin verilir, izleyen bir yeni hatta izin verilir.
  • Bir sonraki dakikayı görüntülerken ekranın temizlenmesi gerekiyor: ya net ekran komutuyla ya da en az 30 yeni satır ekleyerek.

Ek kurallar


sayı ve tire arasında iki boşluk olabilir mi?
Adám

6
"dakikada bir kez güncellenir" - Daha sık güncellenebilir mi?
17'de sml,

1
@smls Evet, istediğiniz sıklıkta güncelleme yapabilirsiniz. Özellikleri 'en az bir kere' olarak değiştireceğim.
steenbergh

1
@KritixiLithos İki basamaklı saatlerle (9, 10 veya 23, 00) hizalamayı bozar, bu yüzden hayır, izin verilmez.
steenbergh

1
23'ten sonra, bir sonraki saat 24 mü yoksa 0 mı?
Kritixi Lithos,

Yanıtlar:


2

MATL , 41 bayt

@Kundor'a bir hata olduğunu fark ettiği için teşekkürler

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

MATL online olarak deneyin ! Ancak programın 30 saniye sonra öldürüldüğüne dikkat edin, bu nedenle çıktıda herhangi bir değişikliği yakalamak zor.

Nasıl çalışır

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

Ben olabilirim, ama ikinci yinelemede, yalnızca üst satır yazdırılıyor ...
steenbergh

@steenbergh Benim için saat ve dakika yerine dakika ve saniye ile çalışıyor, bu yüzden değişiklikler kolayca görülebiliyor: matl.suever.net/…
Luis Mendo

1
Evet, çalışıyor. - Aslında, bunu kendi saatimin 3. ve 4. satırları olarak görmek harika olabilir.
steenbergh

@ steenbergh: bu cevabı kabul ettiniz, ancak geçerli değil - 23'ten 24'ü geçecek olan saati gösteriyor.
Nick Matteo,

@kundor Fark ettiğiniz için teşekkürler. 3 byte pahasına düzeltildi
Luis Mendo

11

TI-Basic, 94 bayt

" 
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

Nispeten basit. Bu başında bir boşluk olan bir dize. Saatler sağa hizalanır. Bu yalnızca TI-84 + hesap makinelerinde çalışır, çünkü TI-83'ün dahili bir saati yoktur.

Düzenleme: Son döngüyü kapatmadığımı fark ettiğin için teşekkür ederim. Şimdi düzeltildi (+2 bayt).

Düzenleme # 2: İlk saat yirmi dört değil sıfır olmalıdır. +14 bayt pahasına düzeltildi.


Her komut bir bayt olarak sayılır?
Sygmei

@Sygmei Çoğu simge bir bayt, evet. Bununla birlikte, ve gibi simgeler Str1, her biri iki bayttır. Sen daha fazla bilgi edinebilirsiniz tibasicdev.wikidot.com/tokensgetTimesub(
Timtech

Bir öykünücüyle bağlantısı olmayacaktı, değil mi?
steenbergh

Cemetech.net/projects/jstified 'i tavsiye ederim ancak bu tür hesap makinesine sahip olmadığınız sürece, bu emülatörle internetten bir ROM kullanmanın ahlaki olarak yanlış olduğunu unutmayın.
Timtech

1
Bağlantıyı tıklatmaktan korkmayın, çünkü öykünücü yasaldır ve çalışmadan önce kendi ROM'unuzu yüklemenizi ister. Onları özgürce erişilebilir kıldım ama artık yoklar. Bir arkadaşınızdan TI-84 bulabilirseniz, bu en iyi seçenek olacaktır.
Timtech

9

Toplu iş, 197 bayt

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

Not: 10. satırda arkada kalan bir boşluk var. Benim için, %time%saatleri öncü boşlukla, ancak dakikaları öncü sıfırla biçimlendirir. Önde gelen sıfırın daha kolay bir çıktı biçimi olduğuna karar verdim, çünkü bunun için tek yapmam gereken 100 saat eklemek ve ilk rakamı kaldırmak. Dakikalar, sekizli ayrıştırma hatalarına neden olarak daha zordur 08veya 09olur, bu yüzden 1etkin bir şekilde 100 dakika ekleyerek, 100'ü çıkarmaktan daha kısa bir bayt olan döngüyü uygun şekilde dengeleyerek bunu ayarlayarak öneriyorum.


7

Python 3.6, 110 114 112 bayt

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

Bu (bir byte kaydetmek için biçimlendirme yeni f-string kullanır f'\n{h+1:2} 'vs '\n%2d '%(h+1)değiştirebilirsiniz.) [sleep(9)]İçin 18 bayt kaydetmek için, ama sonra sadece ekranı spams.

Değişen bir bayt Kaydedilen while 1:...;sleep 60için while[sleep(60)]:..., TuukkaX sayesinde.

OP'nin daha önce de söylediği gibi, bir sonraki saatin 23'ten sonra 0 olmak üzere, 24 yerine 0 olması için 5 bayt kullanmam gerekti. :-(

Bir bayt 60 yerine sadece 9 saniye uyuyarak kurtarıldı.

Value Ink'in Ruby cevabından(h+1)%24 ödünç almak için biraz kestirmek için iki baytlık tasarruf sağlandı .


Lütfen if koşulunun çevresine neden köşeli parantez koyduğunuzu açıklayabilir misiniz? Her iki tarafın aksine, sadece süre ile uyku arasındaki boşluğun 1 bayt olması olmaz mıydı? EDIT: Boşver, onu haksız kılmak. Yeterince adil.
Gölge

1
@shadow: Sahte olan sleepdöner None.
Nick Matteo,

@ ToivoSäwén: modülde sleepayrıca time, içe aktarma * daha iyidir.
Nick Matteo,

5

Ruby, 98 95 91 bayt

Her 5 saniyede bir güncellenir. Sadece Unix tarzı terminallerde çalışır.

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

Windows komut istemi sürümü, 95 92 bayt:

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

Sistem yerine backticks kullanabilir misiniz? `cls`vssystem'cls'
IMP1

Öyle gözükmüyor, fakat 3 bayttan tasarruf eden saniye yerine h=t.hourkullanabilirsiniz . ht.hour
IMP 1

@ IMP1 gerçekten, backticks için çalışmıyor cls. Diğer öneriniz için teşekkürler!
Değerli Mürekkep

@ IMP1 göründüğü gibi, puts`clear`eğer Unix terminalleri kullanıyorsanız, gidilecek yoldur. Sadece Windows komut istemiyle çalışmıyor cls.
Value Ink,

Pencereler için, puts"\e[H\e[2J"dört bayt tıraş olduğunu düşündüğüm konsolu temizleyebilirsiniz. İlk satırınızı okuyacaktırloop{t=Time.now;puts"\e[H\e[2J%02d %s
IMP1

4

Perl 6 , 113 bayt

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

Bir saniye zaman aşımı ile bir kez deneyin .

Veya birkaç saat boyunca çalışmanın sonucunu veren değiştirilmiş bir versiyonu deneyin .

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
}

'Üçgen' hangi operatörleri destekliyor? İçinde [\+]ekler ve [\-]çıkarmak gibi görünüyor. Bu çarpma ve bununla mı çalışıyor?
Yytsi

@TuukkaX Neredeyse tüm infix operatörleri ile çalışmalıdır. Temelde [+] LIST, azaltıcı ile aynıdır, ancak size ara değerleri verir. Üretmek
Brad Gilbert b2gills

4

QBasic, 120 127 121 bayt

Bunu çok uzun süre çalıştırmayın, aksi halde dizüstü bilgisayarınız ateş alır. Şimdi 99.several9s% ​​CPU daha verimli.

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

Ungolfed ve açıklama

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

Ekranı temizleyerek başlıyoruz, o andan saat ve dakikaları alıyoruz TIMER; bu, gece yarısından beri geçen saniye sayısını döndürüyor.

İlk kez denedim PRINT USING, bu yüzden her zamanki QBasic tuhaflığından muzdarip olmadığını ve pozitif rakamların öncü bir alanda basıldığını keşfetmekten memnun oldum. ##format belirteci olarak, tek basamaklı sayıların doğru şekilde hizalanmasını ve gerektiği gibi boşlukla doldurulmasını sağlar. QBasic bir dize tekrarlama fonksiyonuna sahip olmadığından maalesef tire için bir döngü kullanmak zorundayız. (Yanılıyorsam, lütfen bana bildirin!)

Tüm PRINTifadeler ;newline'ı bastırmak için bitiyor ; ancak kısa çizgilerden sonra yeni bir satıra ihtiyacımız var; Böylece, ?FORdöngüden sonra yalnız .

SLEEP 1Şimdi gereklidir. Onsuz, ekran baskıdan sonra o kadar hızlı bir şekilde silinir ki sadece titreyen bir karışıklıktır. (Kullandığım LOCATE 1yerine CLSbunu fark edene kadar, bu nedenle ilk başta CLSsahip SLEEP. Yine de kısadır) RUNüstten programı yeniden - sonsuz döngü almak için en kısa yol.


Bu günün son saatini nasıl idare ediyor? Üst satır 23, fakat ne; alt satırdaki saat kaç?
steenbergh

Not 7'yi kullanıyorum ve bu programı durum çubuğu saatimin yerine öngörülebilir bir gelecek için çalıştırmayı düşünüyorum. Bu iyi bir fikir mi?
owlswipe

@ steenbergh Boğmaca, düzeltildi. Soruda söz konusu olan bu durumu dile getirmeniz yararlı olacaktır.
DLosc

@Dosc Nah, sadece şaka yapıyorum :)). Ama evet, akıllı!
owlswipe

1
@ steenbergh H MOD 24'ü basar, eğer başlangıçta h = 23 ise, bir sonraki döngü 24, 24 ve 0'a modlanır. Ama bunun da işe yarayıp yaramadığını merak ediyorum. CLS ilk satırı temizler, böylece ekranda hiçbir zaman her iki basılı satır olmaz, değil mi?
Jens

4

Java 8, 313 300 299 bayt

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

Bu sadece while döngüsünün her 30 tekrarlamasını günceller. Diğer 29 yineleme sadece yeni satırları yazdırıyor.

Güncellenmiş

Kevin Cruijssen'in yardımı nedeniyle 13 14 bayt kaydedildi ! Teşekkürler!


Merhaba, PPCG'ye hoş geldiniz! Öncelikle, yalnızca programlara / işlevlere izin verilir ve geçerli kodunuz bir snippet'tir. Bunu bir yöntemle kuşatmanız void f(){...}gerekecek (yani , gerekli olan ithalatı eklemeniz gerekir (sizin durumunuzda import java.time.*;). Söylendiği gibi, kodunuz 311 bayta düşürmek için birden fazla yerde çalıştırılabilir (eklenen yöntemle bile) -declaration ve import). (Bu yorum için çok uzun sürdüğü için, bir sonraki yoruma
koydum

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 ) Java ile Golf için İpuçları ve <tüm diller> ile golf için İpuçları . Kaldınız.
Kevin Cruijssen

@KevinCruijssen Cevabımı güncelledim ve lambda notasyonu kullanarak 3 bayt daha tasarruf ettim. Ayrıca, sağladığınız koda birkaç parça da değiştirdim (örneğin for(i=0;i++<60, 61 (h<10?yerine 9 yerine.) Metod bildirimi ve bazı golf ipuçlarını bildirdiğiniz için teşekkür ederiz!
CraigR8806

Ah, 60 yerine 61 aslında benim hatamdı. Bunun for(i=0;++i<61yerine yazdığımı sanıyordum for(i=0;i++<61(bu ikinci durumda gerçekten 60 olmalı, ve aynı miktarda bayt olmasına rağmen, muhtemelen daha açık / okunaklı olabilir). h<9Benim kodunda olsa doğrudur. Önceden yapmıştın h+1<10ve ben h<9her ikisini de kaldırarak bunu değiştirdim . :)
Kevin Cruijssen

1
@KevinCruijssen Ha Bunu anlamadım! h<9. 1 bayt daha tasarruf etmek için düzenleyeceğim. Tekrar teşekkürler!
CraigR8806

4

C, 176 162 161 160 156 bayt

Bu, işaretçilerin ağır şekilde kötüye kullanılmasıdır ancak belirtildiği şekilde derlenir ve çalışır. Optimizasyon olmadan derlediğinizden emin olun, aksi takdirde segfault'a çarpmanız olasıdır.

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

3

JavaScript (ES6), 162 bayt

Saniyede bir kez güncellemeler

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)


Kodu yeniden yapılandırarak epeyce bayt kaydedebilirsiniz, böylece yalnızca bir ifadedir ( bağımsız değişken console.clear()içinde çağırmak mümkündür console.log) ve kullanılmayan parantezleri mümkün olduğunca atayabilirsiniz. 154B için Sürüm: 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'+$:$))).
Luke

Saati ve dakikayı tek bir fonksiyona koyarak bir demet bayttan tasarruf edebilirsiniz m=>`0${h++} \.slice(-3)+'-'.repeat(m).
Neil

3

Python 2, 131 129 127 bayt

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 sayesinde bir bayt kaydedildi


2
New Line'a sonra boşluğa ihtiyacınız yokwhile 1:
Buğday Sihirbazı

Kodunuzu 19: 55'te başlattım. 20:01 de görüyorum 19 - \n 20 -----------------------------------------------------------. Saatler güncellenmiyor ...
steenbergh

@ steenbergh Saati elle ayarlayarak kendim denedim ve benim için çalışıyor.
ovs

@ovs saat zorlukları eğlenceli değildir :-). Her neyse, muhtemelen repl.it ile bir şey ...
steenbergh

merkez bürosu Repl.it sunucusu yerel saatime bir saat kaldı ... Konsolun en tepesinde bile öyle yazıyor. Kendimi göreceğim, teşekkürler ...
steenbergh 17:17

3

C 251 267 251 bayt

 #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 versiyonu

#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");    
 }
}

Yapılan işi alır! Kesinlikle bir şekilde kısaltılabilir. unistd.hDosyanın dahil olduğunu varsayın .

@Neil Bilgi için teşekkürler.

@Seth 8 bayt kaydettiğiniz için teşekkür ederiz.


IIRC Mecbur dahil (bu durumda tanımları arasında derleme kodu almak için gereken her şeyi time_tve struct tm) sizin bayt sayısında.
Neil

Yerine printf("\n");kullanabilirsinizputs("");
Seth

3

İlk kez golf oynamak ...

Powershell, 116 bayt (122 idi)

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}

Düzenleme: @ AdmBorkBork'un tavsiyesiyle, 6 baytlık bir tasarruf için Get-Date'i bugüne kadar değiştirdi ve cls'ye temizleyin.


PPCG'ye hoş geldiniz, iyi cevap
george

PPCG'ye Hoşgeldiniz! Birkaç kolay çoraplar - kullanabileceğiniz clsyerine clear(Windows üzerinde bu kadar uzun sen gibi) ve dateyerine get-date. Ayrıca biçimlendirmeyi çıkarmanın daha kolay bir yolu olduğundan da eminim - onunla oynuyorum ve bir şey bulursam size haber vereceğim.
AdmBorkBork

Güzel. Bunu dene: 108 bayt while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}. Editörünüzde LF satır sonu kullanın, ``
n`

3

PHP, 104 105 bayt

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

için vitrin printf's özel karakterleri doldurma:
"%'-Ns"= sol ped dize -kadar Nkaraktere.

ekranı temizlemek yerine 99 yeni satır (her 6 saniyede bir) yazdırır.

İlk yeni satır tek bir karakter olmalıdır. Öyleyse, Windows'da bunun değiştirilmesi gerekir \n.


2

GameMaker Dili, 134 bayt

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

Ayarlarda, bunun çalışması için ölümcül olmayan hataları görmezden gelmelisiniz. Ayrıca, GML'de, çoğu dilde #eşdeğerdir \n.


2

Perl 6 , 104 bayt

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

ANSI uyumlu bir terminalde çalıştırılması gerekir, böylece terminal sıfırlama kontrol dizisi çalışır.

Oldukça basit (çünkü denediğim daha karışık yaklaşımlar daha uzun sürdü):

  • DateTime.now.&{" "}.say xx*: Geçerli saati bir dizgeye dönüştürün (aşağıya bakınız) ve söyleyin ve hepsini sonsuz sayıda tekrarlayın. Dize şöyle inşa edilmiştir:
    • \ec: <ESC>cEkranı temizleyen terminali sıfırlamak için ANSI kontrol kodu .
    • {.hour.fmt: '%2s'}: saat, 2 sütuna sağa hizalı
    • : uzay
    • {'-'x.minute}: tire dakika tekrarladı
    • \n: Yeni hat
    • {(.hour+1).fmt: '%2s'}: sonraki saat, 2 sütuna sağa hizalı
    • : uzay
    • {'-'x 60-.minute}: kısa çizgi 60 dakika eksi dakika

2

AWK, 190 bayt

#!/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}}

Yerleşik AWKbir sleepişlevi olmadığından, dakikanın değişip değişmediğini görmek için saati sürekli kontrol ettim. Önemli olan işe yarıyor ... değil mi? :)


2

Python 3.5, 127 120 117 bayt

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
Sadece print('\n'*50)onun yerine os.system('cls')* nix ve Windows üzerinde de çalışamaz mı? osİçe aktarma işlemini kaybedebileceğiniz için bir kaç bayt tasarruf edersiniz ve OP buna izin verildiğini söyler.
ElPedro,

Oh, o zaman doğru okumamıştım. Çok teşekkürler adamım.
Gurupad Mamadapur

Sadece bilgi için, çoğu insan eski bayt sayısı çevresinde <s> </s> kullanma eğilimindedir ve ardından yeni bayt sayısını koyma eğilimindedir, çünkü ilerlemeyi bir cevap olarak iyileştirilmiş olarak görmek ilginçtir. saati. Hala Python 2 ile çalışıyorum.
ElPedro,

1
@ElPedro Yea Yapmayı unuttum. Şimdi düzenleyeceğim.
Gurupad Mamadapur

2

Python, 115 113 bayt

@kundor ve @Phlarx sayesinde birkaç bayt kurtardı

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

En azından sistemimde, bu temel karakterleri silmez, böylece ikinci satırdaki çizgi sayısı zaman geçtikçe azalmaz. Ayrıca: while döngüsünü bir satıra yerleştirerek üç bayt, :02formatları da değiştirerek iki bayt kaydedebilirsiniz :2.
Nick Matteo,

2
@Kundor tarafından 1 byte olarak açıklanan sorunu, ilgili {} öğesinden sonra bir boşluk ekleyerek düzeltebilirsiniz.
Phlarx

@kundor düzeltildi! Teşekkürler. :02Biçimi, sıfır ile bir basamaklı saate sağa kaydırmaya devam ettim .
dfernan

@kundor * sola sıfır ile bir basamaklı saat.
dfernan

@ ddfernan: Eh, :2meydan ok sorun değil diyor boşlukları ile sol-pad.
Nick Matteo,

2

C # Etkileşimli (138 Bayt)

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
Can golf 1 ile bu aşağı) tarih Var adlandırma dyerine dt? ve 2) kullanım mı sleep(1e3)yoksa 999yerine 1000mi?
steenbergh

@steenbergh bkz. güncelleme
seri0ne,

Birkaç şey ... Bu bir snippet değil bir yöntem veya program (C # Interactive olsa da geçerli olup olmadığından emin değilim), esasen benim kodumun golflü bir versiyonudur ayrı bir çözüm (bu spekülasyon olsa da) ve burada yapabileceğiniz birçok küçük iyileştirme var ve hatta uykuya da ihtiyacınız var mı?
TheLethalCoder

@TheLethalCoder SADECE interaktif konsolda çalıştığı için özellikle C # Interactive'i koydum . Bu standart bir C # programı olarak işe yaramaz.
series0ne

Ayrıca, saat 23 olduğunda ve dakika 0 olduğunda bunun işe yaramayacağını da unutmayın
TheLethalCoder

2

PHP, 112 120 bayt

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

Ekranı temizlemenin bir yolu olmadığından (bulabildiğim kadarıyla) bir sürü yeni hatla gitmem gerekiyordu. Ayrıca dakikada en az bir kez "en az" olarak güncellenen soru ile bir bayt kaydeder9 yerine60 .

edit: @Titus ikinci saatin dolgusunda bir hata fark etti. Sabitleme 8 bayta mal oldu.


Bu görüntüler doğru çıkışı ile birlikte stdout'ta metni uyarı: 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 hakkında bir şey var mı?
steenbergh

@ steenbergh Bu haber; Varsayılan değerleri kullanırsanız görüntülenmez (komut satırı parametresi -nveyaerror_reporting(22519);
Titus

saat 2 uzunluğa kadar doldurulmalı
Titus

İyi nokta, Htarih ayarı 00-23 arasındadır, ancak ikinci saat için unuttum.
user59178

Fiziksel çizgi ile iki bayt kaydedin.
Titus

2

Bash (3 ve 4): 90 bayt

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

Kullanımı nedeniyle $0 , bu komut dosyasının etkileşimli bir bash kabuğuna yapıştırılmamış bir dosyaya yerleştirilmesi gerekir.

İlk komut $d60 tireye; Bu betiğin ilk satırının 60 karakter uzunluğuna dayanır. Bu, bulabileceğim bir sonraki en iyi şeyden üç karakter daha kısa:

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

Sonunda kutunuzu PID'lerden veya bellekten boşaltmak istemiyorsanız eval, bu 95 bayt olan son satırın başına ekleyebilirsiniz .


Bana hatayı veriyor let: h=09: value too great for base (error token is "09"). Sorun, baştaki sıfırların sekizli sabitler olarak yorumlanmasıdır, bu nedenle 09 geçersizdir.
Nick Matteo,

Hrm, bu benim senaryomun birkaç şekilde bozulduğu anlamına geliyor. Teşekkürler.
Evan Krall,

2

BASH, 165 141 155 bayt

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
Uykuyu

Bazı optimizasyonlar: sleep 9while döngüsünün durumuna geçin; -4. satırdaki biçim dizesindeki M'nin önünü kaldırın, ayrıca aritmetik ifadelerde değişken adlarının önünde $ kullanmanız gerekmez, bu durumda $((60-$m))olabilir$((60-m))
Evan Krall

9. satırdaki matematiğin doğru olup olmadığından emin değilim: h=23; echo $((10#$h+1))benim için 24 yazıyor.
Evan Krall

24'ün nesi var?
pLumo

-M'ye ihtiyacım var çünkü $ ((60-08)) hata veriyor.
pLumo

1

Gura , 138 bayt

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

Oldukça kısa ve anlaşılır :)


Vay ... Bu hızlı. Gura'yı çalıştırma konusunda herhangi bir ipucu var mı? Sadece ikili dosyaları indirdi, ancak Gura.exebu kodda çalıştırmak ve yapıştırmak bana bir sözdizimi hatası veriyor symbol k is not defined.
steenbergh

Noktalı virgül unuttum! Tekrar çalıştırmayı deneyebilirsin :)
Sygmei

1
Bu her dakika güncelleniyor mu? Konsol bu kodu sadece bir kere çalıştırıyor gibi görünüyor ...
steenbergh

Woops, o kısmı görmedim, şimdi çalışıyor olmalı!
Sygmei

Güncellediğinde, ekranı temizlemeli veya 30 yeni satır eklemelidir. Dostum, ben senin davasındayım ...
steenbergh

1

Tamam, bir süredir kod golf yapmadım, bu yüzden işte üzücü girişim :)

Unix Korn Shell: 177 171 170 bayt

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 ekoyu 1'e ekledim, birkaç bayt kurtardı ... (uyku 10 yerine 1 9 bayt: P) lol
Ditto

1

Mathematica, 235 bayt

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

İşleme, 204 200 198 197 bayt

@L sayesinde 5 bayt kaydedildi. Daha akıllı ternerler kullanarak Serné

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

Bu, her güncelleme için 30'dan fazla yeni satır çıktısı alır (çerçeve güncellendiğinde gerçekleşir)

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

Değişen ((i=hour())<10?" ":"")+iINTO ((i=hour())>9?i:" "+i)ayrıca golf ile 2B iki kez ... İyi şanslar kurtarmak istiyorum!
Luke

@ L.Serne bahşiş için teşekkürler :)
Kritixi Lithos

Kudreti çalışmalarında bir diğer gelişme: ((i=hour()+1)>24?i=0:i)>9olur (i=hour()+1)>9, çünkü hoursen artışını hareket etmeliyiz, bu ilave 0-23 aralığındadır ve hatta 1'den bir sayı, bu da 24'e daha büyük asla çıkışlar iiçinde durumun iç fordöngü En son döngüde yaptığın gibi. Toplamda 13B tasarruf etmeli.
Luke

@ L.Serné İlk nokta için yine de üçgeni eklemem gerekiyor, çünkü 24 saatlik bir saatte 23 + 1 0 oluyor (veya en azından sanırım). Daha isonra, for-döngüsü koşulunun içindeki artışı arttırırsam, bunun yerine ibaşlayacağım ve bir bayt daha eklemem gerekiyor ve bayt sayısı yine aynı olacak. Ama yine de, bana 1 bayt daha golf 10i++<=minute()
attığım

1

C, 239 bayt

#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'in ve Abel'ın girişlerinden esinlenilen bu işlem, gerektiğinde bir sonraki saat için 24 yerine 0 yerine 0 değerini gösterecek ve ekranı temizlemek için 30 satır kullanacaktır.


1

SmileBASIC, 55 bayt

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

Açıklama:

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)

Not: SmileBASIC sadece 50 metin sütununa sahiptir, bu yüzden iyi görünmeyecek ...


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

Bu kod using System.Threading;satırın dahil olduğunu varsayar .

Tam sınıf:

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

Bu çözüm, döngüden çıkmanın hiçbir yolu yoktur (orijinal, yorum yapılan, kodu ayrı bir dizide çalıştırır), bu nedenle Console.ReadKeyifade gereksizdir. Ctrl+Break
Çıkmanın

Bu sadece bir kod parçacığı değil bir yöntem veya program değil, aynı zamanda using System.Threading;kullanıyorsanız bayt sayısına dahil edilmesi gerekir. İle aynı Using System;.
TheLethalCoder
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.