얼마나 남았습니까? 가장 빠른 시간을 출력하십시오. 에. 각 음절을

얼마나 남았습니까?

최근에 나는 휴대 전화에서 5 분 타이머를 사용하여 피자를 만들고있었습니다. 누군가 들어 와서 얼마나 오래 남았는지 물었을 때, 나는 처음에 질문에 대답하는 방법에 대해 잠시 혼란스러워했습니다. 현재 순간의 타이머가 3:47 인 경우 ‘3 분 49 초’를 큰 소리로 읽을 때까지 시간이 바뀌었을 것입니다. 따라서, 나는 타이머가 도달 할 것이라는 점을 한 번에 찾을 필요 단지 내가 그것을 다 읽기로한다.

이 과정을 자동화하는 것은 당신의 도전입니다. 적절한 형식의 시간 ( “:”구분 또는 분 및 초 인수)이 주어진 경우 타이머를 가져 오는 데 걸리는 시간과 동일한 시간이 걸리는 현재 순간부터 가장 빠른 시간을 출력하십시오. 에. 각 음절을 읽는 데 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


답변

자바 스크립트 (ES6)  112 106  105 바이트

@EmbodimentofIgnorance의 제안을 기반으로 한 짧은 버전은 @DaniilTutubalin이
6 바이트를 절약했습니다.

(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

온라인으로 사용해보십시오!


자바 스크립트 (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

답변

파이썬 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 개로 가정하고 7로 끝나는 경우 1을 더한 다음, 7로 끝나는 경우 1을 더하고 0으로 끝나는 경우 1을 빼고 10과 10에 있으면 1을 빼고 한 자릿수이면 2입니다. 12와 11은 마지막에 수동으로 조정됩니다. 세 번째 줄은 전체 표현에서 음절에 대한 람다입니다. 마지막으로, 네 번째 줄은 t 초 후 시간을 제공합니다. 다섯 번째 줄은 출력입니다-문제를 만족시키는 모든 시간의 배열을 만들고 첫 번째 줄을 출력합니다.

편집 1 : 의견에 Matthew Anderson 덕분에 입력을 개별적으로 취함으로써 2 바이트가 줄었습니다.


답변

C # (Visual C # 대화식 컴파일러) , 141 바이트

a=>b=>((a=Enumerable.Range(1,b+=a*60).Last(i=>new[]{i/60,i%60}.Sum(x=>x<1?0:(x%10==7?4:3)+(x==11?3:x<13?1:x<21|x%10<1?2:3))-1==b-i))/60,a%60)

온라인으로 사용해보십시오!


답변

젤리 , 46 바이트

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

온라인으로 사용해보십시오!

모나드 링크 인수만큼 시간을내어 [minutes, seconds]과 같은 말을 적절한시기에 반환 [minutes, seconds]또는 [seconds]분 미만 경우입니다.


답변

CJam , 102 바이트

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@

온라인으로 사용해보십시오!

지루한 오래된 매직 넘버 바이너리 룩업 테이블, 여기서 볼 것이 없습니다.