Yıldız sarmal


29

Boyut spirali Sve kademesi göz önüne alındığında, dıştan iç yarıçapa saat yönünde yapılmış, yıldızlara sahip N"kare" S*Sspiral çıkar N.

Aşağıdaki test durumları (örnekler).

  1. Giriş: 4 3

    Çıktı:

    ***
    
  2. Giriş: 4 6

    Çıktı:

    ****
       *
       *
    
  3. Giriş: 4 11

    Çıktı:

    ****
       *
    *  *
    ****
    
  4. Giriş: 6 18

    Çıktı:

    ******
         *
         *
    *    *
    *    *
    ******
    
  5. Giriş: 6 22

    Çıktı:

    ******
    ***  *
    *    *
    *    *
    *    *
    ******
    
  6. Giriş: 6 27

    Çıktı:

    ******
    ******
    *   **
    *   **
    *   **
    ******
    
  7. Giriş: 1 1

    Çıktı:

    *
    

Aşağıdaki durumlarda davaların ele alınması gerekli değildir:

  • sağlanan Nyıldız işaretleri verilen bir sarmal içinde "uyum" olamaz S*Sboyutları.

  • ya Nya da Ssıfırdır.

Zorluk, kod golfü, en kısa bayt cevap kazanır, herhangi bir dilde kullanılabilir.

Çıktınızda istediğiniz kadar sondaki (ancak baştaki değil) boşluk / yeni satır olabilir.


Sondaki boşluklara / yeni hatlara sahip olabilir miyiz?
user202729

2
Ben derim S boyutu (ya da en azından çapı yerine) yarıçapı
Luis Mendo

@Luis fuar noktası!
nicael

3
Sevgili dostlar , lütfen sadece soruya değil, cevaplara da oy verin. Bu zorluğu yapmak kolaydır. Buna bir cevap vermek (sanırım) kesinlikle daha zor.
nicael

2
Sadece sen öyle düşünüyorsun. İyi karşılanmış ve net bir mücadele yazmak çok zordur. (sadece
şuanki yorum başlığına bakın

Yanıtlar:


16

MATL , 17 16 bayt

UGlYLGoQ&P->42*c

Çevrimiçi deneyin!

Açıklama (örneğin)

Girdileri 4ve 11bir örnek olarak düşünün .

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
Vay be, golf oynamakta hiç iyi değildim, ama onu 17 byte ile çözdüm ... Bu sihire benziyor :) (daha kısa cevapların geleceğini biliyorum, ama ilk sen ve işte benim izlenimlerim :)
nicael

1
İşin bir kısmı, yerleşik bir spiral fonksiyonla yapılır. Sadece bir açıklama ekledim
Luis Mendo

@nicael Belirli amaçlara yönelik golf dilleri dünyasına hoş geldiniz. :)
Outgolfer Erik,

3
Açıklama yanında tam örnek için +1
IanF1


6

Stax , 19 bayt

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

Koş ve hata ayıkla

Sola hizalanmış tüm yıldızlarla sonuçtaki tüm karakterleri içeren bir dize oluşturarak başlar. Daha sonra dizginin sonundan giderek daha geniş dilimler alır ve ızgarayı döndürürken bunları bir ızgara etrafına "sarar".

İşte aynı program, paketlenmemiş, bağlanmamış ve yorum yaptı.

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

Koş ve hata ayıkla


2
Yanlışlıkla beni eğlendirir bu robot üzerinde bu cevap turuncu bir damla surat içerir.
StarWeaver

@ StarWeaver Stax'ta bunu yapan birçok cevap var.
Weijun Zhou,

Açıklamayı okuduğumda gerçekten kafam karıştı ve bir tane görmedim. Sadece Stax’ın çok garip bir kod sayfası olduğunu düşündüm!
ndm13

@ Ndm13: Sanırım tuhaf bir kod sayfası var. İçinde aynı karaktere sahip "gerçek" bir kodlama olan CP437'den türetilmiştir . Telefonunuzdaki bu bağlantıyı izlerseniz aynı gülen yüzü görmelisiniz.
özyinelemeli


4

APL (Dyalog) , 65 bayt

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

Çevrimiçi deneyin!

Spiral matrisin kodu , benim başka bir cevabımdan alınmıştır .


Kodunuz Ntek ise spirali yanlış yöne çekiyor :)
nicael

@nicael sabit (yamalı gibi). teşekkürler
Uriel


Belki de girişi yanlış kullanıyorum?
nicael

@nicael arghh. Tamam, bence şimdi iyi.
Uriel



3

Kömür , 34 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Nθ

Giriş N.

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

(Köşeleri hariç) spiral kolların uzunlukları S-1, S-1, S-1, S-2, S-2, S-3, ..., 3, 2, 2, 1, 1, 1. Bu, 0'dan 1'e 0kadar olan 2Sdeğişimlerden başlayarak , 0'dan 1'e değiştirerek, onu tersine çevirerek, her öğeye birinden sonra 1 ekleyerek ve son olarak tüm öğeleri 2'ye bölen tamsayı ile oluşturularak oluşturulur.

F‹θι≔θι

Bir sonraki kolun uzunluğundan daha az yıldız kalacaksa, kolu o uzunluğa düşürün.

×ι*

Uygun sayıda yıldız çizin.

≧⁻ιθ

Kalan yıldız sayısından çıkarın.

Çizim yönünü saat yönünde 90 ° döndürün.


3

J, 60 56 Bayt

-4 Bayt, sarmal için inşa işlemini değiştirerek y ^ 'den çıkarılmasını gereksiz kılıyordu.

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

Çevrimiçi deneyin!

Açıklama çok yakında .

Açıklama:

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

Örnekler:

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

Yürütülebilir örneğe bir bağlantı da ekleyebilir misiniz?
nicael

@nicael Eklendi :)
Bolce Bussiere

2

Kotlin , 361 355 353 334 bayt

Jonathan tarafından sağlanan 6 bayt
2 bayt kaydedildi ve
19 bayt lambdaya geçtiğinde ve dış kenarları takip ettiğinde değişti.

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

Çevrimiçi deneyin!


1
Giriş alanı boş olduğundan, nasıl deneneceğinden emin değilim.
nicael

1
@ nicael Bu bir fonksiyondur. bu kullanımı daha kolay olabilir - çağrı altbilgide yapılır.
Jonathan Allan

1
Kotlin'i pek tanımıyorum, ancak ==' 'bunun yerini alabileceğine inanıyorum <'*'. Ayrıca d==0birlikte d<1ve d==3birlikte d>2. Bunlar oldukça temel golf gibi görünüyor, bu yüzden muhtemelen başkaları da var!
Jonathan Allan

@nicael giriş alanına iki tam sayı, ilk satıra boyut, ikinci numaraya koyabilirsiniz.
JohnWells

1
@JohnWells gerçekten, işe yarıyor. Her nasılsa çok yavaş ama önemli değil.
nicael

2

Java 10, 284 282 281 263 bayt

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

Eğlenceli bir meydan okuma!

Burada çevrimiçi deneyin .

18 baytlık golf oynadığı için Kevin Cruijssen'e teşekkürler .

Ungolfed versiyonu:

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 bayt Son iki döngü esas olarak değiştirilir ve a var beklenir, böylece her biri iki kez yerine yalnızca x>0?i<u:i>lve birini bir y>0?j<u:j>lkez yapmanız gerekir .
Kevin Cruijssen

@KevinCruijssen harika golf, teşekkürler!
OOBalance

2

JavaScript (Node.js) , 167 164 163 bayt

  • @Erik Outgolfer ve @nicael (3 bayt) için teşekkürler
  • map ,yerine `` split'e katılmak için @micha'ya teşekkür ederiz (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``}

Çevrimiçi deneyin!


1
Güzel, işe yarıyor! Daha da kısaltmak için boşlukları / newlines kaldırabilir misiniz?
nicael


1
Güzel! Kotlin ve Java sürümü aynı yöntemi kullanacak olsaydı, çok daha kısa olurdu! Spirale veya kenarlara çarptığınızda tespit edip "kaplumbağayı" çevirmek için böyle zarif bir yol. Çok zeki! Bir bayt daha az: dönüşü değiştirin return a.join` `.split`,`.join``.
micha

Her şeyden önce @micha teşekkür ederim :). ikincisi a.join .split`,` jojo` spirali "güzel" (yeni çizgilerle)
çıkarmaz

@DanielIndie, yeni satır biçimlendirildi, ilk katılımın yeni bir satırı olmalı. Bakın
micha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.