Aritmetica ... tock ... tick ... tock


15

Questa domanda posta da un gioco a cui mi piace giocare quando sono bloccato in lunghe riunioni telefoniche.

Dato due volte da un orologio di 24 ore (dalle 00:00 alle 23:59), quante equazioni matematiche valide possono essere generate con tutti i tempi tra l'utilizzo solo delle operazioni aritmetiche di base?

Input: due stringhe a quattro cifre (senza due punti) che rappresentano tempi validi in un ciclo di 24 ore.

Esempi:

Per input = 0000, 1300

03:26 produces: "0+3*2=6" and "03*2=6" etc.
11:10 produces quite a few, including: "1*1=1+0" and "1=1=1^0" and  "1=11^0" etc.
12:24 produces: "1/2=2/4" and "1=(2*2)/4" etc.

Le operazioni valide sono:

  • aggiunta
  • sottrazione
  • moltiplicazione
  • divisione (virgola mobile)
  • elevamento a potenza
  • fattoriale

Altri simboli consentiti

  • parentesi
  • Pari segni

Il codice più corto vince.

Appunti

  • L'obiettivo è trovare il numero di espressioni valide tra due volte, non il numero di volte che contengono un'espressione valida.
  • Le due volte fornite come input sono incluse nell'intervallo di volte.
  • È possibile raggruppare le cifre in qualsiasi modo possibile, quindi "1223" può essere "12 23" o "1 2 23" o "1 223" ecc. Ecc.
  • È possibile utilizzare tutte le parentesi necessarie.
  • È possibile utilizzare più di un =segno. Ad esempio, il tempo 11:11ha l'espressione valida 1=1=1=1.
  • Se la prima volta si verifica in ordine cronologico dopo la seconda volta, l'intervallo di tempo dovrebbe concludersi come se attraversasse il giorno successivo.
  • I numeri devono rimanere nell'ordine originale, non è possibile riordinare le cifre.
  • Quando si raggruppano i numeri, gli zero possono essere in assoluto la cifra più in primo piano, nel qual caso vengono ignorati ("0303" raggruppato come "03 03" è solo due cifre con il valore di 3.)
  • NON PUOI usare il segno meno come negazione unaria. Pertanto, "12:01" NON produce "1-2 = - (01)", ma produce "1-2 = 0-1".
  • NON PUOI aggiungere punti decimali alle cifre. Pertanto, "12:05" NON produce "1/2 = 0,5".
  • Nessun concatenamento di fattoriali: una cifra può essere seguita al massimo da un "!", Non più, altrimenti molte volte avrebbero soluzioni infinite. Es: "5!" è valido ma "5 !!" non è valido.


4
" Le operazioni valide includono " sembrano impedire di poter aggiungere casi di test. Sarebbe una domanda migliore se lo cambiassi in " Operazioni valide " e aggiungendo alcuni casi di test. Sarebbe anche utile essere precisi sugli endpoint: per input si 0000 1300dovrebbero derivare equazioni da 0000ed 1300essere incluse nel conteggio?
Peter Taylor,

1
Dato le cifre "1423", esegui "1 + 4 = 2 + 3", "(1 + 4) = (2 + 3)", "(1 + 4) = 2 + 3" e "1 + 4 = (2 +3) "contano come una o quattro equazioni? E ... quali sono tutte le equazioni di "0000"? Penso a circa 100 possibilità, o anche di più ... Potrebbe essere?
Bob

2
Esistono restrizioni sull'uso di operatori unari? In assenza di tale limitazione nelle regole, il fattoriale può essere applicato ripetutamente e quindi una soluzione perfetta può rivelarsi impossibile.
Michael Stern,

1
Michael, è un'ottima osservazione. Quindi, per il bene del puzzle, penso che lo limiterò a un fattoriale per "cifra", se questo ha senso. Pertanto, 5! è valido ma 5 !! non è valido.
nobillygreen

Risposte:


1

Python3, 363 caratteri

Dal momento che nessuna risposta è data fino ad oggi, consegno ciò che ho ricevuto. Purtroppo, il blocco try / tranne è troppo grasso, non ho trovato un modo per salvare i caratteri lì. È davvero complicato con i loop nidificati lì, non tutto può essere fatto con la comprensione dell'elenco penso, ma forse qualcuno può dirmi come.

Tuttavia, ho limitato la sfida a me stesso di utilizzare solo la matematica di base '+ - * /' e nessuna parentesi.

a,b = input().split()
r=0
for time in [c for c in range(int(a),int(b)) if c/10%10<6]:
 t,*ts='%04d'%time
 e=[t]
 for d in ts:
  e=[(n+o+d,n+d)[o==' '] for o in ' -+*/=' for n in e]
 for h in [g for g in [e.split('=') for e in e if '='in e] if len(g)>1]:
  for k in h:
   try:
    if eval(h[0]) != eval(k):
     break
   except:
    break
  else:
   r+=1
print(r)

Il mio codice completo (spero qualcosa di esplicativo) su questo CodeGolf può essere trovato sul mio pastebin .

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.