Мандрівник часу


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>, однакової довжини.


Оооо, 100 річ зводить мене з розуму. Я б хотів, щоб я про це думав. (Це врятувало б мені лише 3 персонажа, але врятувало б мені набагато більше часу на мозок.)
Джессі Мілікан

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()ви могли фактично використовувати iзамість ' 'in R()+' '+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()
fR0DDY

t/y/z%x or x- символ коротший.
Набб

5

GolfScript 62 60 символів

Редагувати: мені вдалося отримати масив, який раніше зберігався в a, щоб перебувати на стеку, це потребує трохи додаткової комутації таким чином, хоча так не було значного покращення.

~](\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: Зберігайте порожній масив у.
3: Виберіть блок із 7 та розкладіть його до 7 окремих чисел.
b / 8: Виконайте цикл 3 рази, один раз на секунди, хвилини та години.
4: Додайте останні два числа разом, для першої ітерації, яка переходить секунди та час, для наступних це хвилини та години із переповненням з попереднього циклу. Зробіть другу копію результату.
5: Розділіть копію на граничну величину, щоб отримати переповнення та перемістити результат назад на один пробіл.
6: Обчисліть модуль попереднього поділу для отримання частини результату.
7: Додайте цю частину до масиву.
9: Зніміть часовий перелив та межі другої та хвилини зі стеку.
10: Візьміть частину години, якщо її нуль замініть на межу години, покладіть її назад у масив.
11: Для кожного елемента в а покладіть "0" попереду, перетворюючи таким чином на рядок, і викиньте все, крім двох останніх символів.
12: Згорніть масив в один рядок, розміщений на ':', розмістіть новий рядок і змістіть масив, що містить решта завдань, на передню частину стека, готуючись до наступної ітерації.


А що 13? Гарне пояснення! +1
FUZxxl

@FUZxxl: 13 і 8 - кінцеві маркери блоків a і b.
шнадер

5

J (172/35) 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&{має матрицю три на три (складається з вхідних рядків, останні два елементи - сміття)
  • H / m / s отримується з {. (голова), фактичний час з 1 & {(другий елемент), а другий відлік з {. & {: (голова хвоста).
  • Дієслово використовує #. перетворити час годин на секунди. (Див. Документальне підтвердження.)
  • Він додає другий підрахунок, а потім використовує #:, щоб отримати відповідь на 3 елемента.
  • Випадок 0 годин обробляється відніманням 1 за годину до зміни бази та додаванням 1 назад після. (два біти з 1 0 0)
  • Решта - це вхід і вихід, який справді буває (як завжди).
  • ".;._2(1!:1)3 отримує 3 'стовпчикову' матрицю вводу з 0s у незаповнених позиціях.
  • ,&}.$~,&3 3&{.&{. відрізає перший рядок від введення та формує решта рядків у Nx3x3.
  • У "2модифікує центральний дієслово прийняти 3x3 випадки.
  • 10 10&#:дає 2 десяткові цифри для кожного числа, даючи матрицю Nx3x2. (Отримати 0 за забивку було болем .)
  • ,"2":"0 перетворює цифри в ASCII (Nx3x2x1) і виконує останній стовпець, надаючи Nx3x2 знову як ASCII.
  • LF,~"1([,':',])/"2 вставляє: між кожним елементом і додає їх (Nx7) та додає подачу рядків на (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) виправлено трохи внесені три зміни назад: години знову виправляються
  • Редагувати: (160 -> 159) відмовився від дзвінка tail

Година компенсується одиницею у всіх результатах.
Джої Адамс

@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

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

Це дає той самий результат, що і в наведених прикладах.

Але я не погоджуюся з такою поведінкою: годинник не має стільки цифр, скільки годин у день: їх половина.

Це означає, що якщо додати 3600 секунд до 12:50:12, він повинен надрукувати 01:50:12, а не 13: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. Зазвичай використовуйте найрозумніші способи зробити найкоротший код можливим.
Кріс Єстер-Янг

Не має значення, чи ваш код не читається чи ні; отже, ваша "нечитабельна" версія не корисна для змагань з кодовим гольфом, якщо вона інакше не є короткою. Якщо чесно, Java є поганою мовою для участі у змаганнях з гольфу, адже порівняно з більшістю мов, Java настільки багатослівна. :-(
Кріс Єстер-Янг

Найближчим часом я буду робити вправи з очищення, де записи, що не належать до гольфу, будуть видалені з питань [code-golf]. Отже, якщо ви можете зробити версію для гольфу (див. Мій перший коментар), будь ласка, зробіть це; інакше ваша відповідь буде видалена під час наступного прибирання.
Кріс Єстер-Янг

Привіт. Вибачте за все. Я розгубився ... Я зрозумів, що означає гольф. Я не зберігав версію, що не використовується, як лише посилання. Я сподіваюся, що це добре, особливо через мої сумніви щодо внесеного та очікуваного результату. Я ставлю тоді кращу версію для гольфу. Правильна Java - це не найкраще, але я думаю, що я зробив достатньо добре, щоб ця версія для гольфу зберігалася тут. Вибачте знову.
тисек

@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], що означає, що після 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

Як я пам'ятаю, другий мод є за негативні минулі секунди.

Цей рядок 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

Баш, 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

і ось що створює мій код. Покажіть, будь ласка, годинник, який відображається на 24:00 на землі замість 00:00:00 - можливо, 24:59:59. Або ви очікуєте послідовності:

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

замість

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

На Землі ви не побачите 24:00:01, але ви час від часу бачите "день N о 24:00:00", який використовується як синонім "день N + 1 в 00:00:00". Це той самий час, але інший фокус - "півночі сьогодні" проти "півночі завтра вранці".
Марк Рід

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 символи без гольфу, порожні рядки виключені)

Мої відбитки 00:00:00 замість 12: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'

Можна було б абстрагуватися ще декількома речами, але з / п. Він повністю ігнорує перший рядок вхідного файлу і, як правило, кричить на вас за неправильно відформатовані файли.


Зауважте, цим рішенням було б легко маніпулювати, щоб передбачати більше двох цифр години, хвилини та секунди.
Ден Бертон

"Години в годиннику з x годинами розташовані аналогічно нашим (1, 2, 3, ..., x)", тому 00:00:00 недійсне. Хоча це не важко налаштувати для цього.
Кевін Браун

@ Bass5098 виправлено та трохи скорочено. Я все ще не маю серця витягти це в нечитабельну форму.
Ден Бертон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.