Nie tylko układanka czterech czwórek

11

W tym wariancie układanki Cztery czwórki powinieneś użyć do x x's(i żadnej innej liczby) oraz zdefiniowanego zestawu operacji, aby osiągnąć każdą liczbę od 0 do 100. Jeśli x = 4wtedy możesz użyć do czterech, 4sto pytanie stanie się klasyczną czwórką puzzle (z wyjątkiem tego, że możesz użyć maksymalnie czterech 4 zamiast konieczności używania dokładnie czterech). Zakładamy 1 < x <= 9.

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

  • Dodawanie ( +), odejmowanie ( -), mnożenie ( *), dzielenie ( /). Zauważ, że to prawdziwy podział, więc 5/2 = 2.5.
  • Potęgowanie (np. 4 ^ 4), ponieważ nie wymagałoby to żadnych dodatkowych symboli, gdyby były pisane ręcznie.
  • Możesz tworzyć nowe liczby całkowite, łącząc xs. Np. Możesz zrobić liczby całkowite 4, 44, 444, 4444.

Możesz także użyć nawiasów do grupowania numerów po prostu w celu kontrolowania kolejności oceny operatorów. Nie można na przykład łączyć nawiasów z konkatenacją jak w (4/4)(4/4) = (1)(1) = 11.

Nie można stosować żadnych innych symboli i obowiązuje standardowa kolejność operacji.

Twój program powinien wygenerować poprawne rozwiązanie dla danych wejściowych, jeśli istnieje xw zdefiniowanym zakresie oraz npomiędzy 0i 100włącznie. W przeciwnym razie twój kod musi wypisać coś, co wskaże, że takie rozwiązanie nie istnieje.

Musisz być w stanie uruchomić przesyłanie do ukończenia na swoim komputerze dla wszystkich wartości wejściowych xi ndozwolonego zakresu. To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie.

To stare powiązane pytanie wykorzystuje więcej operatorów (i tylko 4), a zatem wszystkie liczby od 0 do 100 są rozwiązywalne, co nie będzie prawdziwe dla tego wyzwania.

Wejście i wyjście

Twój kod przyjmuje dwie liczby całkowite xi njako dane wejściowe i powinien wypisywać rozwiązanie (lub wskazanie, że nie ma rozwiązania) w dowolnym formacie czytelnym dla człowieka, który uważasz za dogodny. Dane wejściowe 4 6oznaczają na przykład: „Używając maksymalnie czterech 4, uczyń liczbę 6”. Więc jeśli wejście jest 4 6wyjściem może być (4+4)/4+4.

Anush
źródło
1
Pomocne informacje
Toast inżynierski
2
Czy można łączyć pareny z konkatenacją? np. `(4/4) (4/4) = (1) (1) = 11?
Cyfrowa trauma
1
Dodanie nawiasów (i niedozwolone nawiasów + konkatenacja) znacznie utrudnia
Draconis
2
Dodając operator potęgowania i zewnętrzną pętlę ponad liczbę razy, gdy cyfra jest używana, nie dodawaj przez IMO niczego niebanalnego nad codegolf.stackexchange.com/q/82884/194
Peter Taylor
2
@PeterTaylor Nawiasy wydają się mieć spore znaczenie. Głosowałbym na ponowne otwarcie, gdybym mógł.
felipa

Odpowiedzi:

4

Python 3 , 265 bajtów

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{}

Wypróbuj online!

Działa dla wszystkich liczb w odnośniku połączonym przez Engineer Toast.

Podbiega do x=8na Tio, x=9zajmuje kilka minut na moim komputerze.


Funkcja gzwraca zestaw wszystkich kombinacji z co najwyżej xliczbą x. fnastępnie zapętla je i zwraca pierwszą, która zwraca liczbę n.

Znalazłem dla każdego możliwą wartość x:

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

Wszystkie numery powyżej mogą być generowane z (a+b), (a-b), (a+b), a*b, a/b, (a/b), i a^b. a+bi a-bnie podawaj więcej liczb.

a^b jest również używany tylko raz, ponieważ w przeciwnym razie tworzone są ogromne liczby (jest to również weryfikowane w powyższym dokumencie referencyjnym)


Alternatywna wersja, która zwiera, gdy tylko znajdzie rozwiązanie (nie tak jak w golfa):

Jest to o wiele szybsze, ponieważ dla x=7..9wszystkich liczb można utworzyć.

Python 3 , 338 289 bajtów

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

Wypróbuj online!

TFeld
źródło
To bardzo miła odpowiedź! Myślałem, że zawsze używasz dokładnie (w przeciwieństwie do) x xs (np. (4/4**(4-4))Dla 4), ale okazuje się, że tak nie jest.
Anush
exit(e)jest krótszy niżreturn e
mbomb007