Rozważ tę spiralę
###########
#
# #######
# # #
# # ### #
# # # # #
# # # # #
# # # #
# ##### #
# #
#########
Zaczynając w centrum:
- Pierwszy wiersz (w górę) ma 3 znaki.
- Drugi wiersz ma tę samą liczbę znaków (3)
- Następnie dodajemy dwa znaki (5) dla następnych dwóch stron.
- Ten wzór trwa, dwie strony tej samej długości, a następnie zwiększ długość o 2.
Chcę wygenerować tę spiralę dla N linii.
- Pisz w dowolnym języku.
- Wejście / argument itp. To liczba linii w twojej spirali.
- Każda linia zaczyna się od znaku kończącego poprzednią linię w kierunku 90 stopni zgodnie z ruchem wskazówek zegara od poprzedniej linii.
- Nie dbam o to, ile białych znaków jest przed lub po każdej linii, o ile elementy linii spiralnej są w linii.
- Wygeneruj tekst, aby narysować spiralę dowolnym wybranym znakiem spacji.
- Spróbuj to zrobić przy najmniejszej liczbie bajtów.
Przypadki testowe (używając skrótu jako danych wyjściowych):
N = 1
#
#
#
N = 2
###
#
#
N = 3
###
# #
# #
#
#
N = 10
###########
#
# #######
# # #
# # ### #
# # # # #
# # # # #
# # # #
# ##### #
# #
#########
*
zamiast#
. Spodziewany?Odpowiedzi:
05AB1E ,
1311 bajtówKod:
Dzięki Emignie za uratowanie dwóch bajtów!
Wykorzystuje kodowanie 05AB1E . Wypróbuj online!
Wyjaśnienie
Długości każdej pojedynczej krawędzi spirali zaczynają się od długości 3 i stopniowo zwiększają się co dwa kroki o dwa:
Aby uzyskać spiralę z krawędziami, wystarczy przyciąć tę listę do rozmiaru . Odbywa się to za pomocą następującego fragmentu kodu:nn n
To w zasadzie daje nam pożądaną listę długości.
Kanwa działa jako funkcja, która wyskakuje z trzech parametrów (gdzie pierwszy parametr z prawej strony jest wyświetlany jako pierwszy): <length (s)> , <char (s)> , <direction (s)> . Parametrem kierunków jest w tym przypadku lista liczb. Liczby odpowiadające kierunkom to:
W tym przypadku [0, 2, 4, 6] odpowiada liście kierunków
[↑, →, ↓, ←]
. Kanwa iteruje się po każdej długości pobranej z listy długości, używa znaku „#” i cyklicznie iteruje po liście wskazówek.źródło
0246S
=3Ý·
Python 2 ,
176170165161157 bajtówWypróbuj online!
Wielokrotnie: Używa
g
do obracanian
iteracji spirali do pozycji „kanonicznej” (podobnie do N = 3 lub N = 7), dodaje nowy segment, dodając 2 spacje po lewej stronie każdego istniejącego rzędu, a następnie zastępując ostatni rząd ze wszystkimi'#'
s (co daje pozycję porównywalną z N = 4 lub N = 8), i na koniec za pomocąg
ponownie obróć go z powrotem do prawidłowej pozycji. Spłucz, spłucz, powtórz.źródło
Węgiel drzewny ,
161514 bajtów-2 bajty dzięki @Neil .
Wypróbuj online (pełne) lub Wypróbuj online (czyste) .
Wyjaśnienie:
Kierunek drukowania jest domyślnie po prawej stronie i chcemy zacząć w górę, więc zaczynamy od obrócenia o 45 stopni w lewo:
Następnie zapętl się
i
w zakresie[0, input)
:Wydrukuj nową linię, aby naśladować efekt cofnięcia się o jedną pozycję:
Wydrukuj
x
liczbę „#” razy w bieżącym kierunku:Gdzie
x
jest3 + i // 2 * 2
:A następnie obróć o 45 stopni w kierunku zgodnym z ruchem wskazówek zegara do następnej iteracji pętli:
źródło
⊗÷ι²
jest bajtem krótszym niż⁻ι﹪ι²
. Możesz także uzyskać efekt cofnięcia, drukując\n
przed#
s, co pozwoli ci usunąć»#
dodatkową oszczędność bajtów.⊗÷ι²
, ale jakie byłyby zmiany w drukowaniu\n
przed#
s? Spirala jest niepoprawna, jeśli dodamPrint("\n")
.#
wydłużyć.Python 2 ,
179178 bajtówdzięki Kevin Cruijssen za -1 bajt.
Wypróbuj online!
Python 2 , 179 bajtów
W tym podejściu stosowane są formuły
x
iy
delty zamiast listy odnośników.Wypróbuj online!
źródło
n+1+n%2
sięn%2-~n
przez około 1 bajtu. I muszę pamiętać,0--n/4*2
że jestem o 1 niższy niż-(-n/4*2)
. Dobra odpowiedź, +1 ode mnie.JavaScript (ES6), 185 bajtów
Jasne, że można to pograć bardziej w golfa, może z curry, ale oto moja bardzo skromna próba. Dodano podział linii dla czytelności, z wyjątkiem przedostatniego znaku
Użycie:
d(10)
zwraca ciąg znaków zgodnie z przykładem wyzwania N = 10.Definiuje funkcję
r(a,n)
obracania tablicya
pon
kolei; funkcjas(n)
generowania dwuwymiarowego układu reprezentującego spiralę wielkościn
poprzez rekurencyjne obracanie i dodawanie odstępów i linii (nie obróconych z powrotem do pozycji wyjściowej); oraz funkcjęd(n)
rysowania spirali wielkościn
, obracanej konsekwentnie zgodnie z wyzwaniem i renderowanej jako zwracany ciąg.To było naprawdę zabawne wyzwanie: ¬)
źródło