Xoắn ốc ra bảng chữ cái!


13

Nhìn vào chuỗi sau đây. Chú ý một mẫu?

ABEFNOPEFGH
DC GQI
MHRJ
SK SKJI
DTL
CUM
BAZYXWV N
EO
Sở DP
CQ
BAZYXWVUTSR

Như một số người có thể nhận thấy, về cơ bản, nó là một vòng xoắn ốc của bảng chữ cái, trong đó khoảng cách giữa các hàng / cột đang dần tăng thêm 1 khoảng trắng / dòng mới.

Định nghĩa khắt khe

  • Hãy có một bộ đếm c , ban đầu là 0.
  • Chúng tôi viết ra các chữ cái c + 1 đầu tiên của bảng chữ cái từ trái sang phải : A.
  • Sau đó, từ trên xuống dưới tiếp theo (c + 1) (c + 2) / 2 chữ cái (thêm B) : AB.

  • Từ trái sang phải, tiếp theo (c + 1) (c + 2) / 2 (thêm C):

    AB
     C
    
  • Và từ dưới lên trên, các chữ cái c + 1 tiếp theo (thêm D):

    AB
    DC
    
  • Đã đến cuối chu kỳ. Do đó, hãy tăng c (trở thành 1). Sau đó, nó bắt đầu trở lại từ bước đầu tiên, sự khác biệt duy nhất là thay vì sử dụng các chữ cái c + 1 đầu tiên của bảng chữ cái, chúng tôi sử dụng các chữ cái c + 1 tiếp theo , bắt đầu từ phần tử cuối cùng của chu kỳ này ( Dtrong trường hợp này, vì vậy chúng tôi tiếp tục với EFG...). Khi Zđạt được, nó quay trở lại từ A.

Bài tập

Cho một số nguyên N (dương cho chỉ số 1 hoặc không âm cho lập chỉ mục 0), xuất ra N chu kỳ đầu tiên của vòng xoắn ốc.

Quy tắc

  • Bạn có thể sử dụng chữ thường hoặc bảng chữ cái in hoa, nhưng lựa chọn của bạn phải nhất quán (chỉ sử dụng một trong số chúng, không được phép trộn).

  • Bạn có thể nhận đầu vào và cung cấp đầu ra thông qua bất kỳ phương thức tiêu chuẩn nào , trong bất kỳ ngôn ngữ lập trình nào , trong khi lưu ý rằng các lỗ hổng này bị cấm theo mặc định.

  • Các định dạng đầu ra có thể chấp nhận: chuỗi nhiều dòng, một danh sách các chuỗi biểu thị các dòng, một danh sách chứa nhiều danh sách các ký tự, mỗi danh sách đại diện cho một dòng hoặc bất cứ thứ gì khác mà bạn thấy phù hợp. Trong trường hợp bạn không chọn định dạng đầu tiên, sẽ rất tuyệt nếu bao gồm một phiên bản in đẹp của mã của bạn.

  • Đây là , vì vậy mã ngắn nhất tính bằng byte (trong mỗi ngôn ngữ) đáp ứng các yêu cầu sẽ thắng!


Các trường hợp thử nghiệm

Số nguyên đầu vào sẽ được phân tách bằng đầu ra tương ứng của nó thông qua một dòng mới và các kiểm tra sẽ được phân tách bằng dấu gạch ngang. Lưu ý rằng đây là 1 chỉ mục.

1

AB
DC

--------

2

ABEF
DC G
MH
LKJI 

--------

3

ABEFNOP
DC GQ
MHR
LKJI S
DT
CU
BAZYXWV

-------

4

ABEFNOPEFGH
DC GQI
MHRJ
SK SKJI
DTL
CUM
BAZYXWV N
EO
Sở DP
CQ
BAZYXWVUTSR

-------
5

ABEFNOPEFGHFGHIJ
DC GQIK
MHRJL
SKJI
DTLN
CUMO
NP BAZYXWV
EOQ
Sở DPR
CQS
BAZYXWVUTSR
RU
QV
PW
CON BÒ
NMLKJIHGFEDCBAZY

------

6

ABEFNOPEFGHFGHIJSTUVWX
DC GQIKY
MHRJLZ
SKJI
DTLNB
CUMOC
NPZ BAZYXWV
EOQE
DPRF
CQSG
BAZYXWVUTSR
RUI
QVJ
PWK
OXL
NMLKJIHGFEDCBAZY M
SN
RO
QP
PQ
HOẶC LÀ 
NMLKJIHGFEDCBAZYXWVUTS

Các testcase nên là n = 1,2,3,5,6, tôi nghĩ vậy.
TFeld

Câu trả lời:


9

Than , 31 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Lưu ý: Deverbosifier đưa ra một dấu tách cho một số lý do. Giải trình:

F⮌…⁰NB

Vẽ các hộp theo thứ tự ngược kích thước (lớn nhất đến nhỏ nhất).

⁺²⊘×ι⁺³ι

Tính kích thước của hộp.

⭆α§α⁺λ

Vẽ đường viền của hộp bằng bảng chữ cái xoay.

÷×ι⊕×ι⁺⁹⊗ι⁶

Tính toán chữ cái sẽ xuất hiện ở phía trên bên trái của hộp (được lập chỉ mục 0).


6

Python 2 , 176 byte

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

Hãy thử trực tuyến!

Giải trình

Chúng tôi xây dựng một mảng trống của các không gian có kích thước bên phải, sau đó di chuyển qua nó như thế này, bắt đầu ở góc trên bên trái:

  • 1 bước →, 1 bước ↓, 1 bước ←, 1 bước

  • 3 bước →, 3 bước ↓, 3 bước ←, 3 bước ↑

  • 6 bước →, 6 bước, 6 bước ←, 6 bước ↑

  • 10 bước →, 10 bước ↓, 10 bước ←, 10 bước ↑

  • Giáo dục

Mỗi khi chúng tôi tìm thấy một ô trống, chúng tôi đặt một chữ cái ở đó và chuyển sang chữ cái tiếp theo trong bảng chữ cái.

Trong mã, s%4là hướng (→ ←) và chúng tôi thực hiện bước này nhiều lần:

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

Cơ hội chơi gôn

  • Có một cách ngắn hơn để ánh xạ s%4đến 1,0,-1,0hơn abs(2-s%4)-1?

  • Có một cách ngắn hơn để ánh xạ s%4đến 0,1,0,-1hơn s%2-s%4/3*2?

Tín dụng

  • Ông Xcoder đã lưu một byte.

2
+1 Wow, điều này thật tuyệt vời. Mất một lúc để tìm ra cách nó hoạt động. Tôi tìm thấy một tốc ký cho 21/(s%4+3)%3-1: s%2-2*(s%4>2)( 179 byte ). Nó vẫn có thể chơi được mặc dù
Ông Xcoder

4

C,  305  281 byte

Cảm ơn @Mr. Xcoder để lưu bốn byte!

#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++]);}

Hãy thử trực tuyến!


1
Lần đầu tiên tôi thấy một #definefor for((thực sự tiết kiệm byte). +1 từ tôi. :)
Kevin Cruijssen

2

Python 2 , 262 260 254 245 byte

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

Hãy thử trực tuyến!

Phương pháp mới với nhiều toán học hơn!

Trả về một danh sách các danh sách char.


Phiên bản cũ:

Python 2 , 322 321 308 298 byte

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]

Hãy thử trực tuyến!


@ Mr.Xcoder Không .49đủ vừa đủ trong trường hợp đó, hay nó thất bại cho các đầu vào rất lớn?
Kevin Cruijssen

1
@KevinCruijssen Không chắc chắn, nhưng điều này hoạt động chắc chắn, 260 byte .
Ông Xcoder

Tôi không biết rõ về Python, nhưng có thể tạo biến nội tuyến cho i<j, vì bạn đang sử dụng nó bốn lần?
Kevin Cruijssen

1
245 byte bằng cách chơi golf +1==1+từ phương pháp trước đây của tôi
Ông Xcoder

1

Perl 5, 177 +2 (-nl) = 179 byte

2 byte được lưu nhờ 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

Dùng thử trực tuyến


Bạn có thể lưu một byte bằng cách sử dụng -1thay vì $#O. Cũng sử dụng $,thay vì $nsẽ cho phép bạn loại bỏ các không gian trước fortrong$_.=$"x$n for@O
Xcali

cảm ơn bạn, tôi đã tìm kiếm những cải tiến khác nhưng không thể tìm thấy vào lúc này
Nahuel Fouilleul

đã lưu thêm 2 byte thay đổi regex s/ (?=\S)/n/ethànhs/.*\K /n/e
Nahuel Fouilleul

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.