Ne kadar kaldı?


21

Ne kadar kaldı?

Son zamanlarda, telefonumda 5 dakikalık bir zamanlayıcı kullanarak pizza yapıyordum. Biri içeri girip bana ne kadar süre kaldığını sorduğunda, soruyu nasıl cevaplayacağı konusunda ilk başta bir an kafam karıştı. Görüyorsunuz, şu andaki zamanlayıcı saat 3: 47'de olsaydı, yüksek sesle 'Üç dakika kırk yedi saniye' okuduğum zaman zaman değişecekti. Bu nedenle, zamanlayıcı ulaşacağı bir zaman bulmak gerek sadece bunu dışarı okumayı bitirdiğinizde olarak.

Bu senin zorluğun: bu süreci otomatikleştirmek. Herhangi bir uygun formatta (":" ayrılmış ya da bir dakika ve ikinci bir argüman olarak) bir zaman verilmişse, zamanın alması için alacağı süreyi okumak için eşit miktarda zaman alacak olan mevcut andan en erken zamanı çıkar. için. Her hecenin okunması 1 saniye sürdüğünü varsayıyoruz.

Ek kurallar

  • 'Dakikaları' ve 'saniye'yi' her bir hecenin ikisinin yanı sıra aralarında 've' olarak saymalısınız.
  • Pizza, yemek yapmak için asla 59:59'dan fazla zaman almayacaktır.
  • '11 dakika ve 0 saniye '10 hece değildir:' 11 dakikaya kadar basitleştirmelisiniz (yani 5 heceli). Aynı şey dakikalarla da geçerli: '0 dakika 7 saniye' de sadece 4 heceli olarak sayılıyor.
  • Programınız çıktısını herhangi bir formatta verebilir: bir dizi [minutes, seconds]veya hatta <minutes> minutes and <seconds> seconds(normal metin yazılır).
  • Standart boşluklar uygulanır.
  • Bu , bayt cinsinden en kısa cevap kazanır.

Test durumları

Tüm girişler olarak (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)

Hece sayısı referansı

Başvuru için, işte her sayıdaki 59'a kadar hecenin sayısı.

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

İlk test durumunuz için, 4:37 de geçerli bir çıktı olur mu, çünkü bu 10 hecenin söylenmesini ister mi?
Quinn,

1
@ Quinn, şartname en erken süreyi vermemiz gerektiğini belirtiyor .
Shaggy

1
@Shaggy ağrıyor, bu yüzden teşekkür ediyor - cevabımı çözdüğümde pizzamın yanacağını düşünüyorum
Quinn

Girişin doldurulabildiğini, yani 4 ve 43 saniye "04:43" olarak girilebileceğini varsaymamıza izin verilir mi?
Vedvart1

1
@ Vedvart1 Tamam, sorun değil
Geza Kerecsenyi

Yanıtlar:


4

JavaScript (ES6),  112 106  105 bayt

@EmbodimentofIgnorance tarafından bir öneriye dayalı daha kısa bir sürüm @DaniilTutubalin
tarafından kaydedilen 6 bayt daha

(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

Çevrimiçi deneyin!


JavaScript (ES6),  126  119 bayt

(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

Çevrimiçi deneyin!

Yorumlananlar

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

Lütfen bir açıklama ekler misiniz?
Geza Kerecsenyi

@GezaKerecsenyi Tamamlandı. :-)
Arnauld,

Teşekkürler. Çoğunlukla 30774612>>2*n%(n>12?20:26)&3kafam karıştı.
Geza Kerecsenyi

1
g=x=>x&&(x%10==7)+(x==11?6:x<13?4:x<21|x%10<1?5:6)işe yarayabilir (Internet kapalı olduğundan ve telefonumu kullandığından beri denenmemiş)
Ignorance uygulaması

1
@DaniilTutubalin Cool. Tam g()tersi sonucu döndürerek ve XOR'la ​​birlikte alarak başka bir baytı oradan kurtardım ~d.
Arnauld,

2

Python 3 , 287 285 bayt

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

Çevrimiçi deneyin!

Çok akıllıca bir çözüm değil - çoğunlukla güçlü. Alır : 's m' m ve ayrı girişler olarak s (dolgulu olmak zorunda değildir), (m, s) ve çıktılar. Geçerli çıktı yoksa hata atar.

Program, yoğun şekilde 0 ve 1'e atanmış booleanlara dayanıyor. İlk satır girdi alıyor. İkinci satır, heceleri bir sayıdaki hecelerde veren bir lambda fonksiyonunu tanımlar - 3 heceli bir üs varsayar, sonra 7'de biterse 1 ekler, 0'da biterse 1'i çıkarır ve 10'larda ise 1'i çıkarır ve Tek basamaklı ise 2. On iki ve onbir sonunda manüel olarak ayarlanır. Üçüncü satır, tüm ifadedeki heceler için bir lambdadır. Son olarak, dördüncü satır t saniyeden sonra zaman verir. Beşinci satır çıktıdır - sorunu gideren tüm zamanların bir dizisini oluşturur ve birincisini çıkarır.

EDIT 1: Yorumlarda Matthew Anderson sayesinde, girişleri ayrı ayrı alarak 2 bayt tıraş edildi.


1
İki ayrı satıra giriş yaparsanız: m=int(input()) s=int(input())2 bayt kaydedebilirsiniz.
Matthew Anderson,


1

Jöle , 46 bayt

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

Çevrimiçi deneyin!

Zamanı argüman olarak alan [minutes, seconds]ve bir dakikanın altındaysa [minutes, seconds]veya [seconds]bir dakikadan azsa söylemeye uygun zamanı geri döndüren tek taraflı bir bağlantı .


0

CJam , 102 bayt

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@

Çevrimiçi deneyin!

Sadece sıkıcı, eski bir sihirli sayı ikili arama masası, burada görülecek bir şey yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.