도트 및 쉼표 시간 마커가있는 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
이것은 세미콜론과 쉼표만으로도 좋아 보이지만 아포스트로피는 그것을 모두
— 망쳐

실제로 1439는 23: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와 $2에 p()쓸 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.