시간 여행자


18

시계에서 정확한 시간을 생성하는 가장 짧은 코드가 이깁니다.

당신은 노련한 시간 여행자이며 여행 중에 많은 행성에서 멈추는 것으로 알려져 있습니다. 각 행성은 다른 속도로 회전하며 이로 인해 하루의 길이는 일반적인 24 시간 하루와 다릅니다. 결과적으로 행성은 시간이 다른 시계를 사용합니다. x 시간을 가진 시계의 시간은 우리의 (1, 2, 3, ..., x )와 유사하게 배열되며 숫자는 시계 방향으로 회전하고 x 는 맨 위에 있습니다.

또한 각 행성은 한 시간에 분이 다르고 분에 다른 초가 있습니다. 종료 시간을 결정해야하는 시작 시간과 경과 시간 (초)이 제공됩니다.

입력은 인수 또는 표준 입력으로 전달 된 파일에서 직접 가져올 수 있습니다. 첫 번째 입력 라인은 처리해야하는 클럭 수입니다. 그 후, 각 시계에는 다음 형식의 정수를 포함하는 세 줄의 입력이 있습니다.

x y z
h m s
t

각 글자의 의미는 다음과 같습니다.

x = 하루의 시간 수 (2 <= x <= 99)
y = 시간 단위의 시간 (2 <= y <= 100)
z = 분 단위의 초 수 (2 <= z <= 100)
h = 시작 시간의 시간 (1 <= h <= x)
m = 시작 시간의 분 (0 <= m <y)
s = 시작 시간의 초 (0 <= s <z)
t = 경과 한 시간 (초)

출력은 시작 시간 이후 t 초가 지난 후 각 시계의 종료 시간이어야합니다 . 출력은 표준 클럭 시간 (HH : MM : SS)으로 포맷되어야합니다. 필요한 경우 모든 숫자가 두 자리 숫자가되도록 숫자를 채워야합니다.

테스트 사례


입력

2
5 20 10
1 10 5
2633
6 25 5
6 0 3
290

산출

04:13:08
02:08:03

입력

1
14 17 11
12 16 10
1530

산출

07:03:00

입력

2
8 40 25
3 1 15
10620
14 15 20
1 14 0
-580

산출

05:26:10
14:00:00

8
모든 행성에 영국인이 거주하는지 궁금합니다.
aaaaaaaaaaaa

4
@eBusiness 차와 완전히 다르지 않은 멋진 컵을 제공하는 것이 좋습니다.
Mateen Ulhaq

예제 / 입력 형식을 이해하지 못하는 것 같습니다. x는 행성의 시간 또는 인간 / 지구 시간에서 하루의 시간 수입니까? 그리고 h, 시작 시간은 행성의 시간입니까, 아니면 인간 / 지구 시간입니까? 이유 : 입력 1, 예 2에서 행성은 6 시간 밖에 안됩니다. 시작 시간은 어떻게 6이어야합니까? 그것은 잘못된 시간입니다.
사용자가 알 수 없음

올바르게 이해하면 시간이 1에서 n으로 이동합니다. 분과 초는 0에서 n-1로 이동합니다. 그러나 자정은 n : 00 : 00 또는 1:00:00입니다. 내가 혼란스러워하는 곳이다.
captncraig

@CMP : 마지막 테스트 사례에서 알 수 있듯이 자정 시간은 n : 00 : 00입니다.
케빈 브라운

답변:


8

GolfScript-50 자

~](;7/{{~+.4$/\4$%])\}3*3<)@\or\+{100+`(;}%':'*n}%

값 (H / M / S)은 스택 앞쪽으로 이동하여 수집됩니다 ( ])\). 0의 시간 '언더 플로우'는로 처리됩니다 or. 제로 패딩은 길이가 100+`(;같지만 으로 처리됩니다 0`\+-2>.


Ooooh, 100 가지가 나를 화나게합니다. 내가 생각했으면 좋겠다. (3 자만 절약 할 수 있지만 훨씬 더 많은 두뇌 시간을 절약 할 수 있습니다.)
Jesse Millikan

9

파이썬, 142 자

R=raw_input
for i in' '*input():x,y,z,h,m,s=map(int,(R()+i+R()).split());t=input()+h*y*z+m*z+s;print'%02d:%02d:%02d'%((t/y/z-1)%x+1,t/z%y,t%z)

내가 실수하지 않으면 사용하기 때문에 for i in ' '*input()실제로 in i대신 두 문자를 저장할 수 있습니다. ' 'R()+' '+R()
Dan Burton

감사합니다.
Keith Randall

이것으로 두 번째 줄을 바꿀 수 있습니다exec"x,y,z,h,m,s=map(int,(R()+' '+R()).split());t=input()+h*y*z+m*z+s;print'%02d:%02d:%02d'%((t/y/z-1)%x+1,t/z%y,t%z);"*input()
fR0DDY

t/y/z%x or x더 짧은 문자입니다.
Nabb

5

GolfScript 62 60 자

편집 : 스택에 상주하기 위해 이전에 저장된 어레이를 가져올 수 있었으므로 큰 개선은 없지만 약간의 추가 전환이 필요합니다.

~](\7/\{(~+[]\{.5$/@@5$%\+@@+}3*;\;(@or\+{'0'\+-2>}%':'*n@}*

62 버전 :

~](\7/\{[]:a;(~{+.4$/\4$%a+:a;}3*;;;a(@or\+{'0'\+-2>}%':'*n@}*
1______a2____3_b4_5___6__7____8__9__10_____11_________12____13

나는 그것이 훨씬 더 잘 될 수 있다고 확신합니다.

1 : 모든 입력의 배열을 만들고 첫 번째 요소를 선택하고 나머지는 7 블록으로 그룹화합니다.
a / 13 : 입력에서 첫 번째 숫자를 소비하여 루프를 해당 횟수만큼 실행합니다.
2 : 빈 배열을 a에 저장합니다.
3 : 7의 블록을 선택하고 7 개의 개별 숫자로 확장합니다.
b / 8 : 초, 분 및 시간마다 한 번씩 루프를 3 회 실행합니다.
4 : 첫 번째 반복 (초 및 이동 시간)에 대해 마지막 두 숫자를 함께 추가하십시오. 다음은 이전주기에서 오버 플로우 된 시간 (분 및 시간)입니다. 결과의 두 번째 사본을 작성하십시오.
5 : 복사본을 한계로 나눠 오버플로를 생성하고 결과를 한 칸 뒤로 이동합니다.
6 : 결과의 일부를 생성하기 위해 이전 구간의 모듈로를 계산합니다.
7 :이 부분을 배열에 추가합니다.
9 : 스택에서 시간 초과 및 두 번째 및 분 제한을 제거합니다.
10 : a의 시간 부분을 가져 가면 0으로 시간 제한으로 바꾸면 배열에 다시 넣으십시오.
11 : a의 각 요소에 대해 '0'을 앞에 놓고 문자열로 변환하고 마지막 2자를 제외한 모든 것을 버립니다.
12 : ':'으로 구분 된 단일 문자열로 배열을 축소하고 줄 바꾸기를 배치하고 나머지 작업이 포함 된 배열을 스택의 맨 앞으로 이동하여 다음 반복을 준비하십시오.


그리고 13이란 무엇입니까? 좋은 설명입니다! +1
FUZxxl

@FUZxxl : 13 및 8은 블록 a 및 b의 끝 마커입니다.
schnaader

5

J (35분의 172) 137 99 107

이제 주어진 모든 테스트 사례를 통과합니다.

4(1!:2)~LF,~"1([,':',])/"2,"2":"0(10 10#:1 0 0+{.#:{.&{:+{.#.1 0 0-~1&{)"2&(,&}.$~,&3 3&{.&{.)".;._2(1!:1)3

172가 전부입니다. 35는 내가 실제로 스누피하고 표시된대로 IO를 거부 한 경우 줄 문자 수입니다. (나는 여전히 약간 수정했습니다. 시계는 J 내에서 대화 형으로 사용되는 파일 이름을 사용하는 함수입니다.)

나는 이것이 내가 보이게하는 것보다 J에서 훨씬 쉬워지기를 바랍니다.

편집 : J에서 더 나은 입력 구문 분석을 수행하고 charsub를 제거하고 명령 줄 호출 및 출력으로 전환하는 방법을 알아 냈습니다.

편집 2 : 중앙 함수 입력을 3x3 행렬로 변경하고 많은 성가신 괄호를 제거하고 이름을 제거했습니다.

편집 3 : 0시 처리.

설명:

내 J는 여전히 좋지 않으며 IO는 항상 고통입니다. 그래서 이것의 일부는 허위입니다.

  • 동사 1 0 0+{.#:{.&{:+{.#.1 0 0-~1&{는 3x3 행렬을 취합니다 (입력 라인으로 구성되며 마지막 두 요소는 가비지입니다).
  • h / m / s는 {로 얻습니다. (머리), 1 & {(두 번째 요소)의 실제 시간 및 {. & {:( 꼬리 머리)의 두 번째 개수입니다.
  • 동사는 #을 사용합니다 . 시계 시간을 초로 변환합니다. (문서 참조)
  • 두 번째 수를 더한 다음 # : 를 사용 하여 세 가지 요소 답변을 얻습니다.
  • 0시 케이스는 기본 변경 전 1 시간에서 1을 빼고 1을 더하여 처리합니다. (와 두 비트 1 0 0)
  • 나머지는 입력과 출력이며, 항상 그렇습니다.
  • ".;._2(1!:1)3 채워지지 않은 위치에서 0으로 입력의 3 '열'행렬을 가져옵니다.
  • ,&}.$~,&3 3&{.&{. 입력에서 첫 번째 행을 잘라 내고 나머지 행을 Nx3x3으로 만듭니다.
  • "2수정은 중앙 동사는 3 × 3 건을 촬영합니다.
  • 10 10&#:Nx3x2 행렬을 제공하는 각 숫자에 대해 2 자리 10 진수를 제공합니다. (패딩에 0을 얻는 것은 고통 스럽다 .)
  • ,"2":"0 숫자를 ASCII (Nx3x2x1)로 변환하고 마지막 열을 래블하여 Nx3x2를 다시 ASCII로 제공합니다.
  • LF,~"1([,':',])/"2 inserts : 각 요소 사이에 추가하고 (Nx7) 추가하고 (Nx8)에 대해 줄 바꿈을 추가합니다.
  • 4(1!:2)~ 각 행을 인쇄합니다.

4

하스켈, 159 자

v(_:x:y:z:h:m:s:t:r)=(w%x+1)&":"$z%y&":"$1%z&"\n"$v$t:r where w=y*z;(%)=mod.div(t+h*w-w+m*z+s)
v _=""
d&c=tail.(shows(d+100)c++)
main=interact$v.map read.words

  • 편집 : (207-> 200) 때로는 divMod가치가 없습니다!
  • 편집 : (200-> 178) 우아한 foldr접근 방식을 사용하지 않기로 결정했습니다 (여러 구성 요소가있는 시간 시스템에서 작동합니다!)
  • 편집 : (178-> 164) 인라인 f
  • 편집 : (164-> 158) 불필요한 괄호를 제거했습니다.
  • 편집 : (158-> 160) 세 가지 수정 전에 소개 된 비트가 수정되었습니다. 시간이 다시 정확합니다.
  • 편집 : (160-> 159) 님에게 전화를 끊었습니다. tail

시간은 모든 출력에서 ​​1 씩 오프셋됩니다.
Joey Adams

@Joey : 잘 잡아! 결정된.
MtnViewMark

3

루비, 128 자

파이썬에서 뻔뻔스럽게 복사합니다.

d=$<.read.split.map(&:to_i);d[0].times{|o|x,y,z,h,m,s,t=d[o*7+1,7];t+=z*(y*h+m)+s;puts ["%02d"]*3*':'%[(t/y/z-1)%x+1,t/z%y,t%z]}

3

하스켈-필요한 219 자

import Text.Printf
(#)=div
(%)=mod
n?d=(n-1)%d+1
e a n=mapM(\_->a)[1..n]
main=readLn>>=(e$do{
 a<-e getLine 3;
 let[x,y,z,h,m,s,t]=map read.words=<<a;
    w=y*z;e=h*w+m*z+s+t::Int
  in printf"%02d:%02d:%02d\n"(e#w?x)(e#z%y)(e%z)})

2

PHP (241 자)

인수로 전달 된 파일에서 입력을받습니다.

foreach(array_chunk(array_slice(file($argv[1]),1),3)as$v){list($x,$y,$z)=split(" ",$v[0]);list($h,$m,$s)=split(" ",$v[1]);$e=($v[2]+$s+$z*($m+$h*$y))%($x*$y*$z);$s=$e%$z;$e/=$z;$m=$e%$y;$h=($e/$y)%$x;printf("%02d:%02d:%02d\n",$h?:$x,$m,$s);}

그리고 골퍼되지 않은 :

$input = array_chunk(array_slice(file($argv[1]),1),3);
foreach($input as $v){
    list($x,$y,$z)=split(" ",$v[0]);
    list($h,$m,$s)=split(" ",$v[1]);
    $t = $v[2];
    $seconds_in_day = $x * $y * $z;
    $total_elapsed = $t + $s + $m*$z + $h*$y*$z;
    $elapsed = $total_elapsed % $seconds_in_day;

    $sec = $elapsed % $z;
    $elapsed /= $z;

    $min = $elapsed % $y;
    $elapsed /= $y;

    $hours = $elapsed % $x;
    if ($hours == 0) $hours = $x;

    printf("%02d:%02d:%02d\n",$hours,$min,$sec);
}

그리고시길 (달러 기호)이 없으면 205 자로 나타납니다.


2

자바, 486 371 자

Ungolfed 버전 : http://pastebin.com/6LiTdGyi

제공된 예제와 동일한 출력을 제공합니다.

그러나 나는 그 행동에 동의하지 않습니다 : 시계에는 하루에 몇 시간이있는만큼 숫자가 없습니다 : 반은 있습니다.

즉, 12:50:12에 3600 초를 추가하면 13:50:12가 아닌 01:50:12 (표준 24/60/60 시스템)가 인쇄됩니다.

내 코드에서 처리했지만 예제와 일치하도록 솔루션에서 주석 처리했습니다. 물론 이것을 고려하면 AM / PM 마커를 추가하지 않으면 입력 시간이 모호한 것으로 간주 될 수 있습니다.

그러나 어쨌든 퍼즐에는 일관성이 없습니다. 00 시간을 x로 바꾸어야하는 경우 시간> (x / 2)는 시간-(x / 2)로 바꾸어야합니다.

편집 : 골프 버전 :

import java.io.File;import java.util.Scanner;public class U{static int i(Scanner s){return
s.nextInt();}public static void main(String[]g)throws Exception{Scanner s=new Scanner(new File(g[0
]));int n=i(s);while(0!=n--){int J=i(s),K=i(s),L=i(s),P=(i(s)*K*L+i(s)*L+i(s)+i(s))%(J*K*L);System.
out.println(String.format("%02d:%02d:%02d",(0==P/L/K%J)?J:P/L/K%J,P/L%K,P%L));}}}

안녕하세요. [code-golf] 질문에는 총 문자 수에서 가장 짧은 답변이 필요합니다. 이것은 골프 참가작이 최소한 다음을 충족해야 함을 의미합니다. 1. package선언을 사용하지 않아야합니다 . 2. 사용하지 않습니다 final; 3. 단일 문자 변수 이름과 클래스 이름을 사용하십시오. 4. 일반적으로 가장 짧은 코드를 가능하게하는 영리한 방법을 사용하십시오.
Chris Jester-Young 1

코드를 읽을 수 없는지 여부는 중요하지 않습니다. 따라서 "읽을 수없는"버전은 코드 골프 경연 대회가 짧지 않으면 유용하지 않습니다. 솔직히 말해서 Java는 골프 대회에 참가하기에 열악한 언어입니다. 대부분의 언어에 비해 Java는 매우 장황하기 때문입니다. :-(
Chris Jester-Young

가까운 장래에, 코드가없는 질문이 [code-golf] 질문에서 제거되는 정리 연습을 할 것입니다. 따라서 골프 버전을 만들 수 있다면 (내 첫 번째 의견 참조)하십시오. 그렇지 않으면 다음 정리시 답이 제거됩니다.
Chris Jester-Young 1

안녕하세요. 모두 죄송합니다. 혼란스러워 ... 결국 골프의 의미를 이해하게되었습니다. 나는 ungolfed 버전을 링크로 유지했습니다. 입력 및 예상 결과에 대한 의심 때문에 특히 좋기를 바랍니다. 나는 더 나은 골프 버전을 넣었다. 올바른 Java는 최고는 아니지만이 골프 버전을 여기에 보관하기에 충분하다고 생각합니다. 다시 죄송합니다.
tisek

@tisek : 새 버전 감사합니다. 다음은 코드를 더욱 단축하기위한 제안입니다. 대신에을 int[]c={i(s),i(s),i(s),i(s),i(s),i(s),i(s)}사용하는 것이 좋습니다 int a=i(s),b=i(s),c=i(s),d=i(s),e=i(s),f=i(s),g=i(s). 예, 여기에 11자를 추가하지만을 사용할 때마다 3자를 저장합니다. c[x]즉, 4 개의 인스턴스 이후에는 자체적으로 지불됩니다. 13 개의 인스턴스를 계산했습니다. 이는 전체적으로 28자를 절약하는 것을 의미합니다!
Chris Jester-Young

2

배쉬-189 자 :

read n
for((i=0;i<n;i++));do
read x y z
read h m s
read t
R=$(((s+m*z+h*y*z+t)%(x*y*z)))
H=$((R/y/z))
R=$((R-H*y*z))
M=$((R/z))
printf"%02d:%02d:%02d\n"$((((H-1)%x+x)%x+1))$M$((R-M*z))
done

제가 기억 하듯이 두 번째 모드는 음의 경과 초 동안 있습니다.

해당 printf 줄이 작동하지 않습니다. printf그리고 그 논쟁 사이 와 그 논쟁 사이에는 공백이 필요합니다 ...
Mark Reed

1

PHP, 229,228

<?$v=file($argv[1]);while(++$i<$v[0]*3){list($x,$y,$z)=split(" ",$v[$i++]);list($h,$m,$s)=split(" ",$v[$i++]);$s=($e=($v[$i]+$s+$m*$z+$h*$y*$z)%($x*$y*$z))%$z;$m=($e/=$z)%$y;printf("%02d:%02d:%02d\n",($e/$y)%$x?$e%$x:$x,$m,$s);}

파일은 인수로 스크립트에 전달되어야합니다

언 골프 드 :

<?php

$v = file($argv[1]); // Automatically break the file into an array by line

while(++$i < $v[0]*3){ // Loop for every three lines
  list($x, $y, $z) = explode(" ", $v[$i++]); // Break apart the first line by space
  list($h, $m, $s) = explode(" ", $v[$i++]); // Break apart the second line

  /*
    Add the starting time to the total number of seconds that have passed
    Divide by total amount of seconds in a day
  */

  $time = ($v[$i] + $s + $m * $z + $h * $y * $z) % ($x * $y * $z);

  $seconds = $time % $z;  // Get the number of seconds
  $minutes = ($time /= $z) % $y; // Remove the end amount of seconds, then get the minutes

  /*
    Remove the end amount of hours
    Determine how many hours there would be
    If the number is zero, then output the max hours
    If the number is not zero, output the amount of hours left
  */

  $hours = ($time / $y) % $x? $e % $x : $x;

  // Display the time in the correct format
  printf("%02d:%02d:%02d\n", $hours, $minutes, $seconds);
}

변경 로그:

229-> 228 : 시분할을 수행하는 동안 남은 시간을 설정할 필요가 없습니다.


1

배쉬, 139 자

read n
while((n--));do
read x y z;read h m s;read t
((t+=z*(y*h+m)+s,a=(t/y/z-1)%x+1,b=t/z%y,c=t%z))
printf %02d:%02d:%02d\\n $a $b $c
done

1

스칼라 184 자

object C extends App{val r=new java.util.Scanner(System.in)
def n=r.nextInt
for(j<-1 to n;h=n;m=n;s=n;x=n;y=n;z=n;t=n;d=(x*m+y)*s+z+t){printf("%02d:%02d:%02d\n",d/(m*s)%h,d/s%m,d%s)}
}

나는 규칙과 충돌하여

14 15 20
1 14 0
-580

출력은해서는 안됩니다

14:00:00

그러나

00:00:00

그것이 내 코드에서 생성하는 것입니다. 00:00:00 대신 24:59:59 대신 24:00:00을 표시하는 시계를 알려주십시오. 또는 순서를 기대하십니까?

23:59:59
24:00:00
00:00:01

대신에

23:59:59
00:00:00
00:00:01

지구상에서는 24:00:01은 보이지 않지만 '0:00:00의 N + 1 일'의 동의어로 'day N at 24:00:00'이 사용되는 경우가 있습니다. 같은 시간이지만 다른 초점- '오늘 자정'과 '내일 아침 자정'.
Mark Reed

1

파이썬 2 , 137 바이트

lambda T:["%02d:%02d:%02d"%((s/z/y%x,x)[s%x<1],s/z%y,s%z)for x,y,z,h,m,s,t in[T[i:i+7]for i in range(1,len(T),7)]for s in[s+m*z+h*y*z+t]]

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

다른 Python 답변 보다 약간 짧지 만 다른 경로를 사용합니다.

풀리지 않은 설명 :

def f(T):
    # ignore first list element, split list into even chunks of length 7
    for i in range(1, len(T), 7):
        # get variables for sublist
        for x, y, z, h, m, s, t in [T[i:i + 7]]:
            # get total time in seconds, inside a list so that we can use list comprehension
            for s in [s + m*z + h*y*z + t]:
                # split total time into parts
                # seconds: convert seconds to minute, take remainder
                sec = s % z
                # minutes: convert seconds to minutes (discard remainder), convert minutes to hours, take remainder
                min = s / z % y
                # hours: convert seconds to minutes (discard remainder),
                #        convert minutes to hours (discard remainder),
                #        convert hours to days, take remainder
                # if seconds are evenly divisible by total hours, use number of hours in day instead ("midnight")
                hr = (s / z / y % x, x)[s % x < 1]

                print "%02d:%02d:%02d"%(hr, min, sec)

0

하스켈 ( 815 개 624 문자 비 golfed, 빈 줄은 제외)

광산은 "자정"과 같은 시간 인 12:00:00 대신 00:00:00을 인쇄합니다. 편집 : 변경했습니다.

main = readFile "in.txt" >> mapM_ print . times . map (map read . words) . tail . lines

times [] = []
times ([x,y,z]:[h,m,s]:[t]:xs) = Time x y z h m s +++ t : times xs

data Time = Time {x,y,z,h,m,s :: Int}
hr t | h t == 0 = x t | otherwise = h t

instance Show Time where show t = pad2 (hr t) ++ ':':pad2 (m t) ++ ':':pad2 (s t)

pad2 x | x < 10 = '0':show x | otherwise = show x

t +++ ss | ss < 0  = t +++ (ss + x'*y'*z') | otherwise = Time x' y' z' h' m' s'
  where (x',y',z') = (x t, y t, z t)
        (ms, s') = (s t + ss) `quotRem` z'
        (hs, m') = (m t + ms) `quotRem` y'
        (_,  h') = (h t + hs) `quotRem` x'

몇 가지를 더 추상화 할 수는 있지만 w / e입니다. 입력 파일의 첫 번째 줄을 완전히 무시하고 형식이 잘못된 파일에 대해 비명을 지 릅니다.


시간, 분 및 초 동안 두 자리 이상의 숫자를 허용하도록이 솔루션을 조작하는 것이 쉽습니다.
Dan Burton

"x 시간이있는 시계의 시간은 우리의 시간 (1, 2, 3, ..., x)과 비슷하게 정렬되어 있으므로"00:00:00은 유효하지 않습니다. 그래도 조정하기 어렵지 않아야합니다.
케빈 브라운

@ Bass5098 고정 및 비트 단축. 그래도 읽을 수없는 형태로 그것을 내놓을 마음이 없습니다.
Dan Burton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.