Суми 24-годинного часу


21

З огляду на ціле число від 0 до 141 (включно), перерахуйте всі 24-годинні часи, години, хвилини та секунди одиниць додаються до цього цілого числа.

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

Числа додаються за одиницями часу, а не одноцифровими.

Наприклад, візьміть 17:43:59

17 + 43 + 59 = 119

Пам'ятайте, що це приклад цифр, що додаються. Насправді ви б ввели 119, а 17:43:59 був би одним із результатів. Вихід повинен бути вказаний як HH: MM: SS або H: MM: SS.

Також пам’ятайте, що найбільше можливе число - 141, яке становить 23:59:59. Це кодовий гольф, тому виграє найменша сума. Проби та помилки дозволені, але може бути кращий спосіб зробити це.

Редагувати: Будь ласка, вкажіть, де у вашому коді знаходиться вхідне значення.


3
Ласкаво просимо до головоломки програмування та коду для гольфу! Якщо підключення до вас означає частину вихідного коду, зазвичай це заборонено. Взагалі, непогано дотримуватися цих типових значень. Чи потрібно відображати результати як рядки? Якщо так, то які формати дозволені?
Денніс

Чи гарантоване число введення є позитивним? Чи знайдеться хоча б одне рішення?
xnor

Я трохи відредагував питання, щоб уточнити / відповісти на деякі речі. Якщо ваш намір відрізнявся від моїх змін, сміливо відредагуйте його, щоб відповідати цьому.
Геобіц

1
Я це робив лише тому, що це звичайний спосіб, коли я бачу дані часи (в реальному світі). Ніхто ніколи не каже, що це 13: 4: 7, але 5:10:30 майже завжди прийнятно. У мене немає проблеми з його зміною.
Геобіц

3
"Будь ласка, вкажіть, де у вашому коді знаходиться вхідне значення." - Конвенція про PPCG для прийому інформації використовує аргументи, а також кілька інших варіантів. Див. За замовчуванням для Code Golf: Методи введення / виведення для Meta.
user2428118

Відповіді:


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 разів, форматуйте як рядок, а потім зберігайте лише ті, де сума підсумовується.


FYI: Ви можете замінити 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

Математика, 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 виглядає цікаво. Ви створили його просто для # коду-гольфу !? :)
wasatchwizard

@wasatchwizard Yup :-)
steenbergh

1

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

Оскільки правила нічого не говорять про завершення за певний час (або взагалі), і нічого про відсутність дублікатів, ось жахливе рішення:

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

1
Я не можу знайти відповідний мета-пост, але я впевнений, що подання повинно бути дійсним, якщо це не визначено викликом
Сефа

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

0

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

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

Безголівки:

(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 байт

Бере один додатковий порожній рядок як вхідний, які, я вважаю, не враховуються до розміру. Оновлений байт-рахунок (включаючи історичний), щоб додати два байти для ініціалізації рядка.

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
  • а остання цифра - ціле число mod 60

Відняти всі 3 числа від вхідного значення, щоб повернути значення фальси, якщо три числа додають до вхідного значення. Якщо значення фальси, виведіть значення.


0

bash, 78 байт (за допомогою утиліти BSD) або 79 байт (не для BSD)

Це трохи довше, ніж @DigitalTrauma та приємне баш-рішення для 71-байтового @ 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 для їх перетворення в базу 60. "Цифри" на виході бази-60 постійного струму - це двозначні числа від 00 до 59, з пробілами, що розділяють "цифри", так тут перераховані всі бажані часи з 00 00 00 до 23 59 59 майже у потрібному форматі.

Якщо ви буквально це виконуєте, цифри нижче 60 ^ 2 не є 3-розрядними числами в базі 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.