아날로그 시계 제작 [폐쇄]


16

ASCII 그래픽을 사용하여 현재 시스템 시간을 아날로그 시계로 표시하는 프로그램을 작성하십시오. 시계에는 적어도 시간 및 분 포인터가 표시되어야하며 5 분 이상의 해상도가 있어야합니다.

디스플레이는 원하는만큼 작고보기 흉할 수 있지만 표시된 시간은 쉽게 인식 할 수 있어야합니다.

프로그램은 지속적으로 실행되고 상태를 업데이트해야합니다. 시스템에서 화면을 지울 수 있으면 사용하십시오. 그렇지 않으면 상태가 변경 될 때 시계를 다시 칠하기에 충분합니다.

시계의 해상도가 1 분 이상인 경우 캐릭터 수에 -20 % 보너스가 적용됩니다.


당신이 아날로그 시계를 말할 때 당신은 일반적인 하나 또는 어떤 형태의 아날로그 랩 표현을 의미합니까?
Marco Martinelli 2013

1 초 해상도에 대한 추가 보너스?
Shmiddty

"실제로 -20 % 보너스를 받습니까?" 긍정적이지 않습니까?
Timtech

@Timtech : 정말로 원한다면 캐릭터 수 20 %를 추가 할 수 있습니다 .
vsz

@vsz 무엇을 의미합니까?
Timtech

답변:


10

수학 207-42 = 165

진드기와 시간 레이블은 단위 원에 배치됩니다. HM각각 완료 시간 분의 전체 수를 나타내는 클럭 중심 주위를 공전. S매 초마다 위치를 업데이트합니다.

데카르트 평면에 텍스트를 표시하는 버전과 그리드에 텍스트 문자를 표시하는 버전이 표시됩니다.

이 버전은 문자를 데카르트 평면으로 플로팅합니다.

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

아래 시계는 시간 3:08:17을 보여줍니다 .

시계

터미널 또는 그리드 버전 : 430 개 (보너스 할인과 253) 316 문자

이 버전은 거의 동일하지만 문자를 직교 평면이 아닌 61 x 61 셀 격자에 배치합니다. 아직 조금 golfed 수 있습니다,하지만 난 단지 터미널과 같은에서 출력 (sloppier)을 보여주고 싶었다 티카 .

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]]]

아래 시계는 11:06을 표시합니다 .

terminal clock


재미로:

다음은 비 Ascii 버전의 아날로그 시계입니다. (60 자) 외부 라이브러리가 사용되지 않았습니다.

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

clock3


2
나에게 ASCII 예술처럼 보이지 않습니다.
Joe Z.

3
나는 Wikipedia에 주어진 정의를 따랐다. "ASCII 아트는 프리젠 테이션을 위해 컴퓨터를 사용하는 그래픽 디자인 기법이며 1963 년 ASCII 표준에 의해 정의 된 95 개의 인쇄 가능한 (총 128 개) 문자와 ASCII 호환 문자로 구성된 그림들로 구성되어 있습니다. 독점 확장 문자 (표준 7 비트 ASCII 128 자 이상)로 설정합니다.이 용어는 일반적으로 텍스트 기반 시각 예술을 가리키는데도 사용되지 않습니다. "
DavidC

2
흠. 나는 그것이 작동한다고 생각합니다. 그래도 vsz는 터미널 아트를 기대하고있었습니다. 아마도 그는 분명히 할 수 있습니다.
조 Z.

14

자바 스크립트 370-74 = 296

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

(요소 ID가 전역 범위에 추가된다는 사실을 남용하기 때문에 Chrome에서만 작동합니다).

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

골프 (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)

샘플 출력 (데모에서 훨씬 더 압축 된) :

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●○○○○○○●○○○○○○●●●●●●●●●●●●●●
●●●●●●●●●●●●○○○○○○○○●○○○○○○○○●●●●●●●●●●●●
●●●●●●●●●●○○○○○○○○○○●○○○○○○○○○○●●●●●●●●●●
●●●●●●●●○○○○○○○○○○○○●○○○○○○○○○○○○●●●●●●●●
●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●●●
●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●●
●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●
●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●
●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●
●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●
●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●
●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●●○○○○○○○○○○○○○○○○○○○○○○○○○●○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○●●○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○○○○○●●○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○○○○●●○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○○○●●○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○○●○○○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○○○●○○○○○○○○○○○○○○○○○○●
●●●●●○○○○○○○○○○○○○○○●○○○○○○○○○○○○○○○●●●●●
●○○○○○○○○○○○○○○○○○○●○●○○○○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○○●○○●○○○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○●○○○○●●○○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○○●○○○○○●●○○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○○●○○○○○○○●●○○○○○○○○○○○○○●
●○○○○○○○○○○○○○○○●●○○○○○○○○●●○○○○○○○○○○○○●
●●○○○○○○○○○○○○○○●○○○○○○○○○○○●○○○○○○○○○○●●
●●○○○○○○○○○○○○○●○○○○○○○○○○○○○●○○○○○○○○○●●
●●●○○○○○○○○○○○○●○○○○○○○○○○○○○○●○○○○○○○●●●
●●●○○○○○○○○○○○●○○○○○○○○○○○○○○○○●○○○○○○●●●
●●●●○○○○○○○○○○●○○○○○○○○○○○○○○○○○●○○○○●●●●
●●●●○○○○○○○○○●○○○○○○○○○○○○○○○○○○○●●○○●●●●
●●●●●○○○○○○○●●○○○○○○○○○○○○○○○○○○○○●●●●●●●
●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●●
●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○●●●●●●●
●●●●●●●●○○○○○○○○○○○○●○○○○○○○○○○○○●●●●●●●●
●●●●●●●●●●○○○○○○○○○○●○○○○○○○○○○●●●●●●●●●●
●●●●●●●●●●●●○○○○○○○○●○○○○○○○○●●●●●●●●●●●●
●●●●●●●●●●●●●●○○○○○○●○○○○○○●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

초침을 제거하면 263 점 이하로 떨어 뜨릴 수 있지만 마음에 듭니다!
Shmiddty

3
웃는 얼굴도 시계처럼 : jsfiddle.net/wBKQ6/17/show/light
Shmiddty

바이올린은 작동하지 않습니다 ...
수학 냉각기

@tryingToGetProgrammingStraight Chrome 30에서 작동합니다.
Shmiddty

파이어 폭스 24.0을 실행 메신저, 그냥 크롬에서 시도-그것은 효과, 난 당신이 편집하면 내 투표를 변경할 수 있습니다 ...
Math chiller

12

파이썬, 328-65 = 263

분침이 매분 업데이트되면서 매 초마다 새로운 시계를 인쇄합니다.

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

인쇄되는 시계는 다음과 같습니다 (터미널에서 늘어나지 않았습니다).

                  **************                  
               ****      *     ****               
             ***         *        ***             
           ***           *          ***           
          ** **          *         ** **          
         **   *                    *   **         
        **    **                  **    **        
       *       *                  *      **       
      **                                  **      
     **                                    **     
    **                                      **    
    *                                        *    
   ***                                      ***   
   * ***                                  *** *   
  **   **                                **   **  
  *                                            *  
  *                                            *  
 **                                            ** 
 *                                              * 
 *   *                                          * 
 *   ******                                     * 
 *        ******                                * 
 *             ******                           * 
 *                  *****                       * 
 *****                   *                  ******
 *                       **                     * 
 *                        **                    * 
 *                         *                    * 
 *                         **                   * 
 *                          **                  * 
 **                          **                ** 
  *                           *                *  
  *                           *                *  
  **   **                                **   **  
   * ***                                  *** *   
   ***                                      ***   
    *                                        *    
    **                                      **    
     **                                    **     
      **                                  **      
       *       *                  *       *       
        **    **                  **    **        
         **   *                    *   **         
          ** **          *         ** **          
           ***           *          ***           
             ***         *        ***             
               ****      *     ****               
                  **************                  
                         *                        

초를 어떻게 읽습니까?
DavidC

1
하나는 그렇지 않습니다. 매 초마다 인쇄되지만 매분마다 업데이트됩니다.
cardboard_box

8

100 % 순수 만! 포크없이!

체결 된 업그레이드 된 버전을 볼 수 있다 : 또는이 페이지에 괴짜 아스키 - 시계 . 그러나 그것을 사용하지 마십시오! 이 답변의 끝에있는 메모를 읽으십시오. 경고를 받았습니다! 이 펄 버전을 사용하십시오 대신 !

두 번째 틱이없는 첫 번째 간단한 시계.

확장 가능하고 편집 가능 :

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

1 초 이내에 10H10에서 21x21 (10x2 + 1) 클럭을 그립니다.

여기에는 3 개의 인수가 허용됩니다. Usage: ascii-clock.sh [ray of clock] [Hour] [Min]여기서 기본 광선은 12이고 시계 그림은2 x ray + 1 둥근 모양을 얻기 위해 추가 된 공간으로 인해 선 높이와 두 배 너비입니다.

스크립트가 인수 0또는 1인수 로 호출되면 매분 다시 그리기 위해 반복됩니다. 그렇지 않으면 적어도 시간 (두 번째 매개 변수)이 지정되면 한 번만 그려 종료됩니다.

H마커 광선의 70 %에 위치하는 상기 M마커는 광선의 90 %에있다.

같은 외부 바이너리의 어떠한 사용하지 date또는bc 추첨에!

(덕분에 대해 @manatwork하는 내장 read -t 장소의 경우에 /bin/sleep).

따라서이 모든 것은 내장 쉘 명령으로 수행됩니다 .

ANSI 시퀀스를 사용 하지만 루프에만 사용 하고 마커를 굵게 표시합니다.

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

이것은 다음과 같이 실행할 수 있습니다.

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

이것은 다음과 같은 것을 생성합니다 :

+- 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 . .       |
+- - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - +

또는 다음과 같이 실행할 수 있습니다.

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" &

대안 : 전체 경로 그리기 :

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

생산할 수 있습니다 :

+- 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 . .       |
+- - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - +

또는

                                . . . . 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 . . . .                                 

Seconds가 포함 된 마지막 버전은 렌더링 및 nanosleep 을 동기화합니다.

이 작업은 최신 Linux에서만 작동합니다.이 방법 /proc/timer_list을 사용 하면 각 새로 고침 사이에 잠자기 시간 을 몇 초로 계산할 수 있습니다.

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

더 난독 화 된 버전 (2702 바이트) :

의 요청에 따라 @manatwork 하는이 더 golfed 버전.

이 버전은 색상이 지정되어 있으며 모서리에 디지털 시간이 표시됩니다.

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

참고 : 어쨌든 이것을 사용하지 마십시오!

이것은 프로그램 이므로 이고 bash는 프로그래밍 언어가 아니므로 한동안 사용하기에 좋지 않습니다.

7 자 길이의 광선으로 5 시간 만에 약간의 메모리 소비 데모가 있습니다.

$ 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

이것의 주요 장점은 메모리가 필요할 때 시계를 죽여야한다는 것입니다.

( Nota : 괴짜를 위해 ascii-clock 에서 펄 버전 버전을 병합했습니다. ;-)


@manatwork 왜? 그것은 아날로그이며 지속적으로 실행되며 1 초 이내에 그림을 그립니다 ... 나는 무엇을 잘못 읽었습니까?
F. Hauri

죄송합니다. 내 실수. 먼저 bash4.1에서 시도했습니다 . 4.2에서는 실제로 계속 실행되며 명령 줄 매개 변수가 필요하지 않습니다.
manatwork

요구 사항 에는 크기 제한 이 없습니다 . 그리고 순수한 배쉬 에서 이것을 하는 것은 진정한 도전입니다! 포크없이 이것을 짧게하는 것은 간단하지 않습니다 (가능한 경우).
F. Hauri

그렇습니다. 크기 제한이 없으며 순수하게이를 달성하는 bash것은 훌륭한 기술을 보여줍니다. (/ me는 모자를 쓰고 upvote 링크를 클릭합니다.) 그러나 코드 골프 도전 과제 의 정신에서이 2529 자 문자는 여전히 줄어들 수 있습니다 . "
manatwork

@manatwork 더 골프화 된 버전이 있습니다 (더 짧지 않음 : 2529 바이트 에서이 버전은 이제 2702 바이트이지만 새로운 기능이 있습니다)
F. Hauri

6

파이썬 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)

매우 추악하지만 읽을 수 있습니다. 9 초마다 인쇄 (원하는 경우 1 초로 변경 가능), 5 분마다 업데이트 파이썬에서 코드 골프에 대한 경험이 많지 않아서 향상 될 것으로 기대합니다.

출력 예 :

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

18
시계가 달리 인 것 같습니다. 브라보!
Shmiddty 2019

3

Perl 5 x 65 = 325-65 (20 %) = 260 자 !!

두 번째 눈금으로 깨끗하고 원형이며 매 초마다 업데이트됩니다.

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

24 라인 콘솔에서 좋아 보인다 ( 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                       

그리고 더 색이 좋고 더 좋고 똑똑한 버전이 있습니다.

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

이 버전은 다른 장점과 밀접한 관련 있으며 주요 장점 은 다음과 같습니다. 잠시 동안 조용히 실행할 수 있습니다! 그래서 당신은 거기 또는 괴짜를위한ASCII 시계 에서 업그레이드 된 버전을 찾을 수 있습니다 웹 페이지 있습니다.

일을하는 시연으로 동일 적은 자원을 필요로 :

$ 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 

대략 동일한 기능 :

  • 새로 고침을하기 위해 매초의 시작을 기다립니다
  • 색상과 대담한 속성으로 그리기
  • 점, 시간 틱, 시간 및 분 전체 경로 및 s두 번째 핸들러 의 점으로 완전한 원을 그립니다 .
  • 오른쪽 상단에 시간 , 왼쪽 하단에 초를 나타내는 디지털 시계 프롬프트 그리기 를 .
  • 잠자는 동안S 왼쪽 상단에 a 를 표시하십시오 ( 버전 과의 차이점을 찾으십시오 )

을 더한

  • 업그레이드 된 버전 -a은 시간과 분 경로를 분수로 그리기위한 인수를 승인합니다 (11h59 장소 시간 경로는 약 12 ​​시간입니다).

또 다른 펄 버전을 보자!

다음과 같은 (아름다운) 그림 사용하기 :

펄 코드의 멋진 표현

당신이 단순히 할 수있는 것보다 :

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'

자, 이것은 gd2-perl이 설치되어 있어야합니다. 하지만 당신은 대체 할 수 curl에 의해 wget -O -;-)

(참고 :이 사진은 1.5Kb에 가깝습니다. 나는 같은 그림을 만들었지 만 길이는 900 바이트입니다.이 그림과 괴짜에 대한 ascii-clock 에서 동일한 버전을 찾을 수 있습니다 :-)


마지막 샘플에서는 알 수없는 다운로드 코드를 실행하기 전에 순서대로 대체 eval하는 것이 좋습니다. print;-)
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}]}

좋아, 여기에 몇 가지 설명이 있습니다.

  • while 1 {...} -설명은 잊어 버려
  • regsub -all \ +|. "oaosocowoeouooovoioxozom r n\n" \ {&} p대체 +|._{\0}에 결과 저장합니다 p. p실제로 첫 번째 키가없는 엉망인 사전입니다 (또는 홀수의 요소가있는 목록).
  • lset p [set h [expr $h%12*2]] h 교체 목록에서 시간을 설정합니다
  • lset p [set m [expr $m/5*2]] [expr $h-$m?"m":"x"]분을 설정합니다. 시간과 분이 같으면 x대신 사용하십시오.
  • string map /\ $p {rr/nrzmrann xrrr snnimrrrcnn vrrr wnnromrenrru} /\ $p와 같으 "/ $p"므로 첫 번째 키 ( /)를 추가합니다 . 그 후 나는 키의 모든 발생을 그 rr/nrzmrann xrrr snnimrrrcnn vrrr wnnromrenrru가치로 대체 합니다.

일반적인지도는

/ 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 {
}

(읽기 바꾸기 "등 /으로 o교체 ao대체 ... m와 함께 ___) (즉해야한다 공간)

나는를 repace oh및과 다른 m, m, rn출력 문자열을 shoren 단지이다 (나는 또한 그들 중 하나를 여러 공백을 대체 \n와 함께 n). 나중에 첫 번째 요소를 추가하여 대체하는 인덱스에 h * 2 대신 h * 2 + 1을 사용할 수 있습니다. (2 문자 절약)

몇 가지 참고 사항 :

  • Tcl의 목록은 공백을 구분 기호로 사용합니다. 요소에 공백이 포함되어 있으면을 묶어야합니다 {}. 좋아, 그것은 조금 더 복잡합니다. 예를 들어 공백으로 이스케이프를 피할 수는 \있지만 그러한 세부 사항은 다른 곳에 문서화되어 있습니다 .
  • Tcl의 dict은 짝수 개의 요소가있는 목록 일뿐입니다. key1 value1 key2 value2
  • 리스트를 문자열로 취급하거나 스트링을리스트로 취급 할 수 있습니다. 문자열이 유효한 목록이면 작동합니다. 무료 직렬화!

14:23이면 14:00 대신 13:00에 시간 포인터가 잘못 표시됩니다! — tutorialspoint.com/…
sergiol

Tcl은 시간대에 대해 알고 있습니다. 환경을 올바르게 설정하십시오. (tutorialspoints에서 UTC를 사용하는 것 같습니다)
Johannes Kuhn

앗 미안 해요. 다른 시간 설정일 수 있습니다. 포르투갈은 GMT를 사용하며 여름에는 시간이 +1입니다. 그러니 공감하십시오.
sergiol

2

자바 스크립트 2169-434 = 1735

좋아, 그것은 많이 있지만 그것들은 훌륭하고 이전 게시물 ( bashperl )의 이전 변형과 동일하게 작동 합니다.

이 버전은 괴짜를 위해ASCII 시계에서 찾을 수있는 것보다 더 난독 화 되어 있습니다.

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>


1

파이썬, 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)

샘플 출력 :

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

      m                                               -      
     #                                                 #     
   -                                                     -   

  -                                                       -  
 -                                                         - 

 -                                                         - 
#                                                           #
 -                                                         - 

 -                                                         - 
  -                                                       -  

   -                                                     -   
     #                                                 #     
      -                                               -      

        -                                           -        
          -                                       -          
             -  #                           #  -             
                  -                       -                  
                     -  -  -     -  -  -                     
                              #                              

1

루비: (230) 228 문자 - 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

(참고 : ^[단일 문자입니다.)

샘플 실행 (21:19:33) :

                      12
           11                     1



   10                                     2




       H
 9                                           3


                                       M

   8                                      4



            7   S                 5

                       6

“당신이 원하는대로 못생긴”버전 : 191181 자-36 = 145

(작은 크기, 낮은 정밀도, 초 없음, 동일한 반경, 끔찍한 깜박임)

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

샘플 실행 (21:19) :

       12  1
   11

              2
 10


H              3
9


               M
 8

            5
    7   6

삼각법이없는 버전 : (130) 125 자 (NO 보너스)

( 요하네스 쿤Tcl 솔루션에서 영감을 얻음 . 여전히 코드를 해독하지 않았으므로 얼마인지 확실하지 않습니다.)

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

샘플 실행 (21:19) :

  * * *
*       *
H       M
*       *
  * * *

내 솔루션에 설명을 추가했습니다. 분명하지 않은 것이 있는지 물어보십시오.
Johannes Kuhn

@JohannesKuhn 감사합니다, 나는 그것을 이미 읽었습니다. 나에게 신비는 구문이 아니라 문자열 값의 인코딩입니다.
manatwork

마지막에 구문 오류가 발생합니다.
Timtech

@Timtech, "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`은 이전 버전에서 Fixnum으로 해석되었으며 나중에 야 String으로 변경되었습니다.
manatwork

0

HTML 및 JS : 397 - 20% = 317.6 characters

내 첫 반복. 나는 그것에 매우 만족하지 않지만 작동하지만 매우 명확한 방식으로 시간을 보여줍니다.

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

1
귀엽지 만 정확히 우리가 ascii-art 라고 부르는 것은 아닙니다 .
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

출력은 매우 예쁘고 상세합니다.


0

C, 554 바이트, 초당 대략 1 회 업데이트.

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

결과:

           |           
      .          .     



 .                     
                S    . 

       H               


-          O          -



                M      
 .                     
                     . 



     .          .      
           |            

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.