Spirala z alfabetu!

13

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 ( Dw tym przypadku więc kontynuujemy EFG...). Po Zosiągnięciu cykl wraca z A.

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 , 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
Pan Xcoder
źródło
Myślę, że przypadki testowe powinny wynosić n = 1,2,3,5,6.
TFeld

Odpowiedzi:

9

Węgiel drzewny , 31 bajtów

F⮌…⁰NB⁺²⊘×ι⁺³ι⭆α§α⁺λ÷×ι⊕×ι⁺⁹⊗ι⁶

Wypróbuj online! Link jest do pełnej wersji kodu. Uwaga: Deverbosifier z jakiegoś powodu wysyła separator końcowy. Wyjaśnienie:

F⮌…⁰NB

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).

Neil
źródło
6

Python 2 , 176 bajtów

n=input()
k=n*-~n/2+1
a=eval(`[[' ']*k]*k`)
x=y=z=0
for s in range(4*n+4):exec s/4*(s/4+1)/2*"if'!'>a[y][x]:a[y][x]=chr(z%26+65);z+=1\nx+=abs(2-s%4)-1;y+=s%2-s%4/3*2\n"
print a

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%4jest kierunek (→ ↓ ← ↑), a my robimy to wiele razy:

TriangularNumber(s/4) = s/4*(s/4+1)/2.

Możliwości gry w golfa

  • Czy istnieje krótsza droga do map s%4do 1,0,-1,0ni abs(2-s%4)-1?

  • Czy istnieje krótsza droga do map s%4do 0,1,0,-1ni s%2-s%4/3*2?

Kredyty

  • Pan Xcoder zapisał bajt.
Lynn
źródło
2
+1 Wow, to jest po prostu genialne. Zajęło mi trochę czasu, aby dowiedzieć się, jak to działa. Znalazłem skrót dla 21/(s%4+3)%3-1: s%2-2*(s%4>2)( 179 bajtów ). Nadal jednak można grać w golfa
Pan Xcoder,
4

C,  305  281 bajtów

Dzięki @Mr. Xcoder do zapisywania czterech bajtów!

#define L(x,y)l[x][y]=a++%26+65;
#define F for(
c,i,j,a,p;f(n){char**l=calloc(8,i=a=n*n*4);F;i--;memset(l[i],32,a))l[i]=malloc(a);F c=a=p=i=0;c<n;++c){F i=p;i<c+p+!c;)L(j=0,c+i++)F p=i;j<=-~c*(c+2)/2;)L(j++,c+i)F;c+i-1;)L(j-1,c+--i)F i=0;i<=c;)L(j+~i++,0)}F i=0;i<j;)puts(l[i++]);}

Wypróbuj online!

Steadybox
źródło
1
Pierwszy raz widzę #definefor for((który faktycznie oszczędza bajty). +1 ode mnie :)
Kevin Cruijssen,
2

Python 2 , 262 260 254 245 bajtów

lambda n:[[[' ',chr(65+(4*(i<j)+sum((i<j)*8+2+I*[5,9][i<j]+sum(2*R(I))for I in R(S(i,j)-1))+[i+j,-i-j][i<j])%26)][max(i,j)==S(i,j)*-~S(i,j)/2or i*j<1]for i in R(1+n*-~n/2)]for j in R(1+n*-~n/2)]
R=range
S=lambda x,y:int((8*max(x,y)+1)**.5+.99)/2

Wypróbuj online!

Nowa metoda z większą ilością matematyki!

Zwraca listę list znaków.


Stara wersja:

Python 2 , 322 321 308 298 bajtów

R=range
n=input()
w=1+n*-~n/2;r=[w*[' ']for _ in R(w)];r[0][0]='A';l=R(1,w*w*9);c=lambda:chr(65+l.pop(0)%26)
for i in R(n+1):
 w=1+i*-~i/2;W=w-i
 for x in R(W,w):r[0][x]=c()
 for y in R(1,w):r[y][w-1]=c()
 for x in R(1,w):r[w-1][w+~x]=c()
 for x in R(1,w-W):r[w+~x][0]=c()
for l in r:print`l`[2::5]

Wypróbuj online!

TFeld
źródło
@ Mr.Xcoder Czy to nie .49wystarczy w takim przypadku, czy też zawodzi przy bardzo dużych wejściach?
Kevin Cruijssen
1
@KevinCruijssen Nie jestem pewien, ale to działa na pewno, 260 bajtów .
Pan Xcoder
Nie znam tak dobrze Pythona, ale czy można utworzyć zmienną wbudowaną i<j, ponieważ używasz jej cztery razy?
Kevin Cruijssen
1
245 bajtów przez +1==1+
grę w
1

Perl 5, 177 +2 (-nl) = 179 bajtów

2 bajty zapisane dzięki Xcali

sub n{chr 65+$c++%26}@O=(n);while($,++<$_){$_.=$"x$,for@O;push@O,($"x length$O[0])x$,;$O[0]=~s/ /n/eg;s/ $/n/e for@O;1while$O[-1]=~s/.*\K /n/e;s/^ /n/e for reverse@O}print for@O

Wypróbuj online

Nahuel Fouilleul
źródło
Możesz zapisać bajt, używając -1zamiast $#O. Korzystając również $,zamiast $npozwoli usunąć spację przed forw$_.=$"x$n for@O
Xcali
dziękuję, szukałem innych ulepszeń, ale na razie nie mogłem znaleźć
Nahuel Fouilleul
zapisał 2 bajty więcej, zmieniając wyrażenie regularne s/ (?=\S)/n/enas/.*\K /n/e
Nahuel Fouilleul