Arithmétique… tock… tick… tock

15

Cette question vous est posée par un jeu auquel j'aime jouer quand je suis coincé dans de longues réunions téléphoniques.

Étant donné deux fois à partir d'une horloge de 24 heures (de 00:00 à 23:59), combien d'équations mathématiques valides peuvent être générées avec toutes les heures intermédiaires en utilisant uniquement des opérations arithmétiques de base?

Contribution: deux chaînes de quatre chiffres (pas de deux-points) représentant des heures valides dans un cycle de 24 heures.

Exemples:

Pour entrée = 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.

Les opérations valides sont:

  • une addition
  • soustraction
  • multiplication
  • division (virgule flottante)
  • exponentiation
  • factorielle

Autres symboles autorisés

  • Parenthèses
  • Des signes égaux

Le code le plus court gagne.

Remarques

  • Le but est de trouver le nombre d'expressions valides entre deux fois, pas le nombre de fois qui contiennent une expression valide.
  • Les deux temps donnés en entrée sont inclus dans la plage de temps.
  • Vous pouvez grouper les chiffres de toutes les manières possibles, donc "1223" peut être "12 23" ou "1 2 23" ou "1 223" etc. etc.
  • Vous pouvez utiliser autant de parenthèses que nécessaire.
  • Vous pouvez utiliser plusieurs =signes. Par exemple, l'heure 11:11a l'expression valide 1=1=1=1.
  • Si la première fois se produit chronologiquement après la deuxième fois, la plage de temps doit s'achever comme si elle passait au lendemain.
  • Les numéros doivent rester dans leur ordre d'origine - vous ne pouvez pas réorganiser les chiffres.
  • Lors de la mise en cluster de nombres, les zéros peuvent absolument être le chiffre le plus en avant, auquel cas, ils sont ignorés ("0303" groupé en "03 03" n'est que deux chiffres avec la valeur de 3.)
  • Vous NE POUVEZ PAS utiliser le signe moins comme négation unaire. Par conséquent, "12:01" ne produit PAS "1-2 = - (01)", mais produit "1-2 = 0-1".
  • Vous NE POUVEZ PAS ajouter de décimales aux chiffres. Par conséquent, "12:05" ne produit PAS "1/2 = 0,5".
  • Aucun enchaînement de factorielles - un chiffre peut être suivi d'au plus un "!", Pas plus, sinon, plusieurs fois, il y aurait des solutions infinies. Ex: "5!" est valide mais "5 !!" n'est pas valide.
nobillygreen
la source
4
" Les opérations valides incluent " semble vous empêcher de pouvoir ajouter des cas de test. Ce serait une meilleure question si vous changiez cela en " Les opérations valides sont " et ajoutiez quelques cas de test. Il serait également utile d'être précis sur les critères d'évaluation: pour l'entrée 0000 1300, les équations doivent-elles être dérivées du décompte 0000et 1300être incluses dans celui-ci?
Peter Taylor
1
Étant donné les chiffres "1423", faites "1 + 4 = 2 + 3", "(1 + 4) = (2 + 3)", "(1 + 4) = 2 + 3" et "1 + 4 = (2 +3) "compte comme une ou quatre équations? Et quels sont toutes les équations de "0000"? Je pense à environ 100 possibilités, voire plus ... Serait-ce possible?
bobbel
2
Y a-t-il une restriction à l'utilisation d'opérateurs unaires? En l'absence d'une telle restriction dans les règles, la factorielle peut être appliquée à plusieurs reprises et une solution parfaite peut donc s'avérer impossible.
Michael Stern
1
Michael, c'est une excellente observation. Donc, pour le bien du puzzle, je pense que je vais le limiter à une factorielle par "chiffre", si cela a du sens. À cet effet, 5! est valide mais 5 !! n'est pas valide.
nobillygreen du

Réponses:

1

Python3, 363 caractères

Puisqu'aucune réponse n'est donnée jusqu'à aujourd'hui, je remets ce que j'ai obtenu. Malheureusement, le bloc try / except est trop gros, je n'ai pas trouvé de moyen d'y sauvegarder les caractères. C'est vraiment difficile avec les boucles imbriquées là-bas, je ne pense pas que tout puisse être fait avec des listes, mais peut-être que quelqu'un peut me dire comment.

Cependant, j'ai moi-même limité le défi de n'utiliser que les mathématiques de base '+ - * /' et aucune parenthèse.

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)

Mon code complet (espérons quelque chose d'explicatif) sur ce CodeGolf peut être trouvé sur mon pastebin .

Oliver Friedrich
la source