タイムトラベラー


18

クロックで正しい時間を生成する最短のコードが勝ちです。

あなたはベテランの時間旅行者であり、旅行中に多くの惑星に立ち寄ることが知られています。各惑星は異なる速度で回転します。そのため、1日の長さは通常の24時間とは異なります。その結果、惑星は異なる時間数の時計を使用します。x時間の時計の時間は、私たちのものと同様に配置されます(1、2、3、...、x)、数字は時計回りに回転し、xが最上部にあります。

さらに、各惑星には1時間に異なる分数があり、1分に異なる秒数があります。開始時間と終了時間を決定する必要がある経過秒数が提供されます。

入力は、引数または標準入力として渡されたファイルから直接取得できます。入力の最初の行は、処理する必要があるクロックの数になります。その後、各クロックには、次の形式の整数を含む3行の入力があります。

x y z
h m s
t

各文字の意味は次のとおりです。

x = 1日の時間数(2 <= x <= 99)
y = 1時間の分数(2 <= y <= 100)
z = 1分あたりの秒数(2 <= z <= 100)
h =開始時間の時間(1 <= h <= x)
m =開始時間の分(0 <= m <y)
s =開始時間の秒(0 <= s <z)
t =経過した秒数

出力は、tの後の各クロックの終了時間でなければなりません、開始時刻から秒経過した。出力は、標準時刻(HH:MM:SS)としてフォーマットする必要があります。必要に応じて、すべての数字が2桁になるように数字を埋め込む必要があります。

テストケース


入力

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 Betterは、お茶とまったく違いない素敵なカップを提供します。
Mateen Ulhaq

私は例/入力形式を理解していないと思います。xは1日の時間数-その惑星の時間の時間、または人間/地球の時間ですか?そして、開始時間は、その惑星時間の時間ですか、それとも人間/地球時間ですか?理由:入力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文字しか保存できませんでしたが、脳の時間を大幅に節約できました。)
ジェシーミリカン

9

Python、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()するのでi' 'inの代わりに実際に使用することができR()+' '+R()、2つの文字を保存します。
ダンバートン

本当にありがとう。
キースランドール

これで2行目を置き換えることができます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短い文字です。
ナブ

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回、秒、分、時間ごとに1回実行します。
4:最後の2つの数値を合計します。最初の反復ではシフトする秒と時間、次の反復では前のサイクルからのオーバーフローがある分と時間です。結果の2つ目のコピーを作成します。
5:コピーをその限界で除算してオーバーフローを生成し、結果を1スペース分戻します。
6:前の除算のモジュロを計算して、結果の一部を生成します。
7:この部分を配列に追加します。
9:スタックから時間のオーバーフローと秒と分の制限を削除します。
10:aの時間部分を取得します。ゼロの場合は、時間制限に置き換えて、配列に戻します。
11:aの各要素について、先頭に「0」を配置して文字列に変換し、最後の2文字を除くすべてを破棄します。
12:配列を「:」で区切られた単一の文字列に折りたたみ、改行を配置し、残りのジョブを含む配列をスタックの先頭に移動して、次の反復の準備をします。


13とは何ですか?良い説明!+1
FUZxxl

@FUZxxl:13と8は、ブロックaとbの終了マーカーです。
シュナーダー

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を行うことを拒否した場合に与える文字の数です。(私はまだ少し変更しました; clocksは、J内で対話的に使用されることを意図したファイル名を取る関数です。)

Jの方が見た目よりずっと簡単だと思います。

編集:Jでより良い入力解析を行う方法を考え出し、charsubを削除し、コマンドライン呼び出しと出力に切り替えました。

編集2:中央関数の入力を3x3行列に変更し、厄介な括弧を多く削除し、名前を削除

編集3:0時の処理。

説明:

私のJはまだ素晴らしくなく、IOはいつものように苦痛です。そのため、これの一部は無意味です。

  • 動詞1 0 0+{.#:{.&{:+{.#.1 0 0-~1&{は3行3列の行列を取ります(入力行で構成され、最後の2つの要素は不要です)
  • h / m / sは{で取得されます。(先頭)、1&{(2番目の要素)を含む実際の時間、および{。&{:(末尾の先頭))を含む2番目のカウント。
  • 動詞は#を使用します。時刻を秒に変換します。(ドキュメントを参照してください。)
  • 2番目のカウントを追加し、#:を使用して3要素の回答を取得します。
  • 0時の場合は、ベース変更の前の時間から1を減算し、その後に1を加算して処理します。(で2ビット1 0 0
  • 残りは入力と出力であり、これは本当にいつものことです。
  • ".;._2(1!:1)3 入力された3つの「列」行列を取得します。空の位置に0があります。
  • ,&}.$~,&3 3&{.&{. 入力から最初の行を切り取り、残りの行をNx3x3に整形します。
  • "23x3の例を取るために、中央動詞を変更します。
  • 10 10&#:Nx3x2行列を与える各数値に2桁の10進数を与えます。(パディングに0を取得するのは苦痛でした。)
  • ,"2":"0 数字をASCII(Nx3x2x1)に変換し、最後の列を解き、Nx3x2を再びASCIIとして返します。
  • LF,~"1([,':',])/"2 inserts:各要素間に追加し(Nx7)、for(Nx8)ごとに改行を追加します。
  • 4(1!:2)~ 各行を印刷します。

4

Haskell、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)3つの編集前に導入されたビットを修正:時間は再び正しくなりました
  • 編集:(160-> 159)への呼び出しをドロップしました tail

時間は、すべての出力で1オフセットされます。
ジョーイアダムス

@ジョーイ:良いキャッチ!修繕。
MtnViewMark

3

ルビー、128文字

Python 1から恥知らずにコピーします。

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

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

Java、486 371文字

非ゴルフバージョン:http ://pastebin.com/6LiTdGyi

これにより、提供された例と同じ出力が得られます。

しかし、私はその振る舞いに同意しません。時計は1日の時間ほど多くの数字を持たず、その半分を持っています。

つまり、3600秒を12:50:12に追加すると、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. 1文字の変数名とクラス名を使用します。4.一般に、最短のコードを可能にするために最も賢い方法を使用します。
クリスジェスターヤング

コードが読めないかどうかは関係ありません。したがって、「読めない」バージョンは、短くない限り、コードゴルフコンテストには役立ちません。正直に言うと、Javaはほとんどの言語と比較して非常に冗長であるため、ゴルフコンテストに参加するには貧弱な言語です。:-(
クリスジェスター-ヤング

近い将来、[code-golf]の質問からゴルフ以外のエントリを削除するクリーンアップ演習を行います。だから、もしあなたがゴルフバージョンを作ることができるなら(私の最初のコメントを参照)、してください。そうしないと、次のクリーンアップで回答が削除されます。
クリスジェスターヤング

こんにちは。すみません 私は混乱しました...私はゴルフが意味することを理解することになりました。リンクなしのバージョンをリンクとしてのみ保持しました。特に、入力と期待される結果に関して疑問があるため、これで問題ないことを願っています。それから、より良いゴルフバージョンを置きました。正しい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文字を追加しますがc[x]、使用するたびに3文字を保存します。つまり、そのようなインスタンスが4 回発生すると、それ自体が支払われます。このようなインスタンスを13個カウントしました。つまり、全体で28文字を節約できます。
クリスジェスターヤング

2

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

私が思い出すように、2番目のmodは負の経過時間の間存在します。

そのprintf行は機能しません。printf引数と引数の間、および引数の間にはスペースが必要です...
マークリード

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

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

Scala 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:00:00を表示する時計を表示してください。または、シーケンスを期待していますか:

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

の代わりに

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

地球では、24:00:01は表示されませんが、「日N + 1の00:00:00」の同義語として使用される「日Nの24:00:00」が表示されることがあります。それは同じ時間ですが、焦点が異なります-「今夜の真夜中」と「明日の朝の真夜中」。
マークリード

1

Python 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

Haskell(ゴルフのない815 624文字、空白行は除外)

鉱山は、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。入力ファイルの最初の行を完全に無視し、通常、フォーマットが不適切なファイルについては悲鳴を上げます。


このソリューションを簡単に操作して、時間、分、秒に2桁以上の数字を使用できるようにすることに注意してください。
ダンバートン

「x時間の時計の時間は、私たちの時間(1、2、3、...、x)と同様に配置されている」ため、00:00:00は無効です。ただし、そのための調整は難しくないはずです。
ケビンブラウン

@ Bass5098を修正し、少し短くしました。しかし、私はそれを読めない形に消す心がまだありません。
ダンバートン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.