증분 게임 시간 형식


18

증분 게임 시간 형식

증분 게임에는 종종 작업이 완료 될 때까지 일, 시간, 분 및 초를 나타내는 카운트 다운 타이머가 있습니다. 사용 가능한 공간에 따라 다음과 같이 형식화 할 수 있습니다.

2d 13h
23h 59m 48s
14m
3h 0m 0s

이 코드 골프의 목표는이 형식을 수행하는 함수 나 프로그램을 작성하는 것입니다.

입력

  • 총 시간 (초)입니다.
  • 출력 할 최대 세그먼트 수입니다.

산출

  • 세그먼트는 다음과 같습니다.
    • 0
    • 0
    • 0 시간
    • 0
    • 0
  • 각 세그먼트는 단일 공간으로 구분됩니다.
  • 표시된 세그먼트는 연속적이어야합니다. 예를 들어 0 분이 있더라도 분을 표시하지 않고 시간과 초를 표시하지 않습니다.
  • 단일 숫자 값은 앞에 0이 없지만 값 0은로 표시해야합니다 0.
  • 값은 반올림됩니다.
  • 표시되는 첫 번째 세그먼트는 0이 아닌 첫 번째 값입니다.

테스트 사례

seconds  segments  output
     0      1      0s
   123      1      2m
   123      2      2m 3s
   123      3      2m 3s
 82815      3      23h 0m 15s
307891      2      3d 13h
307891      4      3d 13h 31m 31s
604800      1      1w
604800      6      1w 0d 0h 0m 0s

승리

일주일에 가장 적은 바이트 수의 솔루션이 "수락"을 얻습니다.

편집

  • 예에 표시된 것처럼 첫 번째 세그먼트가 명확 해졌습니다.
  • 요청에 따라 테스트 사례 4를 추가했습니다.

에 대한 예상 결과는 무엇입니까 307891 1? 0w또는 1w.
jnovacho

1
@jnovacho 그렇지 3d않습니까? "표시된 첫 번째 세그먼트는 0이 아닌 첫 번째 값입니다"
Luigi

@Luigi True입니다. 나는 그것을 놓쳤다.
jnovacho

이것이 "어떤 사람이 나를 위해이 코드를 작성해 주시겠습니까?"라는 질문이라고 생각하는 유일한 사람입니까?
fho

매일 코드 골프 작업이 실제로 유용한 것은 아닙니다. D
Geobits

답변:


7

CJam (스냅 샷), 41 38 바이트

q~"<<^X^G"{imd\}%W%"wdhms":s.+_{0=}#><S*

위의 두 문자는 인쇄 할 수 없으므로 캐럿 표기법을 사용합니다.

2 바이트를 골라내는 @ Sp3000에 감사합니다.

테스팅

최신 안정 릴리스 (0.6.5)에는 Longs 대신 정수를 반환 할 수 있는 버그 가 있습니다 {}#. 역설적으로 이것은 정수 ( i) 로 캐스팅하여 우회 할 수 있습니다 .

온라인 인터프리터로 코드를 사용하여이를 실행하려면 이 퍼머 링크를 클릭 하거나이 페이스트 에서 코드를 복사하십시오 .

또는 다음 명령을 실행하여 최신 스냅 샷을 다운로드하고 빌드 할 수 있습니다.

hg clone http://hg.code.sf.net/p/cjam/code cjam-code
cd cjam-code/
ant

다음과 같이 CJam 파일을 작성할 수 있습니다.

base64 -d > game-time.cjam <<< cX4iPDwYByJ7aW1kXH0lVyUid2RobXMiOnMuK197MD19Iz48Uyo=

작동 원리

q~        e# Read an evaluate the input.
"<<^X^G"  e# Push the string corresponding to the array [60 60 24 7
{         e# For each character:
  i       e#   Replace it by its code point.
  md      e#   Push divisor and residue of the division by that code point.
  \       e#   Swap their order.
}%
W%        e# Reverse the resulting array.
"wdhms":s e# Push ["w" "d" "h" "m" "s"].
.+        e# Perform vectorized concatenation.
_         e# Push a copy.
{0=}#     e# Find the index of the first pair with positive integer.
>         e# Remove the preceding pairs.
<         e# Truncate to the number of pairs specified in the input.
S*        e# Join, separating by spaces.

6

자바, 197191 바이트

String p(int s,int m){String a[]={s%60+"s",(s/=60)%60+"m",(s/=60)%24+"h",(s/=24)%7+"d",(s/7)+"w"},b="",z="";for(s=5;s>0&&a[--s].charAt(0)=='0';);for(;s>=0&&--m>=0;z=" ")b+=z+a[s--];return b;}

Java가와 같은 선언을 지원한다는 것을 알았습니다 String a[]. 이 날의 선언 당길 수 bz쓰기에서 저를 저장 한 라인에 String다시합니다.


1
;z=" ")- 매우 영리한.
OldCurmudgeon

5

C, 134 127 110 104 103 바이트

새로운 버전:

a,e=5;f(n,x){for(;e;n%=a)a=(int[]){1,60,3600,86400,604800}[--e],x>e?printf("%u%c ",n/a,"smhdw"[e]):0;}

이전 버전:

#define p(a) x>--e?printf("%u%c ",n/a,"smhdw"[e]):0;n%=a;
e=5;f(n,x){p(604800)p(86400)p(3600)p(60)p(1)}

4

Pyth, 39 43 바이트

jd_>vz+V?u?GeGPG+m%~/QddCM"<<"Q)Q]0"smhdw

편집 : 0s테스트 케이스를 잊었 기 때문에 +4 문자 .

여기에는 인쇄 할 수없는 2 개의 문자가 포함됩니다. 실제 코드를 가져 와서 온라인으로 사용해보십시오. 데모

설명:

                                         z = 1st input line (segments, as string)
                                         Q = 2nd input line (time, as int)
                         "<<.."          string with 4 chars
                       CM                convert to ASCCI-values => [60,60,24,7]
                m                        map each d of ^ to:
                   /Qd                     Q / d 
                  ~                        update Q, but use the old value for
                 %  Q d                    Q mod d
                                         this gives [sec, min, hour, day]
               +               Q         add Q (week)
        u                       )        apply the following expression to G, 
                                         starting with G = [s,m,h,d,w], until
                                         G stops changing:
         ? eG                              if eG != 0:
          G                                  update G with G (stop changing)
                                           else:
             PG                              update G with G[-1]
                                         this gets rid of trailing zeros
      +V                         "smhdw  vectorized add with "smhdw"
   >vz                                   only use the last eval(z) items
  _                                      reverse order
jd                                       join by spaces and print

3

파이썬 2.7 - 181 178 174 바이트

골프를 치기위한 첫 번째 시도.

def I(s,M):
 z=[0]*5;j=0
 for i in [604800,86400,3600,60,1]:z[j],s=s/i,s%i;j+=1
 l=[z.index(n)for n in z if n][0]
 return" ".join([str(i)+n for n,i in zip('wdhms',z)][l:l+M])

1
위대한 첫 번째 시도! 내 여섯 번째 시도 중 일부보다 낫습니다 ...;) if n!=0그냥 로 변경 하여 3 바이트를자를 수 있습니다 if n.
kirbyfan64sos

예, 0이 거짓으로 평가되는 것을 잊었습니다. 감사.
f.rodrigues

2

줄리아, 158 바이트

나는 더 똑똑한 접근으로 이것이 더 짧을 수 있다고 확신하지만 이것이 내가 지금 가지고있는 것입니다.

(s,g)->(j=0;p=cell(5,1);for i=[604800,86400,3600,60,1] p[j+=1],s=s÷i,s%i end;z=findfirst(p);z>0?join([string(p[i],"wdhms"[i])for i=z:min(z+g-1,5)]," "):"0s")

두 개의 정수를 입력으로 받아들이고 문자열을 반환하는 명명되지 않은 함수를 만듭니다. 호출하려면 이름을 지정하십시오 (예 :) f=(s,g)->....

언 골프 + 설명 :

function f(s, g)
    # Initialize an array and an index
    p = cell(5, 1)
    j = 0

    # Loop over the number of seconds in a week, day, hour,
    # minute, and second
    for i in [604800, 86400, 3600, 60, 1]
        # Set the jth element in p to be the quotient and s
        # to be the remainder of i into s
        p[j+=1], s = s ÷ i, s % i
    end

    # Get the index of the first nonzero value in p
    z = findfirst(p)

    if z > 0
        # We start the string at the first nonzero value
        # and continue until we hit the desired number of
        # units (z+g-1) or the maximum number of units (5),
        # whichever comes first. The appropriate unit is
        # appended to each value and the values are then
        # joined with a space.
        join([string(p[i], "wdhms"[i]) for i in z:min(z+g-1,5)], " ")
    else
        # If there are no nonzero values in p, we just
        # have 0 seconds
        "0s"
    end
end

예 :

julia> f(82815, 6)
"23h 0m 15s"

julia> f(604800, 4)
"1w 0d 0h 0m"

1

스칼라, 147 바이트

def p(s:Int,i:Int)=List(s/604800+"w",s/86400%7+"d",s/3600%24+"h",s/60%60+"m",s%60+"s").dropWhile(k=>k.head=='0'&&k.tail!="s").take(i).mkString(" ")

1

rs , 367 바이트

^(\d+)/(_)^^(\1)
(_*) (\d)/\1!\2
_{60}/#
#{60}/@
@{24}/:
:{7}/;
(_+)/(^^\1)s
(#+)/(^^\1)m
(@+)/(^^\1)h
(:+)/(^^\1)d
(;+)/(^^\1)w
([a-z])/\1 
w ((\d+[^\dd])|!)/w 0d \1
d ((\d+[^\dh])|!)/d 0h \1
h ((\d+[^\dm])|!)/h 0m \1
(m|^) ?!/\1 0s!
!(\d+)/!(_)^^(\1)
#
+#(\d+)([a-z]) ?(.*)!(_*)/\1\2 #\3!\4@
#/
(@+)/ (_)^^((^^\1))
!(_+) \1(_*)/!\2
_+ _+/
+\d+[a-z] ?!_/!
 *!/
^$/0s

라이브 데모 및 모든 테스트 사례.

지저분한, 지저분한, 지저분한 ...

Android 용 Chrome에서 테스트 사례를 실행하는 데 약 3-7 초가 걸립니다. 마십시오 하지 때문에 인쇄 할 수있는 모든 출력이 경우 브라우저를 고정 할 수있는 디버그 모드를 사용합니다.


rs는 무엇입니까? -----
Caleb Paul

@Wideshanks 제목에 링크를 추가했습니다. 내가 쓴 정규식 기반 언어입니다.
kirbyfan64sos

0

C #, 239237170164 바이트

이것은 다른 솔루션만큼 컴팩트 한 곳은 아니지만 직접 찌르지 않으면이 도전에 직면 할 수 없습니다.

이 최신 반복은 ESC의 답변 .

명확성을 위해 들여 쓰기 :

string G(int s,int n){
    int[]x={s%60,(s/=60)%60,(s/=60)%24,(s/=24)%7,s/7};
    for(s=5;x[--s]==0&s>0;);
    var o="";
    while(n-->0&s>=0)
        o+=" "+x[s]+"smhdw"[s--];
    return o.Trim();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.