Penjelajah Waktu

18

Kode terpendek untuk menghasilkan waktu yang tepat pada jam menang.

Anda adalah penjelajah waktu yang berpengalaman dan diketahui berhenti di banyak planet selama jurnal Anda. Setiap planet berputar pada kecepatan yang berbeda dan karenanya, lamanya satu hari berbeda dari hari 24 jam yang biasa. Akibatnya, planet-planet menggunakan jam dengan jumlah jam yang berbeda. Jam pada jam dengan x jam disusun mirip dengan jam kita (1, 2, 3, ..., x ) dengan angka berputar searah jarum jam dan x berada di atas.

Selain itu, setiap planet memiliki jumlah menit yang berbeda dalam satu jam, dan jumlah detik yang berbeda dalam satu menit. Anda akan diberi waktu mulai dan beberapa detik berlalu dari mana Anda harus menentukan waktu berakhirnya.

Input dapat diambil langsung dari file yang dikirimkan sebagai argumen, atau sebagai input standar. Baris input pertama adalah jumlah jam yang harus Anda proses. Setelah itu, setiap jam memiliki tiga jalur input yang berisi bilangan bulat dalam format berikut:

x y z
h m s
t

Arti setiap huruf di bawah ini.

x = Jumlah jam dalam sehari (2 <= x <= 99)
y = Jumlah menit dalam satu jam (2 <= y <= 100)
z = Jumlah detik dalam satu menit (2 <= z <= 100)
h = Jam waktu mulai (1 <= h <= x)
m = Menit waktu mulai (0 <= m <y)
s = Yang kedua dari waktu mulai (0 <= s <z)
t = Jumlah detik yang telah berlalu

Output harus menjadi waktu akhir untuk setiap jam setelah t detik berlalu sejak waktu mulai. Output Anda harus diformat sebagai waktu jam standar (HH: MM: SS). Angka harus diisi, bila perlu, untuk memastikan bahwa semua angka adalah dua digit.

Uji Kasus


Memasukkan

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

Keluaran

04:13:08
02:08:03

Memasukkan

1
14 17 11
12 16 10
1530

Keluaran

07:03:00

Memasukkan

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

Keluaran

05:26:10
14:00:00
Kevin Brown
sumber
8
Saya bertanya-tanya apakah semua planet dihuni oleh orang Inggris?
aaaaaaaaaaaa
4
@eBusiness Lebih baik beri mereka secangkir teh yang tidak sama seperti teh.
Mateen Ulhaq
Saya rasa saya tidak mengerti contoh / format input. x apakah jumlah jam dalam sehari - jam dalam waktu planet itu, atau jam manusia / bumi? Dan h, waktu mulainya adalah waktu di planet itu, atau lagi, waktu manusia / bumi? Karena: Jika dalam input 1, contoh 2, planet ini hanya memiliki 6 jam - bagaimana seharusnya waktu mulainya 6? Itu akan menjadi waktu yang tidak valid.
pengguna tidak diketahui
Jika saya mengerti benar, Jam beralih dari 1 ke n. Menit dan detik berubah dari 0 hingga n-1. Tetapi tengah malam n: 00: 00 atau 1:00:00. Di situlah saya bingung.
captncraig
@CMP: Seperti yang ditunjukkan oleh test case terakhir, waktu untuk tengah malam adalah n: 00: 00.
Kevin Brown

Jawaban:

8

GolfScript - 50 karakter

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

Nilai-nilai (H / M / S) dikumpulkan dengan memindahkannya ke depan tumpukan ( ])\). Jam 'underflow' di 0 ditangani dengan or. Tanpa bantalan ditangani 100+`(;, meskipun saya kira 0`\+-2>panjangnya sama.

Nabb
sumber
Ooooh, 100 hal itu membuatku marah. Saya berharap saya memikirkannya. (Itu hanya akan menyelamatkan saya 3 karakter, tetapi akan menyelamatkan saya lebih banyak waktu otak.)
Jesse Millikan
9

Python, 142 karakter

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)
Keith Randall
sumber
Jika saya tidak salah, karena Anda menggunakan for i in ' '*input()Anda benar-benar bisa menggunakan ibukannya ' 'di R()+' '+R(), menyimpan dua karakter.
Dan Burton
Memang terima kasih.
Keith Randall
Anda dapat mengganti baris kedua dengan iniexec"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 xadalah karakter yang lebih pendek.
Nabb
5

GolfScript 62 60 karakter

Sunting: Saya berhasil mendapatkan array yang sebelumnya disimpan di dalam untuk berada di stack, dibutuhkan sedikit pergantian lebih dari itu meskipun begitu tidak ada perbaikan besar.

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

Versi 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

Saya yakin itu bisa dilakukan jauh lebih baik, saya hanya tidak bisa memikirkan yang lebih baik.

1: Buat larik semua input, ambil elemen pertama, kelompokkan sisanya ke dalam blok 7.
a / 13: Konsumsi angka pertama dari input untuk menjalankan loop sebanyak itu kali.
2: Simpan array kosong di a.
3: Pilih satu blok 7 dan perluas menjadi 7 nomor individual.
b / 8: Jalankan loop 3 kali, sekali untuk setiap detik, menit dan jam.
4: Tambahkan dua angka terakhir bersamaan, untuk iterasi pertama yaitu detik dan waktu untuk bergeser, untuk yang berikutnya adalah menit dan jam dengan limpahan dari siklus sebelumnya. Buat salinan kedua hasilnya.
5: Bagilah salinan dengan batasnya untuk menghasilkan kelebihan dan geser hasilnya kembali satu spasi.
6: Hitung modulo dari divisi sebelumnya untuk menghasilkan bagian dari hasilnya.
7: Tambahkan bagian ini ke array.
9: Hapus overflow jam dan batas kedua dan menit dari tumpukan.
10: Ambil bagian jam a, jika nol ganti dengan batas jam, masukkan kembali ke dalam array.
11: Untuk setiap elemen dalam a, tempatkan '0' di depan, dengan demikian dikonversi menjadi string, dan buang semuanya kecuali 2 karakter terakhir.
12: Perkecil larik menjadi string tunggal yang dibatasi oleh ':', letakkan baris baru dan geser larik berisi pekerjaan yang tersisa ke depan tumpukan, dengan demikian mempersiapkan iterasi berikutnya.

aaaaaaaaaaaa
sumber
Dan apa artinya 13? Penjelasan yang bagus! +1
FUZxxl
@FUZxxl: 13 dan 8 adalah penanda akhir dari blok a dan b.
schnaader
5

J (172/35) 137 99 107

Sekarang lewati semua test case yang diberikan.

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 adalah semuanya; 35 adalah jumlah karakter yang akan saya berikan jika saya benar-benar angkuh dan menolak untuk melakukan IO seperti yang ditunjukkan. (Saya masih memodifikasinya sedikit; jam adalah fungsi yang mengambil nama file yang dimaksudkan untuk digunakan secara interaktif dalam J.)

Saya yakin berharap ini jauh lebih mudah di J daripada saya membuatnya terlihat.

Sunting: Mencari tahu bagaimana melakukan parsing input yang lebih baik di J, menghilangkan charsub, beralih ke permintaan & keluaran baris perintah.

Sunting 2: Mengubah input fungsi pusat ke matriks 3x3, menghilangkan banyak tanda kurung sial, menghilangkan nama

Sunting 3: 0-jam ditangani.

Penjelasan:

J-ku masih tidak bagus, dan IO sakit seperti biasa. Jadi sedikit dari ini gila.

  • Kata kerja 1 0 0+{.#:{.&{:+{.#.1 0 0-~1&{mengambil matriks tiga kali tiga (terdiri dari garis input, dua elemen terakhir adalah sampah)
  • H / m / s didapat dengan {. (kepala), waktu aktual dengan 1 & {(elemen kedua), dan hitungan kedua dengan {. & {: (kepala ekor).
  • Kata kerjanya menggunakan #. untuk mengubah waktu jam menjadi detik. (Lihat dokumentasi.)
  • Itu menambah jumlah kedua dan kemudian menggunakan #: untuk mendapatkan jawaban 3 elemen.
  • Kasing jam 0 ditangani dengan mengurangi 1 dari jam sebelum pangkalan berubah dan menambahkan 1 kembali sesudahnya. (dua bit dengan 1 0 0)
  • Sisanya adalah input dan output, yang benar-benar kotor (seperti biasa).
  • ".;._2(1!:1)3 mendapat 3 'kolom' matriks input dengan 0s di posisi tidak terisi.
  • ,&}.$~,&3 3&{.&{. memotong baris pertama dari input dan membentuk baris yang tersisa menjadi Nx3x3.
  • The "2memodifikasi kata kerja sentral untuk mengambil 3x3 kasus.
  • 10 10&#:memberikan 2 angka desimal untuk setiap angka yang menghasilkan matriks Nx3x2. (Mendapatkan 0 untuk bantalan adalah menyebalkan .)
  • ,"2":"0 mengonversi digit ke ASCII (Nx3x2x1) dan menghapus kolom terakhir, memberikan Nx3x2 lagi sebagai ASCII.
  • LF,~"1([,':',])/"2 sisipan: antara setiap elemen dan menambahkannya (Nx7) dan menambahkan umpan baris per untuk (Nx8).
  • 4(1!:2)~ mencetak setiap baris.
Jesse Millikan
sumber
4

Haskell, 159 karakter

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

  • Sunting: (207 -> 200) terkadang divModtidak sepadan!
  • Sunting: (200 -> 178) menyerah karena tidak menggunakan foldrpendekatan elegan (yang bekerja untuk sistem waktu dengan sejumlah komponen!)
  • Sunting: (178 -> 164) sebaris f
  • Sunting: (164 -> 158) menghapus tanda kurung yang tidak perlu
  • Sunting: (158 -> 160) diperbaiki sedikit diperkenalkan tiga suntingan lalu: jam sekarang benar lagi
  • Sunting: (160 -> 159) membatalkan panggilan ke tail
MtnViewMark
sumber
Jam diimbangi dengan satu di semua output.
Joey Adams
@ Joey: Tangkapan bagus! Tetap.
MtnViewMark
3

Ruby, 128 karakter

Salinan tanpa malu-malu dari python:

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]}
Ezran
sumber
3

Haskell - 219 karakter yang diperlukan

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)})
Joey Adams
sumber
2

PHP (241 karakter)

Mengambil input dari file yang diteruskan sebagai argumen.

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);}

Dan ungolfed:

$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);
}

Dan hanya untuk dicatat, tanpa tanda (tanda dolar), ini keluar untuk 205 karakter.

Austin Hyde
sumber
2

Jawa, 486 371 karakter

Versi tidak disatukan: http://pastebin.com/6LiTdGyi

Ini memberikan hasil yang sama seperti pada contoh yang disediakan.

Tetapi saya tidak setuju dengan perilaku itu: sebuah jam tidak memiliki jumlah sebanyak ada jam dalam sehari: jam memiliki setengahnya.

Artinya, jika Anda menambahkan 3600 detik hingga 12:50:12, maka ia harus mencetak 01:50:12, bukan 13:50:12 (dalam sistem 24/60/60 standar kami).

Saya menanganinya dalam kode saya tetapi berkomentar dalam solusi saya agar cocok dengan contoh. Tentu saja jika Anda mempertimbangkan hal ini, maka waktu input dapat dianggap ambigu kecuali jika Anda menambahkan beberapa penanda AM / PM.

Tetapi bagaimanapun juga, teka-teki tersebut memiliki ketidakkonsistenan: jika 00 jam harus diganti dengan x, maka jam> (x / 2) harus diganti dengan jam - (x / 2).

Sunting: Versi golf:

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));}}}
Tisek
sumber
Hai, pertanyaan [code-golf] membutuhkan jawaban terpendek dalam jumlah karakter. Ini berarti entri golf harus, setidaknya: 1. tidak menggunakan packagedeklarasi; 2. tidak digunakan final; 3. menggunakan nama variabel karakter tunggal dan nama kelas; 4. umumnya menggunakan cara paling pintar untuk membuat kode sesingkat mungkin.
Chris Jester-Young
Tidak masalah apakah kode Anda tidak dapat dibaca atau tidak; oleh karena itu, versi "tidak terbaca" Anda tidak berguna untuk kontes golf kode jika tidak pendek. Sejujurnya, Java adalah bahasa yang buruk untuk mengikuti kontes golf, karena dibandingkan dengan kebanyakan bahasa, Java sangat bertele-tele. :-(
Chris Jester-Young
Dalam waktu dekat, saya akan melakukan latihan pembersihan di mana entri non-golf akan dihapus dari pertanyaan [kode-golf]. Jadi, jika Anda dapat membuat versi golf (lihat komentar pertama saya), silakan lakukan; jika tidak, jawaban Anda akan dihapus pada pembersihan berikutnya.
Chris Jester-Young
Hai. Maaf untuk semuanya Saya bingung ... Saya akhirnya mengerti apa arti golf. Saya tetap menggunakan versi yang tidak diklik sebagai tautan saja. Saya harap itu baik-baik saja terutama karena keraguan saya tentang input dan hasil yang diharapkan. Saya kemudian menempatkan versi golf yang lebih baik. Benar Java bukan yang terbaik tapi saya pikir saya melakukannya dengan cukup baik untuk versi golf ini disimpan di sini. Maaf lagi.
tisek
@tisek: Terima kasih untuk versi baru Anda. Berikut saran untuk memperpendek kode lebih jauh: alih-alih int[]c={i(s),i(s),i(s),i(s),i(s),i(s),i(s)}, Anda mungkin ingin menggunakannya int a=i(s),b=i(s),c=i(s),d=i(s),e=i(s),f=i(s),g=i(s). Ya, Anda menambahkan 11 karakter di sini, tetapi Anda menyimpan tiga karakter setiap kali Anda gunakan c[x], yang berarti setelah 4 kejadian seperti itu, itu dibayar sendiri. Saya menghitung 13 contoh seperti itu, yang berarti Anda menyimpan 28 karakter secara keseluruhan!
Chris Jester-Young
2

Bash - 189 karakter:

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
Kevin Brown
sumber
Seingat saya mod kedua ada untuk detik berlalu yang negatif.
Garis printf itu tidak berfungsi. Spasi diperlukan antara printfdan argumennya dan antara argumen itu ...
Mark Reed
1

PHP, 229 228 karakter

<?$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);}

File harus diteruskan ke skrip sebagai argumen

Tidak Disatukan:

<?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);
}

Changelog:

229 -> 228: Tidak perlu mengatur waktu yang tersisa saat melakukan pembagian waktu

Kevin Brown
sumber
1

Bash, 139 karakter

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
Mark Reed
sumber
1

Scala 184 chars:

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)}
}

Bertentangan dengan aturan, saya mengklaim, itu untuk

14 15 20
1 14 0
-580

Outputnya seharusnya tidak

14:00:00

tapi

00:00:00

dan itulah yang dihasilkan kode saya. Tolong tunjukkan pada saya jam yang menampilkan 24:00:00 di bumi, bukannya 00:00:00 - mungkin 24:59:59. Atau apakah Anda mengharapkan urutannya:

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

dari pada

23:59:59
00:00:00
00:00:01
Pengguna tidak diketahui
sumber
Di Bumi, Anda tidak akan melihat 24:00:01, tetapi terkadang Anda melihat 'hari N pukul 24:00:00' digunakan sebagai sinonim untuk 'hari N + 1 pukul 00:00:00'. Ini adalah waktu yang sama tetapi fokus yang berbeda - 'tengah malam malam ini' vs 'tengah malam besok pagi'.
Mark Reed
1

Python 2 , 137 byte

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

Cobalah online!

Hanya sedikit lebih pendek dari jawaban Python yang lain , tetapi mengambil rute yang berbeda untuk sampai ke sana.

Penjelasan Tidak Dikunci:

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)
Triggernometri
sumber
0

Haskell ( 815 624 karakter non-golf, garis kosong tidak termasuk)

Milik saya mencetak 00:00:00 bukannya 12:00:00 atau serupa untuk "tengah malam" -seperti kali. Edit: mengubah itu.

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'

Bisa saja mengabstraksikan beberapa hal lagi, tetapi b Ini benar-benar mengabaikan baris pertama dari file input, dan umumnya menjerit pada Anda untuk file yang diformat dengan tidak benar.

Dan Burton
sumber
Perhatikan bahwa akan mudah untuk memanipulasi solusi ini untuk memungkinkan lebih dari dua digit selama berjam-jam, menit, dan detik.
Dan Burton
"Jam pada jam dengan x jam diatur mirip dengan jam kita (1, 2, 3, ..., x)", jadi 00:00:00 tidak valid. Seharusnya tidak sulit untuk menyesuaikan untuk itu.
Kevin Brown
@ Bass5098 diperbaiki, dan diperpendek sedikit. Saya masih belum tega memuntahkannya ke bentuk yang tidak bisa dibaca.
Dan Burton