Quanto tempo è rimasto?


21

Quanto tempo è rimasto?

Di recente, stavo preparando la pizza usando un timer da 5 minuti sul mio telefono. Quando qualcuno è entrato e mi ha chiesto per quanto tempo mi è rimasto, sono stato inizialmente confuso per un momento su come rispondere alla domanda. Vedete, se il timer in quel momento fosse alle 3:47, quando avessi letto ad alta voce "Tre minuti e quarantasette secondi", il tempo sarebbe cambiato. Pertanto, ho bisogno di trovare un tempo che il timer raggiunga proprio quando finisco di leggerlo.

Questa è la tua sfida: automatizzare questo processo. Dato un tempo in qualsiasi formato appropriato (":" delimitato, o come un minuto e un secondo argomento), emette il primo tempo da quel momento attuale che richiederebbe una quantità uguale di tempo per leggere come ci vorrebbe per ottenere il timer per. Partiamo dal presupposto che ogni sillaba richiede 1 secondo per la lettura.

Ulteriori regole

  • Devi contare 'minuti' e 'secondi' come due delle sillabe ciascuna, oltre a 'e' tra di loro.
  • La cottura della pizza non richiederà mai più di 59:59.
  • '11 minuti e 0 secondi 'non sono 10 sillabe: devi semplificare a '11 minuti' (cioè 5 sillabe). Lo stesso vale per i minuti: anche '0 minuti e 7 secondi' viene conteggiato solo come 4 sillabe.
  • Il tuo programma può fornire l'output in qualsiasi formato: una matrice di [minutes, seconds], o anche come <minutes> minutes and <seconds> seconds(testo normale scritto).
  • Si applicano scappatoie standard.
  • Questo è , quindi vince la risposta più breve in byte.

Casi test

Tutti gli ingressi come (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)

Riferimento di conteggio della sillaba

Per riferimento, ecco il numero di sillabe in ogni numero fino a 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

Per il tuo primo caso di test, 4:37 sarebbe anche un output valido, dal momento che sarebbero necessarie 10 sillabe per dirlo?
Quinn,

1
@Quinn, la specifica afferma che dovremmo produrre il primo tempo.
Shaggy,

1
@Shaggy urla, quindi grazie - quando avrò risolto la mia risposta penso che la mia pizza sarà bruciata
Quinn,

Ci è consentito supporre che l'ingresso possa essere riempito, ovvero 4 minuti e 43 secondi potrebbero essere immessi come "04:43"?
Vedvart1,

1
@ Vedvart1 OK, va bene
Geza Kerecsenyi,

Risposte:


4

JavaScript (ES6),  112106  105 byte

Una versione più breve basata su un suggerimento di @EmbodimentofIgnorance
6 byte in più salvati da @DaniilTutubalin

Accetta input come (minutes)(seconds). Restituisce [minutes, seconds]o se non c'è soluzione.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

Provalo online!


JavaScript (ES6),  126  119 byte

Accetta input come (minutes)(seconds). Restituisce [minutes, seconds]o se non c'è soluzione.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

Provalo online!

Commentate

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

Potresti per favore aggiungere una spiegazione?
Geza Kerecsenyi,

@GezaKerecsenyi Done. :-)
Arnauld

Grazie. Era principalmente la 30774612>>2*n%(n>12?20:26)&3parte di cui ero confuso.
Geza Kerecsenyi,

1
g=x=>x&&(x%10==7)+(x==11?6:x<13?4:x<21|x%10<1?5:6)potrebbe funzionare (non testato poiché Internet è inattivo e utilizza il mio telefono)
Embodiment of Ignorance

1
@DaniilTutubalin Cool. Ho salvato un altro byte da lì g()restituendo il risultato opposto e XOR con ~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])

Provalo online!

Non è una soluzione molto intelligente - è per lo più semplice. Prende 'm: s' m e s come input separati (non è necessario il padding) e output (m, s). Genera un errore se non esiste un output valido.

Il programma si basa fortemente sul cast implicito di booleani su 0 e 1. La prima riga accetta input. La seconda riga definisce una funzione lambda y che fornisce le sillabe in un numero: assume una base di 3 sillabe, quindi aggiunge 1 se finisce in 7, sottrae 1 se finisce in 0 e sottrae 1 se è tra gli anni 10 e 2 se è in cifre singole. Dodici e undici sono regolati manualmente alla fine. La terza riga è una lambda per le sillabe nell'intera espressione. Infine, la quarta riga indica il tempo dopo t secondi. La quinta riga è l'output: crea un array di tutte le volte che soddisfano il problema e genera il primo.

EDIT 1: Grazie a Matthew Anderson nei commenti, 2 byte sono stati eliminati prendendo gli input separatamente.


1
Se si prende input su due righe separate:, m=int(input()) s=int(input())è possibile salvare 2 byte.
Matthew Anderson,


1

Gelatina , 46 byte

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

Provalo online!

Un collegamento monadico che prende come argomento il tempo [minutes, seconds]e restituisce il tempo appropriato per dire come [minutes, seconds]o [seconds]se meno di un minuto.


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@

Provalo online!

Solo una noiosa vecchia tabella di ricerca binaria con numeri magici, niente da vedere qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.