Wprowadzenie (może zostać zignorowane)
Ustawienie wszystkich dodatnich liczb całkowitych w regularnej kolejności (1, 2, 3, ...) jest trochę nudne, prawda? Oto szereg wyzwań dotyczących permutacji (przetasowań) wszystkich liczb całkowitych dodatnich. Jest to szóste wyzwanie z tej serii (linki do pierwszego , drugiego , trzeciego , czwartego i piątego wyzwania).
To wyzwanie ma łagodny motyw wielkanocny (ponieważ jest Wielkanoc). Inspirację czerpałem z tego wysoce zdobionego (i moim zdaniem dość brzydkiego) jaja gęsiego.
Przypomniało mi to spiralę Ulama , w której wszystkie dodatnie liczby całkowite są umieszczone w spirali przeciwnie do ruchu wskazówek zegara. Ta spirala ma kilka interesujących cech związanych z liczbami pierwszymi, ale nie ma to znaczenia dla tego wyzwania.
Przechodzimy do permutacji dodatnich liczb całkowitych tego wyzwania, jeśli weźmiemy liczby ze spirali Ulam i prześledzimy wszystkie liczby całkowite w spirali obracającej się zgodnie z ruchem wskazówek zegara , zaczynając od 1. W ten sposób otrzymujemy:
1, 6, 5, 4, 3, 2, 9, 8, 7, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, etc.
Jeśli narysujesz obie spirale, uzyskasz coś w rodzaju nieskończonej siatki spiral (skorupek jaj) ( zwróć uwagę na odnośnik do Nowego Porządku ).
Zadanie
Przypadki testowe
Input | Output
---------------
1 | 1
5 | 3
20 | 10
50 | 72
78 | 76
123 | 155
1234 | 1324
3000 | 2996
9999 | 9903
29890 | 29796
Zasady
- Wejścia i wyjścia są liczbami całkowitymi.
- Twój program powinien co najmniej obsługiwać dane wejściowe w zakresie od 1 do 32767).
- Nieprawidłowe dane wejściowe (0, liczby zmiennoprzecinkowe, ciągi, wartości ujemne itp.) Mogą prowadzić do nieprzewidzianych wyników, błędów lub (nie) zdefiniowanego zachowania.
- Obowiązują domyślne reguły we / wy .
- Domyślne luki są zabronione.
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach
JavaScript (ES7),
46 4541 bajtów0-indeksowane.
Wypróbuj online!
W jaki sposób?
Jest to oparte na formule 1-indeksowanej stosowanej w przykładowych programach A090861 .
Wypróbuj online!
Wypróbuj online!
Wypróbuj online!
Co można przetłumaczyć na:
Dzięki indeksowi 0 można od razu zaoszczędzić 5 bajtów:
Formułę można dodatkowo uprościć, używając:
które można wyrazić jako:
prowadzący do:
i w końcu:
źródło
Wolfram Language (Mathematica) , 60 bajtów
Wypróbuj online!
źródło
MATL ,
1211 bajtówWypróbuj online!
Bardzo nieefektywna pamięć. Poprzedzenie
X^k
czyni go bardziej wydajne .źródło
C # (interaktywny kompilator Visual C #) , 67 bajtów
Wypróbuj online!
źródło
Python 3.8,
10474656057 bajtówEdycja: Podziękowania dla Johnathana Allana za uzyskanie od 74 do 57 bajtów!
To rozwiązanie wykorzystuje indeksowanie oparte na 0.
źródło
>
zamiast<=
ix*x
zamiastx**2
... w ten sposób:def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n
... TIOPython 3.8 (wersja wstępna) , 53 bajty
Bezpośredni port odpowiedzi JavaScript Arnaulda , idź do góry, i / lub odpowiedź Mathematica J42161217 i / lub odpowiedź Python Kapocsi :)
0-indeksowane.
Wypróbuj online!
źródło
Befunge,
6757 bajtówTo rozwiązanie zakłada indeksowanie wartości wejściowych w oparciu o 0.
Wypróbuj online!
Wyjaśnienie
Zaczynamy od obliczenia „promienia”, przy którym wejście n znajduje się w pętli:
Na końcu pętli poprzednia wartość n jest przesunięciem w spiralę w tym promieniu:
Następnie możemy ustalić, czy znajdujemy się w górnej czy dolnej części spirali w następujący sposób:
A gdy mamy już wszystkie te szczegóły, wartość spirali oblicza się za pomocą:
Promień jest jedyną wartością, którą musimy przechowywać jako „zmienną”, ograniczając ją do maksymalnej wartości 127 w Befunge-93, więc ten algorytm może obsłużyć dane wejściowe do 65024.
źródło
Japt , 15 bajtów
Port z roztworem galaretki Jonathana. 1-indeksowany.
Spróbuj
źródło
x+(1-x%2)
jestx|1
(oszczędzając bajt w galarecie), z czego ta odpowiedź może również skorzystać, założę się.C ++ (gcc) , 88 bajtów
1-indeksowany; używa formuły na stronie OEIS, ale zmanipulowano, aby zapisać kilka bajtów.
Wypróbuj online!
źródło
sqrt(n-1)/2+.5
zamiast(sqrt(n-1)+1)/2