Còn lại bao lâu?


21

Còn lại bao lâu?

Gần đây, tôi đang làm pizza bằng cách sử dụng đồng hồ bấm giờ 5 phút trên điện thoại. Khi ai đó bước vào và hỏi tôi còn lại bao lâu, lúc đầu tôi bối rối không biết trả lời câu hỏi như thế nào. Bạn thấy đấy, nếu đồng hồ bấm giờ ở thời điểm hiện tại là lúc 3:47, khi tôi đọc to 'Ba phút bốn mươi bảy giây, thời gian sẽ thay đổi. Do đó, tôi cần tìm thời gian mà bộ đếm thời gian sẽ đạt được ngay khi tôi đọc xong.

Đây là thách thức của bạn: để tự động hóa quá trình này. Đưa ra một thời gian ở bất kỳ định dạng thích hợp nào (":" được phân cách, hoặc là đối số phút và giây), xuất thời gian sớm nhất từ ​​thời điểm hiện tại sẽ mất một khoảng thời gian bằng nhau để đọc thời gian để có được bộ hẹn giờ để có được đến. Chúng tôi giả định rằng mỗi âm tiết mất 1 giây để đọc.

Quy tắc khác

  • Bạn phải tính 'phút' và 'giây' là hai trong số các âm tiết, cũng như 'và' giữa chúng.
  • Bánh pizza sẽ không bao giờ mất nhiều hơn 59:59 để nấu.
  • '11 phút và 0 giây 'không phải là 10 âm tiết: bạn phải đơn giản hóa thành '11 phút' (tức là 5 âm tiết). Tương tự với phút: '0 phút và 7 giây' cũng chỉ được tính là 4 âm tiết.
  • Chương trình của bạn có thể cung cấp đầu ra ở bất kỳ định dạng nào: một mảng [minutes, seconds]hoặc thậm chí là <minutes> minutes and <seconds> seconds(văn bản bình thường được viết ra).
  • Tiêu chuẩn áp dụng.
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.

Các trường hợp thử nghiệm

Tất cả các đầu vào như (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)

Tài liệu tham khảo đếm

Để tham khảo, đây là số lượng âm tiết trong mỗi số lên tới 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

Đối với trường hợp thử nghiệm đầu tiên của bạn, 4:37 cũng sẽ là một đầu ra hợp lệ, vì điều đó sẽ mất 10 âm tiết để nói?
Quinn

1
@Quinn, thông số kỹ thuật nói rằng chúng ta nên xuất ra sớm nhất .
Shaggy

1
@Shaggy whoops, vì vậy nó cảm ơn - vào lúc tôi sắp xếp câu trả lời của mình, tôi nghĩ pizza của tôi sẽ bị cháy
Quinn

Chúng tôi có được phép giả sử đầu vào có thể được đệm không, tức là 4 phút và 43 giây có thể được nhập vào là "04:43"?
Vedvart1

1
@ Vedvart1 OK, không sao đâu
Geza Kerecsenyi

Câu trả lời:


4

JavaScript (ES6),  112 106  105 byte

Phiên bản ngắn hơn dựa trên đề xuất của @EmbodimentofIgnorance Thêm
6 byte được lưu bởi @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

Hãy thử trực tuyến!


JavaScript (ES6),  126  119 byte

(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

Hãy thử trực tuyến!

Đã bình luận

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

Bạn có thể vui lòng thêm một lời giải thích?
Geza Kerecsenyi

@GezaKerecsenyi Xong. :-)
Arnauld

Cảm ơn. Nó chủ yếu là 30774612>>2*n%(n>12?20:26)&3phần tôi đã nhầm lẫn về.
Geza Kerecsenyi

1
g=x=>x&&(x%10==7)+(x==11?6:x<13?4:x<21|x%10<1?5:6)có thể hoạt động (chưa được kiểm tra vì Internet ngừng hoạt động và sử dụng điện thoại của tôi)
Hiện thân của sự thiếu hiểu biết

1
@DaniilTutubalin Mát mẻ. Tôi đã lưu một byte khác từ đó bằng cách g()trả về kết quả ngược lại và XOR'ing với ~d.
Arnauld

2

Python 3 , 287 285 byte

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

Hãy thử trực tuyến!

Đó không phải là một giải pháp rất thông minh - chủ yếu là hướng tới. Lấy 'm: s' m và s làm đầu vào riêng biệt (không cần phải đệm) và đầu ra (m, s). Ném lỗi nếu không có đầu ra hợp lệ.

Chương trình phụ thuộc rất nhiều vào việc truyền booleans ngầm thành 0 và 1. Dòng đầu tiên nhận đầu vào. Dòng thứ hai xác định hàm lambda y cung cấp các âm tiết trong một số - nó giả sử cơ sở gồm 3 âm tiết, sau đó thêm 1 nếu kết thúc bằng 7, trừ 1 nếu kết thúc bằng 0 và trừ đi 1 nếu nó ở 10 và 2 nếu nó trong các chữ số duy nhất. Mười hai và mười một được điều chỉnh thủ công ở cuối. Dòng thứ ba là một lambda cho các âm tiết trong toàn bộ biểu thức. Cuối cùng, dòng thứ tư cho thời gian sau t giây. Dòng thứ năm là đầu ra - nó xây dựng một mảng của tất cả các lần thỏa mãn vấn đề và đưa ra đầu tiên.

EDIT 1: Nhờ Matthew Anderson trong các bình luận, 2 byte đã bị loại bỏ bằng cách lấy riêng các đầu vào.


1
Nếu bạn lấy đầu vào trên hai dòng riêng biệt : m=int(input()) s=int(input()), bạn có thể lưu 2 byte.
Matthew Anderson


1

Thạch , 46 byte

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

Hãy thử trực tuyến!

Một liên kết đơn âm lấy tham số của nó là thời gian [minutes, seconds]và trả lại thời gian thích hợp để nói [minutes, seconds]hoặc [seconds]nếu ít hơn một phút.


0

CJam , 102 byte

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@

Hãy thử trực tuyến!

Chỉ là một bảng tra cứu nhị phân số ma thuật cũ nhàm chán, không có gì để xem ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.