Spirala liczbowa jest nieskończoną siatką, której lewy górny kwadrat ma liczbę 1. Oto pięć pierwszych warstw spirali:
Twoim zadaniem jest znalezienie liczby w wierszu yi kolumnie x.
Przykład:
Input: 2 3
Out : 8
Input: 1 1
Out : 1
Input: 4 2
Out : 15
Uwaga:
- Dowolny język programowania jest dozwolony.
- Jest to wyzwanie dla golfa, więc wygrywa najkrótszy kod.
- Powodzenia!
Odpowiedzi:
C (gcc),
4443 bajtyWypróbuj online!
Spirala ma kilka „ramion”:
Pozycja znajduje się na ramieniu max ( x , y ) (przypisana do zmiennej ). Zatem największa liczba na ramieniu to , co na przemian znajduje się w lewym dolnym rogu i prawym górnym ramieniu. Odejmowanie od daje sekwencję poruszające się wzdłuż ramienia , więc wybieramy odpowiedni znak na podstawie parzystość , dostosuj przez aby uzyskać sekwencję zaczynającą się od 0, i odejmij tę wartość od(x,y) max(x,y) n n2 x y −n+1,−n+2,…,−1,0,1,…,n−1,n−2 n n n−1 n2 .
z
n 2Podziękowania dla pana Xcodera za uratowanie bajtu.
źródło
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}
oszczędza 1 bajt.f(1, 1)
zwraca wartość1
. Sekcja Stopka zapętla się przez x = 1 do 5 i y = 1 do 5, wywołuje funkcję dla wszystkich takich wartości i wypisuje dane wyjściowe w siatce, aby wykazać, że funkcja jest poprawna dla wszystkich danych wejściowych przedstawionych w pytaniu.Python,
545049 bajtów-4 bajty dzięki @ChasBrown
-1 bajty dzięki @Shaggy
Wypróbuj online!
Pierwszy raz w golfa! Jestem bardziej niż świadomy, że nie jest to optymalne, ale cokolwiek.
Zasadniczo działa na tej samej zasadzie co kod @Doorknob C.
źródło
def f(a,b):
metody, patrz tutaj .M**2
można go zastąpićM*M
.MATL , 15 bajtów
Wypróbuj online!
Zbierz i wydrukuj jako matrycę
W jaki sposób?
Edycja: Ta sama technika, co odpowiedź @ Doorknob, po prostu przyszła inaczej.
Różnica między diagonalnymi elementami spirali to ciąg arytmetyczny . Suma n wyrażeń tego wynosi n ( n - 1 ) (zgodnie ze zwykłą formułą AP). Ta suma, zwiększona o 1, daje element diagonalny w pozycji ( n , n ) .0 , 2 , 4 , 6 , 8 , … n n ( n - 1 ) ( n , n )
Alternatywne 21 bajtowe rozwiązanie:
Wypróbuj online!
Zbieraj i drukuj jako matrycę
Z powyższego wiemy, że potrzebujemy funkcji
Niektóre podstawowe obliczenia pokażą, że jest jedno wyrażenie dla maksymalnie dwóch liczb
Jest to funkcja implementowana przez rozwiązanie.
źródło
Japt , 16 bajtów
Zaadaptowano z rozwiązania Doorknob na kilka piw.
Spróbuj
Wyjaśnienie
źródło
Pyth, 20 bajtów
Zestaw testowy
Przekład niemal dosłownym Rushabh Mehta odpowiedź „s .
Wyjaśnienie:źródło
Galaretka , 13 bajtów
Wypróbuj online!
Wykorzystuje metodę Doorknob . Zbyt długo.
źródło
»Ḃ-*×_‘+»²_»ʋ
Galaretka ,
1312 bajtówWypróbuj online!
Oblicza wartość przekątnej za pomocą
²_’Ṁ
i dodaje / odejmuje do poprawnej wartości indeksu za pomocąṀḂḤ’×I
.źródło
Brain-Flak , 76 bajtów
Wypróbuj online!
źródło
05AB1E ,
1211 bajtów-1 bajt dzięki zmianie @Emigna
Èi
naG
.Port odpowiedzi MATL @sundar , więc upewnij się, że go głosujesz!
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Èi
może byćG
.Pascal (FPC) , 90 bajtów
Wypróbuj online!
Odpowiedź Portu Doorknob , ale odpowiedź Sundara dała mi pomysł, na
z mod 2*2-1
który przekształciłem się,1and z*2-1
by usunąć przestrzeń.źródło
Matematyka 34 bajty
więc:
(*
54
*)
źródło
Julia 1.0 , 35 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 46 bajtów
źródło
Java (JDK 10) , 39 bajtów
Wypróbuj online!
Kredyty
źródło