별표 나선


29

크기의 나선 S과 단계가 주어지면 별표가 N있는 "사각형" S*S나선을 N바깥 쪽에서 안쪽 반경으로 시계 방향으로 출력합니다.

아래의 테스트 사례 (예).

  1. 입력: 4 3

    산출:

    ***
    
  2. 입력: 4 6

    산출:

    ****
       *
       *
    
  3. 입력: 4 11

    산출:

    ****
       *
    *  *
    ****
    
  4. 입력: 6 18

    산출:

    ******
         *
         *
    *    *
    *    *
    ******
    
  5. 입력: 6 22

    산출:

    ******
    ***  *
    *    *
    *    *
    *    *
    ******
    
  6. 입력: 6 27

    산출:

    ******
    ******
    *   **
    *   **
    *   **
    ******
    
  7. 입력: 1 1

    산출:

    *
    

다음과 같은 경우 사례를 처리 할 필요가 없습니다.

  • 제공된 N별표는 주어진 S*S치수 의 나선에 "맞을"수 없습니다 .

  • 하나 N또는 S제로이다.

문제는 코드 골프, 최단 바이트 응답 수, 모든 언어를 사용할 수 있습니다.

출력에는 원하는만큼 후행 공백이있을 수 있습니다.


후행 공백 / 개행을 가질 수 있습니까?
user202729

2
반경 대신 S 크기 (또는 최소 직경 )를 호출 합니다.
Luis Mendo

@ 루이스 페어 포인트!
nicael

3
친애하는 친구 , 질문뿐만 아니라 답변에 투표하십시오. 이 도전을하기가 쉽습니다. 그것에 대한 답변을 제공하는 것이 확실히 더 어렵다고 생각합니다.
nicael

2
당신 만이 그렇게 생각합니다. 잘 받고 분명한 도전 과제를 작성하는 것은 매우 어렵습니다. (여기서 댓글 스레드를 확인하십시오. 챌린지가 게시 된 후 몇 가지 제안이 있습니다)
user202729

답변:


16

MATL , 17 16 바이트

UGlYLGoQ&P->42*c

온라인으로 사용해보십시오!

설명 (예시)

입력을 고려 4하고 11예를 들어.

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
와우, 나는 바로 여기에이 :) 내 노출이 골프에서 좋은 적이 없었지만, 17 바이트로 해결 ... 마법 같은 외모 : (나는 아마도 짧은 답변이 오는 것을 알고,하지만 넌 제
nicael

1
작업의 일부는 내장 나선형 기능으로 수행됩니다. 방금 설명을 추가했습니다
Luis Mendo

@nicael 특정 목적을위한 골프 언어의 세계에 오신 것을 환영합니다. :)
Outgolfer Erik

3
설명과 함께 전체 예를 보려면 +1
IanF1


6

Stax , 19 바이트

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

실행 및 디버깅

결과에 모든 별표가 왼쪽 정렬 된 상태로 모든 문자가 포함 된 문자열을 작성하는 것으로 시작합니다. 그런 다음 줄 끝에서 점점 더 큰 조각을 가져 와서 그리드를 회전 할 때 그리드 주위를 "랩"합니다.

압축을 풀고 풀고 주석 처리 한 동일한 프로그램이 있습니다.

'**     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

실행 및 디버깅


2
안드로이드 에서이 답변에는 주황색 얼룩 스마일이 포함되어 있다는 사실이 놀랍습니다.
StarWeaver

@StarWeaver Stax에는 많은 답변이 있습니다.
Weijun Zhou

설명을 읽을 때 혼란스러워서 보지 못했습니다. Stax에 정말 이상한 코드 페이지가 있다고 생각했습니다!
ndm13

@ ndm13 : 이상한 코드 페이지가 있다고 가정합니다. CP437 에서 파생되었으며 동일한 문자를 가진 "실제"인코딩입니다. 휴대 전화에서 해당 링크를 따라 가면 같은 웃는 얼굴이 나타납니다.
재귀


4

APL (Dyalog) , 65 바이트

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

온라인으로 사용해보십시오!

나선형 행렬의 코드 는 내 또 다른 대답 에서 가져온 입니다.


N이상한 경우 코드가 잘못된 방향으로 나선을 그립니다. :)
nicael

@nicael 고정 (패치 된 것과 비슷 함). 감사합니다
Uriel


어쩌면 내가 잘못된 방식으로 입력을 사용하고 있습니까?
nicael

@nicael arghh. 좋아, 지금은 괜찮을 것 같아.
Uriel



3

, 34 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

Nθ

입력 N.

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

나선 팔의 길이 (모서리 제외)이다 S-1, S-1, S-1, S-2, S-2, S-3, ..., 3, 2, 2, 1,1 , 1. 이것은 0최대 범위에서 시작하여 제외 2S, 0에서 1로 변경, 역전, 첫 번째 요소 다음에 각 요소에 1 추가, 마지막으로 모든 요소를 ​​2로 나누는 정수로 구성됩니다.이 목록은 반복됩니다.

F‹θι≔θι

다음 팔의 길이보다 그릴 왼쪽에 별이 적 으면 팔의 길이를 줄이십시오.

×ι*

적절한 수의 별을 그립니다.

≧⁻ιθ

남은 별 수에서 뺍니다.

드로잉 방향을 시계 방향으로 90 ° 회전합니다.


3

J, 60 56 바이트

y ^ 2에서 빼는 것이 필요하지 않도록 나선형의 빌드 프로세스를 수정하여 -4 바이트

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

온라인으로 사용해보십시오!

설명 .

설명:

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

예 :

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

실행 예제에 대한 링크를 추가 할 수 있습니까?
nicael

@nicael 추가 :)
Bussiere

2

코 틀린 , 361 355 353334 바이트

6 바이트 조나단 덕분에 저장된
2 바이트로 변경시에 저장 한
19 바이트의 바깥 쪽 가장자리를 람다로 전환 추적 및 저장

{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()}}

온라인으로 사용해보십시오!


1
입력 필드가 비어 있으므로 시도하는 방법을 잘 모르겠습니다.
nicael

1
@nicael 그것은 기능이다. 이것은 사용하기 쉬울 수 있습니다-바닥 글에서 전화가 걸립니다.
Jonathan Allan

1
나는 Kotlin을 전혀 모르지만 ==' '로 대체 될 수 있다고 생각 합니다 <'*'. 또한 d==0d<1d==3d>2. 이것들은 꽤 근본적인 골프처럼 보이므로 다른 골프 클럽도있을 것입니다!
Jonathan Allan

@ nicael 입력 필드에 두 개의 정수, 첫 번째 줄의 크기, 두 번째 숫자를 넣을 수 있습니다.
JohnWells

1
@ JohnWells는 실제로 작동합니다. 어떻게 든 너무 느리지 만 중요하지 않습니다.
nicael

2

자바 10, 284 282 281 263 바이트

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;}

재미있는 도전!

여기에서 온라인으로 사용해보십시오 .

18 바이트 골프 를 한 Kevin Cruijssen 에게 감사 합니다.

언 골프 버전 :

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 바이트 마지막 두 개의 루프가 주로 변경하고,이 var b경우에만 할 필요가 있으므로 추가 x>0?i<u:i>l하고 y>0?j<u:j>l각 한 번 대신 두 번 각각의.
Kevin Cruijssen

@KevinCruijssen 위대한 골프, 감사합니다!
OOBalance

2

자바 스크립트 (Node.js를) , 167 (164) 163 바이트

  • @Erik the Outgolfer와 @nicael 덕분에 공백 (3 바이트)
  • 조인을위한 @micha 덕분 ,에 맵 대신 분할 (1 바이트)
(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``}

온라인으로 사용해보십시오!


1
좋아요, 작동합니다! 공백이나 줄 바꿈을 제거하여 더 짧게 만들 수 있습니까?
nicael


1
아름다운! Kotlin과 Java 버전이 동일한 방법을 사용하면 훨씬 짧아집니다! 나선형이나 경계선을 칠 때 "거북이"를 돌릴 때 감지하는 우아한 방법입니다. 매우 영리한! 1 바이트 미만 :로 리턴을 변경하십시오 return a.join` `.split`,`.join``.
micha

@ micha 먼저 감사합니다 :). 두 번째 a.join` .split,`.join ''은 나선을 "좋은"(새 줄로) 출력하지 않으므로 문제가 있다고 생각합니다
DanielIndie

@DanielIndie, 줄 바꿈이 사라졌습니다. 첫 번째 조인에는 줄 바꿈이 있어야합니다. 를 참조하십시오
미샤를
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.