도트 및 쉼표 시간 마커가있는 ASCII 시계


39

소개

코드 골프 설명

문자 줄이 실제로 두 행이라고 상상해보십시오. 윗줄-점-은 시간 (24 시간 시스템)을 나타내며 쉼표-는 분을 나타냅니다 . 한 문자는 가능할 때마다 시간, 분 또는 둘 다를 나타낼 수 있습니다.

처음에는 아마도 자정 이후의 시간을 시간과 분 으로 변환해야 할 것 입니다.

결과는 현재 시간을 "도트 형식"으로 표시하는 문자열입니다. 점 수 ( 아포스트로피는 여기에서 점으로 계산되며 그렇게 호출됩니다! )는 자정 이후의 시간 수이며 쉼표 수는 분 수입니다. 명확하게하기 위해 몇 가지 예를 보여 드리겠습니다.

  • (비고) hh : mm ~ result
  • (시간 만) 05:00- '''''
  • (분만) 00:08- ,,,,,,,,
  • (시간 <분) 03:07- ;;;,,,,
  • (시간> 분) 08:02- ;;''''''
  • (시간 = 분) 07:07- ;;;;;;;
  • (오늘의 시작) 00:00- ( 빈 결과 )

통지 "모두"문자는 23 시간을 최대 사용할 수 있습니다 - 23 : XX, XX는 23 이상이다.

기호

만약 당신의 언어로 캐릭터 탈출 해야한다면 (규칙 5 참조), 대안 중 하나로 바꿀 수 있습니다. 상기 대안으로 충분하지 않으면 다른 기호를 사용할 수 있지만 합리적으로 유지하십시오. 나는 탈출이 장벽이되기를 원하지 않습니다.

  • ;(ALT : 시간과 분 모두 마커 - (세미콜론) :)
  • '(ALT : 시간 마커 - (아포스트로피) '``°)
  • ,(ALT : 분 마커 - (쉼표) .)

추가 규칙

  1. 바이트 수가 가장 적은 코드가 승리합니다!
  2. 가능할 때마다 두 기호를 모두 사용해야 합니다. 02:04의 경우 결과는 '',,,,, 및이 될 수 없습니다 ;',,,. 그것은해야한다;;,,
  3. 입력-스크립트 / 앱 매개 변수, 사용자 입력 (예 : readline) 또는 코드
    3.1 내의 변수 일 수 있습니다 . 변수 내부 코드를 사용하는 경우 길이가 가장 길어야합니다. 그것은이다 1439그것과 같을 것이다, 그래서 (23시 59분를)t=1439
  4. "두"문자 (12:05의 12, 03:10의 3 )로 상징되는 공통 부분 은 문자열의 시작 부분에 배치해야합니다.
  5. 코드에서 기호를 이스케이프해야하는 경우에만 기호를 대체 기호로 바꿀 수 있습니다.
  6. 입력은 00:00 이후에 분 단위로 제공됩니다 . 이것이 음수가 아닌 정수라고 가정 할 수 있습니다.

테스트 사례

Input: 300
Output: '''''

Input: 8
Output: ,,,,,,,,

Input: 187
Output: ;;;,,,,

Input: 482
Output: ;;''''''

Input: 427
Output: ;;;;;;;

Input: 0
Output:  (empty)

내 게시물을 편집 해 주셔서 감사합니다. Adnan! 내가 : 당신에 내, 초보자 골프의 비교에서 배울이 방법
Krzysiu

3
문제 없어요! 그것은 아주 좋은 첫 번째 게시물이고 좋은 도전입니다 :)
Adnan

1
이것은 세미콜론과 쉼표만으로도 좋아 보이지만 아포스트로피는 그것을 모두
망쳐

실제로 143923:59아닙니다 1339. (23 x 60 + 59).
insertusernamehere

좋은 말씀 감사합니다! :) 그래, @Sparr, 그 나쁜 점은 :(의 IT가 대체 될 수 어떻게 생각 insertusernamehere, 바로 고정 있어요 것을 물론?!
Krzysiu

답변:


10

Pyth, 19 바이트

:.iF*V.DQ60J"',"J\;

테스트 스위트

:.iF*V.DQ60J"',"J\;
      .DQ60            Divmod the input by 60, giving [hours, minutes].
           J"',"       Set J equal to the string "',".
    *V                 Perform vectorized multiplication, giving H "'" and M ','.
 .iF                   Interleave the two lists into a single string.
:               J\;    Perform a substitution, replacing J with ';'.

8

CJam, 22 20 19 바이트

STDIN에서 입력을받습니다.

ri60md]',`.*:.{;K+}

여기에서 테스트하십시오.

설명

ri     e# Read input and convert to integer.
60md   e# Divmod 60, pushes hours H and minutes M on the stack.
]      e# Wrap in an array.
',`    e# Push the string representation of the comma character which is "',".
.*     e# Repeat apostrophe H times and comma M times.
:.{    e# Apply this block between every pair of characters. This will only applied to
       e# first N characters where N = min(hours,minutes). The others will remain
       e# untouched. So we want the block to turn that pair into a semicolon...
  ;    e#   Discard the comma.
  K+   e#   Add 20 to the apostrophe to turn it into a semicolon.
}

이 일이 특히, 여기에 함께 시간의 할당 얼마나 잘 작동 정말 운이 좋았다 '에 분을 ,스택에 시간과 분의 순서는 문자의 문자열 표시와 일치하도록.

이것은 지금까지 찾은 유일한 3 바이트 블록입니다. 그래도 많은 4 문자 솔루션이있었습니다.

{;;';}
{';\?}
{^'0+}
{^'F-}
{-'@+}
{-'6-}
...

6

GNU 세드, 37

-Esed 옵션에 대한 점수는 +1입니다 .

나는 내 bash answer 의 golfiness에 특히 감명받지 않았 으므로 재미를 위해 sed로 시도 할 것이라고 생각했습니다.

이 메타 답변에 따라 입력이 단항 입니다.

y/1/,/          # Convert unary 1's to commas (minutes)
s/,{60}/'/g     # divmod by 60.  "'" are hours
:               # unnamed label
s/(.*)',/;\1/   # replace an apostrophe and comma with a semicolon
t               # jump back to unnamed label until no more replacements

온라인으로 사용해보십시오


명명되지 않은 라벨 ??
mikeserv

@mikeserv, sed의 골프 에서 Digital Trauma관련 팁 을 참조하십시오 .
manatwork

@manatwork-GNU 버그 여야한다고 생각합니다.
mikeserv

@ mikeserv-그러나 버그를 사용하는 것도 괜찮습니다. 나는 당신을 조롱하라고 요구하지 않고, 나는 단지 모른다 :)
Krzysiu

@Krzysiu-알았어? 흠. 에 사이트 내가 그것을 우수성의 표시가 될 것 같아요. 그렇지 않으면 거의 확실하지 않습니다. 프로그래머가 API에서 벗어나 구현 세부 사항을 사용할 때 프로그램은 버전 / 구현에 따라 달라집니다. 이는 나쁜 일입니다.
mikeserv

6

파이썬 2, 56 바이트

def g(t):d=t%60-t/60;print(t/60*";")[:t%60]+","*d+"'"*-d

인쇄하는 기능입니다 (하나보다 짧은 문자 t=input();).

이 방법은 Loovjo 와 유사합니다 . 수는 ,시간과 시간 사이에 다르며 암시 적 최소값은 0 '입니다.에 대해서는 부정입니다. 의 경우 시간을 몇 분이 지난 다음 몇 분으로 자르면 암시 적으로 ;계산 됩니다.min;

저장 할 문자는 저장 d하지만 시간과 분은 저장 하지 않습니다. 람다가있는 아날로그는 두 자 이상 (58)이므로 변수 할당이 가치가 있습니다.

lambda t:(t%60*";")[:t/60]+","*(t%60-t/60)+"'"*(t/60-t%60)

입력을 직접 처리해도 문자가 저장되지 않았습니다 (58).

h,m=divmod(input(),60);d=m-h;print(";"*m)[:h]+","*d+"'"*-d

슬라이싱의 또 다른 전략은 훨씬 길다 (64).

def g(t):m=t%60;h=t/60;return(";"*m)[:h]+(","*m)[h:]+("'"*h)[m:]


3

퓨어 배쉬 (외부 유틸리티 없음), 103

p()(printf -vt %$2s;printf "${t// /$1}")
p \; $[h=$1/60,m=$1%60,m>h?c=m-h,h:m]
p , $c
p \' $[m<h?h-m:0]

2 바이트를 절약 한 @ F.Hauri에게 감사합니다.


좋은! 하지만 당신은 스와핑이 개 문자를 구할 수 $1$2p()p , $c라인 3에서
F. 하우리

네,하지만 그것은에서만 사용되는로 printf "%s"가지고, c(재사용되지 동안) 하늘의 뜻을 잘 작동을
F. 하우리

@ F.Hauri 이제 알겠습니다-감사합니다!
Digital Trauma

3

C, 119 바이트

#define p(a,b) while(a--)putchar(b);
main(h,m,n){scanf("%d",&m);h=m/60;m%=60;n=h<m?h:m;h-=n;m-=n;p(n,59)p(h,39)p(m,44)}

상세한

// macro: print b, a times
#define p(a,b) while(a--)putchar(b)

int main(void)
{
    int h,m,n;
    scanf("%d",&m);  // read input

    h=m/60;m%=60;    // get hours:minutes
    n=h<m?h:m;       // get common count
    h-=n;m-=n;       // get remaining hours:minutes

    p(n,59);        // print common
    p(h,39);        // print remaining hours
    p(m,44);        // print remaining minutes

    return 0;
}

1
putchar문자로 & 정수 리터럴을 사용 하면 1 바이트가 절약되고 매크로 내부에서 세미콜론
Quentin

참고 촬영 @Quentin, 5 바이트 저장
Khaled.K을

while#define 매크로에서 공간을 잃을 수 있습니다 . -1 바이트
Albert Renshaw

1
매크로 대신 p (a, b)를 함수로 만들어 더 많은 바이트를 절약 할 수도 있습니다. (그리고 당신의 주요 기능에 약간의 세미콜론을 뿌린다)
Albert Renshaw

3

하스켈, 68 66 바이트

g(h,m)=id=<<zipWith replicate[min h m,h-m,m-h]";',"
g.(`divMod`60)

사용 예 :

(g.(`divMod`60)) 482

여기서 영리한 비트는 replicate주어진 길이가 음수 또는 0 인 경우 빈 문자열을 반환하므로 두 가지 모두에 적용 할 수 있으며 양수 만 표시됩니다. 세미콜론의 수는 두 개 중 최소값이므로 첫 번째 부분은 쉽습니다. 그런 다음 zipWith해당 항목에 기능을 적용하십시오.

편집 : 몇 분 동안 잘못된 문자를 사용하고 있음을 깨달았습니다.

편집 2 : @Laikoni 덕분에 2 바이트가 절약되었습니다.


당신은 대체하여 2 바이트를 저장할 수 있습니다 concat$id=<<.
Laikoni

2

자바 스크립트 (ES6) 69

m=>";".repeat((h=m/60|0)>(m%=60)?m:h)+",'"[h>m|0].repeat(h>m?h-m:m-h)

2

Powershell, 99 85 바이트

param($n)";"*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+"'"*(($h-$m)*!$b)+","*(($m-$h)*$b)

Loovjo의 방법을 사용하면 이것이 Powershell 구현입니다.

언 골프

param($n) 
# set the number of minutes and hours, and a boolean which one is bigger
# and also output the correct number of ;s
";"*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+ 
# add the difference between h and m as 's but only if h > m
"'"*(($h-$m)*!$b)+
# add the difference between m and h as ,s but only if m > h
","*(($m-$h)*$b)

AdmBorkBork 덕분에 14 바이트 절약


첫 번째 의사 삼항 을 사용 하여 $m$h선언을 이동 한 다음 부울 곱셈을 사용하여 저장할 수 있습니다 . –param($n)';'*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+'°'*(($h-$m)*!$b)+','*(($m-$h)*$b)
AdmBorkBork

1

파이썬 3, 98 바이트

d=int(input());m=d%60;h=int((d-m)/60)
if m>=h:print(";"*h+","*(m-h))
else:print(";"*(m)+"'"*(h-m))

아마도 가장 좋은 대답은 아니지만 많은 재미였습니다!


1

파이썬 2, 61 바이트

t=input();m,h=t%60,t/60
print";"*min(h,m)+","*(m-h)+"'"*(h-m)

설명 :

t=input();              # Read input
          m,  t%60,     # Do a divmod, h = div, m = mod
            h=     t/60

print";"*min(h,m)+                    # Print the minimum of the h and m, but in ";"s
                  ","*(m-h)+          # Print (m-h) ","s (if m-h is negative, print nothing)
                            "'"*(h-m) # Print (h-m) "'"s (if h-m is negative, print nothing)

1

PHP, 81 바이트

변수 입력 STDIN이 명령 줄 인수를 읽 거나 취하는 것보다 짧기 때문에 변수 입력을 사용했습니다 .

for($_=1439;$i<max($h=0|$_/60,$m=$_%60);++$i)echo$i<$h?$i<min($h,$m)?';':"'":",";

PHP를 잘 알고 있다고 생각했지만, | 처음으로. 나는 그것을 조금 운동하기 위해 사용할 것이라고 생각한다-나는 그것을 분석 할 것이다 :)
Krzysiu

에 실패합니다 240. $i>=min($h,$m)?$h<$m?",":"'":";"(+1 바이트)를 시도하십시오 . 또는 for($_=1439;$i<max($h=0|$_/60,$m=$_%60);)echo"',;"[$i++<min($h,$m)?2:$h<$m];(76 바이트)를 사용하십시오. Btw : 작은 따옴표는 -r불가능합니다. 따라서 문자열 또는 °독립형 인 경우 따옴표-> -1 바이트가 필요하지 않은 경우 몇 시간 동안 백틱을 사용해야합니다 .
Titus

1

자바 스크립트 (ES6), 77 71 바이트

x=>';'[r='repeat'](y=Math.min(h=x/60|0,m=x%60))+"'"[r](h-y)+','[r](m-y)

속성 액세스 / 함수 인수에 할당을 많이 사용합니다. +1
Cyoce

1

펄 6 103 101 98 97 69 바이트

$_=get;say ";"x min($!=($_-$_%60)/60,$_=$_%60)~"'"x $!-$_~","x $_-$!;

여러 배열을 출력하지만 섹스를 즐기십시오. 평소와 같이 모든 골프 기회는 식욕을 돋 웁니다.

편집 : -2 바이트 : 용감하고 일부 캐스트를 제거했습니다.

Edit2 : 배열을 제거하여 -3 바이트

Edit3 : -1 바이트는 "lambdas"를 사용하고 패러 틴을 제거하여 올바른 형식으로 인쇄합니다.

Edit4 : (죄송한 놈들) 그 시간을 남용하는 분-0은 그 반대입니다. if 문을 제거했습니다. 그런 다음 대괄호를 제거한 다음 람다가 전혀 필요하지 않다는 것을 깨달았습니다. -28 바이트 :)

우와 나는 이것에 점점 나아지고있다.


0

C, 141 바이트

main(h,m){scanf("%d",&m);h=(m/60)%24;m%=60;while(h||m){if(h&&m){printf(";");h--;m--;}else if(h&&!m){printf("'");h--;}else{printf(",");m--;}}}

을 사용하여 몇 바이트를 절약 할 수 있다고 생각합니다 h>0||m>0. 그런 다음 h--;m--;모든 반복에서 한 번만 필요 하면 {}for if/else는 더 이상 사용되지 않습니다.
insertusername 여기

두 번째 조건부에서 몇 바이트를 절약 할 수도 있습니다. 대신 다음을 수행 else if(h&&!m)할 수 있습니다.else if(h)
Hellion

마지막으로 삼항 연산자를 사용하면 ifand 같은 "긴"단어를 사용하지 않아도됩니다 else.
insertusername 여기

입력을 int 매개 변수로 사용하는 함수로 리팩토링을 고려하십시오 scanf().
Digital Trauma

나는 그것이 필요하다고 생각하지 않습니다 %24-최대 입력은 23:59입니다.
디지털 외상

0

Gema, 119 자

<D>=@set{h;@div{$0;60}}@set{m;@mod{$0;60}}@repeat{@cmpn{$h;$m;$h;$h;$m};\;}@repeat{@sub{$h;$m};'}@repeat{@sub{$m;$h};,}

샘플 실행 :

bash-4.3$ gema '<D>=@set{h;@div{$0;60}}@set{m;@mod{$0;60}}@repeat{@cmpn{$h;$m;$h;$h;$m};\;}@repeat{@sub{$h;$m};`}@repeat{@sub{$m;$h};,}' <<< '252'
;;;;,,,,,,,,

0

MATLAB : 89 바이트

i=input('');m=mod(i,60);h=(i-m)/60;[repmat(';',1,min(h,m)),repmat(39+5*(m>h),1,abs(h-m))]

테스트:

310
ans =
;;;;;,,,,,

0

SmileBASIC, 59 바이트

INPUT M
H%=M/60M=M-H%*60?";"*MIN(H%,M);",'"[M<H%]*ABS(H%-M)

설명 :

INPUT MINUTES 'input
HOURS=MINUTES DIV 60 'separate the hours and minutes
MINUTES=MINUTES MOD 60
PRINT ";"*MIN(HOURS,MINUTES); 'print ;s for all positions with both
PRINT ",'"[MINUTES<HOURS]*ABS(HOURS-MINUTES) 'print extra ' or ,

의 하단 부분이 있기 때문에 그것은 꽤 끔찍 ;도 동일하지 않습니다 ,SmileBASIC의 글꼴


0

PHP, 81 바이트

더 많은 솔루션 :

echo($r=str_repeat)(";",min($h=$argn/60,$m=$argn%60)),$r(",`"[$h>$m],abs($h-$m));
// or
echo($p=str_pad)($p("",min($h=$argn/60,$m=$argn%60),";"),max($h,$m),",`"[$h>$m]);

로 실행하십시오 echo <time> | php -R '<code>'.

<?=($r=str_repeat)(";",min($h=($_=1439)/60,$m=$_%60)),$r(",`"[$h>$m],abs($h-$m));
// or
<?=($r=str_repeat)(";",min($h=.1/6*$_=1439,$m=$_%60)),$r(",`"[$h>$m],abs($h-$m));
// or
<?=str_pad(str_pad("",min($h=($_=1439)/60,$m=$_%60),";"),max($h,$m),",`"[$h>$m]);

1439입력으로 교체 하고 파일에 저장 한 후 실행하십시오.


0

루비, 50 자

->t{(?;*h=t/60)[0,m=t%60]+",',"[0<=>m-=h]*m.abs}

덕분에 :

  • GB 에 대한
    • 문자열보다 더 많은 문자를 사용할 수 없다는 것을 상기시켜줍니다 (-1 문자)
    • 계산 재구성 (-1 자)

너무 오래 기다렸다 Numeric.divmod는 것을 깨달았습니다.

샘플 실행 :

2.1.5 :001 > puts ->t{(?;*h=t/60)[0,m=t%60]+",',"[0<=>m-=h]*m.abs}[252]
;;;;,,,,,,,,

1
min :(?;*h=t/60)[0,m=t%60]
GB

1
그리고 m에서 h를 빼서 또 다른 바이트 :",',"[0<=>m-=h]*m.abs
GB

0

05AB1E , 25 바이트

60‰vy„'.Nè×}‚.BøJ„'.';:ðK

온라인으로 사용해보십시오!

60‰vy„'.Nè×}확실히 단축 될 수 있고, 나는 그것을 이해할 수 없었으며, 벡터 버전이없는 한이 접근법으로 승리하기 위해 7 바이트를 줄일 수 있을지 의심 ×됩니다.


예 (입력이 63 인 경우) :

60‰                       # Divmod by 60.
                          # STACK: [[1,3]]
   vy      }              # For each element (probably don't need the loop)...
                          # STACK: []
     „'.Nè×               # Push n apostrophe's for hours, periods for minutes.
                          # STACK: ["'","..."]
            ‚             # Group a and b.
                          # STACK: [["'","..."]]
             .B           # Boxify.
                          # STACK: [["'  ","..."]]
               ø          # Zip it (Transpose).
                          # STACK: [["'."," ."," ."]
                J         # Join stack.
                          # STACK: ["'. . ."]
                 „'.';:   # Replace runs of "'." with ";".
                          # STACK: ["; . ."]
                       ðK # Remove all spaces.
                          # OUTPUT: ;..

D60÷''×s60%'.ׂ.BøJ„'.';:ðK 내 원래 버전 이었지만 divmod보다 훨씬 비쌉니다.

60‰WDµ';ˆ¼}-¬0Qi'.ë''}ZׯìJ 또 다른 방법은 시도했습니다 ...



0

자바 8, 101 99 86 바이트

n->{String r="";for(int m=n%60,h=n/60;h>0|m>0;r+=h--*m-->0?";":h<0?",":"'");return r;}

설명:

여기에서 시도하십시오.

n->{                      // Method with integer parameter and String return-type
  String r="";            //  Result-String (starting empty)
  for(int m=n%60,h=n/60;  //   Get the minutes and hours from the input integer
      h>0|m>0;            //   Loop as long as either the hours or minutes is above 0
    r+=                   //   Append the result-String with:
       h--*m-->0?         //    If both hours and minutes are above 0
                          //    (and decrease both after this check):
        ";"               //     Use ";"
       :h<0?              //    Else-if only minutes is above 0 (hours is below 0)
        ","               //     Use ","
       :                  //    Else:
        "'"               //     Use "'"
  );                      //  End loop
  return r;               //  Return the result
}                         // End of method
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.