Một vòng xoắn ASCII cách đều nhau


13

Hãy xem xét xoắn ốc này

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

Bắt đầu từ trung tâm:

  • Dòng đầu tiên (trở lên) có 3 ký tự.
  • Dòng thứ hai có cùng số ký tự (3)
  • Tiếp theo, chúng tôi thêm hai ký tự (5) cho hai bên tiếp theo.
  • Mô hình này tiếp tục, hai bên cùng chiều dài sau đó tăng chiều dài lên 2.

Tôi muốn tạo xoắn ốc này cho N dòng.

  • Viết bằng bất kỳ ngôn ngữ nào.
  • Đầu vào / đối số, v.v. là số lượng dòng trong vòng xoắn ốc của bạn.
  • Mỗi dòng bắt đầu bằng ký tự kết thúc của dòng trước theo hướng 90 độ theo chiều kim đồng hồ của dòng trước.
  • Tôi không quan tâm có bao nhiêu khoảng trắng trước hoặc sau mỗi dòng, miễn là các phần tử của đường xoắn ốc xếp thành hàng.
  • Xuất văn bản để vẽ hình xoắn ốc với bất kỳ ký tự không phải khoảng trắng nào bạn chọn.
  • Cố gắng làm điều này với số lượng byte nhỏ nhất.

Các trường hợp thử nghiệm (sử dụng hàm băm làm đầu ra):

N = 1

#
#
#

N = 2

###
#
#

N = 3

###
# #
# #
  #
  #

N = 10

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

@Shaggy "Xuất văn bản để vẽ hình xoắn ốc với bất kỳ ký tự không phải khoảng trắng nào bạn chọn." Đúng, bất cứ điều gì bạn thích.
AJFaraday


3
Hình ảnh ban đầu có một *thay vì #. Hy vọng?
Wernisch

@Wernisch Nó được dự định là một điểm khởi đầu hữu ích, nhưng tôi cho rằng nó gây hiểu nhầm. Bạn có thể sử dụng bất kỳ nhân vật nào bạn thích.
AJFaraday

Câu trả lời:


11

05AB1E , 13 11 byte

Mã số:

Cảm ơn Emigna đã lưu hai byte!

LDÈ-Ì'#3Ý·Λ

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình

Độ dài của mỗi cạnh riêng lẻ trên hình xoắn ốc bắt đầu bằng chiều dài 3 và tăng dần sau mỗi hai bước:

3,3,5,5,7,7,9,Giáo dục

nn

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

Điều này về cơ bản cung cấp cho chúng tôi danh sách độ dài mong muốn.

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

Canvas hoạt động như một hàm xuất hiện ba tham số (trong đó tham số ngoài cùng bên phải được bật trước): <length (s)> , <char (s)> , <direction (s)> . Tham số chỉ đường trong trường hợp này là danh sách các số. Các số tương ứng với các hướng là:

[70162543]

Trong trường hợp này, [0, 2, 4, 6] tương ứng với danh sách chỉ đường [↑, →, ↓, ←]. Canvas lặp đi lặp lại theo từng độ dài được lấy từ danh sách độ dài, sử dụng ký tự '#' và lặp theo chu kỳ trên danh sách chỉ đường.


0246S=3Ý·
Emigna

@Emigna Ah tôi không nghĩ về điều đó, cảm ơn!
Ad Nam

6

Python 2 , 176 170 165 161 157 byte

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)

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

Lặp đi lặp lại: Sử dụng gđể xoay vòng nlặp thứ năm của vị trí xoắn ốc sang vị trí 'chính tắc' (tương tự N = 3 hoặc N = 7), thêm một phân đoạn mới bằng cách thêm 2 khoảng trắng ở bên trái của mỗi hàng hiện có, sau đó thay thế hàng cuối cùng với tất cả '#'s (dẫn đến một vị trí có thể so sánh với N = 4 hoặc N = 8), và cuối cùng sử dụng glại để xoay nó trở lại vị trí chính xác. Lót, rửa sạch, lặp lại.


4

Than , 16 15 14 byte

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

-2 byte nhờ @Neil .

Dùng thử trực tuyến (dài dòng) hoặc Thử trực tuyến (thuần túy) .

Giải trình:

Hướng in là sang phải theo mặc định và chúng tôi muốn bắt đầu đi lên, vì vậy chúng tôi bắt đầu bằng cách xoay 45 độ ngược chiều kim đồng hồ:

PivotLeft();
↶

Sau đó lặp itrong phạm vi [0, input):

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

In một dòng mới để bắt chước hiệu ứng di chuyển trở lại một vị trí:

Print("\n");
¶

In xsố lần "#" theo hướng hiện tại:

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

Trong trường hợp xlà: 3 + i // 2 * 2:

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

Và sau đó xoay 45 độ theo chiều kim đồng hồ cho lần lặp tiếp theo của vòng lặp:

PivotRight();
↷

Tôi cho rằng không có lệnh trong Than để di chuyển ngược?
Emigna

@Emigna Không chắc chắn, nhưng tôi cũng không thể tìm thấy nó. Tôi đã thực sự tìm kiếm một mình khi tôi viết câu trả lời này. Có một Di chuyển với một hướng nhất định, cũng như Nhảy với tọa độ đã cho, nhưng không may là MoveBack.
Kevin Cruijssen

1
⊗÷ι²là một byte ngắn hơn ⁻ι﹪ι². Ngoài ra, bạn có thể nhận được hiệu ứng di chuyển trở lại bằng cách in a \ntrước #s, điều này sẽ cho phép bạn loại bỏ »#để tiết kiệm byte tổng thể bổ sung.
Neil

@Neil Cảm ơn bạn ⊗÷ι², nhưng những thay đổi sẽ là gì khi in a \ntrước #s? Các xoắn ốc là không chính xác nếu tôi thêmPrint("\n") .
Kevin Cruijssen

Bởi vì cánh tay bây giờ chồng lên nhau, bạn cần làm cho chúng #dài thêm .
Neil

3

Python 2 , 179 178 byte

cảm ơn Kevin Cruijssen cho -1 byte.

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)

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


Python 2 , 179 byte

Trong phương pháp này, các công thức được sử dụng cho xydeltas thay vì danh sách tra cứu.

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)

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


n+1+n%2đến n%2-~n-1 byte. Và tôi cần nhớ 0--n/4*2là 1 ngắn hơn -(-n/4*2). Câu trả lời hay, +1 từ tôi.
Kevin Cruijssen

1

JavaScript (ES6), 185 byte

Chắc chắn điều này có thể được đánh gôn nhiều hơn, có thể với cà ri, nhưng đây là nỗ lực rất khiêm tốn của tôi. Ngắt dòng được thêm vào để dễ đọc ngoại trừ ký tự áp chót

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

Cách sử dụng: d(10)trả về một chuỗi theo ví dụ thử thách N = 10.

Xác định hàm r(a,n)để xoay một mảng atheo nlượt; một hàm s(n)để tạo một mảng 2 chiều biểu thị một vòng xoắn có kích thước nbằng cách xoay đệ quy và thêm khoảng cách và các đường (không được quay trở lại vị trí bắt đầu); và một hàm d(n)để vẽ một vòng xoắn có kích thước n, được xoay một cách nhất quán theo thách thức và được hiển thị dưới dạng một chuỗi được trả về.

Đây là một thử thách thực sự thú vị: ¬)

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.