あとどれくらい?


21

あとどれくらい?

最近、携帯電話で5分間のタイマーを使ってピザを作っていました。誰かが入って来て、あとどれくらい残っているかと私に尋ねると、最初は質問の答え方についてちょっと混乱しました。現時点でのタイマーが3:47であった場合、「3分47秒」と読み上げた時点で、時間は変更されていたはずです。したがって、タイマーを読み終えた直後にタイマーが到達する時間を見つける必要があります。

これがあなたの挑戦です。このプロセスを自動化することです。適切な形式( ":"で区切られた、または分と2番目の引数として)で時間を指定し、タイマーが取得するのに必要な時間と同じ時間の読み取りにかかる現在の時点から最も早い時間を出力します。に。各音節の読み取りには1秒かかると想定しています。

さらなるルール

  • 「分」と「秒」をそれぞれ2つの音節、およびそれらの間の「および」としてカウントする必要があります。
  • ピザの調理に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、仕様では、最も早い時間を出力する必要があると述べています。
シャギー

1
@Shaggyおっと、だから感謝します-答えを整理するまでに、ピザが燃えると思います
クイン

入力をパディングできると想定することはできますか。つまり、「04:43」として4分43秒を入力できますか。
Vedvart1

1
大丈夫ですVedvart1 OK、@
下座Kerecsenyi

回答:


4

JavaScriptの(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

オンラインでお試しください!


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

説明を追加していただけますか?
ゲザケレクセニー

@gezaKerecsenyiできました。:-)
アーナウルド

ありがとう。ほとんどが30774612>>2*n%(n>12?20:26)&3私が混乱した部分でした。
ゲザケレクセニー

1
g=x=>x&&(x%10==7)+(x==11?6:x<13?4:x<21|x%10<1?5:6)動作する可能性があります(インターネットがダウンし、電話を使用しているためテストされていません)
無知の具現化

1
@DaniilTutubalinかっこいい。g()反対の結果を返し、でXORすることで、そこから別のバイトを保存しました~d
Arnauld

2

Pythonの3287の 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に暗黙的にキャストすることに大きく依存しています。最初の行は入力を受け取ります。2行目は、番号の音節を与えるラムダ関数yを定義します-3音節の基数を想定し、7で終わる場合は1を加算し、0で終わる場合は1を減算し、10の場合は1を減算し、 1桁の場合は2。最後に12と11が手動で調整されます。3行目は、式全体の音節のラムダです。最後に、4行目はt秒後の時間を示します。5行目は出力です。問題を満たすすべての時間の配列を作成し、最初の行を出力します。

編集1:コメントのマシュー・アンダーソンのおかげで、入力を個別に取得することで2バイトが削り取られました。


1
2行に分けて入力する場合:m=int(input()) s=int(input())、2バイト節約できます。
マシューアンダーソン



0

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@

オンラインでお試しください!

ただ退屈な古いマジックナンバーのバイナリルックアップテーブル、ここで見るものは何もありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.