Jak długo zostało?

21

Jak długo zostało?

Ostatnio robiłem pizzę za pomocą 5-minutowego timera na telefonie. Kiedy ktoś wszedł i zapytał mnie, jak długo zostało, na początku byłem przez chwilę zdezorientowany, jak odpowiedzieć na pytanie. Widzicie, jeśli licznik czasu w tej chwili był o 3:47, to zanim przeczytałem głośno „Trzy minuty i czterdzieści siedem sekund”, czas by się zmienił. Dlatego muszę znaleźć czas, timer osiągnie tylko jak skończę czytać ją.

Oto twoje wyzwanie: zautomatyzować ten proces. Biorąc pod uwagę czas w dowolnym odpowiednim formacie (ogranicznik „:” lub jako argument minutowy i drugi), wypisz najwcześniejszy czas od bieżącego momentu, którego odczyt zajmie tyle samo czasu, ile zajęłoby czasowi do. Zakładamy, że odczytanie każdej sylaby zajmuje 1 sekundę.

Dalsze zasady

  • Musisz liczyć „minuty” i „sekundy” jako dwie z sylab każda, a także „i” między nimi.
  • Gotowanie pizzy nigdy nie zajmie więcej niż 59:59.
  • „11 minut i 0 sekund” to nie 10 sylab: musisz uprościć do „11 minut” (tj. 5 sylab). To samo dotyczy minut: „0 minut i 7 sekund” jest również liczone tylko jako 4 sylaby.
  • Twój program może przekazać dane wyjściowe w dowolnym formacie: tablicy [minutes, seconds]lub nawet jako <minutes> minutes and <seconds> seconds(normalny tekst wypisany).
  • Obowiązują standardowe luki.
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Przypadki testowe

Wszystkie dane wejściowe jak (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)

Odnośnik do zliczania sylab

Dla odniesienia, oto liczba sylab w każdej liczbie do 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
Geza Kerecsenyi
źródło
Czy w pierwszym przypadku testowym 4:37 byłoby również prawidłowym wyjściem, ponieważ zajęłoby to 10 sylab?
Quinn
1
@Quinn, specyfikacja mówi, że powinniśmy wypisać jak najwcześniej .
Kudłaty
1
@Shaggy, ups, więc dziękuje - zanim posortuję odpowiedź, myślę, że moja pizza zostanie spalona
Quinn,
Czy możemy założyć, że wejście można uzupełnić, tzn. 4 minuty i 43 sekundy można wprowadzić jako „04:43”?
Vedvart1
1
@ Vedvart1 OK, w porządku
Geza Kerecsenyi

Odpowiedzi:

4

JavaScript (ES6),  112 106  105 bajtów

Krótsza wersja oparta na sugestii @EmbodimentofIgnorance
6 dodatkowych bajtów zapisanych przez @DaniilTutubalin

Pobiera dane wejściowe jako (minutes)(seconds). Zwraca [minutes, seconds]lub jeśli nie ma rozwiązania.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

Wypróbuj online!


JavaScript (ES6),  126  119 bajtów

Pobiera dane wejściowe jako (minutes)(seconds). Zwraca [minutes, seconds]lub jeśli nie ma rozwiązania.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

Wypróbuj online!

Skomentował

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
Arnauld
źródło
Czy możesz dodać wyjaśnienie?
Geza Kerecsenyi
@GezaKerecsenyi Gotowe. :-)
Arnauld
Dzięki. To była głównie 30774612>>2*n%(n>12?20:26)&3część, w której byłem zdezorientowany.
Geza Kerecsenyi
1
g=x=>x&&(x%10==7)+(x==11?6:x<13?4:x<21|x%10<1?5:6)może działać (niesprawdzone, ponieważ Internet nie działa i używa mojego telefonu)
Embodiment of Ignorance
1
@DaniilTutubalin Cool. g()Zapisałem kolejny bajt stamtąd, zwracając przeciwny wynik i XOR'ing z ~d.
Arnauld
2

Python 3 , 287 285 bajtów

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])

Wypróbuj online!

To nie jest bardzo sprytne rozwiązanie - jest przeważnie naprzód. Traktuje „m: s” m jako oddzielne dane wejściowe (nie muszą być wypełniane) i dane wyjściowe (m, s). Zgłasza błąd, jeśli nie ma prawidłowego wyniku.

Program w dużej mierze opiera się na niejawnym rzucaniu wartości logicznych na 0 i 1. Pierwszy wiersz wymaga danych wejściowych. Druga linia definiuje funkcję lambda y, która daje sylaby w liczbie - zakłada podstawę 3 sylab, a następnie dodaje 1, jeśli kończy się na 7, odejmuje 1, jeśli kończy się na 0, i odejmuje 1, jeśli jest w dziesiątkach i 2, jeśli zawiera pojedyncze cyfry. Dwanaście i jedenaście są ręcznie korygowane na końcu. Trzecia linia to lambda dla sylab w całym wyrażeniu. Wreszcie czwarta linia podaje czas po t sekundach. Piąty wiersz jest wyjściem - buduje tablicę wszystkich czasów, które spełniają problem, i wysyła pierwszy.

EDYCJA 1: Dzięki Matthew Andersonowi w komentarzach, 2 bajty zostały ogolone poprzez oddzielne wprowadzenie danych.

Vedvart1
źródło
1
Jeśli weźmiesz dane w dwóch osobnych wierszach: m=int(input()) s=int(input())możesz zapisać 2 bajty.
Matthew Anderson
1

Galaretka , 46 bajtów

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

Wypróbuj online!

Link monadyczny, przyjmujący za argument czas [minutes, seconds]i zwracający odpowiedni czas na wypowiedź jako [minutes, seconds]lub [seconds]jeśli mniej niż minutę.

Nick Kennedy
źródło
0

CJam , 102 bajty

60:X;q~\X*+:W_{;(__X%\X/{_196656821516111872\_A%K+e<_{(2*m>3&3.5+}{\;}?@}2*+i+\X*+_W=!2$0<-}g;_X%\X/S@

Wypróbuj online!

Po prostu nudny stary binarny stół do wyszukiwania liczb magicznych, nic tu nie widać.

JosiahRyanW
źródło