Arithmetik… Häkchen… Häkchen… Häkchen


15

Diese Frage hat Ihnen ein Spiel gestellt, das ich gerne spiele, wenn ich in langen Telefonkonferenzen stecke.

Wie viele gültige mathematische Gleichungen können unter Verwendung von nur arithmetischen Grundoperationen für alle Zeiten zwischen 24 Stunden (von 00:00 bis 23:59 Uhr) erstellt werden?

Eingabe: Zwei vierstellige Zeichenfolgen (ohne Doppelpunkt), die gültige Zeiten in einem 24-Stunden-Zyklus darstellen.

Beispiele:

Bei Eingabe = 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.

Gültige Operationen sind:

  • Zusatz
  • Subtraktion
  • Multiplikation
  • Division (Gleitkomma)
  • Potenzierung
  • Fakultät

Andere zulässige Symbole

  • Klammern
  • Gleichheitszeichen

Kürzester Code gewinnt.

Anmerkungen

  • Ziel ist es, die Anzahl der gültigen Ausdrücke zwischen zwei und nicht die Anzahl der Ausdrücke zu ermitteln , die einen gültigen Ausdruck enthalten.
  • Die zwei als Eingabe angegebenen Zeiten sind im Zeitbereich enthalten.
  • Sie können die Ziffern in beliebiger Weise gruppieren, sodass "1223" "12 23" oder "1 2 23" oder "1 223" usw. usw. sein kann.
  • Sie können beliebig viele Klammern verwenden.
  • Sie können mehr als ein =Zeichen verwenden. Zum Beispiel hat die Zeit 11:11den gültigen Ausdruck 1=1=1=1.
  • Wenn das erste Mal chronologisch nach dem zweiten Mal auftritt, sollte sich der Zeitbereich so erstrecken, als würde er in den nächsten Tag übergehen.
  • Die Nummern müssen in der ursprünglichen Reihenfolge bleiben. Sie können die Ziffern nicht neu anordnen.
  • Wenn Zahlen gruppiert werden, können Nullen absolut die vorderste Ziffer sein. In diesem Fall werden sie ignoriert ("0303" gruppiert als "03 03" besteht nur aus zwei Ziffern mit dem Wert 3).
  • Sie dürfen das Minuszeichen NICHT als unäre Negation verwenden. Daher erzeugt "12:01" NICHT "1-2 = - (01)", sondern "1-2 = 0-1".
  • Sie dürfen keine Dezimalstellen zu Ziffern hinzufügen. Daher erzeugt "12:05" NICHT "1/2 = 0,5".
  • Keine Verkettung von Fakultäten - einer Ziffer darf höchstens ein "!" Folgen, sonst hätten viele Male unendliche Lösungen. Bsp .: "5!" ist gültig aber "5 !!" ist ungültig.


4
" Valid operations include " scheint zu verhindern, dass Sie Testfälle hinzufügen können. Es wäre eine bessere Frage, wenn Sie dies in " Gültige Operationen sind " ändern und einige Testfälle hinzufügen würden. Es wäre auch nützlich, die Endpunkte genau zu bestimmen: Sollten für die Eingabe 0000 1300Gleichungen aus der Zählung abgeleitet 0000und 1300in die Zählung einbezogen werden?
Peter Taylor

1
Geben Sie für die Ziffern "1423" "1 + 4 = 2 + 3", "(1 + 4) = (2 + 3)", "(1 + 4) = 2 + 3" und "1 + 4 = (2)" ein +3) "als eine oder vier Gleichungen zählen? Und ... was sind alle Gleichungen von "0000"? Ich denke über 100 Möglichkeiten nach, oder noch mehr ... Könnte das sein?
Bobbel

2
Gibt es eine Einschränkung für die Verwendung von unären Operatoren? Fehlt eine solche Einschränkung in den Regeln, kann die Fakultät wiederholt angewendet werden, und daher kann sich eine perfekte Lösung als unmöglich erweisen.
Michael Stern

1
Michael, das ist eine großartige Beobachtung. Aus Gründen des Puzzles denke ich, dass ich es auf eine Fakultät pro "Ziffer" beschränken werde, wenn das Sinn macht. Dafür 5! ist gültig aber 5 !! ist ungültig.
nobillygreen

Antworten:


1

Python3, 363 Zeichen

Da bis heute keine Antwort gegeben wird, gebe ich ab, was ich bekommen habe. Leider ist der try / except-Block zu fett, ich habe dort keine Möglichkeit gefunden, Zeichen zu sparen. Es ist wirklich schwierig mit den verschachtelten Schleifen dort, nicht alles kann mit Listenverständnissen gemacht werden, denke ich, aber vielleicht kann mir jemand sagen, wie.

Ich habe mich jedoch darauf beschränkt, nur die grundlegenden mathematischen '+ - * /' und keine Klammern zu verwenden.

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)

Mein vollständiger Code (hoffentlich etwas erklärend) zu diesem CodeGolf ist in meinem Pastebin zu finden .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.