Путешественник во времени

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 секунд прошло с момента запуска. Ваш вывод должен быть отформатирован как стандартное время (ЧЧ: ММ: СС). Числа должны быть дополнены, если необходимо, чтобы все числа были двузначными.

Тестовые случаи


вход

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
Интересно, все планеты населены англичанами?
аааааааааааа
4
@eBusiness Лучше дайте им хорошую чашку не совсем похожего на чай.
Матин Улхак
Я думаю, что я не понимаю примеры / формат ввода. x - это количество часов в дне - часы на планетах или часы человека / земли? И ч, время начала - это время на планетах или опять время человека / земли? Потому что: если на входе 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>одинаковой длины.

Nabb
источник
Оооо, 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вместо, ' 'в 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: Возьмите часть часа a, если она равна нулю, замените ее пределом часа, поместите его обратно в массив.
11: Для каждого элемента в a поместите «0» вперед, преобразовав таким образом в строку, и отбросьте все, кроме последних 2 символов.
12: Сверните массив в одну строку, разделенную символом «:», поместите новую строку и сдвиньте массив, содержащий оставшиеся задания, в начало стека, таким образом, готовясь к следующей итерации.

AAAAAAAAAAAA
источник
А что такое 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: Изменен ввод центральной функции в матрицу 3х3, устранены многие надоедливые скобки, удалены имена

Редактировать 3: 0 часов обработано.

Объяснение:

Мой J все еще не велик, а IO - боль, как всегда. Так что кусочки этого чокнутые.

  • Глагол 1 0 0+{.#:{.&{:+{.#.1 0 0-~1&{принимает матрицу три на три (состоящий из входных строк, последние два элемента являются мусором)
  • Ч / м / с получается с {. (голова), фактическое время с 1 & {(второй элемент), а второй счет с {. & {: (голова хвоста).
  • Глагол использует #. преобразовать время часов в секунды. (См. Документацию.)
  • Он добавляет второй счетчик и затем использует #: для получения 3-элементного ответа.
  • Случай 0 часов обрабатывается путем вычитания 1 за час до смены базы и добавления 1 обратно после. (два бита с 1 0 0)
  • Остальное - это ввод и вывод, который действительно грязный (как всегда).
  • ".;._2(1!:1)3 получает 3-х столбцовую матрицу ввода с 0 в незаполненных позициях.
  • ,&}.$~,&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

Хаскель, 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
MtnViewMark
источник
Час смещен на единицу во всех выходах.
Джои Адамс
@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]}
Ezran
источник
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));}}}
tisek
источник
Привет, вопрос [code-golf] требует кратчайшего ответа из общего числа символов. Это означает, что вход в гольф должен, по крайней мере: 1. не использовать packageдекларации; 2. не использоватьfinal ; 3. использовать односимвольные имена переменных и имен классов; 4. обычно используйте самые умные способы, чтобы сделать максимально короткий код.
Крис Джестер-Янг
Неважно, если ваш код не читается или нет; следовательно, ваша «нечитаемая» версия бесполезна для соревнований по коду, если она не короткая. Честно говоря, Java - плохой язык для участия в соревнованиях по гольфу, потому что по сравнению с большинством языков Java настолько многословна. :-(
Крис Шестер-Янг
В ближайшем будущем я буду выполнять упражнение по очистке, где записи, не связанные с игрой в гольф, будут удалены из вопросов [code-golf]. Итак, если вы можете сделать версию для гольфа (см. Мой первый комментарий), пожалуйста, сделайте; в противном случае ваш ответ будет удален при следующей очистке.
Крис Шестер-Янг
Здравствуй. Извините за все это. Я запутался ... Я понял, что значит гольф. Я оставил версию без гольфа только в качестве ссылки. Я надеюсь, что это хорошо, особенно из-за моих сомнений относительно ввода и ожидаемого результата. Я поставил тогда лучшую версию для гольфа. Правильная Ява не лучшая, но я думаю, что сделал все возможное, чтобы сохранить эту версию для гольфа. Еще раз извините.
Тисек
@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

Баш - 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);}

Файл должен быть передан в скрипт в качестве аргумента

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

Changelog:

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

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 , но выбирает другой путь.

Ungolfed Объяснение:

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)
Triggernometry
источник
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 исправлен и немного укорочен. У меня все еще нет сердца, чтобы выплеснуть это в нечитаемую форму, все же.
Дэн Бертон,