Dobrze rozmieszczona spirala ASCII

13

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

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########
AJFaraday
źródło
@Shaggy „Wypisuj tekst, aby narysować spiralę dowolnym wybranym spacją.” Tak, cokolwiek chcesz.
AJFaraday
3
Powiązane 1 ; Powiązane 2 .
Kevin Cruijssen
3
Początkowy obraz ma *zamiast #. Spodziewany?
Wernisch
@Wernisch To miał być pomocny punkt wyjścia, ale przypuszczam, że wprowadza w błąd. Możesz użyć dowolnej postaci, którą lubisz.
AJFaraday

Odpowiedzi:

11

05AB1E , 13 11 bajtów

Kod:

Dzięki Emignie za uratowanie dwóch bajtów!

LDÈ-Ì'#3Ý·Λ

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:

3),3),5,5,7,7,9,

Aby uzyskać spiralę z krawędziami, wystarczy przyciąć tę listę do rozmiaru . Odbywa się to za pomocą następującego fragmentu kodu:nnn

L                # Create a list from [1 .. input]
 DÈ              # Duplicate and check for each number if even
   -             # Subtract that from the first list
    Ì            # Add 2

To w zasadzie daje nam pożądaną listę długości.

     '#          # Push the '#' character
       0246S     # Push the array [0, 2, 4, 6]
            Λ    # Write to canvas

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:

[70162)543)]

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.

Adnan
źródło
0246S=3Ý·
Emigna
@Emigna Ah Nie pomyślałem o tym, dzięki!
Adnan
6

Python 2 , 176 170 165 161 157 bajtów

g=lambda a,r:r and g(map(''.join,zip(*a))[::-1],r-1)or a
R=['#']
n=1
exec"R=g(['  '+l for l in g(R,n)][:-1]+[(n+2)*'#'],3*n);n+=1;"*input()
print'\n'.join(R)

Wypróbuj online!

Wielokrotnie: Używa gdo obracania niteracji 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ą gponownie obróć go z powrotem do prawidłowej pozycji. Spłucz, spłucz, powtórz.

Chas Brown
źródło
4

Węgiel drzewny , 16 15 14 bajtów

↶FN«¶×#⁺³⊗÷ι²↷

-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:

PivotLeft();
↶

Następnie zapętl się iw zakresie [0, input):

For(InputNumber()){ ... }
FN« ...

Wydrukuj nową linię, aby naśladować efekt cofnięcia się o jedną pozycję:

Print("\n");
¶

Wydrukuj xliczbę „#” razy w bieżącym kierunku:

Print(Times("#", ... ));
×# ...

Gdzie xjest 3 + i // 2 * 2:

Add(3,Doubled(IntegerDivide(i,2))
⁺³⊗÷ι²

A następnie obróć o 45 stopni w kierunku zgodnym z ruchem wskazówek zegara do następnej iteracji pętli:

PivotRight();
↷
Kevin Cruijssen
źródło
Zakładam, że w Charcoal nie ma polecenia cofania się?
Emigna
@Emigna Nie jestem pewien, ale też nie mogłem go znaleźć. Rzeczywiście sam szukałem takiej, kiedy pisałem tę odpowiedź. Istnieje ruch z danym kierunkiem, a także skok z podanymi współrzędnymi, ale niestety nie ruch z powrotem.
Kevin Cruijssen
1
⊗÷ι²jest bajtem krótszym niż ⁻ι﹪ι². Możesz także uzyskać efekt cofnięcia, drukując \nprzed #s, co pozwoli ci usunąć »#dodatkową oszczędność bajtów.
Neil
@Neil Dzięki za ⊗÷ι², ale jakie byłyby zmiany w drukowaniu \nprzed #s? Spirala jest niepoprawna, jeśli dodamPrint("\n") .
Kevin Cruijssen
Ponieważ ramiona nakładają się na siebie, musisz je dodatkowo #wydłużyć.
Neil
3

Python 2 , 179 178 bajtów

dzięki Kevin Cruijssen za -1 bajt.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Wypróbuj online!


Python 2 , 179 bajtów

W tym podejściu stosowane są formuły xi ydelty zamiast listy odnośników.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Wypróbuj online!

ovs
źródło
n+1+n%2się n%2-~nprzez 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.
Kevin Cruijssen
1

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

r=(a,n=1)=>n?r(a.reduce((_,c)=>c).map((_,i)=>a.map(e=>e[i])).reverse(),n-1):a,
s=n=>n?r(s(n-1)).map((r,i)=>[...r,w,w].map(x=>i?x:'#')):[[w=' ']],
d=n=>r(s(n),1-i).map(r=>r.join``).join`
`

Użycie: d(10)zwraca ciąg znaków zgodnie z przykładem wyzwania N = 10.

Definiuje funkcję r(a,n)obracania tablicy apo nkolei; funkcja s(n)generowania dwuwymiarowego układu reprezentującego spiralę wielkości npoprzez 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ści n, obracanej konsekwentnie zgodnie z wyzwaniem i renderowanej jako zwracany ciąg.

To było naprawdę zabawne wyzwanie: ¬)

Chris M.
źródło