Układanka Cztery Czwórki

21

Czterech czwórek puzzle jest popularnym rekreacyjnych puzzle matematyczne, które polega na użyciu dokładnie cztery 4s (i żaden inny numer) i zdefiniowany zestaw operacji, aby osiągnąć każdy numer od 0 do danego maksimum.

W tej wersji dozwolone są tylko następujące operatory:

  • Można stosować dowolne symbole grupujące
  • Dodawanie ( +), odejmowanie ( -), mnożenie ( *), dzielenie ( /)
  • Factorial ( !), funkcja Gamma ( Γ)
  • Potęgowanie ( ^), pierwiastek kwadratowy ( )
  • Łączenie (np. 44To dwa 4s)
  • Kropka dziesiętna (np. 4.4To dwa 4s), Overbar (np. .4~ = 4/9)

Obowiązuje standardowa kolejność operacji.

Twój program powinien wygenerować poprawne rozwiązanie dla danych wejściowych od 0 do 100 włącznie. Jeśli program wyświetli nieprawidłowe rozwiązanie dla dowolnego wejścia, program jest nieprawidłowy.

Na przykład po wprowadzeniu wartości 0program może wygenerować 44-44.

Korzystanie z zewnętrznych modułów jest niedozwolone. Dozwolony _.4~jest tylko operator naziemny - to znaczy tylko jeden 4może znajdować się za kropką dziesiętną.

To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie.


Edycja : Aby być bardziej przejrzystym, program musi wypisać zestaw powyższych operacji zastosowanych do dokładnie czterech 4s - nie więcej, nie mniej. Ponadto .4 = 4/10jest prawidłowym terminem i liczy się jako użycie tylko jednego 4.

Zmienność
źródło
brak operacji zaokrąglania? :-(
John Dvorak,
@JanDvorak nie, nie, to nie byłoby dozwolone.
Zmienność
Czy zarówno gamma, jak i silnia są dozwolone?
John Dvorak,
@JanDvorak wszystko, co jest na liście (ale tylko rzeczy, które są na liście) mogą być używane.
Zmienność
czy wolno nam wyprowadzać silnię jako funkcję przedrostka ( !(4)zamiast (4)!)?
John Dvorak,

Odpowiedzi:

6

GolfScript (129 znaków *)

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

Czas pracy na moim komputerze to 4 minuty. Umiarkowane przyspieszenie można uzyskać kosztem dwóch postaci, dodając operację wyjątkowości .&bezpośrednio po %+.

Używam PREKODOWANE wyrażeń na 1, 2, 4, 6, 24, 120, i 44, i zbudować odpocząć od tych, używając tylko +, *i -. W ten sposób nie muszę wykonywać żadnej arytmetyki niecałkowitej w samym programie. Próbowałem uzyskać prostsze wyrażenia, umieszczając prostsze wstępnie zakodowane wartości na początku.

Wszystkie te wartości są wymagane i konieczne jest wsparcie obu kierunków odejmowania ( complex_expression - simple_expressioni odwrotnie). Konieczne jest również uwzględnienie niektórych operacji, które wymagają nawiasów (a konkretnie a*(b-c)), więc wszystkie podwyrażenia dzielę bez rozróżnienia.

* Liczę punkty kodu Unicode, zakładając, że program jest zakodowany w UTF-8, i szczotkuję pod dywan fakt, że jeśli nie używasz najnowszej wersji Ruby do uruchomienia interpretera, to naprawdę traktuje go jako znaki ASCII. Jeśli bardzo się tym martwisz, użyj Gdla Gamma i vsqrt.

Cóż, ściśle mógłbym usunąć 44w zamian za 11jak 44/4i 71jak √(Γ√4+(ΓΓ4+Γ√4)!), ale to nie jest dobry kompromis.

Peter Taylor
źródło
7

Python 155 bajtów

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)

Pierwsze trzy bajty ( \xEF\xBB\xBF) to znak kolejności bajtów UTF-8, chociaż plik należy zapisać w formacie ANSI. ûI âbędzie interpretowana jako i Γodpowiednio w cp437 i cp850 , który powinien działać na niemal każdym polu Windows.

Czas działania wynosi około 0,4 s na moim komputerze.

Przykładowe użycie (nazwij plik 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

Wyniki dla 0..100 . Ze względu na sposób iteracji skrótu woli używać go 4!tak często, jak to możliwe.

Edycja: zapisano pewną liczbę bajtów, dodając Γ√4 = 1, co eliminuje potrzebę grupowania, i usuwając √4 = 2, co nie było już konieczne.

primo
źródło
4

JOT, 175 161 znaków

   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!)

Sprawdzony format to (v op v) op (v op v) gdzie v={0.4 4/9 1 2 4 6 24}iop={+ - * /}

pełne wyniki 0..100

randomra
źródło
Nie sądzę, że .4jest to poprawny numer dla tej gry.
John Dvorak
@JanDvorak to jest - może powinienem był to wyjaśnić
Zmienność