Як довго залишилось?


21

Як довго залишилось?

Нещодавно я робив піцу за допомогою 5-хвилинного таймера на своєму телефоні. Коли хтось зайшов і запитав, як довго залишилось, я спочатку розгубився, як відповісти на питання. Розумієте, якби таймер у поточний момент був о 3:47, до моменту, коли я прочитав уголос «Три хвилини і сорок сім секунд», час би змінився. Тому мені потрібно знайти час, таймер буде досягти тільки , як я дочитати його.

Це ваше завдання: автоматизувати цей процес. З огляду на час у будь-якому відповідному форматі (":" обмежено, або як хвилина та другий аргумент), виведіть найдавніший час з цього поточного моменту, який би зайняв рівну кількість часу для зчитування, як це знадобиться таймеру, щоб отримати до. Ми припускаємо, що на кожен склад потрібно прочитати 1 секунду.

Подальші правила

  • Ви повинні рахувати "хвилини" і "секунди" як два склади кожен, а також "і" між ними.
  • На приготування піци ніколи не буде потрібно більше 59:59.
  • "11 хвилин і 0 секунд" - це не 10 складів: ви повинні спростити до "11 хвилин" (тобто 5 складів). Те саме стосується хвилин: "0 хвилин і 7 секунд" також зараховується лише до 4 складів.
  • Ваша програма може дати вихід у будь-якому форматі: масив [minutes, seconds]або навіть як <minutes> minutes and <seconds> seconds(звичайний текст, виписаний).
  • Застосовуються стандартні лазівки.
  • Це , тому найкоротша відповідь у байтах виграє.

Тестові кейси

Всі входи як (minutes, seconds)

(4, 47) = (4, 38) (Four MiNutes And ThirTy Eight SeConds - 9 syllables/seconds)
(1, 1) = (0, 56) (FifTy-Six SeConds - 5 syllables/seconds)
(59, 57) = (59, 46) (FifTy Nine Minutes And Forty Six SeConds - 11 syllables/seconds)
(0, 10) = null/error/0 (no positive answer)

Посилання підрахунку складового числа

Для довідки, ось кількість складів у кожному числі до 59.

0,0 (does not need to be counted)
1,1
2,1
3,1
4,1
5,1
6,1
7,2
8,1
9,1
10,1
11,3
12,1
13,2
14,2
15,2
16,2
17,3
18,2
19,2
20,2
21,3
22,3
23,3
24,3
25,3
26,3
27,4
28,3
29,3
30,2
31,3
32,3
33,3
34,3
35,3
36,3
37,4
38,3
39,3
40,2
41,3
42,3
43,3
44,3
45,3
46,3
47,4
48,3
49,3
50,2
51,3
52,3
53,3
54,3
55,3
56,3
57,4
58,3
59,3

У вашому першому тестовому випадку 4:37 також був би дійсним результатом, оскільки для цього знадобиться 10 складів?
Квін

1
@Quinn, специфікація зазначає, що ми повинні виводити якнайшвидший час.
Shaggy

1
@Shaggy whoops, так що це дякує - до моменту, коли я розберу свою відповідь, я думаю, що моя піца буде спалена
Квінн

Чи дозволяється нам припускати, що вхід може бути прокладеним, тобто 4 хвилини та 43 секунди можуть бути введені як "04:43"?
Vedvart1

1
@ Vedvart1 Добре, це добре
Geza Kerecsenyi

Відповіді:


4

JavaScript (ES6),  112 106  105 байт

Скорочена версія, заснована на пропозиції @EmbodimentofIgnorance, ще
6 байтів, збережених @DaniilTutubalin

(minutes)(seconds)[minutes, seconds]0

m=>d=F=s=>m|s?(g=n=>n&&(n%10!=7)-7+(n-11?n<13?2:n<21|n%10<1:0))(m)+g(s)^~d?F(s?s-1:m--&&59,d=-~d):[m,s]:0

Спробуйте в Інтернеті!


JavaScript (ES6),  126  119 байт

(minutes)(seconds)[minutes, seconds]0

m=>d=F=s=>m|s?(g=n=>n&&2+(30774612>>2*n%(n>12?20:26)&3)+(n>12)+(n>19))(m)+g(s)+!!(m*s)^d?F(s?s-1:m--&&59,d=-~d):[m,s]:0

Спробуйте в Інтернеті!

Прокоментував

m =>                  // m = minutes
d =                   // d = delta in seconds between the initial time and the current time,
                      //     initialized to a non-numeric value (zero-ish)
F = s =>              // F is a recursive function taking s = seconds
  m | s ? (           // if either m or s is not 0:
    g = n =>          //   g is a helper function taking an integer n in [0..59]
      n &&            //     return 0 if n = 0
      2 + (           //     otherwise, start with 2 for either 'mi-nutes' or 'se-conds'
        30774612 >>   //     add the base number of syllables (0 to 3) corresponding to n
        2 * n %       //     using a bitmask of 13 entries x 2-bit:
                      //       12 11 10  9  8  7  6  5  4  3  2  1  0
                      //       01 11 01 01 01 10 01 01 01 01 01 01 00
        (n > 12 ? 20  //     using n MOD 10 if n is greater than 12
                : 26) //     or just n otherwise
        & 3           //     isolate the two least significant bits
      ) +             //   
      (n > 12) +      //     add 1 syllable for '-teen' or '-ty' if n is greater than 12
      (n > 19)        //     add 1 more syllable for 'x-ty' if n is greater than 19
  )(m) +              //   invoke g for the minutes
  g(s) +              //   invoke g for the seconds
  !!(m * s)           //   add 1 syllable for 'and' if both m and s are non-zero
  ^ d ?               //   if the result is not equal to the delta:
    F(                //     otherwise, do a recursive call:
      s ? s - 1       //       decrement s if it's not 0,
        : m-- && 59,  //       or decrement m and restart with s = 59
      d = -~d         //       increment the delta
    )                 //     end of recursive call
  :                   //   else:
    [m, s]            //     success: return [m, s]
:                     // else:
  0                   //   failure: return 0

Не могли б ви додати пояснення?
Geza Kerecsenyi

@GezaKerecsenyi Готово. :-)
Арнольд

Спасибі. Це була здебільшого 30774612>>2*n%(n>12?20:26)&3частина, про яку я плутався.
Geza Kerecsenyi

1
g=x=>x&&(x%10==7)+(x==11?6:x<13?4:x<21|x%10<1?5:6)може працювати (не перевірено, оскільки Інтернет не працює та використовую мій телефон)
Втілення Невідомості

1
@DaniilTutubalin Cool. Я врятував звідти ще один байт, g()повернувши протилежний результат і XOR'ing з ~d.
Арнольд

2

Python 3 , 287 285 байт

m=int(input())
s=int(input())
y=lambda w:3+(w[-1]=='7')-(w[-1]=='0')-(w[0]in'01')*(1+(w[0]=='0'))+(w=='11')-(w=='12')
z=lambda m,s:(2+y(f'{m:02d}'))*(m!=0)+(2+y(f'{s:02d}'))*(s!=0)+(m!=0!=s)
q=lambda t: (m-(t+60-s-1)//60,(s-t)%60)
print([q(t) for t in range(s+60*m) if z(*q(t))==t][0])

Спробуйте в Інтернеті!

Це не дуже розумне рішення - це здебільшого жорсткість. Приймає 'm: s' m і s як окремі входи (не потрібно прокладати), а виходи (m, s). Якщо помилка виводиться, помилка не вдається.

Програма в значній мірі покладається на неявне виведення булевих значень 0 і 1. Перший рядок приймає введення. Другий рядок визначає лямбда-функцію y, яка дає склади у ряді - вона передбачає основу з 3 складів, потім додає 1, якщо вона закінчується на 7, віднімає 1, якщо вона закінчується на 0, і віднімає 1, якщо це в 10-х і 2, якщо це в одній цифрі. Дванадцять і одинадцять регулюються вручну в кінці. Третій рядок - лямбда для складів у всьому виразі. Нарешті, четвертий рядок дає час через t секунд. П'ятий рядок - це вихід - він будує масив усіх часів, що задовольняють проблему, і виводить перший.

EDIT 1: Завдяки Меттью Андерсону у коментарях, 2 байти було викреслено, взявши вхід окремо.


1
Якщо ви берете дані в двох окремих рядках:, m=int(input()) s=int(input())ви можете зберегти 2 байти.
Меттью Андерсон


1

Желе , 46 байт

ḅḶbɗ60Ṛµ“÷ṢḣxE⁻Ṇ⁹ƬƝwɼỤṡl’ḃ4+2;0⁸ịS+ṬS$’)=JTị⁸Ḣ

Спробуйте в Інтернеті!

Монадический посилання взявши в якості аргументу часу , як [minutes, seconds]і повернення відповідного часу , щоб сказати , як [minutes, seconds]або , [seconds]якщо менш ніж за хвилину.


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