Spójrz na następujący ciąg. Zauważ wzór?
ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL SMAR BAZYXWV N EO DP CQ BAZYXWVUTSR
Jak niektórzy mogli zauważyć, jest to w zasadzie spirala alfabetu, w której odległości między rzędami / kolumnami stopniowo rosną o 1 spację / nowy wiersz.
Rygorystyczna definicja
- Załóżmy licznik c , który początkowo wynosi 0.
- Piszemy się pierwszy c + 1 litery alfabetu od lewej do prawej:
A
. Następnie, od góry do dołu, kolejny (C + 1) (c + 2) / 2 liter (ADD
B
):AB
.Od lewej do prawej następna (c + 1) (c + 2) / 2 (dodaj
C
):AB C
I od dołu do góry, kolejne c + 1 litery (dodaj
D
):AB DC
Dotarłem do końca cyklu. Dlatego zwiększmy c (który staje się 1). Następnie zaczyna się od pierwszego kroku, jedyną różnicą jest to, że zamiast używać pierwszych c + 1 liter alfabetu, używamy kolejnych c + 1 liter, zaczynając od ostatniego elementu tego cyklu (
D
w tym przypadku więc kontynuujemyEFG...
). PoZ
osiągnięciu cykl wraca zA
.
Zadanie
Biorąc pod uwagę liczbę całkowitą N (która jest dodatnia dla indeksowania 1 lub nieujemna dla indeksowania 0), wyprowadzaj pierwsze N cykli spirali.
Zasady
Możesz użyć małych lub wielkich liter, ale twój wybór musi być spójny (użyj tylko jednego z nich, mieszanie nie jest dozwolone).
Możesz pobierać dane wejściowe i generować dane wyjściowe za pomocą dowolnej standardowej metody w dowolnym języku programowania , zwracając uwagę, że te luki są domyślnie zabronione.
Dopuszczalne formaty wyjściowe: łańcuch wielowierszowy, lista ciągów reprezentujących linie, lista zawierająca wiele list znaków, każdy reprezentujący jedną linię, lub cokolwiek innego, co uważasz za odpowiednie. Jeśli nie wybierzesz pierwszego formatu, dobrze byłoby dołączyć ładną wersję swojego kodu.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach (w każdym języku), który spełnia wymagania!
Przypadki testowe
Wejściowa liczba całkowita zostanie oddzielona odpowiadającym jej wyjściem przez nowy wiersz, a testy zostaną rozdzielone za pomocą myślników. Pamiętaj, że są one indeksowane 1.
1 AB DC -------- 2) ABEF DC G MH LKJI -------- 3) ABEFNOP DC GQ MHR LKJI S. DT CU BAZYXWV ------- 4 ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL SMAR BAZYXWV N EO DP CQ BAZYXWVUTSR ------- 5 ABEFNOPEFGHFGHIJ DC GQIK MHRJL LKJI SKM DTLN CUMO BAZYXWV NP EOQ DPR CQS BAZYXWVUTSR T RU QV PW WÓŁ NMLKJIHGFEDCBAZY ------ 6 ABEFNOPEFGHFGHIJSTUVWX DC GQIKY MHRJLZ LKJI SKMA DTLNB CUMOC BAZYXWV NPD EOQE DPRF CQSG BAZYXWVUTSR TH RUI QVJ PWK OXL NMLKJIHGFEDCBAZY M SN RO QP PQ LUB NMLKJIHGFEDCBAZYXWVUTS
Odpowiedzi:
Węgiel drzewny , 31 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Uwaga: Deverbosifier z jakiegoś powodu wysyła separator końcowy. Wyjaśnienie:
Rysuj pola w odwrotnej kolejności (od największej do najmniejszej).
Oblicz rozmiar pudełka.
Narysuj obramowanie ramki za pomocą obróconego alfabetu.
Oblicz literę, która pojawi się w lewym górnym rogu pola (indeksowane 0).
źródło
Python 2 , 176 bajtów
Wypróbuj online!
Wyjaśnienie
Tworzymy pustą tablicę spacji o odpowiednim rozmiarze, a następnie przesuwamy się w ten sposób, zaczynając od lewego górnego rogu:
1 krok →, 1 krok ↓, 1 krok ←, 1 krok ↑
3 kroki →, 3 kroki ↓, 3 kroki ←, 3 kroki ↑
6 kroków →, 6 kroków ↓, 6 kroków ←, 6 kroków ↑
10 kroków →, 10 kroków ↓, 10 kroków ←, 10 kroków ↑
…
Za każdym razem, gdy znajdujemy pustą komórkę, umieszczamy tam literę i przechodzimy do następnej litery w alfabecie.
W kodzie
s%4
jest kierunek (→ ↓ ← ↑), a my robimy to wiele razy:Możliwości gry w golfa
Czy istnieje krótsza droga do map
s%4
do1,0,-1,0
niabs(2-s%4)-1
?Czy istnieje krótsza droga do map
s%4
do0,1,0,-1
nis%2-s%4/3*2
?Kredyty
źródło
21/(s%4+3)%3-1
:s%2-2*(s%4>2)
( 179 bajtów ). Nadal jednak można grać w golfaC,
305281 bajtówDzięki @Mr. Xcoder do zapisywania czterech bajtów!
Wypróbuj online!
źródło
#define
forfor(
(który faktycznie oszczędza bajty). +1 ode mnie :)Python 2 ,
262260254245 bajtówWypróbuj online!
Nowa metoda z większą ilością matematyki!
Zwraca listę list znaków.
Stara wersja:
Python 2 ,
322321308298 bajtówWypróbuj online!
źródło
.49
wystarczy w takim przypadku, czy też zawodzi przy bardzo dużych wejściach?i<j
, ponieważ używasz jej cztery razy?+1==1+
Perl 5, 177 +2 (-nl) = 179 bajtów
2 bajty zapisane dzięki Xcali
Wypróbuj online
źródło
-1
zamiast$#O
. Korzystając również$,
zamiast$n
pozwoli usunąć spację przedfor
w$_.=$"x$n for@O
s/ (?=\S)/n/e
nas/.*\K /n/e
APL (Dyalog Classic) , 47 bajtów
Wypróbuj online!
źródło