Zaman Yolcusu


18

Saatler üzerinde doğru süreleri oluşturmak için en kısa kod kazanır.

Tecrübeli bir zaman yolcususunuz ve dergilerinizde birçok gezegende durduğunuz biliniyor. Her gezegen farklı bir oranda döner ve bu nedenle, bir günün uzunluğu 24 saatlik normal günümüzden farklıdır. Sonuç olarak, gezegenler farklı saatlerde saatler kullanır. X saati olan bir saatteki saatler bizimkine (1, 2, 3, ..., x ) benzer şekilde düzenlenir ve sayı saat yönünde döner ve x en üstte olur.

Ek olarak, her gezegenin bir saatte farklı bir dakika ve bir dakika içinde farklı bir saniye sayısı vardır. Size bir başlangıç ​​zamanı ve bitiş zamanını belirlemeniz gereken bir dizi geçen saniye verilecektir.

Giriş, bağımsız değişken olarak veya standart girdi olarak iletilen bir dosyadan doğrudan alınabilir. İlk girdi satırı, işlemeniz gereken saat sayısı olacaktır. Bundan sonra, her saatin aşağıdaki biçimde tamsayılar içeren üç giriş satırı vardır:

x y z
h m s
t

Her harfin anlamı aşağıdadır.

x = Gün içindeki saat sayısı (2 <= x <= 99)
y = Bir saatteki dakika sayısı (2 <= y <= 100)
z = Dakikadaki saniye sayısı (2 <= z <= 100)
h = Başlangıç ​​zamanının saati (1 <= h <= x)
m = Başlangıç ​​zamanının dakikası (0 <= m <y)
s = Başlangıç ​​zamanının ikincisi (0 <= s <z)
t = Geçen saniye sayısı

Çıkış , başlangıç ​​zamanından bu yana t saniye geçtikten sonra her saat için bitiş zamanı olmalıdır . Çıktınız standart saat olarak biçimlendirilmelidir (SS: DD: SS). Tüm numaraların iki basamaklı olduğundan emin olmak için gerektiğinde sayılar dolgulu olmalıdır.

Test Durumları


Giriş

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

Çıktı

04:13:08
02:08:03

Giriş

1
14 17 11
12 16 10
1530

Çıktı

07:03:00

Giriş

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

Çıktı

05:26:10
14:00:00

8
Acaba tüm gezegenler İngilizler mi yaşıyor?
aaaaaaaaaaaa

4
@ eBusiness Onlara çaydan tamamen farklı olmayan güzel bir bardak ver.
Mateen Ulhaq

Bence örnekleri / girdi formatını anlamıyorum. x bir gün içindeki saat sayısı - bu gezegenlerin saatindeki saat sayısı mı, yoksa insan / dünya saati? Ve h, başlangıç ​​zamanı o gezegenlerin zamanı mı, yoksa insan / dünya zamanı mı? Çünkü: Eğer giriş 1, örnek 2 ise, gezegenin sadece 6 saati vardır - başlangıç ​​zamanı 6 olmalıdır? Bu geçersiz bir zaman olurdu.
kullanıcı bilinmiyor

Doğru anlarsam, Saatler 1'den n'ye gider. Dakika ve saniye 0'dan n-1'e geçer. Ama gece yarısı n: 00: 00 veya 1:00:00. İşte kafam karıştı.
captncraig

@CMP: Son test vakasının gösterdiği gibi, gece yarısı zamanı n: 00: 00'dır.
Kevin Brown

Yanıtlar:


8

GolfScript - 50 karakter

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

Değerler (H / M / S), yığının ( ])\) önüne hareket ettirilerek toplanır . 0'daki saat 'taşma' ile işlenir or. 100+`(;Her ne 0`\+-2>kadar aynı uzunlukta olsa da sıfır dolgu ile işleniyor .


Ooooh, 100 şey beni deli ediyor. Keşke düşünseydim. (Bana sadece 3 karakter kazandıracaktı, ama bana çok daha fazla zaman kazandıracaktı.)
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)

Kullanmak beri, yanılmıyorsam for i in ' '*input()aslında kullanabilirsiniz iyerine ' 'içinde R()+' '+R()iki karakter tasarruf.
Dan Burton

Gerçekten, teşekkürler.
Keith Randall

İkinci satırı 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()
bununla

t/y/z%x or xbir karakter daha kısadır.
Nabb

5

GolfScript 62 60 karakter

Düzenleme: Ben önceden bir yığın depolamak için saklanan dizi elde başardı, bu yüzden büyük bir gelişme olsa da bu şekilde biraz ekstra anahtarlama alır.

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

62 versiyon:

~](\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

Eminim çok daha iyi yapılabilir, daha iyi bir şey düşünemedim.

1: Tüm girdilerin bir dizisini yapın, ilk elemanı çıkarın, gerisini 7 bloklara
gruplayın . A / 13: Döngüyü bu sayıda çalıştırmak için girişteki ilk sayıyı kullanın.
2: Boş bir diziyi a.
3: 7'lik bir blok seçin ve 7 ayrı sayıya genişletin.
b / 8: Saniyelerin, dakikaların ve saatlerin her biri için bir kez olmak üzere 3 kez bir döngü çalıştırın.
4: Kaydırmak için saniye ve zaman olan ilk yineleme için son iki sayıyı bir araya getirin, daha sonra bir önceki döngüden taşma ile dakika ve saattir. Sonucun ikinci bir kopyasını oluşturun.
5: Taşmayı üretmek için kopyayı sınırına bölün ve sonucu bir boşluk geri kaydırın.
6: Sonucun bir kısmını üretmek için önceki bölümün modulo'sunu hesaplayın.
7: Bu parçayı diziye ekleyin.
9: Saat taşmasını ve ikinci ve dakika sınırlarını yığından kaldırın.
10: a'nın saat kısmını alın, eğer sıfırsa saat sınırıyla değiştirin, diziye geri koyun.
11: a'daki her öğe için önüne '0' koyun, böylece dizeye dönüştürün ve son 2 karakterden başka her şeyi atın.
12: Diziyi ':' ile ayrılmış tek bir dizeye daraltın, bir satırsonu yerleştirin ve kalan işleri içeren diziyi yığının önüne kaydırın, böylece bir sonraki yinelemeye hazırlanın.


Ve 13 nedir? İyi açıklama! +1
FUZxxl

FUZxxl: 13 ve 8, a ve b bloklarının uç işaretleridir.
schnaader

5

J (172/35) 137 99 107

Şimdi verilen tüm test senaryolarını geçer.

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 her şeydir; 35, gerçekten küçümseydim ve belirtildiği gibi IO yapmayı reddedersem vereceğim karakter sayısıdır. (Hala biraz değiştirdim; saatler, J içinde etkileşimli olarak kullanılması amaçlanan bir dosya adı alan bir işlevdir.)

Umarım bu J'de göründüğünden çok daha kolaydır.

Düzenleme: J, daha iyi giriş ayrıştırma yapmak için nasıl anlaşılır charsub ortadan kaldırıldı, komut satırı çağırma ve çıkış geçti.

Edit 2: Merkezi fonksiyon girişi 3x3 matris olarak değiştirildi, birçok sinir bozucu parantez ortadan kaldırıldı, isimler elendi

Düzenleme 3: 0-saat işlendi.

Açıklama:

J'm hala harika değil ve IO her zamanki gibi bir acı. Yani bu parçaların akıl hastası.

  • Fiil 1 0 0+{.#:{.&{:+{.#.1 0 0-~1&{üç ila üç matris alır (giriş satırlarından oluşur, son iki öğe çöptür)
  • H / m / s, {ile kazanılır. (kafa), 1 & {(ikinci eleman) ile gerçek zaman ve {. & {: (kuyruk başı) ile ikinci sayım.
  • Fiil # kullanır . saatin saniyeye dönüştürülmesi. (Belgelemeye bakınız.)
  • İkinci sayımı ekler ve 3 elemanının cevabını almak için #: kullanır .
  • Saat 0 vakası, taban değişikliğinden önceki saatten 1 çıkarılıp sonradan 1 eklenerek işlenir. (iki bit ile 1 0 0)
  • Gerisi giriş ve çıkış, hangi gerçekten pis (her zamanki gibi).
  • ".;._2(1!:1)3 doldurulmamış konumlarda 0s ile girdinin 3 'sütun' matrisini alır.
  • ,&}.$~,&3 3&{.&{. girişteki ilk satırı keser ve kalan satırları Nx3x3 şeklinde şekillendirir.
  • "2Değiştirir merkezi fiil 3x3 çantasını alacak.
  • 10 10&#:Nx3x2 matrisi veren her sayı için 2 ondalık basamak verir. (Dolgu için 0 saniye almak acı vericiydi .)
  • ,"2":"0 basamakları ASCII'ye (Nx3x2x1) dönüştürür ve son sütunu rampa ederek Nx3x2'yi tekrar ASCII olarak verir.
  • LF,~"1([,':',])/"2 ekler: her öğenin arasına ekler ve bunları ekler (Nx7) ve (Nx8) başına satır besleme ekler.
  • 4(1!:2)~ her satırı yazdırır.

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

  • Düzenleme: (207 -> 200) bazen divModbuna değmez!
  • Düzenleme: (200 -> 178) zarif foldryaklaşımı (herhangi bir sayıda bileşenli zaman sistemleri için çalışır!)
  • Düzenleme: (178 -> 164) satır içi f
  • Düzenleme: (164 -> 158) gereksiz parantez kaldırıldı
  • Düzenleme: (158 -> 160) Üç düzenleme önce tanıtılan biraz düzeltildi: saatler şimdi tekrar doğru
  • Düzenleme: (160 -> 159) için çağrı bıraktı tail

Saat, tüm çıkışlarda bir ile dengelenir.
Joey Adams

@Joey: İyi yakaladın! Sabit.
MtnViewMark

3

Yakut, 128 karakter

Utanmadan python'dan kopyalar:

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 gerekli karakter

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

Bağımsız değişken olarak iletilen bir dosyadan girdi alır.

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

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

Ve sadece not etmek için, işaretsiz (dolar işareti), bu 205 karaktere çıkıyor.


2

Java, 486371 karakter

Ungolfed sürümü: http://pastebin.com/6LiTdGyi

Bu, sağlanan örneklerle aynı çıktıyı verir.

Ama bu davranışa katılmıyorum: Bir saat, günde saatlerin olduğu kadar çok sayıya sahip değil: yarısına sahip.

Bu, 12:50:12'ye 3600 saniye eklerseniz, 13:50:12 değil 01:50:12 yazdırması gerekir (standart 24/60/60 sistemimizde).

Kodumda ele aldım ancak örneklerle eşleşmesi için benim çözümümde yorum yaptım. Elbette bunu göz önünde bulundurursanız, bazı AM / PM işaretleri eklemediğiniz sürece giriş süreleri belirsiz kabul edilebilir.

Ancak her durumda, bulmacanın bir tutarsızlığı vardır: 00 saatin x ile değiştirilmesi gerekiyorsa, saat> (x / 2) saat ile değiştirilmelidir - (x / 2).

Düzenleme: Golfçü sürüm:

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

Merhaba, [kod-golf] sorusu toplam karakter sayısı içinde en kısa cevabı gerektiriyor. Bu, golf girişinin en azından şunları yapması gerektiği anlamına gelir: 1. packagebeyannameleri kullanmamak ; 2. kullanmayın final; 3. tek karakterli değişken adlarını ve sınıf adlarını kullanır; 4. genellikle mümkün olan en kısa kodu yapmak için en akıllı yolları kullanın.
Chris Jester-Young

Kodunuzun okunamaz olup olmadığı önemli değildir; bu nedenle, "okunamayan" sürümünüz, aksi takdirde kısa değilse, bir kod golf yarışması için yararlı değildir. Dürüst olmak gerekirse, Java bir golf yarışmasına girmek için zayıf bir dildir, çünkü çoğu dil ile karşılaştırıldığında Java çok ayrıntılıdır. :-(
Chris Jester-Young

Yakın gelecekte, golf dışı girişlerin [code-golf] sorularından kaldırılacağı bir temizleme egzersizi yapacağım. Golflü bir sürüm yapabilirseniz (ilk yorumuma bakın), lütfen yapın; aksi takdirde cevabınız bir sonraki temizlikte kaldırılacaktır.
Chris Jester-Young

Selam. Hepsi için üzgünüm. Kafam karıştı ... Golfün ne anlama geldiğini anladım. Ben ungolfed versiyonunu sadece link olarak sakladım. Umarım özellikle girdi ve beklenen sonuçla ilgili şüphelerimden dolayı iyi olur. O zaman daha iyi bir golf versiyonu koydum. Doğru Java en iyi değil ama ben bu golfed sürüm burada tutulması için yeterince iyi yaptığını düşünüyorum. Tekrar özür dilerim.
tisek

@tisek: Yeni sürümünüz için teşekkürler. İşte kodu daha da kısaltmak için bir öneri: bunun yerine, int[]c={i(s),i(s),i(s),i(s),i(s),i(s),i(s)}kullanmak isteyebilirsiniz int a=i(s),b=i(s),c=i(s),d=i(s),e=i(s),f=i(s),g=i(s). Evet, buraya 11 karakter eklersiniz, ancak her kullandığınızda üç karakter kaydedersiniz c[x], yani bu tür 4 durumdan sonra, kendisi için ödeme yapılır. Bu tür 13 örneği saydım, yani toplamda 28 karakter kazanıyorsunuz!
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

Hatırladığım gibi, ikinci mod negatif geçen saniyeler için orada.

Bu printf hattı çalışmıyor. Bağımsız printfdeğişkenler arasında ve bu bağımsız değişkenler arasında boşluk olması gerekir ...
Mark Reed

1

PHP, 229228 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);}

Dosya betiğe argüman olarak aktarılmalıdır

Ungolfed:

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

Değişiklikler:

229 -> 228: Saatlerde bölme işlemi gerçekleştirirken kalan süreyi ayarlamanıza gerek yok


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

1

Scala 184 karakter:

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

Kurallara aykırı olarak şunu iddia ediyorum:

14 15 20
1 14 0
-580

Çıktı olmamalı

14:00:00

fakat

00:00:00

ve kodum bu şekilde üretiyor. Lütfen bana 00:00:00 - belki 24:59:59 yerine dünya üzerinde 24:00:00 görüntüleyen bir saat gösterin. Veya diziyi bekler misiniz?

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

onun yerine

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

Dünya'da 24:00:01 görmezsiniz, ancak bazen 'N gün 24:00:00' gününün 'N + 1 günü 00:00:00' ile eş anlamlı olarak kullanıldığını görürsünüz. Aynı zaman ama farklı bir odak - 'bu gece gece yarısı' vs 'yarın sabah gece yarısı'
Mark Reed

1

Python 2 , 137 bayt

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

Çevrimiçi deneyin!

Sadece biraz daha kısa Diğer Python cevabından , ama oraya ulaşmak için farklı bir yol izliyor.

Açıklanamayan Açıklama:

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 karakter olmayan golfed, boş satır hariç)

Benimki "gece yarısı" benzeri saatler için 12:00:00 veya benzeri yerine 00:00:00 yazdırır. Düzenle: bunu değiştirdi.

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'

Birkaç şey daha soyut olabilirdi, ama w / e. Giriş dosyasının ilk satırını tamamen yok sayar ve genellikle yanlış biçimlendirilmiş dosyalar için size çığlık atar.


Saat, dakika ve saniye boyunca ikiden fazla basamağa izin vermek için bu çözümü değiştirmek kolay olacaktır.
Dan Burton

"X saati olan bir saatteki saatler bizimkine benzer şekilde düzenlenmiştir (1, 2, 3, ..., x)", bu yüzden 00:00:00 geçerli değildir. Buna rağmen ayarlamak zor olmamalı.
Kevin Brown

@ Bass5098 düzeltildi ve biraz kısaltıldı. Yine de okunamayan bir şekle sokacak kalbim yok.
Dan Burton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.