Spirala Ulama to naprawdę fascynujący, ale zagadkowy temat w matematyce. Jak to działa szczegółowo można znaleźć tutaj , ale krótkie podsumowanie można wyjaśnić w następujący sposób:
Zaczynam od napisania jednego, a potem dwa po prawej stronie. Powyżej dwóch piszę trójkę, a po lewej stronie cztery. Kontynuuję ten wzór krążenia wokół 1 (i dowolnych liczb między mną a 1) w nieskończoność (lub dopóki nie każę przestać), tworząc spiralny wzór. (patrz przykład poniżej)
Cel
Stwórz program, który przyjmuje n (zawsze będzie liczbą nieparzystą większą od zera) jako dane wejściowe, które korelują z liczbą wierszy, a następnie wypisuje wartości liczb pierwszych rząd po rzędzie spirali Ulama. Formatowanie może być dowolne, ale musi być czytelne dla człowieka i oczywiste.
Na przykład, biorąc pod uwagę wejście 3, twój program powinien wypisać 5,3,2,7
, ponieważ 3 rzędy tworzą następującą spiralę:
5 4 3 <-- first row has the primes 5 and 3
6 1 2 <-- second row has the prime 2
7 8 9 <-- third row has the prime 7
Ponieważ jest to golf golfowy, wygrywa odpowiedź z najmniejszą liczbą bajtów (bez względu na to, jak mało wydajna)! Standardowe luki są niedopuszczalne.
Odpowiedzi:
Pyth, 20 bajtów
Wypróbuj online: demonstracja
Ten kod generuje w pełni spiralę Ulama, łączy wszystkie linie i filtry dla liczb pierwszych.
Wyjaśnienie:
źródło
MATLAB, 48
Zasadniczo tworzy to spiralę o wymaganym rozmiarze (żądanym od użytkownika), a następnie ustawia ją w taki sposób, aby pojawiała się we właściwej kolejności wierszy. Jest to przechowywane w. Następnie wyświetla wszystkie wartości w pierwszej.
Jak powiedziałeś, każdy możliwy do odczytania format, zapisałem bajt i wybrałem domyślną wartość wyjściową disp (), którą jest (w twoim przypadku testowym n = 3):
Jako dodatkowy bonus działa dla dowolnego n> 0, w tym liczb parzystych. Na przykład dane wyjściowe dla n = 10 to:
źródło
spiral
funkcjaCJam,
4233 bajtyWypróbuj online
Najnowsza wersja zawiera znaczne ulepszenia sugerowane przez @Martin.
Metodą budowy spirali jest obrócenie macierzy o 90 stopni na każdym etapie i dodanie wiersza z dodatkowymi liczbami. To się powtarza
(n / 2) * 4
.Wartości w wynikowej macierzy są następnie filtrowane pod kątem liczb pierwszych.
Wyjaśnienie:
źródło
2/4*
być zastąpiony przez2*
, czy też specjalnie go tak zostawiłeś?(2*
powinno być poprawne.Mathematica 223
To przywłaszcza kod Kuby spirali Ulama. Dlatego przesyłam go jako wiki społeczności. Po prostu grałem w golfa i wybrałem liczby pierwsze, które są wymienione według rzędu, w którym się znajdują.
Przykład
Aby poprawić wyświetlanie:
źródło
Mathematica, 118 bajtów
Generuje to spiralę Ulama w postaci liniowej, zauważając, że położenie każdej kolejnej liczby może być kumulowane jako
tzn. zacznij od środka, a następnie przesuń 1 w prawo, 1 w górę, 2 w lewo, 2 w dół, 3 w prawo, 3 w górę, ...
Wynik:
źródło
JavaScript,
516363304276243240 bajtówMoje rozwiązanie nie tworzy gęstej macierzy ze Spiralą, zamiast tego zwraca indeks, który odpowiada podanej liczbie w Matrycy Ulama dla danego rzędu. I tak iteruje liczby od 2 do M * M i tworzy tablicę liczb pierwszych o idx podanym przez fn ulamIdx
Minified wygląda następująco:
Dla wejścia 15 wyjście jest następujące:
,,,,,,,,,,,,,,,,, 197 ,,,, 193,, 191 ,,,,,,,,,,,,,,, 139, 137, , 199,, 101 ,,,, 97 ,,,,,,,, 181 ,,,,,,,, 61,, 59 ,,,, 131 ,,,, 103, 37 ,,,,,, 31, 89, 179,, 149,, 67,, 17 ,,,, 13 ,,,,,,,,,,,, 5, 3,, 29 ,,,,,, 151 ,,, , 19 ,,, 2,11,, 53,, 127 ,,,, 107,, 41,, 7 ,,,,,,,,,,,, 71 ,,,, 23 ,,,,,,, ,,, 109,, 43 ,,,, 47 ,,,, 83, 173 ,,,, 73 ,,,,,, 79 ,,,,,,,,,, 113 ,,,,,,, ,,,,, 157 ,,,,,, 163 ,,,, 167 ,,,, 211 ,,,,,,,,,,,, 223
źródło