เครื่องหมายดอกจันเกลียว


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
ส่วนหนึ่งของงานจะทำโดยฟังก์ชั่นเกลียวในตัว ฉันเพิ่งเพิ่มคำอธิบาย
หลุยส์เมนโดะ

@nicael ยินดีต้อนรับสู่โลกแห่งการเล่นกอล์ฟภาษาที่มีวัตถุประสงค์เพื่อวัตถุประสงค์เฉพาะ :)
Erik the Outgolfer

3
+1 สำหรับตัวอย่างแบบเต็มพร้อมคำอธิบาย
IanF1


6

Stax , 19 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

มันเริ่มต้นด้วยการสร้างสตริงที่มีตัวละครทั้งหมดในผลลัพธ์ที่มีเครื่องหมายดอกจันทั้งหมดจัดชิดซ้าย จากนั้นมันจะใช้เวลาชิ้นใหญ่มากขึ้นในตอนท้ายของสตริงและ "ล้อม" พวกเขาไปรอบ ๆ ตารางในขณะที่มันหมุนตาราง

นี่คือโปรแกรมเดียวกันแตกออก ungolfed และแสดงความคิดเห็น

'**     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
มันช่างน่าประหลาดใจที่ฉันบน Android คำตอบนี้มีรอยส้มหยด
StarWeaver

@StWeWeaver มีคำตอบมากมายใน 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

4

PHP, 118 ไบต์

ปรับและแข็งแรงเล่นกอล์ฟวิธีการแก้ปัญหาของฉันสำหรับตัวอักษรเกลียว

for($w=$n=$argv[$s=1],$r="*";--$argv[2];$r[$p+=$s*$d+$s]="*")if(!$c=++$c%$n)($d^=$w)?$n--:$s=-$s;echo wordwrap($r,$w);

ทำงานด้วยphp -nr '<code>' <S> <N>หรือลองออนไลน์



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 ไบต์

-4 Bytes โดยการดัดแปลง build proccess สำหรับ Spiral เพื่อให้การลบออกจาก y ^ 2 นั้นไม่จำเป็น

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 เพิ่ม :)
Bolce Bussiere

2

Kotlin , 361 355 353 334 ไบต์

บันทึกไปแล้ว 6 ไบต์ขอบคุณ Jonathan
2 ไบต์บันทึกการเปลี่ยนแปลงเป็นเมื่อ
บันทึกข้อมูล 19 ไบต์สลับไปยัง lambda & การติดตามขอบด้านนอก

{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==0มีd<1และมีd==3 d>2สิ่งเหล่านี้ดูเหมือนสนามกอล์ฟระดับพื้นฐานที่น่ารัก
Jonathan Allan

@nicael คุณสามารถใส่จำนวนเต็มสองจำนวนในฟิลด์อินพุต, ขนาดบนบรรทัดแรก, ตัวเลขในวินาที
JohnWells

1
@ JohnWells ทำงานได้จริง อย่างใดมันช้าเกินไป แต่มันไม่สำคัญ
nicael

2

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

ความท้าทายที่สนุก!

ลองออนไลน์ได้ที่นี่

ขอบคุณKevin Cruijssenสำหรับการเล่นกอล์ฟขนาด 18 ไบต์

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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เพิ่มa ดังนั้นคุณต้องทำx>0?i<u:i>lและy>0?j<u:j>lแต่ละครั้งแทนที่จะเป็นสองครั้ง
Kevin Cruijssen

@KevinCruijssen กอล์ฟที่ยอดเยี่ยมขอบคุณ!
OOBalance

2

JavaScript (Node.js) , 167 164 163 ไบต์

  • ขอบคุณ @Erik the Outgolfer และ @nicael สำหรับช่องว่าง (3 ไบต์)
  • ขอบคุณ @micha สำหรับ join``split ,แทนแผนที่ (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 เวอร์ชันจะใช้วิธีการเดียวกันพวกเขาจะสั้นกว่ามาก! วิธีการตรวจจับที่สง่างามเช่นนี้เมื่อคุณชนกับเกลียวหรือเส้นขอบแล้วหมุน "เต่า" ฉลาดมาก! หนึ่งไบต์น้อย: return a.join` `.split`,`.join``เปลี่ยนกลับมาลงใน
มิชา

@micha ก่อนอื่นเลยขอบคุณ :) a.join` สอง.split, `ไม่เอาท์พุท .join`` เกลียว "อย่าง"(ที่มีเส้นใหม่) ดังนั้นผมจึงคิดว่าเป็นปัญหาของมัน
DanielIndie

@DanielIndie บรรทัดใหม่ถูกจัดรูปแบบแล้วการเข้าร่วมครั้งแรกควรมีการขึ้นบรรทัดใหม่ ดูมัน
มิชา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.