Twoim zadaniem jest napisanie programu, który na wejściu n wypisze w kolejności minimalne wyrażenie każdej liczby od 1 do n. Najkrótszy program w bajtach wygrywa.
Minimalne wyrażenie łączy jedynki z dodawaniem i mnożeniem w celu uzyskania podanej liczby, używając jak najmniejszej liczby jedynek. Na przykład 23
wyraża się tak, jak 23=((1+1+1)(1+1)+1)(1+1+1)+1+1
jedenaście, co jest minimalne.
Wymagania:
- Program musi przyjąć jako dane wejściowe dodatnią liczbę naturalną n.
- Dane wyjściowe muszą być w tym formacie:
20 = ((1+1+1)(1+1+1)+1)(1+1)
- Twój wynik może nie zawierać niepotrzebnych nawiasów, takich jak
8 = ((1+1)(1+1))(1+1)
. - Znak mnożenia
*
jest opcjonalny. - Miejsca są opcjonalne.
- Nie musisz wyprowadzać wszystkich możliwych równań dla danej wartości: Na przykład masz wybór, aby wyprowadzić
4=1+1+1+1
lub4=(1+1)(1+1)
. Nie musisz generować obu. - Wygrywa najkrótszy program (w bajtach) w każdym języku.
1 = 1 2 = 1 + 1 3 = 1 + 1 + 1 4 = 1 + 1 + 1 + 1 5 = 1 + 1 + 1 + 1 + 1 6 = (1 + 1 + 1) (1 + 1) 7 = (1 + 1 + 1) (1 + 1) +1 8 = (1 + 1 + 1 + 1) (1 + 1) 9 = (1 + 1 + 1) (1 + 1 + 1) 10 = (1 + 1 + 1) (1 + 1 + 1) +1 11 = (1 + 1 + 1) (1 + 1 + 1) + 1 + 1 12 = (1 + 1 + 1) (1 + 1) (1 + 1) 13 = (1 + 1 + 1) (1 + 1) (1 + 1) +1 14 = ((1 + 1 + 1) (1 + 1) +1) (1 + 1) 15 = (1 + 1 + 1 + 1 + 1) (1 + 1 + 1) 16 = (1 + 1 + 1 + 1) (1 + 1) (1 + 1) 17 = (1 + 1 + 1 + 1) (1 + 1) (1 + 1) +1 18 = (1 + 1 + 1) (1 + 1 + 1) (1 + 1) 19 = (1 + 1 + 1) (1 + 1 + 1) (1 + 1) +1 20 = ((1 + 1 + 1) (1 + 1 + 1) +1) (1 + 1)
Oto kilka przypadków testowych: (pamiętaj, że dozwolone są również inne wyrażenia o tej samej liczbie 1)
157=((1+1+1)(1+1)(1+1)+1)(1+1+1)(1+1)(1+1)+1
444=((1+1+1)(1+1+1)(1+1)(1+1)+1)(1+1+1)(1+1)(1+1)
1223=((1+1+1)(1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)(1+1+1+1+1)+1+1+1
15535=((((1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)((1+1+1)(1+1)+1)+1)(1+1+1)+1)(1+1+1)(1+1+1)+1
45197=((((1+1+1)(1+1)(1+1)(1+1)+1)(1+1+1+1+1)(1+1)+1)(1+1+1)(1+1)(1+1)+1)(1+1+1+1+1)(1+1+1)+1+1
Powodzenia! - Żółw 🐢
code-golf
math
arithmetic
Żółw
źródło
źródło
n=20
) i 2) mówisz na początku, że złożoność liczb całkowitych, która jest różna od równania, musi być wyprowadzona, ale nie włączasz tego w dowolny z przykładów oprócz pierwszego.Odpowiedzi:
Pyth, 60 bajtów
Demonstracja
Kompilator online może osiągnąć 1223 przed upływem czasu, dzięki automatycznemu zapamiętywaniu funkcji Pytha.
W skrócie,
Korzysta z funkcji rekurencyjnej
'
, która oblicza wszystkie możliwe produkty i sumy, które mogłyby dać pożądany wynik, wyszukuje najkrótszy ciąg przy każdej końcowej operacji, a następnie porównuje je według1
liczby i zwraca pierwszą.Wykorzystuje funkcję pomocniczą
y
, która nawiasuje wyrażenie tylko wtedy, gdy trzeba go nawiasować.W trybie offline uruchamiam program z danymi wejściowymi
15535
i jest on prawie ukończony. Wyniki są drukowane przyrostowo, więc łatwo jest zobaczyć postęp.Ostatnie linie wyniku:
Skróconą notacją
źródło
CJam,
1051029896 bajtówWypróbuj online w interpretatorze CJam .
Testowe uruchomienie
Tłumacz online jest zbyt wolny dla większych przypadków testowych. Nawet w przypadku interpretera Java większe przypadki testowe zajmą dużo czasu i będą wymagały znacznej ilości pamięci.
Mając wystarczająco dużo czasu, opracowałoby te rozwiązania dla następnych przypadków testowych:
źródło
Julia, 229 bajtów
To jest naprawdę dość szybkie. Przypisanie
f
i uruchomienie funkcji@time f(15535)
daje wynik (tylko dwa ostatnie wiersze)i za
@time f(45197)
to dajeCo robi kod? Prosty -
C
zawiera bieżącąC
liczbę dla liczby,K
jest tablicą wskaźników śledzącą, czy wyrażenie jest zasadniczo sumą lub iloczynem, do celów obsługi nawiasów, iE
przechowujeE
sam xpression. Od czasus=1
don
czasu kod wyszukuje minimalną reprezentację liczbys
w kategoriach niższych wartości, szukając sumy lub produktu. Jeśli jest to produkt, sprawdza dwa składniki i umieszcza wokół nich nawiasy, jeśli są sumami. Sprawdzanie odbywa się w funkcjiF
, aby zaoszczędzić bajty (ponieważ należy to zrobić dwukrotnie, dla dwóch czynników).źródło