Суммы 24-часового времени


21

Если задано целое число от 0 до 141 (включительно), перечислите все 24-часовые значения, чьи единицы времени, минуты и секунды добавляют к этому целому числу.

Правила добавления

Числа добавляются по единицам времени, а не по одной цифре.

Например, возьмите 17:43:59

17 + 43 + 59 = 119

Помните, это пример добавления цифр . В действительности вы должны ввести 119, и 17:43:59 будет одним из результатов. Выходные данные должны быть представлены в формате ЧЧ: ММ: СС или Ч: ММ: СС.

Также имейте в виду, что наибольшее возможное число - 141, то есть 23:59:59. Это код гольф, поэтому выигрывает самая низкая сумма. Метод проб и ошибок допускается, но может быть лучший способ сделать это.

Изменить: Пожалуйста, укажите, где в вашем коде вводимое значение.


3
Добро пожаловать в Программирование Пазлов и Code Golf! Если под подключением вы имеете в виду создание части исходного кода, это обычно запрещено. В общем, это хорошая идея придерживаться этих значений по умолчанию. Должны ли мы отображать результаты в виде строк? Если да, то какие форматы разрешены?
Деннис

Гарантируется ли положительный номер ввода? Будет ли хотя бы одно решение?
xnor

Я немного отредактировал вопрос, чтобы уточнить / ответить на некоторые вопросы. Если ваше намерение отличалось от моих изменений, не стесняйтесь редактировать его в соответствии с этим.
Geobits

1
Я только сделал это, потому что это обычный способ, которым я вижу данные времена (в реальном мире). Никто никогда не говорит, что это 13: 4: 7, но 5:10:30 почти всегда приемлемо. У меня нет проблем с его изменением.
Geobits

3
Msgstr "Пожалуйста, укажите, где в вашем коде вводимое значение." - Соглашение о приеме входных данных PPCG использует аргументы, а также несколько других опций. См. По умолчанию для Code Golf: Методы ввода / вывода в Meta.
user2428118 31.12.16

Ответы:


8

Желе , 16 30 29 20 байт

Теперь с правильным форматом вывода! Большое спасибо Деннису за помощь в отладке этого ответа. Предложения по игре в гольф приветствуются.Попробуйте онлайн!

Изменить: +14 байтов от использования правильного формата вывода. -1 байт от удаления лишнего пробела. -3 от смены 24,60,60до “ð<<‘. -6 байтов от изменения +100DḊ€€до d⁵.

“ð<<‘Œp’S=¥Ðfd⁵j€”:Y

объяснение

“ð<<‘Œp’S=¥Ðfd⁵j€”:Y  Main link. Argument: n

“ð<<‘                 Jelly ord() the string `ð<<` to get [24, 60, 60]. Call this list z.
     Œp               Cartesian product of z's items. 
                        Since each item of z is a literal,
                        Jelly takes the range [1 ... item] for each item.
       ’              Decrements every number in the Cartesian product 
                        to get lowered ranges [0 ... item-1].
        S=¥           Create a dyadic link of `sum is equal to (implicit n)`.
           Ðf         Filter the Cartesian product for items with sum equal to n.
             d⁵       By taking divmod 10 of every number in each item,
                        we get zero padding for single-digit numbers
                        and every double-digit number just turns into a list of its digits.
               j€”:   Join every number with a ':'.
                   Y  Join all of the times with linefeeds for easier reading.

8

Баш, 71

  • 8 байтов сохранено благодаря @hvd
for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}

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


1
printfздесь дорого Подойдя tближе к нужному формату и исправив его, чтобы он заработал ((t-$1)), вы можете уменьшить его до 71:for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}
hvd

@hvd Хорошая игра в гольф - спасибо!
Цифровая травма

6

Perl 6 , 62 56 байт

{map *.fmt('%02d',':'),grep $_==*.sum,(^24 X ^60 X ^60)}

Просто проверяет все возможные комбинации в перекрестном произведении всех часов, минут и секунд.


4

Python 3 , 91 байт

def f(n):
 for k in range(86400):t=k//3600,k//60%60,k%60;sum(t)==n!=print('%d:%02d:%02d'%t)

Есть более короткие решения, использующие exec (Python 2) или рекурсии (Python 3), но оба требуют неоправданного количества памяти.

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


4

PowerShell , 87 77 байт

Сохранено 10 байтов благодаря Джону Л. Бевану

$d=date;0..86399|%{$d+=1e7l;"$d".Split()[1]}|?{("{0:H+m+s}"-f$d|iex)-in$args}

Попробуйте онлайн! (это будет время ожидания, это очень медленно)

объяснение

Довольно просто, начиная с текущего [datetime], добавить 1 секунду 86,399 раз, отформатировать в виде строки, а затем оставить только те, в которых сумма складывается.


К вашему сведению: вы можете заменить 10000000на, 1e7lчтобы сэкономить 4 байта ... или даже 1e7на дополнительный байт (я думаю; мне пришлось включить параметр Lв пользу параметра; но подозреваю, что ваш подход избегает такой необходимости.
JohnLBevan

1
@JohnLBevan спасибо! Я боролся 1e7как минимум 30 минут, и Lя пропустил этот постфикс; Я забыл об этом и не мог найти способ, чтобы получить его в int, который был короче, чем константа. Кто решил, что это [timespan]интерпретирует [int]как клещи, а [double]как дни ?? iexБит довольно блестящий, хотя это и делает все это дело премного медленнее.
Бриантист

1
Не стоит беспокоиться; Я тоже немного помог с этим;): stackoverflow.com/q/41408902/361842
JohnLBevan

1
@JohnLBevan Я буквально только что видел этот вопрос перед комментарием, где вы связали его! Ницца.
Бриантист

1
Также iexхитрость была адаптирована из подсказки здесь: codegolf.stackexchange.com/a/746/6776
JohnLBevan

3

Haskell, 77 байт

f x=[tail$(':':).tail.show.(+100)=<<t|t<-mapM(\x->[0..x])[23,59,59],sum t==x]

2

Haskell, 90 байт

p x=['0'|x<10]++show x
i=[0..59]
f x=[p h++':':p m++':':p s|h<-[0..23],m<-i,s<-i,h+m+s==x]

Возвращает список строк HH: MM: SS, например f 140->["22:59:59","23:58:59","23:59:58"] .

Это три простых цикла через часы, минуты и секунды. Сохраните и отформатируйте все значения, где сумма является входным числом x.




2

Пакет, 168 байт

@for /l %%t in (0,1,86399)do @call:c %1 %%t
@exit/b
:c
@set/ah=%2/3600,m=%2/60%%60,s=%2%%60,n=%1-h-m-s
@set m=0%m%
@set s=0%s%
@if %n%==0 echo %h%:%m:~-2%:%s:~-2%

Выводит однозначные часы.


2

Mathematica, 79 байтов

Cases[Tuples@{(r=Range)@24-1,x=r@60-1,x},t_/;Tr@t==#:>DateString@TimeObject@t]&


1

QBIC , 82 72 байта

:[0,23|[0,59|[0,59|~b+c+d=a|?!b$+@:`+right$(@0`+!c$,2)+A+right$(B+!d$,2)

Это поражает неудачное место в QBasic, так как приведение к числу, обрезка и добавление, 0когда это необходимо, действительно дорого.

Пример вывода:

Command line: 119
1:59:59
2:58:59
2:59:58
3:57:59
[... SNIP 270 lines ...]
23:58:38
23:59:37

Пояснение я написал роман об этом:

:           Get N, call it 'a'
[0,23|      Loop through the hours; this FOR loop is initialised with 2 parameters
            using a comma to separate FROM and TO, and a '|' to delimit the argument list
[0,59|      Same for the minutes
[0,59|      And the seconds
            QBIC automatically creates variables to use as loop-counters: 
            b, c, d (a was already taken by ':')
~b+c+d=a    IF a == b+c+d
|           THEN
 ?          PRINT
  !         CAST
   b        'b'
    $       To String; casting num to str in QBasic adds a space, this is trimmed in QBIC
+@:`        Create string A$, containing ":"
+right$      This is a QBasic function, but since it's all lowercase (and '$' is 
            not a function in QBIC) it remains unaltered in the resulting QBasic.
(@0`+!c$,2) Pad the minutes by prepending a 0, then taking the rightmost 2 characters.
+A          Remember that semicolon in A$? Add it again
+right$     Same for the seconds
(B+!d$,2)   Reusing the 0-string saves 2 bytes :-)

QBIC выглядит интересно. Вы создали это только для # code-golf !? :)
wasatchwizard

@wasatchwizard Yup :-)
Стинберг

1

PowerShell , 67 79 байт (неприятная версия)

Так как в правилах ничего не говорится о завершении в определенное время (или вообще) и ничего об отсутствии дубликатов, вот ужасное решение:

for(){if(("{0:H+m+s}"-f($d=date)|iex)-in$args){"{0:H:mm:ss}"-f$d}}

1
Я не могу найти соответствующую мету - сообщение, но я довольно уверен , что представление должно остановить быть действительными, если не указано вызовом
Sefa

Спасибо @Sefa ... если это так, я не могу найти хороший способ заставить мою противную версию работать с меньшим количеством символов, чем чистая версия Briantist ... Соблазн удалить этот ответ, но я горжусь тем, как плохо это;)
JohnLBevan

0

Ракетка 39 байт

(for*/sum((h 24)(m 60)(s 60))(+ h m s))

Ungolfed:

(for*/sum      ; loop for all combinations; return sum of values for each loop
   ((h 24)     ; h from 0 to 23
    (m 60)     ; m from 0 to 59
    (s 60))    ; s from 0 to 59
  (+ h m s))   ; sum of all 3 variables

0

MATL , 29 байт

24:q60:qt&Z*t!si=Y)'%i:'8:)&V

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

объяснение

24:q     % Push [0 1 ... 23]
60:q     % Push [0 1 ... 59]
t        % Duplicate
&Z*      % Cartesian product of the three arrays. This gives a matrix with each
         % on a different row Cartesian tuple
t!       % Push a transposed copy
s        % Sum of each column
i=       % Logical mask of values that equal the input
Y)       % Select rows based on that mask
'%i:'    % Push this string
8:)      % Index (modularly) with [1 2 ... 8]: gives string '%i:%i:%i'
&V       % Convert to string with that format specification. Implicitly display

0

JavaScript, 122 120 байт

Принимает одну дополнительную пустую строку в качестве ввода, который я предполагаю, не учитывается в размере, Обновлен bytecount (включая исторический), чтобы добавить два байта для инициализации строки.

console.log((
//Submission starts at the next line
i=>o=>{for(h=24;h--;)for(m=60;m--;)for(s=60;s--;)if(h+m+s==i)o+=`${h}:0${m}:0${s} `;return o.replace(/0\d{2}/g,d=>+d)}
//End submission
)(prompt("Number:",""))(""))


Если вам нужно инициализировать строку, чтобы очистить, инициализация должна быть посчитана
edc65

@ edc65 Готово. ···
user2428118

0

JavaScript (ES6), 110

v=>eval("o=[];z=x=>':'+`0${x}`.slice(-2);for(m=60;m--;)for(s=60;s--;h>=0&h<24&&o.push(h+z(m)+z(s)))h=v-m-s;o")

Меньше гольфа

v=>{
  o=[];
  z=x=>':' + `0${x}`.slice(-2);
  for(m = 60; m--;)
    for(s = 60; s--; )
      h = v - m - s,
      h >= 0 & h < 24 && o.push(h + z(m) + z(s))
  return o
}

Тестовое задание

F=
v=>eval("o=[];z=x=>':'+`0${x}`.slice(-2);for(m=60;m--;)for(s=60;s--;h>=0&h<24&&o.push(h+z(m)+z(s)))h=v-m-s;o")

function update() {
  O.textContent=F(+I.value).join`\n`
}

update()
<input id='I' value=119 type=number min=0 max=141 oninput='update()'><pre id=O></pre>


0

JavaScript, 96 байт

v=>{for (i=86399;i;[a,b,c]=[i/3600|0,i%3600/60|0,i--%60]){v-a-b-c?0:console.log(a+":"+b+":"+c)}}

Расширенный вид:

v => {
    for (i = 86399; i;
        [a, b, c] = [i / 3600 | 0, i % 3600 / 60 | 0, i-- % 60]) {
        v - a - b - c ? 0 : console.log(a + ":" + b + ":" + c)
    }
}

Перебрать все возможные времена, выполняя цикл 86399 до 1,

  • преобразовать целое число во время, разделив на 3600, чтобы получить первую цифру
  • 2-я цифра, взяв целое число мод 3600, а затем разделив на 60
  • и последняя цифра - целое число 60

Вычтите все 3 числа из входного значения, чтобы получить ложное значение, если эти три числа складываются до входного значения. Если значение равно false, выведите значение.


0

bash, 78 байтов (с использованием утилиты BSD) или 79 байтов (также не-BSD)

Это немного длиннее, чем у @DigitalTrauma и красивого 71-байтового bash-решения @ hvd, но мне здесь очень понравилась идея использования чисел в 60-й строке; Мне любопытно, может кто-нибудь еще немного поиграть в гольф.

С помощью стандартной утилиты BSD:

jot '-wx=`dc<<<60do3^%d+n`;((`dc<<<$x++'$1'-n`))||tr \  :<<<${x:3}' 86400 0|sh

С более универсально доступной утилитой seq:

seq '-fx=`dc<<<60do3^%.f+n`;((`dc<<<$x++'$1'-n`))||tr \  :<<<${x:3}' 0 86399|sh

Идея состоит в том, чтобы сгенерировать числа от 0 до 83699 и использовать dc для преобразования их в base 60. «Цифры» в выводе dc base-60 представляют собой двузначные числа от 00 до 59, с пробелами, разделяющими «цифры», поэтому в нем перечислены все желаемые времена с 00 00 00 до 23 59 59 почти в необходимом формате.

Если вы выполняете это буквально, числа ниже 60 ^ 2 не являются трехзначными числами в базе 60, поэтому начальные 00 или 00 00 отсутствуют. По этой причине я на самом деле генерирую числа от 60 ^ 3 до 60 ^ 3 + 83699; это гарантирует, что все сгенерированные числа имеют длину ровно 4 цифры в базе 60. Это нормально, пока я в конечном итоге выбрасываю лишнюю первую цифру (01), которая не нужна.

Итак, как только желаемое время сгенерировано, я просто беру каждую четверку с 01 00 00 00 до 01 23 59 59, добавляю последние три числа и вычитаю аргумент $ 1. Если это 0, то я беру все в четверке с 3-го символа (отбрасывая «01»), использую tr для преобразования пробелов в двоеточия и печатаю результат.


0

PowerShell , 91 97 байт (включая ввод)

param($x)1..864e3|%{($d=date($_*1e7l))}|?{("{0:H+m+s}"-f$_|iex)-eq$x}|%{"{0:H:mm:ss}"-f$_}

param($x)0..23|%{$h=$_;0..59|%{$m=$_;0..59|?{$h+$m+$_-eq$x}|%{"{0:0}:{1:00}:{2:00}"-f$h,$m,$_}}}

или

param($x)0..23|%{$h=$_;0..59|?{($s=$x-$h-$_)-le59-and$s-ge0}|%{"{0:0}:{1:00}:{2:00}"-f$h,$_,$s}} <\ S>

Расширено и прокомментировано

param($x)
#loop through the hours
0..23 | %{
    $h=$_
    #loop through the minutes
    0..59 | %{
        $m=$_
        #loop through the seconds
        0..59 | ?{ #filter for those where the sum matches the target
            $h + $m + $_ -eq $x
        } | %{
            #format the result
            "{0:#0}:{1:00}:{2:00}" -f $h, $m, $_
        }
    }
}

NB: Превосходит по версии @ Briantist: /codegolf//a/105163/6776

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.