เหลืออีกนานเท่าไหร่?


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 พยางค์ในการพูด
Quinn

1
@Quinn ข้อมูลจำเพาะระบุว่าเราควรเอาท์พุทที่เก่าแก่ที่สุดเวลา
Shaggy

1
@ Shaggy อ๊ะดังนั้นมันจะขอบคุณ - ตามเวลาที่ฉันเรียงลำดับคำตอบของฉันออกฉันคิดว่าพิซซ่าของฉันจะถูกเผาไหม้
Quinn

เราได้รับอนุญาตให้สมมติว่าอินพุตสามารถถูกเพิ่มเช่น 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 เรียบร้อยแล้ว :-)
Arnauld

ขอบคุณ มันเป็นส่วนที่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 เจ๋ง ฉันบันทึกไบต์อีกจากที่นั่นโดยมีการg()กลับมาผลตรงข้ามและ XOR'ing ~dกับ
Arnauld

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) ส่งข้อผิดพลาดหากไม่มีเอาต์พุตที่ถูกต้อง

โปรแกรมอาศัยการส่งผ่าน booleans โดยนัยเป็น 0 และ 1 บรรทัดแรกใช้อินพุต บรรทัดที่สองกำหนดฟังก์ชั่นแลมบ์ดา y ซึ่งให้พยางค์เป็นตัวเลข - สมมติว่ามีฐานของ 3 พยางค์จากนั้นบวก 1 ถ้ามันลงท้ายด้วย 7 ลบ 1 ถ้าลงท้ายด้วย 0 และลบ 1 ถ้าอยู่ใน 10 และ 2 ถ้ามันอยู่ในหลักเดียว สิบสองและสิบเอ็ดจะถูกปรับด้วยตนเองในตอนท้าย บรรทัดที่สามคือแลมบ์ดาสำหรับพยางค์ในการแสดงออกทั้งหมด ในที่สุดบรรทัดที่สี่จะให้เวลาหลังจาก t วินาที บรรทัดที่ห้าคือผลลัพธ์ - มันสร้างอาร์เรย์ของเวลาทั้งหมดที่ตอบสนองต่อปัญหาและสร้างผลลัพธ์แรก

แก้ไข 1:ขอบคุณ Matthew Anderson ในความคิดเห็น 2 ไบต์ถูกแยกออกโดยแยกอินพุต


1
หากคุณรับข้อมูลจากสองบรรทัด: m=int(input()) s=int(input())คุณสามารถบันทึกได้ 2 ไบต์
Matthew Anderson


1

เยลลี่ขนาด 46 ไบต์

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

ลองออนไลน์!

ลิงก์ monadic ที่ใช้เป็นอาร์กิวเมนต์เป็นเวลา[minutes, seconds]และส่งคืนเวลาที่เหมาะสมเพื่อบอกว่าเป็น[minutes, seconds]หรือ[seconds]น้อยกว่าหนึ่งนาที


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.