Zbuduj zegar analogowy [zamknięty]

16

Napisz program, który wyświetla bieżący czas systemowy jako zegar analogowy, używając grafiki ASCII. Zegar musi pokazywać co najmniej wskazówki godzinowe i minutowe oraz musi mieć wystarczającą rozdzielczość co najmniej 5 minut.

Wyświetlacz może być tak mały i brzydki, jak chcesz, ale pokazany czas powinien być łatwo rozpoznawalny.

Program musi działać nieprzerwanie i aktualizować swój status. Jeśli twój system może wyczyścić ekran, użyj go, w przeciwnym razie wystarczy odmalować zegar, gdy zmieni się jego stan.

Otrzymasz -20% premii od liczby postaci, jeśli zegar ma rozdzielczość co najmniej 1 minuty.

vsz
źródło
Kiedy mówisz o zegarze analogowym, masz na myśli zwykły jeden lub jakąkolwiek formę analogowego przedstawienia czasu?
Marco Martinelli,
Dodatkowy bonus za 1 sekundę rozdzielczości?
Shmiddty,
Czy to naprawdę „dostać premię -20%”? Czy nie powinno to być ... pozytywne?
Timtech
@Timtech: jeśli naprawdę tego chcesz, mogę dodać 20% do liczby twoich postaci ...
vsz
@vsz Co masz na myśli;
Timtech

Odpowiedzi:

10

Mathematica 207 - 42 = 165

Znaczniki i etykiety godzin są umieszczone na okręgu jednostki. Hi Mobracają się wokół centrum zegara, pokazując odpowiednio całkowitą liczbę ukończonych godzin i minut. Saktualizuje swoją pozycję kilka razy na sekundę.

Pokazane są dwie wersje: wersja, która drukuje tekst w płaszczyźnie kartezjańskiej, a druga, która wyświetla znaki tekstowe w siatce.

Ta wersja umieszcza postacie w płaszczyźnie kartezjańskiej.

d = Dynamic; t = Table; x = Text;i_~u~k_ := {Sin[2 \[Pi] i/k], Cos[2 \[Pi] i/k]};
d[{f = Date[], Clock[{1, 1}, 1]}]
Graphics[d@{t[x[".", u[i, 60]], {i, 60}],t[x[i, u[i, 12]], {i, 12}],
x["H", .7 u[f〚4〛, 12]],x["M", .8 u[f〚5〛, 60]],x["S", .9 u[f〚6〛, 60]]}]

Poniższy zegar pokazuje czas 3:08:17 .

clock

Wersja terminalowa lub sieciowa : 430 316 znaków (253 z dodatkowym rabatem)

Ta wersja działa tak samo, ale umieszcza znaki w siatce komórek 61 x 61, a nie na płaszczyźnie kartezjańskiej. Nadal można go trochę pograć w golfa, ale chciałem tylko pokazać (niechlujny) wynik podobny do terminala w Mathematica .

d = Dynamic; i_~u~k_ := Round /@ (10 {Sin[2 \[Pi] (i + 3 k/4)/k], 
Cos[2 \[Pi] (i + 3 k/4)/k]}); d[{f = Date[], Clock[]}]
z = Round /@ (# u[f[[#2]], #3] + 11) -> #4 &;
t = Table[( u[i, 12] + 11) -> i, {i, 12}];
d@Grid[ReplacePart[ConstantArray["", {21, 21}],
Join[z @@@ {{.9, 5, 60, "M"}, {.8, 4, 12, "H"}},
DeleteCases[Table[( u[i, 60] + 11) -> "*", {i, 60}], x_ /; MemberQ[t[[All, 1]], x[[1]]]], t]]]

Poniższy zegar pokazuje 11:06 .

terminal clock


Dla żartu:

Oto nie analogiczna wersja zegara analogowego. (60 znaków) Nie użyto zewnętrznych bibliotek.

Dynamic@Refresh[ClockGauge@AbsoluteTime[], UpdateInterval -> 1]

clock3

DavidC
źródło
2
Nie wygląda mi to na ASCII.
Joe Z.
3
Postępowałem zgodnie z definicją podaną w Wikipedii: „Sztuka ASCII to technika projektowania graficznego, która wykorzystuje komputery do prezentacji i składa się ze zdjęć złożonych z 95 drukowalnych (z 128) znaków zdefiniowanych w standardzie ASCII z 1963 r. I znak zgodny z ASCII zestawy z zastrzeżonymi rozszerzonymi znakami (poza 128 znakami standardowego 7-bitowego ASCII). Termin ten jest również luźno używany w odniesieniu do sztuki wizualnej opartej na tekście. ”
DavidC
2
Hmm Przypuszczam, że to działa. Oczekuję jednak, że vsz spodziewał się sztuki terminalnej. Być może może to wyjaśnić.
Joe Z.
14

JavaScript 370–74 = 296

http://jsfiddle.net/wBKQ6/7/

(Działa to tylko w Chrome, ponieważ nadużywam faktu, że identyfikatory elementów są dodawane do zakresu globalnego).

(function loop(){
    M=Math;p=M.PI/2;z=M.pow;q=M.sqrt;d=new Date();h=(d.getHours()%12/3*p+p)%(p*4);m=(d.getMinutes()/15*p+p)%(p*4);s=(d.getSeconds()/15*p+p)%(p*4);e=49;o='';

    for(r=0;r<99;r++){
        for(c=0;c<99;c++){           
            d=q(z(r-e,2)+z(c-e,2));
            a=(M.atan2(e-r,e-c)+p*4)%(p*4);
            E=(d<e*.8&&M.abs(m-a)*d<.5) || (d<e*.5&&M.abs(h-a)*d<.5) || (d<e*1&&M.abs(s-a)*d<.5);
            o+=d-e>0||d<1||E||(e-d<5&&a%p==0)?'●':'○';
            //■□●○
        }
        o+='\n';
    }
    O.innerText=o
    setTimeout(loop,1000);
})()

Gra w golfa (370):

!function L(){p=M.PI/2;q=p*4;P=M.pow;d=new Date();s=(d.getSeconds(S=d.getMinutes(e=40))/15*p+p)%q;m=(S/15*p+p)%q;h=(d.getHours(A=M.abs)%12/3*p+S/180*p+p)%q;for(r=o='';r<81;r++,o+='\n')for(c=0;c<81;){d=M.sqrt(P(r-e,2)+P(c-e,2));a=(M.atan2(e-r,e-c++)+q)%q;o+='○●'[d-e>0|d<e*.8&A(m-a)*d<1|d<e/2&A(h-a)*d<1|d<e&A(s-a)*d<1|e-d<5&a%p==0]}O.innerText=o;setTimeout(L,9)}(M=Math)

Przykładowe wyjście (znacznie bardziej skondensowane w wersji demo):

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●○○○○○○●○○○○○○●●●●●●●●●●●●●●
●●●●●●●●●●●●○○○○○○○○●○○○○○○○○●●●●●●●●●●●●
●●●●●●●●●●○○○○○○○○○○●○○○○○○○○○○●●●●●●●●●●
●●●●●●●●○○○○○○○○○○○○●○○○○○○○○○○○○●●●●●●●●
●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●●●
●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●●
●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●
●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●
●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●
●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●
●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●
●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●●○○○○○○○○○○○○○○○○○○○○○○○○○●○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○●●○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○○○○○●●○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○○○○●●○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○○○●●○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○○●○○○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○●○○○○○○○○○○○○○○○○○○●
●●●●●○○○○○○○○○○○○○○○●○○○○○○○○○○○○○○○●●●●●
●○○○○○○○○○○○○○○○○○○●○●○○○○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○●○○●○○○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○●○○○○●●○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○●○○○○○●●○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○●○○○○○○○●●○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○●●○○○○○○○○●●○○○○○○○○○○○○●
●●○○○○○○○○○○○○○○●○○○○○○○○○○○●○○○○○○○○○○●●
●●○○○○○○○○○○○○○●○○○○○○○○○○○○○●○○○○○○○○○●●
●●●○○○○○○○○○○○○●○○○○○○○○○○○○○○●○○○○○○○●●●
●●●○○○○○○○○○○○●○○○○○○○○○○○○○○○○●○○○○○○●●●
●●●●○○○○○○○○○○●○○○○○○○○○○○○○○○○○●○○○○●●●●
●●●●○○○○○○○○○●○○○○○○○○○○○○○○○○○○○●●○○●●●●
●●●●●○○○○○○○●●○○○○○○○○○○○○○○○○○○○○●●●●●●●
●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●●
●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●●●
●●●●●●●●○○○○○○○○○○○○●○○○○○○○○○○○○●●●●●●●●
●●●●●●●●●●○○○○○○○○○○●○○○○○○○○○○●●●●●●●●●●
●●●●●●●●●●●●○○○○○○○○●○○○○○○○○●●●●●●●●●●●●
●●●●●●●●●●●●●●○○○○○○●○○○○○○●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
Shmiddty
źródło
Prawdopodobnie mógłbym obniżyć wynik poniżej 263, jeśli usunę drugie rozdanie, ale mi się podoba!
Shmiddty
3
Buźki też lubią być zegarami: jsfiddle.net/wBKQ6/17/show/light
Shmiddty
skrzypce nie działa ...
Agregat matematyczny
@tryingToGetProgrammingStraight Działa dla mnie w Chrome 30
Shmiddty,
korzystam z Firefox 24.0, po prostu wypróbowałem go w chrome - działało, mogę zmienić mój głos tylko, jeśli edytujesz ...
Chłodzenie matematyki
12

Python, 328 - 65 = 263

Drukuje nowy zegar co sekundę, a wskazówka minut jest aktualizowana co minutę.

import math,time
def p(t,r):c[int(25-r*math.cos(t))][int(25+r*math.sin(t))]='*'
while 1:
 time.sleep(1);c=[[' ']*50 for i in range(50)];t=time.localtime();h=t.tm_hour*6.283+t.tm_min/9.549
 for i in range(999):
    p(i/158.0,24);p(h,i*.02);p(h/12,i*.01)
    for q in range(12):p(q/1.91,24-i*.005)
 for y in range(50):print''.join(c[y])

Zegary, które drukuje, wyglądają tak (nie są tak rozciągnięte w moim terminalu):

                  **************                  
               ****      *     ****               
             ***         *        ***             
           ***           *          ***           
          ** **          *         ** **          
         **   *                    *   **         
        **    **                  **    **        
       *       *                  *      **       
      **                                  **      
     **                                    **     
    **                                      **    
    *                                        *    
   ***                                      ***   
   * ***                                  *** *   
  **   **                                **   **  
  *                                            *  
  *                                            *  
 **                                            ** 
 *                                              * 
 *   *                                          * 
 *   ******                                     * 
 *        ******                                * 
 *             ******                           * 
 *                  *****                       * 
 *****                   *                  ******
 *                       **                     * 
 *                        **                    * 
 *                         *                    * 
 *                         **                   * 
 *                          **                  * 
 **                          **                ** 
  *                           *                *  
  *                           *                *  
  **   **                                **   **  
   * ***                                  *** *   
   ***                                      ***   
    *                                        *    
    **                                      **    
     **                                    **     
      **                                  **      
       *       *                  *       *       
        **    **                  **    **        
         **   *                    *   **         
          ** **          *         ** **          
           ***           *          ***           
             ***         *        ***             
               ****      *     ****               
                  **************                  
                         *                        
pudełko kartonowe
źródło
Jak się odczytuje sekundy?
DavidC
1
Nie ma. Drukuje co sekundę, ale aktualizuje się tylko co minutę.
karton_box
8

100% czystości Tylko ! Bez widelca!

Sfinalizowaną i zaktualizowaną wersję można znaleźć tam lub na tej stronie: zegar ascii dla maniaków . Ale nie używaj tego! Przeczytaj notatkę na końcu tej odpowiedzi, zostałeś ostrzeżony! Zamiast tego użyj tej wersji perla !

Pierwszy prosty zegar bez drugiego tiku.

Skalowalne i edytowalne:

time 2>&1 /tmp/asci-art.sh 10 10 10
              . . . 12. . .               
          11.               . 1           
        .                       .         
      .                           .       
    .                               .     
  10                                  2   
  .     H                           M .   
.                                       . 
.                                       . 
.                                       . 
9                                       3 
.                                       . 
.                                       . 
.                                       . 
  .                                   .   
  8                                   4   
    .                               .     
      .                           .       
        .                       .         
          7 .               . 5           
              . . . 6 . . .               


real    0m0.356s
user    0m0.348s
sys     0m0.004s

Narysuj zegar 21x21 (10x2 + 1) o 10H10 w mniej niż jedną sekundę.

To akceptuje 3 argumenty: Usage: ascii-clock.sh [ray of clock] [Hour] [Min]gdzie domyślny promień to 12, rysunek zegara to2 x ray + 1 wysokość linii i podwójna szerokość z powodu dodanego miejsca, aby spróbować uzyskać okrągły kształt.

Jeśli skrypt zostanie wywołany z argumentem 0lub 1, będzie się powtarzać co minutę. W przeciwnym razie, jeśli określono przynajmniej godzinę (drugi parametr), losuje tylko raz i wychodzi.

HZnacznik znajduje się w 70% z promieniowania i Mznacznik znajduje się w 90% z promieniowania.

Bez użycia zewnętrznych plików binarnych takich jak datelubbc do losowania!

(Dzięki @manatwork za wbudowane, read -t jeśli /bin/sleep).

Wszystko to odbywa się za pomocą wbudowanego poleceń powłoki.

Używa sekwencji ANSI , ale tylko dla pętli i aby pogrubić znaczniki.

#!/bin/bash
# Analog clock in Ascii-Art written in BASH V4.2 +=

RAY=${1:-12} NowH=$2 NowM=$3

sqrt() {
    local -a _xx=(600000 200000)
    local _x1=${_xx[$(($1&1))]} _x0=1
    while [ $_x0 -ne $_x1 ] ;do
        _x0=$_x1
        [ $_x0 -eq 0 ] && _x1=0000 || 
        printf -v _x1 "%u" $(( (${_x0}000 + ${1}00000000000/${_x0} )/2 ))
        printf -v _x1 "%.0f" ${_x1:0:${#_x1}-3}.${_x1:${#_x1}-3}
    done
    _x1=0000$_x1
    printf ${2+-v} $2 "%.3f" ${_x1:0:${#_x1}-4}.${_x1:${#_x1}-4}
}
clksin() { # $1:moment [0-60], $2:path length, $3:variable name
    local _csin=(0 104528 207912 309017 406737 500000 587785 669131
        743145 809017 866025 913545 951057 978148 994522 1000000)
    local xsign=1 x=$1 ysign=-1 y=$1
    [ $x -gt 30 ] && xsign=-1 x=$((60-x)) 
    [ $x -gt 15 ] && x=$((30-x))
    x=00000$((RAY*1000000+xsign*${2:-10}*${_csin[$x]}))
    [ $y -gt 30 ] && y=$((60-y))
    [ $y -gt 15 ] && ysign=1 y=$((30-y))
    y=00000$((RAY*1000000+ysign*${2:-10}*${_csin[15-$y]}))
    printf ${3+-v} $3 "%.0f %.0f" \
        ${y:0:${#y}-6}.${y:${#y}-6} ${x:0:${#x}-6}.${x:${#x}-6} 
};

MLEN=000$((900*RAY))
printf -v MLEN "%.0f" ${MLEN:0:${#MLEN}-3}.${MLEN:${#MLEN}-3}
HLEN=000$((700*RAY))
printf -v HLEN "%.0f" ${HLEN:0:${#HLEN}-3}.${HLEN:${#HLEN}-3}

declare -A ticks
for ((i=1;i<=12;i++));do
    clksin $((5*(i%12))) $RAY tick
    ticks[$tick]=$i
done

while :;do
    [ "$NowM" ] || printf -v NowM "%(%M)T\n" -1
    clksin ${NowM#0} $MLEN NowM
    [ "$NowH" ] || printf -v NowH "%(%H)T\n" -1
    clksin $((5*(${NowH#0}%12))) $HLEN NowH

    [ "$2" ] || echo -en \\e[H; # ANSI sequence for top left of console
    for ((i=0;i<=2*RAY;i++));do
        x=$((RAY-i))
        sqrt $((RAY**2 - ${x#-}**2 )) y0
        printf -v y0 "%.0f" $y0
        for ((l=0;l<=2*RAY;l++));do
            y=$((RAY-l));
            sqrt $((RAY**2 - ${y#-}**2 )) x0
            printf -v x0 "%.0f" $x0
            if [ "${ticks["$i $l"]}" ] ;then
                printf "%-2s" ${ticks["$i $l"]}
            elif [ ${x#-} -eq $x0 ] || [ ${y#-} -eq $y0 ] ;then
                echo -n .\ 
            elif [ "$i $l" = "$NowM" ] ;then
                echo -en \\e[1mM\ \\e[0m
            elif [ "$i $l" = "$NowH" ] ;then
                echo -en \\e[1mH\ \\e[0m
            else
                echo -n \ \ 
            fi
        done
        echo -e \\e[K
    done
    echo -en \\e[J
    [ "$2" ] && break # Exit if at least Hour was specified
    printf -v SleepS "%(%S)T" -1
    read -t $((60-${SleepS#0})) foo
    unset NowH NowM
done

Można to uruchomić jako:

for time in 10:10 15:00 12:30 06:00 09:15 16:40 ;do
    echo - $time -{,}{,}{,}
    ./ascii-clock.sh 5 ${time//:/ }
    echo -{,,,,,}{,}
  done |
    sed 's/\o033\[\(.m\|[JK]\)//g;/-$/!s/$/|/;s/-$/+/' |
    column -c 80

Spowoduje to wytworzenie czegoś takiego:

+- 10:10 - - - - - - - + - 12:30 - - - - - - - + - 09:15 - - - - - - - +
|      . . 12. .       |       . . 12. .       |       . . 12. .       |
|    11          1     |     11    H     1     |     11          1     |
|  10              2   |   10              2   |   10              2   |
|.   H           M   . | .                   . | .                   . |
|.                   . | .                   . | .                   . |
|9                   3 | 9                   3 | 9 H               M 3 |
|.                   . | .                   . | .                   . |
|.                   . | .                   . | .                   . |
|  8               4   |   8               4   |   8               4   |
|    7           5     |     7     M     5     |     7           5     |
|      . . 6 . .       |       . . 6 . .       |       . . 6 . .       |
+- - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - +
+- 15:00 - - - - - - - + - 06:00 - - - - - - - + - 16:40 - - - - - - - +
|      . . 12. .       |       . . 12. .       |       . . 12. .       |
|    11    M     1     |     11    M     1     |     11          1     |
|  10              2   |   10              2   |   10              2   |
|.                   . | .                   . | .                   . |
|.                   . | .                   . | .                   . |
|9                 H 3 | 9                   3 | 9                   3 |
|.                   . | .                   . | .                   . |
|.                   . | .                   . | .   M           H   . |
|  8               4   |   8               4   |   8               4   |
|    7           5     |     7     H     5     |     7           5     |
|      . . 6 . .       |       . . 6 . .       |       . . 6 . .       |
+- - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - +

Lub może być uruchamiany jako:

xterm -geom 86x44 -bg black -fg grey -e ./ascii-clock.sh 21 &

xterm -geom 103x52 -fn nil2 -bg black -fg grey -e ./ascii-clock.sh 25 &

gnome-terminal --geometry 103x52 --zoom .5 -e "./ascii-clock.sh 25" &

Alternatywa: z pełnym rysunkiem ścieżki:

#!/bin/bash
# Analog clock in Ascii-Art written in BASH V4.2 +=

RAY=${1:-12} NowH=$2 NowM=$3

sqrt() {
    local -a _xx=(600000 200000)
    local _x1=${_xx[$(($1&1))]} _x0=1
    while [ $_x0 -ne $_x1 ] ;do
        _x0=$_x1
        [ $_x0 -eq 0 ] && _x1=0000 || 
    printf -v _x1 "%u" $(( (${_x0}000 + ${1}00000000000/${_x0} )/2 ))
        printf -v _x1 "%.0f" ${_x1:0:${#_x1}-3}.${_x1:${#_x1}-3}
    done
    _x1=0000$_x1
    printf ${2+-v} $2 "%.3f" ${_x1:0:${#_x1}-4}.${_x1:${#_x1}-4}
}
clksin() { # $1:moment [0-60], $2:path length, $3:variable name
    local _csin=(0 104528 207912 309017 406737 500000 587785 669131
    743145 809017 866025 913545 951057 978148 994522 1000000)
    local xsign=1 x=$1 ysign=-1 y=$1
    [ $x -gt 30 ] && xsign=-1 x=$((60-x)) 
    [ $x -gt 15 ] && x=$((30-x))
    x=00000$((RAY*1000000+xsign*${2:-10}*${_csin[$x]}))
    [ $y -gt 30 ] && y=$((60-y))
    [ $y -gt 15 ] && ysign=1 y=$((30-y))
    y=00000$((RAY*1000000+ysign*${2:-10}*${_csin[15-$y]}))
    printf ${3+-v} $3 "%.0f %.0f" \
    ${y:0:${#y}-6}.${y:${#y}-6} ${x:0:${#x}-6}.${x:${#x}-6} 
};

MLEN=000$((900*RAY))
printf -v MLEN "%.0f" ${MLEN:0:${#MLEN}-3}.${MLEN:${#MLEN}-3}
HLEN=000$((700*RAY))
printf -v HLEN "%.0f" ${HLEN:0:${#HLEN}-3}.${HLEN:${#HLEN}-3}

declare -A ticks
for ((i=1;i<=12;i++));do
    clksin $((5*(i%12))) $RAY tick
    ticks[$tick]=$i
done

while :;do
    [ "$NowM" ] || printf -v NowM "%(%M)T\n" -1
    unset MPath
    declare -A MPath
    for ((i=1;i<=MLEN;i++));do
    clksin ${NowM#0} $i tick
    MPath[$tick]=M
    done
    [ "$NowH" ] || printf -v NowH "%(%H)T\n" -1
    unset HPath
    declare -A HPath
    for ((i=1;i<=HLEN;i++));do
    clksin $((5*(${NowH#0}%12))) $i tick
    HPath[$tick]=H
    done

    [ "$2" ] || echo -en \\e[H; # ANSI sequence for top left of console
    for ((i=0;i<=2*RAY;i++));do
    x=$((RAY-i))
    sqrt $((RAY**2 - ${x#-}**2 )) y0
    printf -v y0 "%.0f" $y0
    for ((l=0;l<=2*RAY;l++));do
        y=$((RAY-l));
        sqrt $((RAY**2 - ${y#-}**2 )) x0
        printf -v x0 "%.0f" $x0
        if [ "${MPath["$i $l"]}" ] ;then
        echo -en \\e[1m${MPath["$i $l"]}\ \\e[0m
        elif [ "${HPath["$i $l"]}" ] ;then
        echo -en \\e[1m${HPath["$i $l"]}\ \\e[0m
        elif [ "${ticks["$i $l"]}" ] ;then
        printf "%-2s" ${ticks["$i $l"]}
        elif [ ${x#-} -eq $x0 ] || [ ${y#-} -eq $y0 ] ;then
        echo -n .\ 
        else
        echo -n \ \ 
        fi
    done
    echo -e \\e[K
    done
    echo -en \\e[J
    [ "$2" ] && break # Exit if at least Hour was specified
    printf -v SleepS "%(%S)T" -1
    read -t $((60-${SleepS#0})) foo
    unset NowH NowM
done

może produkować:

+- 10:10 - - - - - - - + - 12:30 - - - - - - - + - 09:15 - - - - - - - +
|      . . 12. .       |       . . 12. .       |       . . 12. .       |
|    11          1     |     11    H     1     |     11          1     |
|  10              2   |   10      H       2   |   10              2   |
|.   H           M   . | .         H         . | .                   . |
|.   H H H   M M M   . | .         H         . | .                   . |
|9                   3 | 9                   3 | 9 H H H H   M M M M 3 |
|.                   . | .         M         . | .                   . |
|.                   . | .         M         . | .                   . |
|  8               4   |   8       M       4   |   8               4   |
|    7           5     |     7     M     5     |     7           5     |
|      . . 6 . .       |       . . 6 . .       |       . . 6 . .       |
+- - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - +
+- 15:00 - - - - - - - + - 06:00 - - - - - - - + - 16:40 - - - - - - - +
|      . . 12. .       |       . . 12. .       |       . . 12. .       |
|    11    M     1     |     11    M     1     |     11          1     |
|  10      M       2   |   10      M       2   |   10              2   |
|.         M         . | .         M         . | .                   . |
|.         M         . | .         M         . | .                   . |
|9           H H H H 3 | 9                   3 | 9                   3 |
|.                   . | .         H         . | .   M M M   H H H   . |
|.                   . | .         H         . | .   M           H   . |
|  8               4   |   8       H       4   |   8               4   |
|    7           5     |     7     H     5     |     7           5     |
|      . . 6 . .       |       . . 6 . .       |       . . 6 . .       |
+- - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - +

lub

                                . . . . 12. . . .                                 
                          . . .                   . . .                           
                      . .                               . .                       
                  . 11                                      1 .                   
                .                                               .                 
              .                                                   .               
            .                                                       .             
          .                                                           .           
        .                                                               .         
      .                                                                   .       
      10                                                                  2       
    .                                                                   M   .     
    .                                                             M M M     .     
  .             H                                               M             .   
  .               H H                                       M M               .   
  .                   H                                   M                   .   
.                       H H H                       M M M                       . 
.                             H                   M                             . 
.                               H H           M M                               . 
.                                   H       M                                   . 
9                                     H   M                                     3 
.                                                                               . 
.                                                                               . 
.                                                                               . 
.                                                                               . 
  .                                                                           .   
  .                                                                           .   
  .                                                                           .   
    .                                                                       .     
    .                                                                       .     
      8                                                                   4       
      .                                                                   .       
        .                                                               .         
          .                                                           .           
            .                                                       .             
              .                                                   .               
                .                                               .                 
                  . 7                                       5 .                   
                      . .                               . .                       
                          . . .                   . . .                           
                                . . . . 6 . . . .                                 

Ostatnia wersja z Seconds renderuje tyki i nanosleep do synchronizacji.

Działa to tylko na najnowszym Linuksie, ponieważ /proc/timer_listumożliwia obliczenie ułamka sekundy do uśpienia między każdym odświeżeniem.

#!/bin/bash
# Analog clock in Ascii-Art written in BASH V4.2 +=

RAY=${1:-12} NowH=$2 NowM=$3

# Hires Sleep Until
# there is a need to store offset in a static var

mapfile  </proc/timer_list _timer_list
for ((_i=0;_i<${#_timer_list[@]};_i++));do
    [[ ${_timer_list[_i]} =~ ^now ]] && TIMER_LIST_SKIP=$_i
    [[ ${_timer_list[_i]} =~ offset:.*[1-9] ]] && \
        TIMER_LIST_OFFSET=${_timer_list[_i]//[a-z.: ]} && \
        break
done
unset _i _timer_list
readonly TIMER_LIST_OFFSET TIMER_LIST_SKIP

sleepUntilHires() {
    local slp tzoff now quiet=false nsnow nsslp
    local hms=(${1//:/ })
    mapfile -n 1 -s $TIMER_LIST_SKIP nsnow </proc/timer_list
    printf -v now '%(%s)T' -1
    printf -v tzoff '%(%z)T\n' $now
    nsnow=$((${nsnow//[a-z ]}+TIMER_LIST_OFFSET))
    nsslp=$((2000000000-10#${nsnow:${#nsnow}-9}))
    tzoff=$((0${tzoff:0:1}(3600*${tzoff:1:2}+60*${tzoff:3:2})))
    slp=$(( ( 86400 + ( now - now%86400 ) +
                10#$hms*3600+10#${hms[1]}*60+10#${hms[2]} -
                tzoff - now - 1
            ) % 86400)).${nsslp:1}
    read -t $slp foo
}

sqrt() {
    local -a _xx=(600000 200000)
    local _x1=${_xx[$(($1&1))]} _x0=1
    while [ $_x0 -ne $_x1 ] ;do
        _x0=$_x1
        [ $_x0 -eq 0 ] && _x1=0000 || 
    printf -v _x1 "%u" $(( (${_x0}000 + ${1}00000000000/${_x0} )/2 ))
        printf -v _x1 "%.0f" ${_x1:0:${#_x1}-3}.${_x1:${#_x1}-3}
    done
    _x1=0000$_x1
    printf ${2+-v} $2 "%.3f" ${_x1:0:${#_x1}-4}.${_x1:${#_x1}-4}
}
clksin() { # $1:moment [0-60], $2:path length, $3:variable name
    local _csin=(0 104528 207912 309017 406737 500000 587785 669131
    743145 809017 866025 913545 951057 978148 994522 1000000)
    local xsign=1 x=$1 ysign=-1 y=$1
    [ $x -gt 30 ] && xsign=-1 x=$((60-x)) 
    [ $x -gt 15 ] && x=$((30-x))
    x=00000$((RAY*1000000+xsign*${2:-10}*${_csin[$x]}))
    [ $y -gt 30 ] && y=$((60-y))
    [ $y -gt 15 ] && ysign=1 y=$((30-y))
    y=00000$((RAY*1000000+ysign*${2:-10}*${_csin[15-$y]}))
    printf ${3+-v} $3 "%.0f %.0f" \
    ${y:0:${#y}-6}.${y:${#y}-6} ${x:0:${#x}-6}.${x:${#x}-6} 
};

SLEN=000$((870*RAY))
printf -v SLEN "%.0f" ${SLEN:0:${#SLEN}-3}.${SLEN:${#SLEN}-3}
MLEN=000$((780*RAY))
printf -v MLEN "%.0f" ${MLEN:0:${#MLEN}-3}.${MLEN:${#MLEN}-3}
HLEN=000$((650*RAY))
printf -v HLEN "%.0f" ${HLEN:0:${#HLEN}-3}.${HLEN:${#HLEN}-3}

declare -A ticks
for ((i=1;i<=12;i++));do
    clksin $((5*(i%12))) $RAY tick
    ticks[$tick]=$i
done

while :;do
    [ "$NowM" ] || printf -v NowM "%(%M)T\n" -1
    unset MPath
    declare -A MPath
    for ((i=1;i<=MLEN;i++));do
    clksin ${NowM#0} $i tick
    MPath[$tick]=M
    done
    [ "$NowH" ] || printf -v NowH "%(%H)T\n" -1
    unset HPath
    declare -A HPath
    for ((i=1;i<=HLEN;i++));do
    clksin $((5*(${NowH#0}%12))) $i tick
    HPath[$tick]=H
    done
    printf -v NowS "%(%S)T\n" -1
    clksin ${NowS#0} $SLEN STick

    [ "$2" ] || echo -en \\e[H; # ANSI sequence for top left of console
    for ((i=0;i<=2*RAY;i++));do
    x=$((RAY-i))
    sqrt $((RAY**2 - ${x#-}**2 )) y0
    printf -v y0 "%.0f" $y0
    for ((l=0;l<=2*RAY;l++));do
        y=$((RAY-l));
        sqrt $((RAY**2 - ${y#-}**2 )) x0
        printf -v x0 "%.0f" $x0
        if [ "$i $l" = "$STick" ] ;then
                echo -en \\e[1ms\ \\e[0m
        elif [ "${MPath["$i $l"]}" ] ;then
        echo -en \\e[1m${MPath["$i $l"]}\ \\e[0m
        elif [ "${HPath["$i $l"]}" ] ;then
        echo -en \\e[1m${HPath["$i $l"]}\ \\e[0m
        elif [ "${ticks["$i $l"]}" ] ;then
        printf "%-2s" ${ticks["$i $l"]}
        elif [ ${x#-} -eq $x0 ] || [ ${y#-} -eq $y0 ] ;then
        echo -n .\ 
        else
        echo -n \ \ 
        fi
    done
    echo -e \\e[K
    done
    echo -en \\e[J
    [ "$2" ] && break # Exit if at least Hour was specified
    printf -v SleepS "%(%s)T" -1
    printf -v SleepS "%(%T)T" $((1+SleepS))
    sleepUntilHires $SleepS
    unset NowH NowM
done

Bardziej zaciemniona wersja (2702 bajtów):

Zgodnie z prośbą @manatwork istnieje wersja bardziej golfowa .

Ta wersja jest pokolorowana i przedstawia czas cyfrowy na rogach.

#!/bin/bash
W=/proc;J=${1:-12} B=$2 A=$3 LANG=C R=$W/timer_list;if [ -f $R ];then Q=10
mapfile <$R e;for ((P=0;P<${#e[@]};P++));do ((Q+=${#e[P]}));[[ ${e[P]} =~ ^now
]]&&U=$Q;[[ ${e[P]} =~ offset:.*[1-9] ]]&&a=${e[P]//[a-z.: ]}&&break;done;c(){
local q p;read -N$U q <$R;q=${q%% nse*};q=$[${q##* }+a];p=$[2000000000-10#${q:
${#q}-9}];read -t .${p:1} M;};else c(){ local H;read -d\  H < $W/upti*;H=$[200
-10#${H#*.}];read -t .${H:1} M;};fi;u(){ local E=({6,2}00000) F=${E[$1&1]} G=1
while [ $G -ne $F ];do G=$F;[ $G -eq 0 ]&&F=0000||printf -v F "%u" $(((${G}000
+${1}00000000000/${G})/2));printf -v F "%.0f" ${F:0:${#F}-3}.${F:${#F}-3};done
F=0000$F;printf -v $2 "%.3f" ${F:0:${#F}-4}.${F:${#F}-4};};g(){ local t=($[7#0
] 104528 207912 309017 406737 500000 587785 669131 743145 809017 866025 913545
951057 978148 994522 1000000) j=1 x=$1 h=-1 y=$1;[ $x -gt 30 ]&&j=-1 x=$[60-x]
((x>15))&&x=$[30-x];x=00000$[J*1000000+j*${2:-10}*${t[$x]}];((y>30))&&y=$[60-y
];((y>15))&&h=1 y=$[30-y];y=00000$[J*1000000+h*${2:-10}*${t[15-y]}];printf -v\
$3 "%.0f %.0f" ${y:0:${#y}-6}.${y:${#y}-6} ${x:0:${#x}-6}.${x:${#x}-6};};v=000
v+=$((870 *J));printf -v v "%.0f" ${v:0:${#v}-3}.${v:${#v}-3};C=000$((780*J));
printf -v C "%.0f" ${C:0:${#C}-3}.${C:${#C}-3};D=000$[650*J];printf -v D %.f \
${D:0:${#D}-3}.${D:${#D}-3};declare -A m;for ((i=1;i<=12;i++));do g $[5*(i%12)
] $J w;m[$w]=$i;done;printf -v T "\e[1m%s\e[0m " . + \* o O;T=(${T});m["${J: \
} $J"]=${T} ;printf "\e[?25l\e[H\e[J";trap "printf '\e[?12l\e[?25h\e[$((2*J +3
))H\e[J';exit" 0 1 2 3 6 9 15; printf -v S "\\e[1;%dH%%(%%H)T\\e[%dH%%(%%M${Z:
})T\\e[%d;%dH%%(%%S)T" $[4*J] $[2*J+1] $[2*J+1] $[4*J];declare -A V;V["$[2 * J
] $[2*$J]"]="  ";while :;do [ "$A" ]||printf -v A "%(%M)T" -1;unset r;declare\
 -A r;for ((i=1;i<=C;i++));do g ${A#0} $i w;r[$w]=M;done;[ "$B" ]||printf -v \
B "%(%H)T" -1;unset s;declare -A s;for ((i=1;i<=D;i++));do g $((5*( ${B#0}%12)
)) $i w;s[$w]=H;done;printf -v z "%(%S)T" -1;g ${z#0} $v n;[ "$2" ]||echo -en\
 \\e[H;for ((i=0;i<=2*J;i++));do x=$[J-i];u $[J*J-${x#-}**2] N;printf -v N${Z:
} %.f $N;for ((l=0;l<=2*J;l++));do y=$[J-l];u $[J*J-${y#-}**2] O;printf -v O \
%.f $O;c="  ";if [ "$i $l" = "$n" ];then c=$'\e[36;1ms \e[m';elif [ "${r["${i:
} $l"]}" ] ;then c=$'\e[32;1m'${r["$i $l"]}$' \e[0m';elif [ "${s["$i $l"]}" ];
then c=$'\e[34;1m'${s["$i $l"]}$' \e[0m';elif [ "${m["$i $l"]}" ];then printf\
 -v c "%-2s" "${m["$i $l"]}";elif [ ${x#-} -eq $O ] || [ ${y#-} -eq $N ] ;then
c=.\ ;else c="  ";fi;[ "$c" != "${V["$i $l"]}" ]&& V["$i $l"]="$c" && printf \
"\e[%s;%sH%-2s" $((1+i)) $[1+l*2] "$c";done;done;[ "$2" ] &&break;printf "${Z:
}\e[H\e[7mS\e[0m";c;printf "\e[H $S" -1 -1 -1;m["$J $J"]=${T[$[10#$z%${#T[@]}]
]};unset B A;done

Uwaga: i tak tego nie używaj!

Ponieważ jest to program a bash nie jest językiem programowania, przez pewien czas nie warto go używać.

Demo zużycia pamięci w zaledwie 5 godzin, z rysunkiem promienia o długości 7 znaków:

$ ascii-clock.sh 7

After     PMem   PCpu      Mem
    0'30"  0.0%  21.6%   12.98M
   10'30"  1.0%  20.9%   48.91M
 1h 0'30"  5.6%  20.8%  228.63M
 2h 0'31" 11.2%  20.8%  444.25M
 3h 0'32" 16.8%  20.8%  659.91M
 5h 0'00" 27.9%  20.8%   1.064G

Główną zaletą tego jest to, że kiedy potrzebuję pamięci, muszę po prostu zabić zegar.

( Nota: Połączyłem to, wersję perla i jej wersję w ascii-clock dla maniaków ;-)

F. Hauri
źródło
@manatwork Dlaczego? Jest analogowy, działa nieprzerwanie i sprawia, że ​​losowanie zajmuje mniej niż 1 sekundę ... Co źle odczytałem?
F. Hauri,
Ups Mój błąd. Najpierw spróbowałem na bash4.1. W wersji 4.2 rzeczywiście działa w sposób ciągły i nie wymaga parametrów wiersza poleceń.
manatwork
Nie ma limitu wielkości wymagań. A robienie tego w czystym bashu to prawdziwe wyzwanie! Wykonanie tego krótszego bez widelca wydaje się niełatwe (jeśli w ogóle możliwe).
F. Hauri,
Zgadza się, nie ma limitu wielkości, a osiągnięcie go z czystym bashjest demonstracją wielkich umiejętności. (/ ja zdejmuję kapelusz i klika link upvote) Ale te 2529 znaków wciąż można zredukować w duchu wyzwań związanych z golfem kodowym : „Golf-golf to konkurencja polegająca na rozwiązaniu określonego problemu w najmniejszej liczbie bajtów kodu źródłowego. ”
manatwork
@manatwork Jest teraz bardziej golfowa wersja (nie krótsza: od 2529 bajtów, ta wersja ma teraz 2702 bajty, ale ma nowe funkcje)
F. Hauri
6

Python 2 - 207

import time as T
while 1:t=T.localtime();m=t.tm_min/5;l=[12]+range(1,12);l[m]='';l[t.tm_hour%12]='H';l[m]+='M';a='  %s\n';print(a+('%s'+a)*5+a)%tuple(str(l[x])for x in[0,11,1,10,2,9,3,8,4,7,5,6]);T.sleep(9)

Jest bardzo brzydki, ale czytelny. Drukuje co 9 sekund (w razie potrzeby możesz zmienić na 1 sekundę), aktualizuje się co 5 minut. Nie mam dużego doświadczenia z golfem kodu w pythonie, więc spodziewam się, że można to poprawić.

Przykładowe dane wyjściowe:

  12
11  1
10  2
9  M
8  4
7  H
  6
aditsu
źródło
18
Twój zegar wydaje się być Dali. Brawo!
Shmiddty
3

Perl 5 x 65 = 325 - 65 (20%) = 260 znaków !!

Czysty, okrągły, z drugim tikiem i aktualizowany co sekundę.

perl -E '
$r=11;$p=atan2(1,1)/7.5;sub c{($A,$R,$C)=@_;$a[$r-$R*cos($A*$p)][
$r+$R*sin($A*$p)]=$C." "x($C!~/../)};while(::){@a=map{[map{"  "}(
0..$r*2)]}(0..$r*2);map{c$_*5,$r,$_}(1..12);@t=localtime;for$i(qw
|H:6:5:2 M:8:1:1 s:9:1:0 |){($S,$P,$F,$T)=split":",$i;map{c$F*$t[
$T],$_,$S}(do{$T?1:$P}/10*$r..$P/10*$r)};map{say@{$_}}@a;sleep 1}
'

Na 24- liniowej konsoli wyglądają dobrze ( 00:12:56 ):

                    12                        
          11                    1             
                s                             


  10                  H                 2     
                      H                       
                      H                       
                      H           M M         
                      H     M M M             
                      M M M                   
9                                           3 




  8                                     4     



          7                     5             

                      6                       

I jest kolorowa, ładniejsza i mądrzejsza wersja:

#!                               /usr/bin/perl
                        use Time::HiRes qw|sleep time|
                     ;$h=11;$h=$ARGV[0]if$ARGV[0];$P=atan2
                 (1,1)/7.5;$V =4*$h; $v= 2* $h+ 1;@r=(0..2*$v)
              ;sub p{printf @_       }sub        b{ return"\e[1m"
            .pop."\e[0m"              };$              |=p"\e[?25".
           "l\e[H\e[" ."J"            ;$             SIG{ 'INT'}=sub
         {p"\e[?1"    ."2l"                        ."\e"     ."[?25h".
      "\e[%dH"        ."\e"                       ."[J"      ,$v+2;exit;
      };@z=map                                                  {[map{" "
     }@r] }(0                                                     ..2*$v);
    @Z=map{[@                                                  {$z[$_]}]}@r
   ;sub c{($A,$r ,$s                                       )=@_;$z[$h-$r*cos
  ($A*$P)    +.5 ][$h+$                                 r*sin($A*$P)+.5]=$s;}
  for$x(        0..$h) {$y=                         int(sqrt($h**2     -$x**2
 )+.5);$         z[$h-$x][$h-$                  y]=".";$z[$h+$x        ][$h-$y
 ]=".";             $z[$h-$x][$h+$           y]=".";$z[$h+$x            ][$h+$
y]=".";                $z[$h-$y][$h-$    x]=".";$z[$h+$y                ][$h-$x
]=".";                    $z[$h-$y][$h+$x]=".";$z[$h+                    $y][$h
+$x]="."};map{               c$_*5,$h,b$_}(1..12);                @R=map{[@{$z[
$_]}]}@r;while                (::){@t=localtime;                   p"\e[H\e[1;$
{V}H%0"                       ."2d\e[${v}H%02d\e"                        ."[${v
};${ V                         }H%02d",$t[2],$t[                         1],$t[
 0];@z=                         map{[     @{$R[                         $_]}]}(
 0..2*$                                                                 v);for
 $i('H:'                                                              .'65:5:'
  .'2:4',     ""                                               x1    .'M:78:'
   ."1:1" .":2",                                               "s:8". "7:1:"
    .'0:6'){($                                                  l,$p,$F,$u,$
     c)=split                                                    ":",$i;map
      {c$F*$t                                                     [$u],$_
       ,b("\e["                                                ."3${c}m$
        l")}(do{$u     ?1:$                         p} /     100*$h..$p
          /100*$h);}  $z[$            h][            $h]=  b((".","+"
            ,"*","o","O")             [$t             [0]%5]);for$x
              (@r){for$y(@r           ){$           Z[$x][$y]ne$z
                 [$x][$y]?p"\e[%d;%dH".$z  [ $x] [$y],$x+1,2*$
                    y+1:''};};@Z=map{[@{$z[$_]}]}@r;$n=1-$1
                        if time=~/(\..*)$/;p"\e[H\e[7m"
                               ."S\e[0m";sleep$n}

Ta wersja jest silnie powiązana z inną odpowiedzią , z tą główną zaletą, że można przez chwilę uruchomić to w spokoju! Możesz więc znaleźć tam uaktualnioną wersję lub na tej stronie ascii-clock dla maniaków .

W demonstracji, która robi ok samo w wymaga mniej zasobów:

$ ascii-clock.pl 7

After     PMem   PCpu      Mem
    0' 0"  0.0%   0.0%    23.5M 
   10'30"  0.0%   0.0%    23.5M 
 1h 0' 0"  0.0%   0.0%    23.5M 
 2h 0' 0"  0.0%   0.0%    23.5M 

dla mniej więcej takich samych funkcji:

  • poczekaj na początek każdej sekundy na odświeżenie
  • rysuj kolorem i pogrubionymi atrybutami
  • narysuj pełne koło z kropkami, zaznaczeniem godziny, pełną ścieżką godzin i minut oraz skropką dla drugiego przewodnika.
  • narysuj zegar cyfrowy wskazujący godzinę w prawym górnym rogu, minuty w lewym dolnym rogu i sekundy w prawym dolnym rogu.
  • pytaj Sw lewym górnym rogu podczas snu (poszukaj różnicy w wersji )

Plus

  • -aZaktualizowana wersja autoryzuje argument do rysowania ścieżki godzinowej i minutowej ułamkowo (ścieżka godzinowa miejsca 11h59 około 12h).

Niech kolejna wersja perla !!!

Korzystanie z następującego (pięknego) obrazu:

Wspaniała reprezentacja kodu perla

Niż możesz po prostu:

curl http://i.stack.imgur.com/xvbHP.png |
  perl -e 'use GD;GD::Image->trueColor(1);$i=GD::Image->newFromPng(
      STDIN);my($x,$y)=$i->getBounds();for my$k(0..$x-1){for my$l(0
      ..$y-1){$_.=pack"UUU",$i->rgb($i->getPixel($k,$l))};};eval'

Ok, wymaga to zainstalowania gd2-perl. Ale można zastąpić curlprzez wget -O -;-)

(Uwaga: ten obraz ma rozmiar około 1,5 KB. Zbudowałem kolejny taki sam obraz, ale o długości 900 bajtów. Możesz znaleźć to zdjęcie, a także jego wersję w ascii-clock dla maniaków :-)

F. Hauri
źródło
W ostatniej próbie, I (zalecamy /) sugerują zastąpić evalprzez print, aby przed uruchomieniem nieznanego pobrać kod ;-)
F. Hauri
2

Tcl, 288

while 1 {scan [clock format [clock seconds] -format %k-%M] %d-%d h m
regsub -all \ +|. "oaosocowoeouooovoioxozom   r    n\n" \ {&} p
lset p [set h [expr $h%12*2]] h
lset p [set m [expr $m/5*2]] [expr $h-$m?"m":"x"]
puts [string map /\ $p {rr/nrzmrann xrrr snnimrrrcnn vrrr wnnromrenrru}]}

Ok, oto wyjaśnienie:

  • while 1 {...} - Ok, zapomnij wyjaśnienia.
  • regsub -all \ +|. "oaosocowoeouooovoioxozom r n\n" \ {&} pzastępuje +|.się _{\0}i zapisuje wynik w p. pjest tak naprawdę pomieszanym słownikiem, w którym brakuje pierwszego klucza (lub tylko listą z nieparzystą liczbą elementów).
  • lset p [set h [expr $h%12*2]] h ustawia godzinę na liście zastępczej
  • lset p [set m [expr $m/5*2]] [expr $h-$m?"m":"x"]ustawia minuty. jeśli godzina i minuta są takie same, użyj xzamiast tego.
  • string map /\ $p {rr/nrzmrann xrrr snnimrrrcnn vrrr wnnromrenrru} /\ $pjest równa "/ $p", więc dodaję pierwszy key ( /). Następnie zastępuję każde wystąpienie klucza rr/nrzmrann xrrr snnimrrrcnn vrrr wnnromrenrrujego wartością.

Zwykła mapa to

/ o a o s o c o w o e o u o o o v o i o x o z o m {   } r {    } n {
}

(Odczytywać jako „Zamień /z o, wymienić az o... zastąpić mz ___(które powinny być spacji))

I repace oz hi innych z m, m, ri nto tylko do Shoren ciąg wyjściowy (Wymieniłem kilka pomieszczeń z jednym z nich, również \nz n). Pierwszy element dodaję później, aby zamiast h * 2 + 1 użyć indeksu, który zastępuję. (zapisuje 2 znaki)

Niektóre uwagi:

  • Lista w Tcl używa białych znaków jako separatora, jeśli element zawiera spację, musisz go zawrzeć {}. Ok, jest to trochę bardziej skomplikowane, np. Można uciec przed spacją za pomocą \, ale takie szczegóły są udokumentowane gdzie indziej .
  • Dict w Tcl to tylko lista z parzystą liczbą elementów: key1 value1 key2 value2
  • Możesz traktować listę jako ciąg znaków lub ciąg jako listę. Działa, jeśli ciąg jest prawidłową listą. Darmowa serializacja!
Johannes Kuhn
źródło
Kiedy jest 14:23, wyświetla nieprawidłowo wskaźnik godziny 13:00 zamiast 14:00! - tutorialspoint.com/…
sergiol
Cóż, Tcl wie o strefach czasowych. Skonfiguruj swoje środowisko poprawnie. (wygląda jak tutorialspoints używa UTC)
Johannes Kuhn
UPS przepraszam. Być może jestem w innym ustawieniu czasu. Oto Portugalia, używamy GMT, a będąc w lecie, godzina to +1. Więc zdobądź moje poparcie.
sergiol
2

JavaScript 2169-434 = 1735

Ok, dużo, ale są w porządku i działają tak samo jak mój poprzedni wariant w poprzednich postach ( bash i perl ).

Ta wersja jest bardziej zaciemniona niż ta, którą można znaleźć na moim zegarku ascii dla maniaków

var x='<div class="m">&nbsp;M</div>',v='<div class="s">&nbsp;s</div>',w='&nbsp;'
,r=10,q,w='&nbsp;',y='<div class="h">&nbsp;H</div>',f=new Object();function d(){
q=document.getElementById("asciiclock");var t=document.location.toString().match
(/[?]([0-9]+)/);if (t!=null) r=t[1]*1.0;a();b();}function m(e){r=e;a();}function
a(){f=[];for (var i=1;r>i;i++){var u=Math.round(Math.sqrt(Math.pow(r,2)-Math.pow
(r-i,2)));f[(2*r-i)+"x"+(r+u)]=w+".";f[(i)+"x"+(r+u)]=w+".";f[(2*r-i)+"x"+(r-u)]
=w+".";f[(i)+"x"+(r-u)]=w+".";f[(r+u)+"x"+(2*r-i)]=w+".";f[(r+u)+"x"+(i)]=w+".";
f[(r-u)+"x"+(2*r-i)]=w+".";f[(r-u)+"x"+(i)]=w+".";}for(var i=1;13>i;i++){f[Math.
round(r+r*Math.sin(Math.PI/6*i-Math.PI/2))+"x"+Math.round(r+r*Math.cos(Math.PI/6
*i-Math.PI/2))]='<div class="t">'+(i<10?w+i:i)+'</div>';}}function b(){var z='';
var s=new Date(), o=s.getMinutes()*1.0+1.0*s.getSeconds()/60,p=s.getHours()*1.0+
1.0*o/60,n=s.getSeconds()*1.0,k=s.getHours();if (k<10) k=w+k;var j=s.getMinutes(
);if (j<10) j=w+j;var h=s.getSeconds();if (h<10)h=w+h;var g=new Object();for(var
i=1;r*.78>=i;i++) {g[Math.round(r+i*Math.sin (Math.PI/30*o-Math.PI/2))+"x"+Math.
round(r+i*Math.cos(Math.PI/30*o-Math.PI/2))]=x;};for (var i=1;r*.62 >=i;i++) {g[
Math.round(r+i*Math.sin(Math.PI/6*p-Math.PI/2))+"x"+Math.round(r+i*Math.cos(Math
.PI/6*p-Math.PI/2))]=y;};g[Math.round(r+.87*r*Math.sin(Math.PI/30*n-Math.PI/2))+
"x"+Math.round(r+.87*r*Math.cos(Math.PI/30*n-Math.PI/2))]=v;for (var i=0;2*r>=i;
i++){for(var l=0;2*r>=l;l++){if((i==r)&&(l==i)){z+=w+'<div class="t">'+['.','+',
'*','o','O'][n%5]+'</div>';}else if(f[i+"x"+l]!=undefined){z+=f[i+"x"+l]}else if
(g[i+"x"+l]!=undefined){z+=g[i+"x"+l];}else if(l==2*r){if(i==0){z+=w+'<div clas'
+'s="t">'+k+'</div>';}else if(i==l){z+=w+'<div class="t">'+h+'</div>';}else{z+=w
+w;};}else if(l==0){if(i==2*r){z+='<div class="t">'+j+'</div>';}else if(i==0){z=
'<div class="r">S</div>'+w;}else{z+=w+w}}else{z+=w+w}};z+='<br />';};q.innerHTML
=z;window.setTimeout(b,1000-new Date().getMilliseconds());};function c(){window.
setTimeout(b,0);q.innerHTML=w+q.innerHTML.substring (22);q.setAttribute('style',
'display:none');q.setAttribute('style',null)};window.onload=d;
.asciiclock { margin: 3em 0px 0px 0px;padding: 2px 4px 2px 3px; font-size: .5em;
display:inline-block;font-family:mono,monospace,courier;background:rgba(0,0,0,.7
);color: #888;}.asciiclock div{ display:inline-block;font-weight:bold;}.h{color:
#46F;}.m{color:#0F0;}.s{color:#0FF;}.r{color:#000;background:#aaa;}.t{color:#aaa
;}pre{display:inline-block;}
<head><title>Ascii-clock</title><script type="text/javascript" src="ascii-clock.js"
></script><link rel="stylesheet" href="ascii-clock.css" type="text/css"><style
type="text/css">body{margin:0;padding:0;background:#000;}.asciiclock{margin:0}
</style></head><body><div id="asciiclock" class="asciiclock"></div></body>

F. Hauri
źródło
1

Python, 259 - 52 = 207

from time import*
from math import*
g=[[' ']*61 for _ in[0]*31]
while 1:
 t=localtime()
 for x in range(60):a=pi*x/30-pi/2;g[15+int(15*sin(a))][30+int(30*cos(a))]='m'if x==t.tm_min else'h'if x==t.tm_hour%12*5 else'-'if x%5 else'#'
 for r in g:print''.join(r)

Przykładowe dane wyjściowe:

                              #                              
                     -  -  -     -  -  -                     
                  -                       -                  
             -  h                           #  -             
          -                                       -          
        -                                           -        

      m                                               -      
     #                                                 #     
   -                                                     -   

  -                                                       -  
 -                                                         - 

 -                                                         - 
#                                                           #
 -                                                         - 

 -                                                         - 
  -                                                       -  

   -                                                     -   
     #                                                 #     
      -                                               -      

        -                                           -        
          -                                       -          
             -  #                           #  -             
                  -                       -                  
                     -  -  -     -  -  -                     
                              #                              
Daniel Lubarov
źródło
1

Rubinowy: 230 228 znaków - 46 = 182

M=Math
P=M::PI
x=->n,m=60,r,c{$><<"^[[%d;%dH%s\n"%[M.sin(n*P*2/m-P/2)*r+12,M.cos(n*P*2/m-P/2)*r*2+24,c]}
while t=Time.now
$><<"^[[2J"
1.upto(12){|i|x[i,12,11,i]}
x[t.hour*5+t.min/12,8,?H]
x[t.min,9,?M]
x[t.sec,10,?S]
sleep 0.1
end

(Uwaga: ^[jest pojedynczym znakiem).

Przykładowy przebieg (o 21:19:33):

                      12
           11                     1



   10                                     2




       H
 9                                           3


                                       M

   8                                      4



            7   S                 5

                       6

Wersja „Tak brzydka, jak chcesz”: 191 181 znaków - 36 = 145

(Mniejszy rozmiar, niższa precyzja, brak sekund, identyczny promień, straszne migotanie.)

x=->n,m=60,c{$><<"^[[%d;%dH%s\n"%[Math.sin(n*6.3/m-1.6)*8+9,Math.cos(n*6.3/m-1.6)*8+9,c]}
while t=Time.now
$><<"^[[2J"
1.upto(12){|i|x[i,12,i]}
x[t.hour*5+t.min/12,?H]
x[t.min,?M]
end

Przykładowy przebieg (o 21:19):

       12  1
   11

              2
 10


H              3
9


               M
 8

            5
    7   6

Wersja bez trygonometrii: 130 125 znaków (bez premii)

(Zainspirowany Johannes Kuhn „s rozwiązania Tcl . Nie wiem, jak wiele, jak nie mam jeszcze rozszyfrować jego kodu).

while t=Time.now
puts"^[[2J  k l a
j\tb
i\tc
h\td
  g f e".tr((t.min/5+96).chr,?M).tr(((t.hour-1)%12+97).chr,?H).tr("a-l",?*)
end

Przykładowy przebieg (o 21:19):

  * * *
*       *
H       M
*       *
  * * *
człowiek w pracy
źródło
Dodałem wyjaśnienie do mojego rozwiązania. Zapytaj tylko, czy coś nie jest jasne.
Johannes Kuhn
Dziękuję @JohannesKuhn, już to przeczytałem. Dla mnie tajemnicą nie jest składnia, ale kodowanie tych wartości ciągu.
manatwork
W tym ostatnim dostaję błędy składniowe.
Timtech
@Timtech, czy to „ tr': can't convert Fixnum into String (TypeError)”? Now that you mentioned the error I dug for a version 1.8.7 and received the above error of that. Works fine on 1.9.2 and 1.9.3. Seems that ? M ” zostało zinterpretowane jako Fixnum w starszych wersjach i dopiero później zostało zmienione na String.
manatwork
0

HTML i JS: 397 - 20% = 317.6 characters

Moja pierwsza iteracja. Nie jestem z tego bardzo zadowolony, ale to działa i pokazuje czas w bardzo jasny sposób.

<canvas id=c width=198 height=198></canvas><script>c=document.getElementById("c")
.getContext("2d");c.r=c.rotate;c.c=c.clearRect;c.translate(99,99);for(i=0;i<60;i++)
{c.fillRect(89,-1,i%5?3:9,5);c.r(p=Math.PI/30);}setInterval(function(){n=new Date();
h=n.getHours()*5*p;c.beginPath();c.arc(0,0,86,0,7);c.fill();c.r(m=n.getMinutes()*p);
c.c(-2,-3,4,-80);c.r(h-m);c.c(-2,-3,4,-50);c.r(-h);},5);</script>
Fors
źródło
1
Urocze, ale niezupełnie to, co nazywamy sztuką ascii .
manatwork,
0

Ti-Basic 84, 587 - 20% = 469,6

:Xmax/2→Xmax:Ymax/2→Ymax:-Xmax→Xmin:-Ymax→Ymin:Degree:15→H:20→M:18→S::Circle(0,0,30):For(X,1,12)::Text(28-int(cos(X*30)*25),46+int(sin(30*X)*25),X):End:{0,0,0}→LANG:While getKey=0::getTime→LTIME::If LTIME(3)≠LANG(3)/6:Line(0,0,sin(LANG(3))*S,cos(LANG(3))*S,0)::If LTIME(2)≠LANG(2)/6:Then:::Line(0,0,sin(LANG(2))*M,cos(LANG(2))*M,0):::Line(0,0,sin(LANG(1))*H,cos(LANG(1))*H,0)::End::"SET ANGS::LTIME(1)*30+LTIME(2)/2→LANG(1)::LTIME(2)*6→LANG(2)::LTIME(3)*6→LANG(3)::Line(0,0,sin(LANG(1))*H,cos(LANG(1))*H::Line(0,0,sin(LANG(2))*M,cos(LANG(2))*M::Line(0,0,sin(LANG(3))*S,cos(LANG(3))*S:End

Jego wyniki są bardzo ładne i szczegółowe.

Timtech
źródło
0

C, 554 bajtów, Aktualizacje mniej więcej raz na sekundę.

#include <time.h>
#include <math.h>
int r=25,i,q,c,i,q,b[999];void v(float a,int f,int m){b[(r/2+(int)(sin(a)*f))*r+r/2+(int)(cos(a)*f)]=m;}void main(){float a,p=6.28,z=1.57,h,m,s;for(;;){time_t u=time(0);struct tm*l=localtime(&u);s=l->tm_sec;m=l->tm_min+s/60.;h=l->tm_hour+m/60.;system("@cls||clear");q=r*r;c=r/2;memset(b,32,q*4);for(i=0,a=p;a>0;a-=0.52,i++)v(a,c,i%3?46:i%6?124:45);v(0,0,79);v(p*s/60.-z,c-4,83);v(p*m/60.-z,c-5,77);v(p*h/12.-z,c-6,72);for(i=0;i<q;i++){c=b[i];putchar(c);if(i%r==r-1)putchar(10);}for(c=0;c<2000000;c++)hypot(3,.4);}}

Wynik:

           |           
      .          .     



 .                     
                S    . 

       H               


-          O          -



                M      
 .                     
                     . 



     .          .      
           |            
Johan du Toit
źródło
449 bajtów
pułap pułapu