Vier Vierer Puzzle

21

Das Four Fours-Puzzle ist ein beliebtes mathematisches Freizeitpuzzle, bei dem genau vier 4er (und keine andere Zahl) und eine definierte Menge von Operationen verwendet werden, um jede Zahl von 0 bis zu einem bestimmten Maximum zu erreichen.

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

  • Beliebige Gruppierungssymbole können verwendet werden
  • Addition ( +), Subtraktion ( -), Multiplikation ( *), Division ( /)
  • Fakultät ( !), Gamma-Funktion ( Γ)
  • Potenzierung ( ^), Quadratwurzel ( )
  • Verkettung (zB 44ist zwei 4s)
  • Dezimalpunkt (z. B. 4.4zwei 4s), Überstrich (z. B. .4~ = 4/9)

Es gilt die Standardreihenfolge.

Ihr Programm sollte bei einer Eingabe zwischen 0 und 100 eine korrekte Lösung für diese Eingabe generieren. Wenn das Programm eine ungültige Lösung für eine Eingabe ausgibt, ist das Programm ungültig.

Beispielsweise 0könnte Ihr Programm mit einer Eingabe von erzeugen 44-44.

Die Verwendung externer Module ist nicht gestattet. Nur _.4~ist für den Overbar-Operator zulässig, dh nur für einen4 darf hinter dem Dezimalpunkt stehen.

Dies ist Codegolf, also gewinnt die kürzeste Lösung.


Bearbeiten : Um besonders deutlich zu sein, muss das Programm eine Reihe der oben genannten Operationen ausgeben, die auf genau vier 4Sekunden angewendet werden - nicht mehr und nicht weniger. Auch .4 = 4/10ist ein gültiger Begriff und zählt als nur eine Verwendung 4.

Flüchtigkeit
quelle
Keine Rundungsoperationen? :-(
John Dvorak
@JanDvorak äh, nein, das wäre nicht erlaubt.
Volatility
Gamma und Fakultät sind beide erlaubt?
John Dvorak
@JanDvorak Alle aufgelisteten Elemente (aber nur die aufgelisteten Elemente) können verwendet werden.
Volatility
Dürfen wir Fakultät als Präfixfunktion ausgeben ( !(4)anstatt (4)!)?
John Dvorak

Antworten:

6

GolfScript (129 Zeichen *)

[4.`2'√4'24'4!'6'Γ4'1'Γ√4'120'ΓΓ4']2/:F{.F=[[44.`]]*\{`{+{'+*-'1/{:^;.[~@[\]{'()'1/*}%^*@@^~\]\}/}:|~2/~\+|;}+F/}%+}3*\{\0==}+?1=

Die Laufzeit auf meinem PC liegt in der Größenordnung von 4 Minuten. Eine moderate Beschleunigung kann auf Kosten von zwei Zeichen erzielt werden, indem .&unmittelbar nach dem eine Eindeutigkeitsoperation hinzugefügt wird %+.

Ich benutze vorcodierte Ausdrücke für 1, 2, 4, 6, 24, 120, und 44, und baue die oben von dem Rest nur mit +, *und- . Auf diese Weise muss ich im Programm selbst keine nicht ganzzahlige Arithmetik ausführen. Ich habe versucht, einfachere Ausdrücke zu erhalten, indem ich die einfacheren vorcodierten Werte am Anfang platziert habe.

Alle diese Werte sind erforderlich und es müssen beide Subtraktionsrichtungen unterstützt werden ( complex_expression - simple_expressionund umgekehrt). Es ist auch notwendig, einige Operationen einzuschließen, die Klammern erfordern (insbesondere a*(b-c)), so dass ich alle Unterausdrücke wahllos in Klammern setze.

* Ich zähle Unicode-Codepunkte unter der Annahme, dass das Programm UTF-8-codiert ist, und gehe davon aus, dass der Interpreter nur dann als ASCII-Zeichen behandelt wird, wenn Sie eine neuere Version von Ruby verwenden. Wenn Sie darüber sehr besorgt sind, verwenden Sie Gfür Gamma und vfür sqrt.

Naja, ich könnte 44im Gegenzug für 11as 44/4und 71as strikt entfernen √(Γ√4+(ΓΓ4+Γ√4)!), aber das ist kein guter Kompromiss.

Peter Taylor
quelle
7

Python 155 Bytes

h={4:'4',24:'4!',6:'â4',.4:'.4',1:'âû4',4/9.:'.4~'}
f={}
def g(r,s='24',y='4!'):f[eval(s)]=y;[g(r-1,s+o+`k`,y+o+h[k])for k in h for o in'/*-+'if r]
g(3)

Die ersten drei Bytes ( \xEF\xBB\xBF) sind die UTF-8-Bytereihenfolge, obwohl die Datei in einem ANSI-Format gespeichert werden sollte. Das ûund âwird als und Γin cp437 bzw. cp850 interpretiert , die fast jedem Windows - Rechner arbeiten sollten.

Die Laufzeit auf meinem Computer beträgt ungefähr 0,4 Sekunden.

Beispielnutzung (Name der Datei four_fours.py):

$ python
>>> from four_fours import f
>>> f[39]
'4!+4!/.4/4'
>>> f[87]
'4!*4-4/.4~'
>>> for i in range(101): print i, f[i]
0 4!+4!-4!-4!
1 4!+4!/4!-4!
2 4!-4!+Γ4-4
3 4!-4!+4-Γ√4
4 4!+4!/Γ4-4!
.
.
.
96 4!+4!+4!+4!
97 4!*4!/Γ4+Γ√4
98 4!*4+Γ4-4
99 4!*4+4-Γ√4
100 4!*4!/Γ4+4

Ergebnisse für 0..100 . Aufgrund der Art und Weise, wie der Hash iteriert wird, wird die Verwendung 4!so oft wie möglich bevorzugt .

Bearbeiten: Speichert eine Anzahl von Bytes durch Hinzufügen Γ√4 = 1, wodurch keine Gruppierungen √4 = 2mehr erforderlich sind , und durch Entfernen , was nicht mehr erforderlich ist.

primo
quelle
4

J 175 161 Zeichen

   f=.')',~'(',;@((<;._2'+ - * % .4 .4~ g(r(4)) r(4) 4 g(4) 4! ( ) '){~(143402 A.i.9)
      /:~(12,11,0,6$0 4 4)+(9$4 7 7)#:((,@(+/,-/,*/,%/)~)^:2,0.4 4r9 1 2 4 6 24)&i.)

   f 1
(.4+.4)+(.4%r(4))

   f 42
(r(4)+4)+(g(4)*g(4))

   f 100
(r(4)+r(4))+(4*4!)

Überprüftes Format ist (v op v) op (v op v)wo v={0.4 4/9 1 2 4 6 24}undop={+ - * /}

volle 0..100 Ergebnisse

randomra
quelle
Ich glaube nicht, dass .4es eine gültige Nummer für dieses Spiel ist.
John Dvorak
@ JanDvorak es ist - vielleicht hätte ich es klarer machen sollen
Volatility