Cuộn bảng chữ cái thành hình xoắn ốc


22

Viết một chương trình hoặc chức năng, khi được đưa ra n, sẽ in một nký tự xoắn ốc dài được tạo thành từ bảng chữ cái Latinh ABCDEFGHIJKLMNOPQRSTUVWXYZlặp đi lặp lại khi cần thiết. Xoắn ốc này nên chạy qua bảng chữ cái chỉ về phía trước.

Liên quan đến Bảng chữ cái xoắn ốc , mặc dù hình xoắn ốc chạy qua bảng chữ cái tiến và lùi, và hình xoắn ốc là không đổi.

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

4   AB
    DC

40   UVWXYZ
     TGHIJA
    NSFABKB
    MREDCLC
    LQPONMD
    KJIHGFE

0

10  GHIJ
    FAB
    EDC

1000    UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
        TGHIJKLMNOPQRSTUVWXYZABCDEFGHIJA
        SFABCDEFGHIJKLMNOPQRSTUVWXYZABKB
        REZCDEFGHIJKLMNOPQRSTUVWXYZABCLC
        QDYBMNOPQRSTUVWXYZABCDEFGHIJCDMD
        PCXALEFGHIJKLMNOPQRSTUVWXYZKDENE
        OBWZKDEFGHIJKLMNOPQRSTUVWXALEFOF
        NAVYJCDMNOPQRSTUVWXYZABCDYBMFGPG
        MZUXIBCLCDEFGHIJKLMNOPQREZCNGHQH
        LYTWHABKBABCDEFGHIJKLMNSFADOHIRI
        KXSVGZAJAZGHIJKLMNOPQROTGBEPIJSJ
        JWRUFYZIZYFUVWXYZABCDSPUHCFQJKTK
        IVQTEXYHYXETQRSTUVWXETQVIDGRKLUL
        HUPSDWXGXWDSPUVWXYZYFURWJEHSLMVM
        GTORCVWFWVCROTGHIJAZGVSXKFITMNWN
        FSNQBUVEVUBQNSFABKBAHWTYLGJUNOXO
        ERMPATUDUTAPMREDCLCBIXUZMHKVOPYP
        DQLOZSTCTSZOLQPONMDCJYVANILWPQZQ
        CPKNYRSBSRYNKJIHGFEDKZWBOJMXQRAR
        BOJMXQRARQXMLKJIHGFELAXCPKNYRSBS
        ANILWPQZQPWVUTSRQPONMBYDQLOZSTCT
        ZMHKVOPYPONMLKJIHGFEDCZERMPATUDU
        YLGJUNOXONMLKJIHGFEDCBAFSNQBUVEV
        XKFITMNWVUTSRQPONMLKJIHGTORCVWFW
        WJEHSLMLKJIHGFEDCBAZYXWVUPSDWXGX
        VIDGRKJIHGFEDCBAZYXWVUTSRQTEXYHY
        UHCFQPONMLKJIHGFEDCBAZYXWVUFYZIZ
        TGBEDCBAZYXWVUTSRQPONMLKJIHGZAJA
        SFAZYXWVUTSRQPONMLKJIHGFEDCBABKB
        REDCBAZYXWVUTSRQPONMLKJIHGFEDCLC
        QPONMLKJIHGFEDCBAZYXWVUTSRQPONMD
                                LKJIHGFE

Quy tắc

  • Đầu vào của bạn sẽ là một số nguyên không âm 0 <= n <= 1000, nhưng về mặt lý thuyết, mã của bạn sẽ xử lý bất kỳ số nguyên không âm nào.
  • Định dạng đầu ra của bạn có thể ở bất kỳ định dạng lành mạnh nào, với các dấu phân cách nếu cần thiết.
  • Xoay và phản xạ là tương đương.
  • Bảng chữ cái của bạn có thể là chữ hoa hoặc chữ thường.
  • Các khoảng trống trong vòng xoắn ốc của bạn có thể được lấp đầy bằng bất kỳ giá trị không chữ cái nào mà bạn thấy phù hợp.
  • Các xoắn ốc có thể trong bất kỳ hình dạng mà bạn thấy phù hợp. Các hình xoắn ốc hình chữ nhật hoạt động tốt nhất với các giải pháp ASCII, nhưng các giải pháp đồ họa có thể ngắn hơn với các hình xoắn ốc tròn.
  • Không gian hàng đầu và dấu và dòng mới được cho phép.
  • Đây là mã golf. Câu trả lời ngắn nhất tính bằng byte (hoặc tương đương) sẽ thắng.

Như mọi khi, nếu bất cứ điều gì không rõ ràng hoặc không chính xác, xin vui lòng cho tôi biết trong các ý kiến. Chúc may mắn và chơi golf tốt!


hầu hết các biên tập viên sẽ không cho phép in ra một chuỗi dài
t-clausen.dk

@ t-clausen.dk Tôi đã sử dụng tối đa số nguyên 32 bit đã ký. Nếu bạn có đề xuất tốt hơn cho giới hạn trên, tôi rất vui lòng chỉnh sửa nó.
Sherlock9

Đẹp và khéo léo :-)
Joffan

Câu trả lời:


12

Logo, 129 87 byte

Giải pháp đồ họa, thực hiện như chức năng

Điều này được xây dựng trên trình thông dịch Logo của Calormen.com . Các Schức năng có số ký tự như một tham số và lôi kéo họ vào một vòng xoáy. Các Tchức năng đầu ra chữ thẳng đứng để ngăn chặn chúng từ quay với xoắn ốc. . Tôi quyết định rằng nó trông đẹp hơn (và đánh ra 42 byte ) để bỏ qua việc sửa hướng thư. Tôi cũng thắt chặt khoảng cách không thay đổi số byte. Nếu bạn thực sự cuộn một bảng chữ cái, nó sẽ trông giống như thế này hơn.

Phiên bản cập nhật (cuộn thư)

TO S:r
PU IF:r[REPEAT:r[LABEL CHAR((REPCOUNT-1)%26)+65
RT 99/SQRT(REPCOUNT)FD 12]]END

Cầu nguyện

Gọi như sau: S lặp

Sản lượng mẫu

S 1000

Đầu ra mẫu cho 1000 lần lặp

Phiên bản cũ (chữ luôn luôn đứng thẳng)

TO T:l:h
RT:h
LABEL CHAR(:l%26)+65
LT:h
END
TO S:r
PU IF:r[REPEAT:r[T REPCOUNT-1 90-HEADING
RT 95/SQRT(REPCOUNT)FD 15]]END

Đầu ra cũ được loại bỏ để tiết kiệm không gian. Xem nó ở đây .


Đừng hỏi làm thế nào tôi đến với toán học. Tôi đã thử tìm kiếm các công thức trực tuyến, nhưng hầu hết đã giải quyết vấn đề bằng cách giữ cho góc quay không đổi và tăng chiều dài phân khúc, trong khi tôi muốn giữ độ dài phân đoạn không đổi và thay đổi góc. Thử nghiệm và lỗi dường như đã dẫn đến một công thức ổn định. Điều chỉnh 95sẽ thay đổi độ kín của xoắn ốc và thay đổi 15sẽ điều chỉnh khoảng cách tuyến tính của các chữ cái.
GuitarPicker

9

Javascript (ES6), 203 201 byte

n=>{for(a=[],i=d=k=z=0,p=526,j=1;i<n;){p+=[1,32,-1,-32][d&3];j--||(((z^=1)||k++),j=k,d++);(a[y=p>>5]=(a[y]||Array(32).fill` `))[p&31]=String.fromCharCode(65+(i++%26))}return a.map(r=>r.join``).join`
`}

Bản giới thiệu

Bản demo dưới đây tốt nhất nên chạy trong toàn trang.


7

R, 46 hoặc 51 byte, tùy thuộc vào khoảng cách

s=1:scan();plot(s*sin(s),s*cos(s),pch=letters)

nhập mô tả hình ảnh ở đây

(phiên bản cập nhật của cốt truyện: hình xoắn ốc màu xám không được vẽ theo mặc định nhưng tôi đã thêm nó sau để cho thấy rằng các chữ cái thực sự nằm trên một hình xoắn ốc.)

Các xoắn ốc không phải là khoảng cách liên tục, vì vậy tôi hy vọng điều này là ổn. Nếu khoảng cách không đổi là bắt buộc, s=(1:scan())^.5thay vào đó hãy bắt đầu và thêm 5 byte vào tổng số. Sau đó, đầu ra như dưới đây (n = 150):

nhập mô tả hình ảnh ở đây


3
Làm thế nào bạn không gian xoắn ốc của bạn là hoàn toàn tùy thuộc vào bạn. Tôi có hai gợi ý, mặc dù: 1) Giữ vòng xoắn thứ hai. Nó thêm vào câu trả lời của bạn ngay cả khi nó ít chơi gôn hơn; 2) Bạn có thể vẽ một đường xoắn ốc đi qua các chữ cái trong hình ảnh của vòng xoắn ốc đầu tiên của bạn không? Chỉ để làm cho bảng chữ cái xoắn ốc rõ ràng hơn.
Sherlock9

6

Python 3.5, 180 157 152 147 141 byte

-6 do Sherlock9

r=[[]]
for x in range(int(input())):
 r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
print(*map(''.join,r),sep='\n')

-5 do Kap.

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

Giải pháp sửa đổi, python 3.x:

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

Giải pháp trước:

R=range
def g(n):
 r=[]
 for x,f in zip(R(n),(j<1for i in R(n)for j in R(i//2+1))):
  if f:r=list(zip(*r[::-1]))+[[]]
  r[-1].append(chr(x%26+65))
 print(*map(''.join,r),sep='\n')

Giải trình

rlà một danh sách các danh sách giữ xoắn ốc. Ý tưởng cơ bản là các chữ cái mới được thêm vào hàng dưới cùng của hình xoắn ốc ( r[-1].append(chr(x%26+65))). Khi hàng dưới cùng được lấp đầy, hình xoắn ốc được xoay 90 theo chiều kim đồng hồ và một hàng trống mới được thêm vào dưới cùng ( r = list(zip(*r[::-1]))+[[]]).

Bí quyết là tìm ra khi nào để xoay vòng xoắn ốc. Trong giải pháp đầu tiên, trình tạo (j<1for i in R(n)for j in R(i//2+1))tạo ra một chuỗi các giá trị Đúng / Sai cho biết khi nào cần xoay vòng xoắn ốc. Trong giải pháp sửa đổi, tôi đã thay đổi cách rkhởi tạo. Bây giờ khi chiều dài của hàng dưới bằng với chiều dài của hàng trên cùng, xoắn ốc cần phải được xoay.


Bạn có thể thay thế if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]bằng if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]để lưu 5 byte.
R. Kap

Vì bạn chỉ sử dụng rangemột lần, bạn có thể xóa Rđể lưu byte. Bạn cũng có thể lưu byte bằng cách chuyển đổi câu trả lời của mình thành một chương trình đầy đủ, mặc dù để duy trì việc sử dụng [*zip(*r[::-1]),[]], bạn sẽ cần sử dụng range(int(input())).
Sherlock9

Ngoài ra, for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]vì bạn đang kiểm tra khi dòng cuối cùng bằng hoặc lớn hơn dòng đầu tiên.
Sherlock9

Hai điều: 1) Bạn có thể làm cho vòng lặp for dài một dòng bằng cách tách các câu lệnh bằng dấu chấm phẩy; và 2) bạn chưa xác định ntrong phiên bản này. Hoặc bạn cần sử dụng int(input())hoặc bọc lại trong một chức năng.
Sherlock9

2 byte từ việc ngưng tụ forvòng lặp:for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
Sherlock9

5

MATL , 21 18 byte

X^Xk1YL1Y2y)wG>~*c

Lối 0ra đầu vào có lỗi (được cho phép theo mặc định ).

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

Giải trình

X^Xk   % Input n implicitly. Take square root and round up
1YL    % Square matrix of that size containing a spiral of numbers
1Y2    % Predefined literal: string "AB···YZ"
y      % Duplicate the spiral matrix onto the top
)      % Apply as an index inth the string. Gives 2D array of chars
w      % Swap: move copy of the spiral matrix to top
G>~    % Set entries that exceed the input to 0, and the rest to 1 
*      % Multiply. This makes unwanted entries equal to 0
c      % Convert to char. 0 is shown as a space. Display implicitly

5

Python 2, 84 82 byte

Tôi đang sử dụng Rùa một lần nữa. Nó rất vui vẻ! : D

from turtle import*
up()
for i in range(input()):write(chr(i%26+65));rt(9);fd(9+i)

Dùng thử trực tuyến

Thật không may, Trinket.io có một bức tranh nhỏ khủng khiếp. Tôi đã thay đổi 9+iđến 9+i/9và điều chỉnh điểm khởi đầu của con rùa với mục đích chụp màn hình hình ảnh này, do đó nhiều đầu ra sẽ phù hợp:

đầu ra


Một byte từ nếu bạn xóa một khoảng trắng khỏi quá trình nhập: from turtle import*và một byte khác thay đổi từ whilethànhfor i in range(input())
Sherlock9

4

Bình thường, 32 byte

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y

Một chương trình in hình xoắn ốc chữ thường ASCII chữ thường. Tùy thuộc vào đầu vào, một hàng hoặc cột của khoảng trắng đầu hoặc cuối có thể có mặt.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y  Program. Input: Q
  @Q2                             Yield sqrt(Q)
JS                                Unary range, J=[1, 2, 3, ..., floor(sqrt(q))]
                         .iJJ     Interleave J with itself, yielding [1, 1, 2, 2, 3, 3, ...
                                  floor(sqrt(Q)), floor(sqrt(Q))]
                    .u+NY    Z    Cumulatively reduce by addition with base case 0,
                                  yielding [0, 1, 2, 4, 6, 9, 12, 16, 20...]
                *GQ               Repeat the lower-case alphabet Q times
               <   Q              Truncate to legth Q
              c                   Split the above at the indices in the above list
      u                       ]Y  Reduce the above, with base case [[]]:
          _G                       Reverse
        .t  )                      Transpose
       +     H                     Add the next arm of the spiral
     j                            Join on newlines and implicitly print

3

TSQL, 386 362 358 306 byte

Xin lưu ý rằng TSQL không có cách xoay văn bản. Kịch bản này đang bắt đầu từ A và tính toán nên đặt chữ cái tiếp theo theo hướng nào. (phải, xuống, trái, trái, trái, lên, lên, phải ...)

Kịch bản có thể xử lý tối đa 7744 chữ cái.

Chơi gôn

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1);WITH C as(SELECT 0i,@/2a,@/2b UNION ALL SELECT i+1,a+z/2,b+z%2FROM(SELECT*,IIF(a>@/2*2-b,IIF(a<b,2,-1),IIF(a>b,-2,1))z FROM C)t WHERE i<@z-1)SELECT @o=STUFF(@o,@*a-@+b,1,char(i%26+65))FROM c OPTION(maxrecursion 0)PRINT @o

Ung dung:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)
DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1)

;WITH C as
(
  SELECT
    0i,@/2a,@/2b
  UNION ALL
  SELECT
    i+1,a+z/2,b+z%2
    FROM 
      (SELECT*,
         IIF(a>@/2*2-b,
           IIF(a<b,2,-1),
             IIF(a>b,-2,1))z FROM C)t
  WHERE
    i<@z-1
)
SELECT 
  @o=STUFF(@o,@*a-@+b,1,char(i%26+65))
FROM c  
OPTION(maxrecursion 0)

PRINT @o

Vĩ cầm


2

Python 2, 243 byte

r=range(input())
a=[1j**int((4*i+1)**.5)for i in r]
b=[map(int,(-sum(a[:i]).real,sum(a[:i]).imag))for i in r]
c,d=zip(*b)
for i in range(min(c),max(c)+1):print''.join([i,j]in b and chr(b.index([i,j])%26+65)or' 'for j in range(min(d),max(d)+1))

Nghĩa là nó!


0

PHP , 219 byte

for($q=ceil(sqrt($a=$argn))**2,$d=1,$x=$y=$w=0;$i<$q;$i++,${yx[$w%2]}+=[-1,1][$d&1],$i%$d?:$d+=$w++&1)$e[$c[]=$x-!($a&1)][$l[]=$y]=$i<$a?chr(65+$i%26):" ";for($k=min($c);$e[$k];print join($e[+$k++])."\n")ksort($e[+$k]);

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

PHP, 260 byte

Phiên bản cũ

for($y=$x=$d=$i=0;$i<$m=ceil(sqrt($n=$argv[1]))**2;$i++){$a[$y][$x]=$i<$n?chr($i%26+65):" ";$d=$y==$x&$y<1?0:(1-$y==$x&$x>0?1:($y==$x&$y>0?2:($y==-$x&$x<0?3:$d)));$d>2?$y--:($d>1?$x--:($d>0?$y++:$x++));}ksort($a);foreach($a as$r){ksort($r);echo join($r)."\n";}
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.