tło
Ta łamigłówka jest odmianą układanki z czterema czwórkami (sama w sobie jest tematem poprzedniego pytania ). Podobnie jak ta łamigłówka, celem jest znalezienie wyrażeń matematycznych dla różnych liczb całkowitych, przy użyciu tylko czterech cyfr i niektórych operatorów matematycznych. Jednak w tym przypadku dozwolonymi cyframi są tylko 2, 0, 1 i 5 . Każdy musi pojawić się dokładnie raz w roztworze i we właściwej kolejności. W ten sposób można zaskoczyć wiele liczb całkowitych. Solvery są zachęcane, aby najpierw spróbować rozwiązać to ręcznie, ponieważ jest to dziwnie przyjemne.
Zasady
Stałe mogą być zbudowane z jednej lub wielu cyfr:
- Liczby całkowite: np. 2, 0, 15 itd.
- Ułamki dziesiętne: np. 2, 0,01, 1,5 itd.
- Powtarzanie ułamków dziesiętnych : np. 2 ~ (= 0,222 ...), 0,15 ~ (= 0,1555 ...), 20,15 ~~ (= 20,1515 ...)
Dozwolone są następujące operacje jednostkowe:
- Unary negation: -x
- Pierwiastek kwadratowy: sqrt (x)
- Silnia całkowita silnia: x!
Dozwolone są następujące operacje binarne:
- Standardowe operatory arytmetyczne: x + y, xy, x * y i x / y
- Dowolne potęgowanie: x ^ y
- Dowolne pierwiastki: rt [x] (y) (= x-ty pierwiastek y)
Zadanie
Twój program powinien wydrukować wyrażenia dla jak największej liczby liczb całkowitych od 0 do 100, a następnie wypisać liczbę wyprodukowanych wyrażeń.
- Rozwiązania należy wydrukować w kolejności w formacie n = [expr].
- Wyrażenia muszą używać wszystkich cyfr 2, 0, 1, 5, po jednym w tej kolejności.
- Wyrażenia muszą być wydrukowane przy użyciu zapisu opisanego powyżej. Niepotrzebne nawiasy są dozwolone, ale nie są wymagane, podobnie jak białe znaki. Kolejność pierwszeństwa operatorów to jednoargumentacja, silnia, potęgowanie, mnożenie / dzielenie i dodawanie / odejmowanie.
- Program nie musi zwracać rozwiązań dla wszystkich liczb. Dlatego program, który po prostu wyprowadza 0, jest poprawny; patrz jednak sekcja punktacji poniżej.
- Program powinien działać w niecałe 15 minut na nowoczesnym komputerze.
Możesz napisać program lub funkcję. Wyrażenia powinny być wydrukowane do STDOUT (lub najbliższej alternatywy). Liczbę wyrażeń można wydrukować do STDOUT lub zwrócić jako liczbę całkowitą. Obowiązują standardowe ograniczenia gry w golfa.
Przykładowe dane wyjściowe
0=2*0*1*5
10=20*1*.5
42=((2+0!)!+1)!/5!
100=20*1*5
4
Punktacja
Aktualizacja : @orlp zauważył wadę w systemie punktacji. Zobacz http://meta.codegolf.stackexchange.com/questions/5106/way-of-salvaging-two-zero-one-five-puzzle-challenge w celu omówienia, w jaki sposób lub czy należy to naprawić.
Rozwiązania są oceniane najpierw według liczby wyrażeń, które produkują, a następnie według długości kodu w bajtach. Dlatego program 1000-bajtowy, który daje 80 wyników, pokona program 100-bajtowy, który daje tylko 79 (choć ten ostatni można łatwo rozszerzyć o brakujące wyniki).
Dla tych, którzy chcieliby motywować cel, poniżej znajduje się dolna granica liczby wyrażeń, które mogą być reprezentowane. Nie planuję przesłać zgłoszenia, więc może być możliwe, aby wygrać mniej!
Co najmniej 85 (na 101), choć może być również wyższy.
Tablica wyników
Jako dodatkową zachętę, oto podsumowanie progresji wyniku. Za każdym razem, gdy osiągniesz najwyższy wynik, możesz dodać siebie na szczyt tabeli (lub poprosić kogoś innego).
- 0 wyrażeń, 1 bajt (Pyth): implementacja, która po prostu zwraca 0
Odpowiedzi:
85, ~ 2400 bajtów
Trochę mi smutno, że to wyzwanie dla golfistów, ponieważ wszystkie moje wcześniejsze wysiłki były raczej bezużyteczne, kiedy to opublikuję:
Odtąd jest to tylko wyzwanie kompresji. Może wezmę udział później, a może nie. Dla mnie największą frajdą było znalezienie jak największej liczby receptur.
Wskazówka dla tych, którzy próbują napisać solver - środowisko uruchomieniowe nie powinno stanowić problemu. Jeśli masz zbyt wiele formuł do sprawdzenia, potrzebujesz lepszej heurystyki, aby wyrzucić beznadziejne rozwiązania i duplikaty. Kod, który napisałem, aby wygenerować powyższe, działa w Pythonie w ~ 5 sekund.
źródło