To pytanie pochodzi z tego wątku reddit autorstwa użytkownika reddit taho_teg, ale zostało rozszerzone do bardziej ogólnej „układanki”.
Masz wirówkę z 24 otworami na fiolki równomiernie rozmieszczone w okręgu wokół centralnej osi. Jeśli masz teraz kilka fiolek i chcesz uruchomić wirówkę, musisz upewnić się, że są one umieszczone w sposób zrównoważony. Jedynymi liczbami fiolek, których nie można zrównoważyć, są 1 i 23. Można na przykład zrównoważyć 4, ale można również zrównoważyć 5, tworząc „trójkąt” z 3 fiolkami i umieszczając pozostałe dwie na dwóch przeciwnych stronach.
Cel
Musisz napisać program, który akceptuje liczbę otworów (które są równomiernie rozmieszczone w okręgu wokół osi obrotu) twojej wirówki jako dane wejściowe, i który wyświetla listę liczby fiolek, których nie można wyważyć w wirówce.
Musisz wykonać obliczenia i nie możesz po prostu zakodować wstępnie obliczonych rozwiązań.
Wejścia i wyjścia muszą być zaimplementowane w taki sposób, aby kod programu nie musiał być zmieniany w celu wywołania programu dla różnych wejść. Dopuszczalne jest również napisanie funkcji (lub podobnej konstrukcji w twoim języku), którą można wywołać za pomocą konsoli.
Pamiętaj również, że jeśli masz 6 otworów w wirówce, możesz odwirować 2 i 3 fiolki, ale nie możesz zrównoważyć 5, ponieważ „trójkąt” i dwie przeciwne pokrywają się w jednym punkcie. Innym przykładem byłoby dla n = 15, że nie można zrównoważyć 11 fiolek, można zrównoważyć 6 i 5 fiolek, ale kombinacja tych roztworów będzie się nakładać (to oczywiście nie jest jeszcze kryterium, że nie można tego zrobić).
Aktualizacja
Wygląda na to, że niektórzy ludzie nie rozumieli podanego przykładu, więc zrobiłem tutaj grafikę. PROSZĘ napisać krótki opis działania algorytmu, a także kilka przykładowych danych wyjściowych do weryfikacji. Podaj następujące przykłady:
n = 1, 6, 10, 24, 63, 100 = 10^2, 163 (prime), 40320 = 8!, 65536=2^2^2^2^2, 105953 (prime)
Zauważ, że 40320 i 65536 wygenerują ogromne listy, być może dobrym pomysłem będzie wskazanie tylko długości tych list.
Jeśli znasz jakieś interesujące liczby, które chcesz dodać do tej listy, daj mi znać! Algorytm powinien działać co najmniej do n = 1 000 000.
Przykładowe wyniki:
To są przykładowe dane wyjściowe, ale być może błędne, ponieważ właśnie je obliczałem ręcznie.
1: 1
2: 1
3: 1,2
4: 1,3
5: 1,2,3,4
6: 1,5
7: 1,2,3,4,5,6
8: 1,3,5,7
9: 1,2,4,5,7,8
10:1,3,7,9
11:1,2,3,4,5,6,7,8,9,10
12:1,11
13:1,2,3,4,5,6,7,8,9,10,11,12
14:1,3,5,9,11,13
15:1,2,4,7,8,11,13,14
Wskazówka
Jeśli masz wirówkę z otworami n i nie możesz zrównoważyć np. 6 fiolek, nie będziesz również w stanie zblansować fiolek n-6 - zasadniczo to samo zadanie zrównoważyć m fiolek na pustej wirówce lub zrównoważyć napełnioną wirówkę zabierając m fiolek. Więc jeśli masz liczbę m na liście, będziesz musiał również dołączyć nm .
7 spoke wheel
i spójrz.Odpowiedzi:
Szałwia -
102104/115Po co używać teorii liczb, skoro istnieje brutalna siła?
W przypadku określonej liczby fiolek obejmuje to wszystkie sposoby pozycjonowania fiolek i oblicza ich środek ciężkości, stosując złożoną arytmetykę. Jeśli środek masy nie jest zerowy dla żadnego z tych sposobów, liczba jest zwracana.
Niestety nie działa to w niektórych przypadkach (10,14), ponieważ Sage nie upraszcza niektórych wyrażeń do zera (co może być związane z tym błędem ). Można to uznać za wadę interpretera, a nie programu, i nadal twierdzić, że algorytm i program są w porządku.
Następująca 113-znakowa alternatywa opiera się na liczbach zmiennoprzecinkowych zamiast symbolach i nie cierpi z powodu tych problemów:
Wyniki testu wersji 113-znakowej (
for n in range(14): print n,v(n)
):Nie chciałem czekać środowiska wykonawczego na wyższy
n
.Pochodzi z następującego rozwiązania Python. Dokładna arytmetyka i brak konieczności importowania niektórych modułów to całkiem coś.
Python -
173 154156Wyjście testowe tego wariantu (
for n in range(24): print n,v(n)
):Nie chciałem czekać środowiska wykonawczego na wyższy
n
.źródło
Lua - 197
Metoda nie brutalna, tworzy listę czynników i wyklucza je. Wyklucza to również liczby, które można uzyskać po dodaniu tych czynników, o ile największy użyty czynnik jest mniejszy niż liczba niewypełnionych dziur. Jeden jest zawsze drukowany i nie jest używany w algorytmie.
Przykładowe dane wyjściowe: (niektóre zostały wprowadzone jako zakresy, więc nie przekraczam limitu znaków)
źródło
Pyth -
3937 bajtówBezpośrednie tłumaczenie odpowiedzi na python @ Wrzlprmft.
Wyjaśnienie i prawdopodobnie dalsze gry w golfa już wkrótce.
Wypróbuj online tutaj .
źródło