Biorąc pod uwagę liczbę całkowitą wejściową n
, narysuj węża liczbowego, to znaczy pomiar siatki n x n
składający się z liczb, 1
przez n^2
które są nawinięte wokół siebie w następujący sposób:
Wejście n = 3
:
7 8 9
6 1 2
5 4 3
Wejście n = 4
:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
Wejście n = 5
:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
(Zainspirowany tym problemem z Project Euler.)
To jest golf golfowy , wygrywa najkrótsza odpowiedź w bajtach!
4
:? Lub dowolna liczba parzysta.Odpowiedzi:
MATL , 3 bajty
Wypróbuj online!
Wyjaśnienie
Wbudowane ... ¯ \ _ (ツ) _ / ¯
źródło
C #,
203202196193178 bajtówZapisano bajt dzięki @StefanDelport.
Zaoszczędź 22 bajty dzięki @FelipeNardiBatista.
Działa to poprzez następującą obserwację budowy kwadratów:
Jak widać, każdy bit jest dodawany do poprzedniego kwadratu. W przypadku liczb parzystych idziemy na prawo od miejsca, w którym się znajdujemy, aż do jednego, który jest niższy niż tam, gdzie był kwadrat, a następnie do końca. Liczby nieparzyste są w zasadzie odwrotne, idziemy w lewo, do góry, aż są powyżej aktualnej wysokości, a następnie w prawo do końca.
Wersja pełna / sformatowana:
źródło
++i<=n;
może się staćn>++i
, nic więcej nie widzę, +1.n%2<1?2:1
do2-x%2
? Nie testowałem tego w C #, ale w C i Python działało.for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,j;n>i++;){var b=i%2<1; ....
grał trochę w golfavar b=1-2*(i%2);r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;
Dyalog APL,
70564541 bajtówWypróbuj online!
W jaki sposób?
oblicza różnice między wskaźnikami;
1
i¯1
dla prawej i lewej¯⍵
oraz⍵
dla góry i dołu.1,⊢,¯1,-
pojawia się jako1 ⍵ ¯1 ¯⍵
,+⍨⍴
rozciąga tę tablicę na długość⍵×2
, dzięki czemu finał2/⍳
może powtórzyć każdy z nich, a liczba powtórzeń wzrasta co drugi element:następnie,
przygotowuje lewy górny element spirali,
ograniczyć pierwsze ⍵ 2 elementy tej listy odległości,
dokonuje skumulowanej sumy,
ocenia indeksy (
⍵[i] = ⍵[⍵[i]]
), aby przetłumaczyć pierwotną macierz na indeksy każdego elementu, i na konieckształty jako
⍵×⍵
matryca.źródło
C,
321307295284283282 bajtówDzięki zarówno @Zachary T, jak i @Jonathan Frech za grę w bajt!
Przydziela dwuwymiarową tablicę zer, a następnie zaczyna wypełniać ją gdzieś pośrodku. Na koniec drukowane są wartości, które są większe od zera, ale mniejsze lub równe kwadratowi wejścia.
Wypróbuj online!
Sformatowany:
źródło
i,j,k,a,b,m;f(n){n*=n;int**l=calloc(a=m=3*n,4);
sięi,j,k,a,b,m,**l;f(n){n*=n;l=calloc(a=m=3*n,4);
zapisać bajt?k<=n;
zn>k;
zapisać bajt.PHP , 192 bajty
Wypróbuj online!
W ten sam sposób buduj ciąg zamiast tablicy
PHP , 217 bajtów
Wypróbuj online!
źródło
[-1,1][$d&1]
->$d&1?:-1
for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);
. I jeszcze jedno:"%$l".d
. I jeszcze jedno:$x*$l*$a+$y*$l
->($x*$a+$y)*$l
.$s
do wypełnionego podkreślenia (lub litery lub cyfry); ta postać zostanie nadpisana..d
własnego podejścia, aby zaoszczędzić 2 bajtyPHP,
185 176174 bajtówUruchom jako potok
-nR
lub przetestuj go online .awaria
źródło
APL (Dyalog Classic) ,
3229 bajtówWypróbuj online!
Zastosowania
⎕io←1
. Zaczyna się od macierzy 0 na 1 (⍪⍬
). 2N razy (⍣2⍣⍵
) dodaje wysokość macierzy (≢⍵
) do każdego z jej elementów, umieszcza ją1 2...height
po prawej (,⌸
) i obraca (⌽⍉
). Po zakończeniu poprawia orientację wyniku (⊖∘⌽⍣⍵⌽
) i odwraca liczby, odejmując je od N 2 +1 (1+×⍨-
).źródło
Mathematica, 177 bajtów
źródło
C ++,
245228 bajtówWypróbuj online!
Funkcja oblicza i drukuje wartość każdej liczby macierzy w zależności od jej pozycji x, y , stosując następującą logikę:
Wersja sformatowana :
źródło
Python 3 ,
249247 bajtówInicjuję tablicę 2D i znajduję punkt początkowy, który jest środkiem nieparzystego n lub przesunięciem (-1, -1) dla parzystego n, a następnie skaluję wzór wypełnienia / kursora za pomocą bieżącego numeru „pierścienia”. Wydaje mi się, że nie potrafię interpretować wskazówek, ale nie wymyśliłem nic tańszego.
Wypróbuj online!
-2 dzięki Zachary T.
źródło
\t
i\n
jako 1 bajt wciąż otrzymuję 249 bajtówlen("def f(n): M=[n*[0]for a in range(n)] x=y=n//2-(n%2<1) M[x][y]=i=s=1 while 1: t=s*2 for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t: if i==n*n:print(*M,sep='\n');return v=[1,-1][d in'LU'] if d in'UD':x+=v else:y+=v M[x][y]=i=i+1 s+=1") 223
Wolfram Language (Mathematica) ,
(...)83 bajtyBajt mierzony w UTF8,
\[LeftFloor]
(⌊
) i\[RightFloor]
(⌋
) kosztuje 3 bajty każdy. Mathematica nie ma żadnego specjalnego zestawu znaków bajtów.Wypróbuj online!
Używa zamkniętego formularza dla każdego z 4 przypadków, a następnie dokłada maksimum ostrożnie, aby uzyskać pożądany wynik.
Zwraca tablicę liczb całkowitych 2D. Nie jestem pewien, czy jest to dozwolone i chociaż zostało to poproszone w komentarzach , OP nie odpowiedział.
źródło
Clojure, 206 bajtów
Wydaje mi się, że to przyzwoity początek, buduje tablicę w sekwencji na mapie mieszającej, a następnie dzieli ją na
n x n
listy. Którydefmacro
zakończył się dość długo, ale kod jest jeszcze krótszy z nim niż bez. Czy istnieje więcej składni succint, aby to opisać?Większość bajtów oblicza punkt początkowy i buduje logikę wyszukiwania dla następnej prędkości
v
. Być może zagnieżdżenievec
byłoby lepsze, ale wtedy masz dwa indeksy i prędkości do śledzenia.źródło
J , 41 bajtów
Wypróbuj online!
Robi to samo co składanie APL ngn, ale zaczyna się od macierzy 1 na 1 i powtarza 2 × N − 2 razy.
źródło
Python 165 (lub 144)
Spowoduje to utworzenie tablicy numpy, a następnie obrócenie jej i dodanie boku, aż do uzyskania prawidłowego rozmiaru. Pytanie nie określało, czy ten sam punkt początkowy musi być użyty dla liczb parzystych i nieparzystych, jeśli tak nie jest, linię
if n%2==0:a=r(r(a))
można usunąć, oszczędzając 21 bajtów.źródło
J , 41 bajtów
standardowe formatowanie
Podejście to opiera się na At Play With J Volutes (APL Uriela używa podobnej techniki).
Jest to nieoczekiwane i wystarczająco eleganckie, aby uzasadnić odpowiedź na drugie pytanie, pomyślałem.
Zasadniczo nie robimy nic proceduralnego ani nawet geometrycznego. Zamiast tego tworzymy arytmetycznie prostą sekwencję, która po zsumowaniu i stopniowaniu skanu daje prawidłową kolejność spiralnej liczby od lewej do prawej, od góry do dołu. Następnie kształtujemy to w matrycę i gotowe.
Dodam bardziej szczegółowe wyjaśnienie, gdy pozwala na to czas, ale link do artykułu wyjaśnia to dogłębnie.
Wypróbuj online!
źródło
Python 3 (bez stosu) ,
192188179150 bajtówWypróbuj online!
Zapisane 4 bajty, ponieważ obrót fazorów o 90 stopni można łatwo wykonać bez liczb zespolonych
źródło
R 183 bajtów
Wypróbuj online!
Wyjście to wąż matrycowy (lub matryca wężowa, cokolwiek). Prawdopodobnie nie jest to najskuteczniejsza metoda i prawdopodobnie można ją grać w golfa, ale pomyślałem, że warto ją pokazać. Właściwie jestem z tego dumny!
Metoda buduje macierz od środka, zawsze dodając dodatkową liczbę liczb całkowitych równą liczbie kolumn w macierzy przed dołączeniem. Poniższy wzorzec wiąże albo kolumny, albo wiersze, jednocześnie odwracając niektóre wartości, aby były dołączane we właściwej kolejności.
193 bajtów
Dokładnie tak samo jak powyżej, ale ostateczny
b
jestWypróbuj online!
co daje nieco czystszy wynik, ale nie widziałem żadnych specjalnych kryteriów dla wyjścia, więc pierwsza odpowiedź powinna zadziałać, jeśli się nie mylę.
źródło