Wprowadzenie
To jedna z moich ulubionych zagadek matematycznych.
Biorąc pod uwagę cyfrę (powiedzmy 3) i liczbę jej użycia (powiedzmy 5), wygeneruj 10 wyrażeń, które dają 1, 2, 3, 4, 5, 6, 7, 8, 9 i 10 używając tylko +, -, ×, ÷, ^ i √ (root) (nawiasy są dozwolone do grupowania operacji).
Na przykład:
(3^3 + 3)/(3 + 3) = (33 - 3)/(3 + 3) = 3 + 3/3 + 3/3 = 5
Zauważ, że wszystkie powyższe używają pięciu 3 i operacji matematycznych i dają wynik 5. Możesz również użyć 3 przed √, aby określić pierwiastek kostki. To samo dotyczy użycia 4 przed √ do oznaczenia czwartego katalogu głównego.
Zauważ też, że dwa 3 mogą być użyte do utworzenia 33, lub trzy 3 mogą być użyte do utworzenia 333 i tak dalej.
Wyzwanie
- Otrzymasz dwie liczby (obie od 1 do 5) jako argument funkcji, STDIN lub argument wiersza poleceń.
- Pierwsza liczba oznacza, która cyfra ma zostać użyta, a druga liczba oznacza, ile razy ta cyfra ma być użyta w wyrażeniu.
- Twój program powinien wypisać tablicę o rozmiarze 10 (lub 10 liczb oddzielonych spacją), w których każdy element wskazuje, czy wyrażenie matematyczne (przy użyciu tylko dozwolonych operatorów) wynikające z
(index + 1)
liczby jest możliwe, czy też nie, używając wartości prawda / fałsz.
Na przykład, jeśli dane wejściowe to
1 3
Wtedy wyjście powinno być
[1, 1, 1, 0, 0, 0, 0, 0, 0, 1]
ponieważ tylko 1, 2, 3 i 10 można wyrazić za pomocą trzech 1.
Wynik
- To jest golf golfowy, więc wygrywa minimalna długość kodu w bajtach.
Premia
Print-em-all [−50]
Odejmij 50 od swojego wyniku, jeśli elementy tablicy wyjściowej są równe całkowitej liczbie możliwych kombinacji, aby uzyskać (index + 1)
wartość zamiast wartości prawdziwych lub fałszywych.
Na przykład, jeśli istnieją tylko 3 możliwe kombinacje pięciu 3, które dają wynik 5, wówczas tablica wyjściowa jest czwarta wpis powinien 3.
Extreme Maths [−100]
Odejmij 100 od wyniku, jeśli elementy tablicy wyjściowej zawierają co najmniej jedno z rzeczywistych wyrażeń, które wynikają z (index + 1)
wartości.
Na przykład, za pomocą pięciu 3'S, tablica wyjściowego 4 p wpis może być (3^3 + 3)/(3 + 3)
, (33 - 3)/(3 + 3)
lub3 + 3/3 + 3/3
Przekroczony [−200]
Odejmij 200 od swojego wyniku, jeśli elementy tablicy wyjściowej zawierają wszystkie możliwe kombinacje (oddzielone przez |
). Ta premia jest dodawana do Extreme Maths premii , więc w sumie dostajesz −300.
Na przykład, za pomocą pięciu 3'S, 4 macierz wynikową w ty element powinien być(3^3 + 3)/(3 + 3)|(33 - 3)/(3 + 3)|3 + 3/3 + 3/3
Uwaga: Dowolne dwa wyrażenia, aby osiągnąć ten sam wynik, powinny być logicznie różne z innym podejściem w obu z nich.
Na przykład, aby uzyskać 5 za pomocą pięciu 3, 3 + 3/3 + 3/3
jest to samo co 3/3 + 3 + 3/3
lub 3/3 + 3/3 + 3
dlatego, że dla każdego z nich zastosowano takie samo podejście. (3^3 + 3)/(3 + 3)
i (33 - 3)/(3 + 3)
różnią się, ponieważ 30 w liczniku jest osiągane za pomocą różnych podejść.
AKTUALIZACJA : Po przejrzeniu wszystkich odpowiedzi stwierdzono, że wszystkie odpowiedzi miały niedoskonałości z powodu skrajnych przypadków jednostkowych-
i √. W związku z tym pominięcie tych przypadkowych przypadków uznano za prawidłowe, o ile chodzi o kompletność odpowiedzi.
To trudne pytanie, ale dość interesujące.
Miłej gry w golfa!
źródło
1
s?Odpowiedzi:
Python 3 (niedoskonały), 449 - 300 = 149
Cierpi na te same wady co rozwiązanie KSab : brak jednoargumentowych operatorów, w pełni nawiasowanych, zawiera równoważne wyrażenia, takie jak
(1+1)+1
i1+(1+1)
. Wyeliminowałem dokładne duplikaty, przekazując wyniki doset()
. Dane wyjściowe mogą być nieco brzydsze, aby zaoszczędzić kilka bajtów, ale podoba mi się to w ten sposób. Nie zrobiłem też n-tego roota, ponieważ nie wydaje się, żeby kupowali ci dużo w tym problemie.Uruchomienie zajmie kilka minut, jeśli drugim argumentem będzie 5. Przetestuj, wywołując
m(digit, number)
:źródło
Python (niedoskonały)
493474 - 300 = 174Istnieje wiele problemów z tym rozwiązaniem, po pierwsze, że ignoruje on zbyt duży wykładnik (taki, w którym wykładnik jest większy niż 100). Właściwie nie sądzę, że to usuwa wszelkie możliwości dla danych wejściowych mniejszych lub równych 5, ale nie jestem w 100% pewien.
Inną rzeczą jest to, że nie bierze pod uwagę żadnych jednorzędowych pierwiastków kwadratowych, ponieważ byłoby to skomplikowane (każde rozwiązanie z dowolnym terminem równym 0 lub 1 dałoby nieskończoną liczbę rozwiązań). Nie bierze również pod uwagę jednoznacznej negacji (symbol „-”) z tego samego powodu, a także faktu, że tak naprawdę nie jestem pewien, czy pytanie zostało zadane.
Zastanawiałem się również, jakie kryteria powinny zdecydować, czy dwa wyrażenia są równoważne, ale nie mogłem znaleźć sposobu na rygorystyczne zdefiniowanie go w sposób, który uznałem za intuicyjny, więc (przynajmniej na razie) nie wdrożyłem czegoś takiego. Oznacza to, że generuje całkiem sporo wyników, a także używa nawiasów w dość naiwny sposób.
Na marginesie myślę, że może to obejmować najdłuższy pojedynczy wiersz kodu, jaki napisałem, zwłaszcza zanim został w pełni zagrany w golfa.
Przykład: („v” oznacza „√”)
źródło
L
:L=lambda D,N:[(int(str(D)*N),str(D)*N)]+[(o(u,v),"(%s%s%s)"%(s,c,t))for p in R(1,N)for u,s in L(D,p)for v,t in L(D,N-p)for c,o in[('+',F('a+b')),('-',F('a-b')),('*',F('a*b')),('/',F("1.*a/b if b else''")),('^',F("''if(a<0 and int(b)!=b)|(a and b<0)or b>100 else a**b")),('v',F("''if a==0 or(b<0 and int(1./a)!=(1./a))or(b or a<0)or(1./a)>100 else b**(1./a)"))]if o(u,v)!='']
0
tym próbowałem zanegować stwierdzenie, a następnie zamienić konsekwencje. Znalazłem też kilka miejsc do użycia|
i&
zamiastor
iand
. Obie te sztuczki może być wykorzystany do skrócenia ostatniego połączenia do F, ale ten wymagałby trochę Demorgana i zabrakło mi czasu dzioba; peval
jagniąt i - zajęło mi sporo czasu, aby wymyślić swoją drugą linię! Myślę jednak, że udało ci się pokonać „najdłuższą pojedynczą linię”. ;) Zgadzam się na ignorowanie dużych wykładników; w rzeczywistości uważam, że żaden wykładnik większy niż 9 nie będzie przydatny (z wyjątkiem braku możliwości, gdy podstawa wynosi 1).3 = 33 √ (3 ^ 33)
. Właściwie pisząc to, zdaję sobie sprawę, że dwie (prawdopodobnie jedyne dwie?) Kombinacje, na które moja odpowiedź nie trafia,4 = (4^4) √ (4 ^ (4^4))
i równoważne wyrażenie z5
s. Wprawdzie root nie wydaje się zbytnio powiększać problemu, ponieważ zdecydowana większość z nich jest albo używana jako brak operacji na 0 lub 1, brak operacji, gdy root ma wartość 1, lub po prostu w celu anulowania mocy.Python
3-349346Oto raczej niezgrabna wersja:
Do testowania zalecam zmianę
(9)
na coś mniejszego, ponieważ jest to liczba uwzględnionych wielu pierwiastków kwadratowych, co ma ogromny wpływ na wydajność.W końcu zastanawiałem się, czy jednostajny minus jest rzeczywiście potrzebny w niektórych przypadkach…
źródło
1 = 3^3 * 3^(-3)
, ale nawet biorąc pod uwagę te, wątpię, aby istniały jakieś liczby, dla których jest to możliwe rozwiązanie, gdy nie ma innych.a**.5**%i
zamiasta**(1/2**%i)
obliczać wiele pierwiastków kwadratowych.Mathematica - 246 znaków (nie zgłoszono żadnych bonusów)
Wyjaśnienie
Funkcjonować
j
łączy cyfrowo dwie liczby.Funkcja
z
przyjmuje wynikr
, liczbęn
i listę funkcjiL
, z których każda działa na dwóch argumentach. Następnie stosuje sekwencyjnie listę funkcji do argumentów[r,n]
za pomocą rekurencji, aż lista będzie pusta, po czym zwraca wynik.Funkcja
a
przyjmuje liczbęn
i liczbę kopiit
. Tworzy wszystkie krotki długości (t-1) z listy funkcji{Plus, f, Times, g, Power, h, j}
i wysyła każdą krotkę przez funkcję z, a następnie zwraca listę wszystkich utworzonych liczb od 1 do 10.Przykład wykonania
a[2,3]
powracającego{1, 2, 3, 6, 8}
.Ograniczenia
Ponieważ lista funkcji jest stosowana sekwencyjnie, zużywa jedną kopię liczby za każdym razem, może pominąć niektóre kombinacje. Na przykład, gdy pracuje się na czterech dwójkach, straciłby 22/22 = 1 z powodu niemożności oceny listy funkcji w kolejności. Oczywiście 2/2 * 2/2 = 1 obejmuje ten przypadek.
źródło