Nicht nur ein Vier-Viere-Puzzle

11

In dieser Variante des Vier-Viere-Puzzles sollten Sie bis zu x x's(und keine andere Zahl) und einen definierten Satz von Operationen verwenden, um jede Zahl von 0 bis 100 zu erreichen. Wenn x = 4Sie dann bis zu vier verwenden 4skönnen, wird diese Frage zur klassischen Vier-Vier Puzzle (außer Sie können bis zu vier 4s verwenden, anstatt genau vier davon verwenden zu müssen). Wir nehmen an 1 < x <= 9.

In dieser Version sind nur die folgenden Operatoren zulässig:

  • Addition ( +), Subtraktion ( -), Multiplikation ( *), Division ( /). Beachten Sie, dass dies eine echte Teilung ist 5/2 = 2.5.
  • Potenzierung (z. B. 4 ^ 4), da dies keine zusätzlichen Symbole beinhalten würde, wenn es normal von Hand geschrieben würde.
  • Sie können neue Ganzzahlen erstellen, indem Sie verketten xs. ZB können Sie die ganzen Zahlen machen 4, 44, 444, 4444.

Sie können auch Klammern verwenden, um Zahlen einfach zu gruppieren, um die Reihenfolge der Auswertung der Operatoren zu steuern. Sie können beispielsweise keine Klammern mit Verkettung wie in kombinieren (4/4)(4/4) = (1)(1) = 11.

Es dürfen keine anderen Symbole verwendet werden und es gilt die Standardreihenfolge.

Ihr Programm sollte bei einem xim definierten Bereich und nzwischen 0und 100einschließlich eine korrekte Lösung für diese Eingabe generieren, falls vorhanden. Andernfalls muss Ihr Code etwas ausgeben, um anzuzeigen, dass keine solche Lösung vorhanden ist.

Sie müssen in der Lage sein, Ihre Übermittlung für alle Eingabewerte von xund nim zulässigen Bereich vollständig auf Ihrem Computer auszuführen . Dies ist Code Golf, also gewinnt die kürzeste Lösung.

Diese alte verwandte Frage verwendet mehr Operatoren (und nur 4s) und daher sind alle Zahlen von 0 bis 100 lösbar, was für diese Herausforderung nicht zutrifft.

Ein- und Ausgabe

Ihr Code verwendet zwei Ganzzahlen xund nals Eingabe und sollte eine Lösung (oder einen Hinweis darauf, dass es keine Lösung gibt) in einem von Menschen lesbaren Format ausgeben, das Sie für zweckmäßig halten. Eingabe 4 6würde bedeuten "Verwenden Sie bis zu vier 4s, machen Sie zum Beispiel die Zahl 6". Also, wenn der Eingang 4 6der Ausgang ist, könnte sein (4+4)/4+4.

Anush
quelle
1
Hilfreiche Referenz
Ingenieur Toast
2
Können Parens mit Verkettung kombiniert werden? zB `(4/4) (4/4) = (1) (1) = 11?
Digitales Trauma
1
Das Hinzufügen von Klammern (und das Nichtzulassen von Klammern + Verkettung) macht dies erheblich schwieriger
Draconis
2
Wenn Sie den Exponentiationsoperator und eine äußere Schleife über die Häufigkeit der
Peter Taylor
2
@PeterTaylor Die Klammern scheinen einen großen Unterschied zu machen. Ich würde für eine Wiedereröffnung stimmen, wenn ich könnte.
Felipa

Antworten:

4

Python 3 , 265 Bytes

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

Probieren Sie es online aus!

Funktioniert für alle Nummern in der von Engineer Toast verknüpften Referenz .

Läuft bis zu x=8tio, x=9dauert ein paar Minuten auf meinem Computer.


Die Funktion ggibt eine Menge aller Kombinationen mit höchstens einer xAnzahl zurück x. fdurchläuft sie dann und gibt die erste zurück, die die Zahl ergibt n.

Die Anzahl der möglichen Werte, die ich für jeden gefunden habe, xsind:

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

Alle oben genannten Zahlen können von erzeugt werden (a+b), (a-b), (a+b), a*b, a/b, (a/b), und a^b. a+bund a-bgeben Sie nicht mehr Zahlen.

a^b wird auch nur einmal verwendet, da sonst große Zahlen entstehen (dies wird auch im obigen Referenzdokument überprüft).


Eine alternative Version, die kurzschließt, sobald eine Lösung gefunden wird (nicht so golfen):

Dies ist viel schneller, da für x=7..9alle Nummern erstellt werden kann.

Python 3 , 338 289 Bytes

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

Probieren Sie es online aus!

TFeld
quelle
Das ist eine sehr schöne Antwort! Ich dachte, Sie verwenden immer genau (im Gegensatz zu bis zu) x xs (z. B. (4/4**(4-4))für 4), aber es stellt sich heraus, dass dies nicht der Fall ist.
Anush
exit(e)ist kürzer alsreturn e
mbomb007