Asterisk xoắn ốc


29

Với vòng xoắn có kích thước Svà bước N, xuất ra hình S*Sxoắn ốc "vuông" có Ndấu sao, được xây dựng từ bên ngoài đến bán kính bên trong theo chiều kim đồng hồ.

Các trường hợp thử nghiệm (ví dụ) dưới đây.

  1. Đầu vào: 4 3

    Đầu ra:

    ***
    
  2. Đầu vào: 4 6

    Đầu ra:

    ****
       *
       *
    
  3. Đầu vào: 4 11

    Đầu ra:

    ****
       *
    *  *
    ****
    
  4. Đầu vào: 6 18

    Đầu ra:

    ******
         *
         *
    *    *
    *    *
    ******
    
  5. Đầu vào: 6 22

    Đầu ra:

    ******
    ***  *
    *    *
    *    *
    *    *
    ******
    
  6. Đầu vào: 6 27

    Đầu ra:

    ******
    ******
    *   **
    *   **
    *   **
    ******
    
  7. Đầu vào: 1 1

    Đầu ra:

    *
    

Không cần thiết phải xử lý các trường hợp khi:

  • cung cấp Ndấu hoa thị không thể "vừa" trong vòng xoáy của các S*Skích thước nhất định .

  • một trong hai Nhoặc Slà zero.

Thách thức là code-golf, byte ngắn nhất trả lời thắng, mọi ngôn ngữ đều có thể được sử dụng.

Đầu ra của bạn có thể có nhiều dấu cách (nhưng không dẫn đầu) khoảng trắng / dòng mới như bạn muốn.


Chúng ta có thể có dấu cách / dòng mới không?
dùng202729

2
Tôi sẽ gọi S kích thước (hoặc ít nhất là đường kính ) chứ không phải bán kính
Luis Mendo

@Luis điểm công bằng!
nicael

3
Các bạn thân mến , xin hãy bỏ phiếu cho câu trả lời cũng được, không chỉ là câu hỏi. Thật dễ dàng để thực hiện thử thách này. Cung cấp một câu trả lời cho nó là (tôi nghĩ) chắc chắn khó khăn hơn.
nicael

2
Chỉ có bạn nghĩ như vậy. Viết một thử thách được đón nhận và rõ ràng là rất khó. (chỉ cần nhìn vào luồng nhận xét ngay tại đây, có một số gợi ý sau khi thử thách được đăng)
user202729

Câu trả lời:


16

MATL , 17 16 byte

UGlYLGoQ&P->42*c

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

Giải thích (ví dụ)

Xem xét đầu vào 411làm ví dụ.

U       % Implicit input: S. Push S^2
        % STACK: 16
G       % Push S again
        % STACK: 16, 4
lYL     % Outward, clockwise, east-first spiral of that size
        % STACK: 16,
                 [ 7  8  9 10;
                   6  1  2 11;
                   5  4  3 12;
                  16 15 14 13]
GoQ     % Push S, compute parity, add 1. Gives 1 for even S, 2 for odd
        % STACK: 16,
                 [ 7  8  9 10;
                   6  1  2 11;
                   5  4  3 12;
                  16 15 14 13],
                 1
&P      % Flip along that dimension (1 is vertical, 2 is horizontal).
        % This corrects for the orientation of the spiral
        % STACK: 16,
                 [16 15 14 13;
                   5  4  3 12;
                   6  1  2 11;
                   7  8  9 10]
-       % Subtract, element-wise. The upper-left corner becomes 0
        % STACK: [ 0  1  2  3
                  11 12 13  4
                  10 15 14  5
                   9  8  7  6]
>       % Implicit input (below): N. Greater than?, element-wise.
        % This transforms the first N entries, starting from
        % upper-left, inward, east-first, into 1, and the rest
        % into 0
        % STACK: [1 1 1 1;
                  0 0 0 1;
                  1 0 0 1;
                  1 1 1 1]
42*     % Multiply each entry by 42
        % STACK: [42 42 42 42;
                   0  0  0 42;
                  42  0  0 42;
                  42 42 42 42]
c       % Convert to char. Char 0 will be displayed as space.
        % Implicit display
        % STACK: ['****';
                  '   *';
                  '*  *';
                  '****']

1
Ồ, tôi chưa bao giờ giỏi chơi gôn, nhưng giải quyết nó bằng 17 byte ... Điều đó có vẻ kỳ diệu :) (Tôi biết rằng có thể những câu trả lời ngắn hơn đang đến, nhưng trước tiên bạn và đây là ấn tượng của tôi :)
nicael

1
Một phần của công việc được thực hiện bởi một chức năng xoắn ốc tích hợp. Tôi vừa thêm một lời giải thích
Luis Mendo

@nicael Chào mừng bạn đến với thế giới ngôn ngữ chơi gôn nhằm mục đích cụ thể. :)
Erik the Outgolfer

3
+1 cho ví dụ đầy đủ bên cạnh lời giải thích
IanF1

1
@ user202729 codegolf.stackexchange.com/questions/125966/ Kẻ
Luis Mendo

6

Stax , 19 byte

±♪☺ÿzMæ¡♠à╣♂7☼V♀§9↓

Chạy và gỡ lỗi nó

Nó bắt đầu bằng cách xây dựng một chuỗi có tất cả các ký tự trong kết quả với tất cả các dấu hoa thị được căn trái. Sau đó, nó sẽ mất các lát ngày càng lớn ở cuối chuỗi và "bọc" chúng xung quanh một lưới khi nó xoay lưới.

Đây là cùng một chương trình, giải nén, không ghi chú và nhận xét.

'**     repeat "*" specified number of times
,J(     square the top of the input stack, and right-pad string to that length
z       push an empty array - this is the result grid built up in the loop
{       begin a block to loop
  ~     push grid to the input stack
  ihNv  push -(i / 2) - 1 where i is the 0-based iteration index using integer division
  :/]   split the string at that index and wrap the second half in a singleton array
  ,     pop the grid from the input stack
  rM+   rotate the grid clockwise, then prepend the split string as the new first row
  n     copy what's left of the original string to top of stack for the loop condition
w       while; execute block until condition is truthy
m       display resulting grid

Chạy và gỡ lỗi nó


2
Điều đó thật thú vị với tôi rằng trên Android câu trả lời này có chứa một nụ cười màu cam.
StarWeaver

@StarWeaver Có nhiều câu trả lời trong Stax làm như vậy.
Weijun Zhou

Tôi thực sự bối rối khi đọc lời giải thích và không thấy một. Tôi chỉ nghĩ rằng Stax có một trang mã thực sự kỳ lạ!
ndm13

@ ndm13: Tôi cho rằng nó có một trang mã kỳ lạ. Nó có nguồn gốc từ CP437 , một loại mã hóa "thực" có cùng ký tự trong đó. Bạn sẽ thấy khuôn mặt tươi cười tương tự nếu bạn theo liên kết đó trên điện thoại của bạn.
đệ quy


4

APL (Dyalog) , 65 byte

' *'[1+⎕>⊖∘⌽⍣o(⊖×⍨-,⍨⍴∘(⍋+\)×⍨↑(⌈2÷⍨×⍨),(+⍨⍴1,⊢,¯1,-)(/⍨)2/⍳)o←⎕]

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

Mã cho ma trận xoắn ốc được lấy từ một câu trả lời khác của tôi .


Mã của bạn vẽ hình xoắn ốc sai hướng nếu Nlà số lẻ :)
nicael

@nicael đã sửa (giống như vá hơn). cảm ơn
Uriel


Có lẽ tôi đang sử dụng đầu vào sai cách?
nicael

@nicael arghh. OK, tôi nghĩ rằng nó ổn bây giờ.
Uriel



3

Than , 34 byte

NθFE⮌E⊗N∨ι¹÷⁺鬬겫F‹θι≔θι×ι*≧⁻ιθ↷

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Đầu vào N.

FE⮌E⊗N∨ι¹÷⁺鬬겫

Độ dài của cánh tay xoắn ốc (trừ góc) là S-1, S-1, S-1, S-2, S-2, S-3, ..., 3, 2, 2, 1, 1, 1. Điều này được hình thành bằng cách bắt đầu với phạm vi từ 0đến nhưng không bao gồm2S , thay đổi 0 thành 1, đảo ngược nó, thêm 1 cho mỗi phần tử sau phần tử đầu tiên và cuối cùng là số nguyên chia tất cả các phần tử cho 2. Danh sách này sau đó được lặp lại.

F‹θι≔θι

Nếu có ít ngôi sao còn lại để vẽ hơn chiều dài của cánh tay tiếp theo, hãy giảm cánh tay xuống chiều dài đó.

×ι*

Vẽ số sao thích hợp.

≧⁻ιθ

Trừ đi số lượng sao còn lại.

Xoay hướng vẽ theo 90 ° theo chiều kim đồng hồ.


3

J, 60 56 byte

-4 Byte bằng cách sửa đổi công cụ xây dựng cho hình xoắn ốc để việc trừ nó khỏi y ^ 2 là không cần thiết

4 :'''* ''{~x<|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y'

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

Giải thích sắp tới sớm bây giờ.

Giải trình:

4 :'''* ''{~x<|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y'  | Explicit dyad definition
                    (|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y   | Generate a y by y inward spiral
                                                  ,.*:y   | The matrix [[y^2]]
                    (                   )^:(+:<:y)        | 2*(y-1) times...
                     |:@|.                                | Rotate
                          ,                               | Append
                                    i.@#                  | [0..len(n)-1]
                           <:@{:@{:-                      | Subtracted from the previous value and decremented
              |."1|.                                      | Flip around antidiagonal
            x>                                            | Test if each entry is less than x
    '' *''{~                                              | ' ' for 0, '*' for 1

Ví dụ:

   3 :'(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y' 4
7  8  9 10
6 15 16 11
5 14 13 12
4  3  2  1
   3 :'|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y' 4
1  2  3 4
12 13 14 5
11 16 15 6
10  9  8 7
   11(4 :'x<|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y') 4
0 0 0 0
1 1 1 0
0 1 1 0
0 0 0 0
   11(4 :'''* ''{~x<|."1|.(|:@|.,<:@{:@{:-i.@#)^:(+:<:y),.*:y') 4
****
   *
*  *
****

Bạn cũng có thể thêm một liên kết đến ví dụ thực thi?
nicael

@nicael Đã thêm :)
Bolce Bussiere

2

Kotlin , 361 355 353 334 byte

6 byte được lưu nhờ Jonathan
2 byte được lưu thay đổi thành khi
19 byte được lưu chuyển sang lambda & theo dõi các cạnh bên ngoài

{s:Int,n:Int->var a=Array(s,{_->Array(s,{_->' '})})
var r=0
var c=0
var d=0
var e=0
var f=1
var g=s-1
var h=g
for(i in 1..n){a[r][c]='*'
when(d){0->if(c<g)c++
else{d=1
r++
g--}
1->if(r<h)r++
else{d=2
c--
h--}
2->if(c>e)c--
else{d=3
r--
e++}
3->if(r>f)r--
else{d=0
c++
f++}}}
for(i in 0..s-1){for(j in 0..s-1)print(a[i][j])
println()}}

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


1
Tôi không thực sự chắc chắn làm thế nào để thử nó vì trường đầu vào trống.
nicael

1
@nicael Đó là một chức năng. điều này có thể dễ sử dụng hơn - cuộc gọi được thực hiện ở chân trang.
Jonathan Allan

1
Tôi không biết nhiều về Kotlin nhưng tin rằng ==' 'có thể được thay thế bằng <'*'. Cũng d==0với d<1d==3với d>2. Đây có vẻ như là những sân golf khá cơ bản vì vậy có lẽ cũng có những người khác!
Jonathan Allan

@nicael bạn có thể đặt hai số nguyên vào trường nhập, kích thước trên dòng đầu tiên, số thứ hai.
JohnWells

1
@JohnWells thực sự, nó hoạt động. Bằng cách nào đó nó quá chậm, nhưng nó không thành vấn đề.
nicael

2

Java 10, 284 282 281 263 byte

s->n->{var c=new char[s][s];for(var d:c)java.util.Arrays.fill(d,' ');for(int i=0,j=0,y=0,x=1,u=s-1,l=0;n-->0;c[j][i]=42,i+=x,j+=y,l+=i==l&x==0?1:0,u-=i==l&j==l&y<1?1:0)if(x!=0){var b=x>0?i<u:i>l;y=b?0:x;x=b?x:0;}else{var b=y>0?j<u:j>l;x=b?0:-y;y=b?y:0;}return c;}

Một thử thách thú vị!

Dùng thử trực tuyến tại đây .

Cảm ơn Kevin Cruijssen vì đã chơi golf 18 byte.

Phiên bản bị đánh cắp:

s -> n -> { // lambda taking two integer arguments in currying syntax
    var c = new char[s][s]; // the matrix containing the spiral
    for(var d : c) // for every row
        java.util.Arrays.fill(d, ' '); // fill it with spaces
    for(int i = 0, j = 0, // the coordinates of the next '*'
            y = 0, x = 1, // the direction to move in
            u = s-1, l = 0; // the upper and lower bounds
        n-- > 0; // decrecement the length of the spiral and repeat as many times
        c[j][i] = 42, // draw the '*', 42 is ASCII code
        i += x, j += y, // move to the next cell
        l += i == l & x == 0 ? 1 : 0, // adjust lower bound if necessary
        u -= i == l & j == l & y < 1 ? 1 : 0) // adjust upper bound if necessary
        if(x != 0) { // if moving in x direction
            var b = x > 0 ? i < u : i > l; // if we hit the bounds
            y = b ? 0 : x; // flip directions,
            x = b ? x : 0; // turning around
        } else { // if moving in y direction
            var b = y > 0 ? j < u : j > l; // if we hit the bounds
            x = b ? 0 : -y; // flip directions,
            y = b ? y : 0;  // turning around
        }
    return c; // return the matrix
}

263 byte Hai vòng lặp cuối cùng chủ yếu được thay đổi và a var bđược thêm vào để bạn chỉ phải thực hiện một lần x>0?i<u:i>ly>0?j<u:j>lmỗi lần, thay vì hai lần mỗi vòng.
Kevin Cruijssen

@KevinCruijssen golf tuyệt vời, cảm ơn!
OOBalance

2

JavaScript (Node.js) , 167 164 163 byte

  • cảm ơn @Erik the Outgolfer và @nicael cho khoảng trắng (3 byte)
  • cảm ơn @micha vì đã tham gia``split ,thay vì bản đồ (1 byte)
(l,s)=>{a=(b=[...Array(l)]).map(x=>b.map(_=>" "))
for(d=1,x=y=D=0;s--;x+=d,y+=D)a[y][x]="*",(a[y+D]||[])[x+d]!=" "?[d,D]=[-D,d]:0
return a.join`
`.split`,`.join``}

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


1
Đẹp, nó hoạt động! Bạn có thể loại bỏ khoảng trắng / dòng mới để làm cho nó thậm chí ngắn hơn?
nicael


1
Đẹp! Nếu phiên bản Kotlin và Java sử dụng cùng một phương thức thì chúng sẽ ngắn hơn rất nhiều! Đó là một cách phát hiện thanh lịch khi bạn chạm vào đường xoắn ốc hoặc đường viền và sau đó biến "con rùa". Rất thông minh! Ít hơn một byte: thay đổi trả về thành return a.join` `.split`,`.join``.
micha

@micha trước hết cảm ơn bạn :). thứ hai a.join` .split, `.join`` không tạo ra hình xoắn ốc" độc đáo "(với các dòng mới) vì vậy tôi nghĩ đó là một vấn đề
DanielIndie

@DanielIndie, dòng mới đã được định dạng, tham gia đầu tiên nên có một dòng mới. Xem nó
micha
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.