Сколько времени осталось?


31

Программа

У вас есть две строки, A и B . A - текущая позиция, в которой находится ваш таймер, а B - позиция, в которой ваш таймер остановится. Обе строки имеют формат m: ss . Вы должны написать программу, которая определяет оставшееся время, которое также должно быть отформатировано как m: ss или mm: ss .

пример

0:00 0:01 -> 0:01
0:55 1:00 -> 0:05
1:45 3:15 -> 1:30

1
В dc ввод читается неправильно, так :как это команда (данные как философия кода). Могу ли я вместо этого использовать пробелы или мне нужно найти другой язык, чтобы ответить на этот вопрос?
сешумара

1
является 01:30действительным выход? (ведущий ноль)
Луис Мендо

2
Да, я приму это как действительное. Я отредактирую описание.
Джош

1
@seshoumara Вход должен содержать двоеточие.
Джош

Какое максимальное значение ожидается для м ?
Цифровая травма

Ответы:


92

Excel, 6 байт

=B1-A1

Предполагая, что A находится в ячейке, A1а B находится в ячейкеB1


37
Нет ... НЕТ ... Я НЕ ПОЗВОЛЯЮ EXCEL WIN. +1 ты коварный человек.
Волшебный Осьминог Урна

2
Отмените это, |vy':¡загрузившись в 05AB1E, я ничего не могу сделать ... Я думаю, что Excel может честно выиграть это, ничто другое автоматически не анализирует тот формат, который я знаю.
Волшебный Осьминог Урна

7
КАК? КАК? Как выигрывает Excel? Мой мозг должен теперь взорваться ...
Caird Coinheringaahing

2
Если m больше 23, то форматирование не работает. Например, если я наберу 45:45A1 и 22:22B1, то 23:23:00
Digital Trauma

4
@EngineerToast Независимо от того, что форматирование по умолчанию работает для меня. Я просто набрал ввод, переместился в другую ячейку, набрал формулу и нажал ввод.
Райли

15

MATL , 17 7 байт

YOd15XO

Input представляет собой массив ячеек строк в форме {'1:45' '3:15'}или {'1:45', '3:15'}.

Попробуйте онлайн!

объяснение

YO     % Input cell array of strings (implicit). Convert to serial date numbers
d      % Difference
15XO   % Convert to format 15, i.e. 'HH:MM'. Display (implicit)

О, классно! Продолжать!
Suever

8

Bash + coreutils, 44 39 байт

tr : \ |dc -e?r60*+r-r60*-60~rn58PA~rnn

Попробуйте онлайн!

Объяснение: использование «1:45 3:15» в качестве контрольного примера (последний пример). Я показываю промежуточные шаги в кавычках.

tr : \ |         # replace colons with spaces: "1 45 3 15"
dc -e?           # start dc script, push input to LIFO stack: "15 3 45 1"
     r60*+            # turn time B to total seconds: "195 45 1"
     r-r60*-          # turn time A to total seconds and get difference: "90"
     60~r             # turn difference (time left) to minutes and seconds: "1 30"
     n58P             # pop and print minutes, print colon (ASCII code 58): "30"
     A~rnn            # print seconds. Padding with zeroes is done by dividing by
                      #10 (A), and printing the quotient and the remainder.

Обратите внимание, что я не проверяю, нуждается ли минутное значение в заполнении нулями, потому что в OP указано, что максимальное значение для m9.


Ниже мой оригинальный ответ 44 байта, который использовал dateкоманду, чтобы преобразовать общее время, оставшееся в секундах, в m:ssформат.

date -d@`tr : \ |dc -e?r60*+r-r60*-p` +%M:%S

2
@DigitalTrauma Спасибо. Но, в конце концов, мне удалось удалить команду date и выполнить форматную печать в dc.
Сешумара

1
Вычеркнуто 44 выглядит как обычные 44.
Райли

1
@Riley Я также зачеркнул пространство вокруг 44, чтобы получить эффект, который должен был быть в первую очередь.
сешумара


7

Python 2, 90 87 83 80 байт

Принимает участие как "2:45","5:01".

a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
print'%d:%02d'%divmod(b-a,60)

Попробуйте онлайн



Вы можете использовать понимание списка, чтобы сохранить несколько байтов:a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
Фелипе Нарди Батиста

Если я не ошибаюсь, вы можете сохранить три дополнительных символа, заменив две последние строки на print'%d:%02d'%divmod(b-a,60):)
Morwenn


5

Пакетная, 74 байта

@set t=%2-(%1)
@set/as=%t::=*60+1%,m=s/60,t=s/10%%6
@echo %m%:%t%%s:~-1%

Замена :во времени *60+1преобразует его в выражение, которое вычисляет количество секунд. Batch интерпретирует начальные нули как восьмеричные, поэтому я добавляю a 1к секундам, чтобы обеспечить десятичное преобразование; к счастью, эти двое 1отменяют.


5

C 112 100 байт

Спасибо @betseg за сохранение 11 байтов и спасибо @Johan du Toit за сохранение одного байта!

i,j;f(char*a,char*b){i=atoi(b)-atoi(a);j=atoi(b+2)-atoi(a+2);j<0?i--,j+=60:0;printf("%d:%02d",i,j);}

Попробуйте онлайн!


1
Вы можете изменить %s%dс %02dи удалить ?:. Попробуйте онлайн!
betseg

1
scanf()Ваш друг для чтения нескольких целых чисел.
Цифровая травма

1
Вы также можете сохранить 1 байт, используя: j <0? I ++, j + = 60: 0;
Йохан дю Туа

@DigitalTrauma Nononono, как правило, короче использовать аргументы, которые он сделал.
Мэтью Ро

5

MySQL, 13 22 байта

select right(timediff(B,A),5)

ожидает времена в Aи B.


4

Утилиты Bash + GNU, 43

date -d@`date -f- +%s|dc -e??r-60/p` +%M:%S

Попробуйте онлайн .

объяснение

         date -f- +%s                        # read in 2 line-delimited dates and output as number of seconds since the epoch
                     |dc -e                  # pipe to dc expression:
                           ??                # - read 2 input numbers
                             r-              # - reverse and subtract
                               60/           # - divide by 60
                                  p          # - output
        `                          `         # evaluate date|dc command
date -d@                             +%M:%S  # format seconds difference and output

Обратите внимание, что dcвыражение делится на 60, потому что dateчитает входные данные как H: MM вместо M: SS.


4

ECMAScript 6, 99 91 85 байт

Одна линия:

f=s=>s.split`:`.reduce((a,e,i)=>a+e*(!i?60:1),0);t=n=>~~(n/60)+":"+n%60;t(f(b)-f(a));

Слегка отформатированный:

f=s=>s.split`:`.reduce((a,e,i)=>a+e*(!i?60:1),0);
t=n=>~~(n/60)+":"+n%60;
t(f(b)-f(a));

Я чувствую, что там может быть некоторая экономия ... но я не вижу их в настоящее время.

Редактировать - отличные предложения в комментариях.


Вы можете удалить скобки вокруг s.
Арджун,

И вместо того s.split(":"), вы можете использовать новую синтаксис: s.split<backtick>:<backtick>.
Арджун,

4

PHP, 55 53 байта

<?=date('i:s',($s=strtotime)($argv[2])-$s($argv[1]));

принимает входные данные из аргументов командной строки


1
53 байта:<?=date('i:s',($x=strtotime)($argv[2])-$x($argv[1]));
Исмаэль Мигель

4

C #, 72 байта

using System;a=>b=>((DateTime.Parse(b)-DateTime.Parse(a))+"").Remove(5);

Принимает ввод как строки. b="3:15" a="1:45",

Объяснение:

Поскольку DateTime.Parse()возвращает дату в hh:mm:ssформате, я могу проанализировать результат в строку, используя +"", а затем обрезать трейлинг :00.

Это работает, hh:mmпотому что есть 60 секунд в минуту и ​​60 минут в час.

0:01 0:00 возвращается 0:01

1:00 0:55 возвращается 0:05

3:15 1:45 возвращается 1:30


3
К сожалению, DateTime.Parse()входные данные принимаются, например, 1:45как hh:mmи нет mm:ss, что приводит к следующему выводу для A 1:45 и B 3:15 - [01:30:00]( hh:mm:ss) ( даже с CultureInfo.InvariantCultureуказанным ). Возможно, вам придется добавить "0:" + a/bпри разборе.
auhmaan

@auhmaan Ах, хороший улов. Я закончил тем, что урезал трейлинг :00.
Оливер

Я считаю, что вам нужно ;в конце, вы можете использовать карри, т. Е. a=>b=>Вам нужно полностью квалифицировать DateTimeили включить using System;.
TheLethalCoder

3

Ребол, 5 байт

b - a

При условии, что я не пропустил никаких правил ..

Rebol имеет встроенную арифметику для ряда литеральных типов данных. Это также относится к его потомкам, таким как красный


Я мало что знаю об этом языке.
Волшебная Урна Осьминога


2

Pyth, 47 45 44 40 байт

J.U-Zbm+*60hdedmmvkcd\:.z%"%d:%02d".DJ60

Принимает ввод, разделенный символами новой строки.

У Пифа не было времени, встроенного для этого. Я пробовал некоторые причудливые eval () вещи, но, очевидно, Pyth не может оценивать вещи с *какими-либо ведущими нулями. Это стало намного дольше, чем я надеялся. Довольно много байтов расходуется на добавление начального нуля к выводу. По крайней мере, я ниже, чем Bash. Добавлю объяснение, если спросят.

Попробуй это!

альтернативное решение, 48 байт

J.U-Zbm+*60hdh_dmmvkcd\:.z
K%J60
s[/J60\:*<KT\0K

2

Haskell, 98 127 86 байт

r(m:_:s)=60*read[m]+read s
a#b|(d,m)<-divMod(r b-r a)60=show d++':':['0'|m<=9]++show m

Попробуйте онлайн!

Но мне интересно, есть ли некоторые библиотечные функции для этого

РЕДАКТИРОВАТЬ: Удален импорт, также исправлена ​​ошибка, когда он показывал m: s вместо m: ss

Также, хорошо отформатированная версия:

convert :: String -> Integer
convert (a:_:b) = (read [a])*60+(read b)

diffTime :: String -> String -> String
diffTime s1 s2 = let (d,m) = divMod (c b-c a) 60 in show d ++ ":" ++ pad2d m

pad2d :: Int -> String
pad2d n = ['0'|n<=9]++show n

РЕДАКТИРОВАТЬ 2: Гольф от (30?) Байтов благодаря Laikoni! Также играли в гольф некоторые другие разные. байт.


1
Вы должны сказать нам, что это за язык и сколько байтов он использует.
Джош

2
Да, я не хотел нажимать сообщение (кто знал, что вкладка + ввод из текстового поля отправляет ваш ответ?)
общее отображаемое имя

Тот же подход, 86 байт: попробуйте онлайн!
Laikoni

Я не думал об использовании списочного понимания. Спасибо :)
общее отображаемое имя

2

T-SQL, 238 байт

CREATE PROCEDURE d @a time,@b time AS BEGIN DECLARE @d int DECLARE @s varchar(2) SET @d=datediff(s,@a,@b);SET @s=CAST(@d%3600/60 AS VARCHAR(3)) SELECT CAST(@d/3600 AS VARCHAR(3))+':'+(SELECT CASE WHEN LEN(@s)=1 THEN '0'+@s ELSE @s END)END

Использование:

EXEC d '00:55','01:00'

Увидев пример PostGres ранее, я понял, что не видел много попыток игры в гольф в SQL, поэтому я попробовал это сделать в T-SQL. Теперь я знаю, почему вы не видите много игры в гольф в SQL: D


2

CJam , 34 33 25 байтов

Сохранено 8 байтов благодаря Мартину Эндеру!

{r':/60b}2*\m60mds2Te[':\

Попробуйте онлайн!

объяснение

{             e# Start of block
 r            e#  Read one time from input
 ':/          e#  Split on colons, gives [minutes seconds]
 60b          e#  Convert from base 60
}2*           e# Run this block 2 times
              e# At this point, we have the two times in seconds on the stack
\             e# Swap top elements
m             e# Subtract
60md          e# Divmod the result by 60, to convert back to minutes and seconds
s             e# Convert the seconds to a string
2Te[          e# Pad it to 2 characters by adding 0s to the left (T = 0)
':            e# Push a colon character
\             e# Swap top elements, bringing seconds back to the top

2

T-SQL, 82 байта

select left(cast(dateadd(minute, datediff(S,'0:00','0:01')/60,114) as time(0)), 5)

2

Python, 160 байт

Я все еще новичок в коде гольф, поэтому, если у кого-то есть какие-либо предложения, я был бы признателен.

a, b = input()
def z(x):
    x = x.split(":")
    return int(x[0])*60+int(x[1])
a, b = z(a),z(b)
s, m = b-a,0
while s >= 60:
    s -= 60
    m += 1
print(str(m)+":"+str(s))

1
Здравствуйте и добро пожаловать на наш сайт. Похоже, что вы берете данные для своей программы из предварительно инициализированных переменных. Однако это недопустимо в соответствии с настройками по умолчанию для ввода-вывода . Я бы порекомендовал для этого конкретного случая принимать через raw_input().
Wheat Wizard

1

REXX, 79 байтов

arg t q
say right(time(,f(q)-f(t),s),5)
f:return time(s,'00:'right(arg(1),5,0))

1

Пиф, 28

%"%d:%02d".Dh.+misMcd\:60Q60

Попробуй это .

объяснение

                   cd\:      # lambda to split c on ":"
                 sM          # map to convert string to int
               mi      60Q   # convert from base-60 list to give seconds
             .+              # delta of the two seconds values
            h                # single-item list to int
          .D              60 # divmod by 60
%"%d:%02d"                   # format output

1

Java 7, 164 байта

String c(String a,String b){long s=x(b,1)-x(a,1)+(x(b,0)-x(a,0))*60,m=s%60;return(s/60)+":"+(m>9?m:"0"+m);}long x(String s,int i){return new Long(s.split(":")[i]);}

Объяснение:

String c(String a, String b){       // Method with two String parameters and String return-type
  long s = x(b,1) - x(a,1)          //  Get difference in seconds from input times
           + (x(b,0) - x(a,0)*60,   //   plus the difference in minutes times 60 to get the seconds
    m = s%60;                       //  Temp variable of seconds after we've subtracted the minutes (used multiple times)
  return (s/60)                     //  Return minutes
    +":"                            //   plus ":"
    +(m>9?m:"0"+m);                 //   plus seconds (with a leading 0 if necessary)
}                                   // End of method

long x(String s,int i){             // Separate ethod with String and Integer parameters and long return-type
  return new Long(s.split(":")[i];  //  Return either minutes or seconds of String parameter based on the index
}                                   // End of method

Тестовый код:

Попробуй это здесь.

class M{
  String c(String a,String b){long s=x(b,1)-x(a,1)+(x(b,0)-x(a,0))*60,m=s%60;return(s/60)+":"+(m>9?m:"0"+m);}long x(String s,int i){return new Long(s.split(":")[i]);}

  public static void main(String[] a){
    M m = new M();
    System.out.println(m.c("0:00", "0:01"));
    System.out.println(m.c("0:55", "1:00"));
    System.out.println(m.c("1:45", "3:15"));
  }
}

Выход:

0:01
0:05
1:30

1

TXR Lisp, 101 байт

$ txr -e '(awk (:let (s "%M:%S"))
               ((mf (time-parse s))
                (prn (time-string-local (- [f 1].(time-utc) [f 0].(time-utc)) s))))'
13:49 14:49 
01:00
0:13 1:47
01:34
5:01 5:59
00:58
6:00 6:00
00:00
6:00 5:00
59:00

Сгущенное: (awk(:let(s"%M:%S"))((mf(time-parse s))(prn(time-string-local(-[f 1].(time-utc)[f 0].(time-utc))s))))


Вам нужен счет, и я не думаю, что это полностью игра в гольф.
17

1

Рубин , 91 байт

require'time';t=Time;d=t.parse($*[1])-t.parse($*[0]);puts t.at(d.to_i).utc.strftime '%H:%M'

Попробуйте онлайн!

Принимает данные из аргументов командной строки.

Призвание:

ruby outatime.rb $A $B

Пример:

ruby outatime.rb 1:45 3:15

Выход:

1:30


Добро пожаловать на сайт!
DJMcMayhem

1

PowerShell 47 байт

param($s,[timespan]$f)($f-$s).ToString("h\:mm")

Простая математика временного интервала и строка с часами и секундами.


0

JavaScript, 88 байт

a=>b=>{c=a.split`:`,d=b.split`:`;return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60}

Попробуйте онлайн!

Объяснение:

Разбивает входы на двоеточие

c=a.split`:`,d=b.split`:`;

Преобразует строку в int

+c[0]

Получает минутное значение

+c[0]-d[0]-d[1]>c[1]?1:0

Получает второе значение

(+c[1]+60-d[1])%60

Возвращает строку минуты: секунды

return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.