ไขงูให้ฉันหน่อย!


34

กำหนดจำนวนเต็มอินพุทnวาดงูตัวเลขนั่นคือการวัดแบบตารางที่n x nประกอบด้วยตัวเลข1ผ่านทางn^2ที่บาดแผลซึ่งกันและกันในลักษณะต่อไปนี้:

อินพุตn = 3:

7 8 9
6 1 2
5 4 3

อินพุตn = 4:

 7  8  9 10
 6  1  2 11
 5  4  3 12
16 15 14 13

อินพุตn = 5:

21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

(ได้รับแรงบันดาลใจจากปัญหานี้จาก Project Euler)

นี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!


4
ตัวอย่าง: 4? หรือเลขคู่ใด ๆ
TheLethalCoder

1
เราขอสมมติว่าอินพุตเป็นคี่ได้ไหม
นาย Xcoder



1
ดูเพิ่มเติมได้ที่perlmonks.com/?node_id=487200พร้อมโซลูชันและลิงก์จำนวนมากในการตอบกลับ
b_jonas

คำตอบ:


43

MATL , 3 ไบต์

1YL

ลองออนไลน์!

คำอธิบาย

ในตัว ... ¯ \ _ (ツ) _ / ¯


31
ทำไม ... ทำไมถึงเป็นแบบในตัว?
TheLethalCoder

2
ฉันเดาว่านี่เป็นเรื่องเกี่ยวกับ "Magic Square" ใช่ไหม
Magic Octopus Urn

8
@TheLethalCoder เพราะ Matlab มีมันและฉันคิดว่ามันจะมีประโยชน์ ( ซึ่ง มัน เป็น จริง )
หลุยส์ Mendo

18

C #, 203 202 196 193 178 ไบต์

n=>{var r=new int[n,n];for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,b=1-2*(i%2),j;n>i++;){r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;}return r;}

บันทึกเป็นไบต์ด้วย @StefanDelport
บันทึกแล้ว 22 ไบต์ขอบคุณ @FelipeNardiBatista

สิ่งนี้ทำงานโดยการสังเกตต่อไปนี้เกี่ยวกับวิธีการสร้างกำลังสอง:

ภาพสี่เหลี่ยมจัตุรัสโดยที่ n = 5

ในขณะที่คุณสามารถเห็นแต่ละบิตจะถูกเพิ่มลงในตารางก่อนหน้า สำหรับเลขคู่ที่เราไปทางขวาของที่เราอยู่จนถึงจนถึงต่ำกว่าที่หนึ่งของตารางและจากนั้นไปทางซ้าย ตัวเลขที่แปลกเป็นสิ่งที่ตรงกันข้ามเราไปทางซ้ายหนึ่งจนถึงสูงกว่าความสูงในปัจจุบันและจากนั้นไปจนจบ

เวอร์ชันเต็ม / ฟอร์แมต:

using System;
using System.Linq;

class P
{
    static void Main()
    {
        Func<int, int[,]> f = n =>
        {
            var r = new int[n, n];
            for (int o = n - 2 + n % 2 >> 1, i = r[o, o] = 1, c = 2, w = o, h = o, b = 1 - 2 * (i % 2), j; n > i++;)
            {
                r[h, w += b] = c++;

                for (j = 0; j < i - 1; ++j)
                    r[h += b, w] = c++;

                for (j = 0; j < i - 1; ++j)
                    r[h, w -= b] = c++;
            }

            return r;
        };

        Console.WriteLine(String.Join("\n", f(3).ToJagged().Select(line => String.Join(" ", line.Select(l => (l + "").PadLeft(2))))) + "\n");
        Console.WriteLine(String.Join("\n", f(4).ToJagged().Select(line => String.Join(" ", line.Select(l => (l + "").PadLeft(2))))) + "\n");
        Console.WriteLine(String.Join("\n", f(5).ToJagged().Select(line => String.Join(" ", line.Select(l => (l + "").PadLeft(2))))) + "\n");

        Console.ReadLine();
    }
}

public static class ArrayExtensions
{
    public static T[][] ToJagged<T>(this T[,] value)
    {
        T[][] result = new T[value.GetLength(0)][];

        for (int i = 0; i < value.GetLength(0); ++i)
            result[i] = new T[value.GetLength(1)];

        for (int i = 0; i < value.GetLength(0); ++i)
            for (int j = 0; j < value.GetLength(1); ++j)
                result[i][j] = value[i, j];

        return result;
    }
}

1
++i<=n;สามารถกลายเป็นn>++iไม่มีอะไรที่ฉันเห็น +1
LiefdeWen

1
n%2<1?2:1เพื่อ2-x%2? ฉันไม่ได้ทดสอบใน C # แต่ใน C และ Python มันใช้งานได้
เฟลิเป้นาร์ดีบาติสตา

1
for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,j;n>i++;){var b=i%2<1; ....golfed a bit
Felipe Nardi Batista

@FelipeNardiBatista Awesome คงไม่มีใครคิดถึงสองคนนี้เลย! ขอบคุณ
TheLethalCoder

1
var b=1-2*(i%2);r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;
เฟลิ Nardi Batista

15

Dyalog APL, 70 56 45 41 ไบต์

,⍨⍴∘(⍋+\)×⍨↑(⌈2÷⍨×⍨),(+⍨⍴1,⊢,¯1,-)(/⍨)2/⍳

ลองออนไลน์!

อย่างไร?

(+⍨⍴1,⊢,¯1,-)(/⍨)2/⍳

คำนวณความแตกต่างระหว่างดัชนี 1และ¯1สำหรับขวาและซ้าย¯⍵และสำหรับขึ้นและลง

1,⊢,¯1,-มาเป็น1 ⍵ ¯1 ¯⍵, +⍨⍴เหยียดอาร์เรย์นี้เพื่อความยาวของ⍵×2ดังนั้นสุดท้าย2/⍳สามารถทำซ้ำแต่ละของพวกเขาด้วยการนับซ้ำเพิ่มขึ้นทุกองค์ประกอบที่สอง:

      (1,⊢,¯1,-) 4
1 4 ¯1 ¯4
      (+⍨⍴1,⊢,¯1,-) 4
1 4 ¯1 ¯4 1 4 ¯1 ¯4
      (2/⍳) 4
1 1 2 2 3 3 4 4
      ((+⍨⍴1,⊢,¯1,-)(/⍨)2/⍳) 4
1 4 ¯1 ¯1 ¯4 ¯4 1 1 1 4 4 4 ¯1 ¯1 ¯1 ¯1 ¯4 ¯4 ¯4 ¯4

แล้ว

(⌈2÷⍨×⍨),

เติมองค์ประกอบด้านบนซ้ายของเกลียว

×⍨↑

จำกัดองค์ประกอบ⍵ 2แรกของรายการระยะทางนี้

+\

ดำเนินการผลรวมสะสม

ให้คะแนนดัชนี ( ⍵[i] = ⍵[⍵[i]]) เพื่อแปลเมทริกซ์ดั้งเดิมด้วยดัชนีของทุกองค์ประกอบและสุดท้าย

,⍨⍴

รูปร่างเป็น⍵×⍵เมทริกซ์


สำหรับผู้ที่สนใจเทคนิคนี้กล่าวถึงในระยะในบทความที่ยอดเยี่ยมนี้
โยนาห์

9

C, 321 307 295 284 283 282 ไบต์

ขอบคุณ @Zachary T และ @Jonathan Frech สำหรับการเล่นกอล์ฟแบบไบท์!

#define F for(b=a;b--;)l
i,j,k,a,b,m;**l;f(n){n*=n;l=calloc(a=m=3*n,4);F[b]=calloc(m,4);for(l[i=j=n][j]=a=k=1;n>k;++a){F[i][++j]=++k;F[++i][j]=++k;++a;F[i][--j]=++k;F[--i][j]=++k;}for(i=0;i<m;++i,k&&puts(""))for(j=k=0;j<m;)(a=l[i][j++])>0&&a<=n&&printf("%*d ",(int)log10(n)+1,k=a);}

จัดสรรศูนย์สองมิติจากนั้นเริ่มเติมจากที่ใดที่หนึ่งตรงกลาง สุดท้ายค่าที่มากกว่าศูนย์ แต่มีขนาดเล็กกว่าหรือเท่ากับสแควร์ของอินพุตจะถูกพิมพ์

ลองออนไลน์!

จัดรูปแบบ:

#define F for(b=a; b--;)l
i, j, k, a, b, m; **l;
f(n)
{
    n *= n;
    l = calloc(a=m=3*n, 4);

    F[b] = calloc(m, 4);

    for(l[i=j=n][j]=a=k=1; n>k; ++a)
    {
        F[i][++j] = ++k;
        F[++i][j] = ++k;
        ++a;

        F[i][--j] = ++k;
        F[--i][j] = ++k;
    }

    for(i=0; i<m; ++i, k&&puts(""))
        for(j=k=0; j<m;)
            (a=l[i][j++])>0 && a<=n && printf("%*d ", (int)log10(n)+1, k=a);
}

1
เป็นไปได้ไหมที่จะแทนที่i,j,k,a,b,m;f(n){n*=n;int**l=calloc(a=m=3*n,4);ด้วยi,j,k,a,b,m,**l;f(n){n*=n;l=calloc(a=m=3*n,4);เพื่อบันทึก byte?
Zacharý

1
คุณอาจสามารถแทนที่k<=n;ด้วยn>k;เพื่อบันทึกไบต์
Jonathan Frech

6

PHP , 192 ไบต์

for($l=strlen($q=($a=$argn)**2)+$d=1,$x=$y=$a/2^$w=0;$i++<$q;${yx[$w%2]}+=$d&1?:-1,$i%$d?:$d+=$w++&1)$e[$x-!($a&1)][$y]=sprintf("%$l".d,$i);for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);

ลองออนไลน์!

วิธีเดียวกันสร้างสตริงแทนอาร์เรย์

PHP , 217 ไบต์

for($l=strlen($q=($a=$argn)**2)+$d=1,$x=$y=($a/2^$w=0)-!($a&1),$s=str_pad(_,$q*$l);$i++<$q;${yx[$w%2]}+=$d&1?:-1,$i%$d?:$d+=$w++&1)$s=substr_replace($s,sprintf("%$l".d,$i),($x*$a+$y)*$l,$l);echo chunk_split($s,$a*$l);

ลองออนไลน์!


1
[-1,1][$d&1]->$d&1?:-1
Titus

@Titus ขอบคุณคุณฉันไม่เห็นมัน
JörgHülsermann

1
for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);นี่คือหนึ่งไบต์เพิ่มเติมได้ที่: และอีกอันหนึ่ง: "%$l".d. และอีกหนึ่ง: ->$x*$l*$a+$y*$l ($x*$a+$y)*$l
ติตัส

1
และฉันคิดว่าในรุ่นที่สองคุณสามารถเริ่มต้น$sเป็นขีดล่าง (หรือตัวอักษรหรือตัวเลข) ตัวละครนั้นจะถูกเขียนทับ
ติตัส

@Titus ขอขอบคุณและคุณสามารถใช้วิธีการ.dของคุณเองเพื่อประหยัด 2 ไบต์
JörgHülsermann

6

PHP, 185 176 174 ไบต์

for(;$n++<$argn**2;${xy[$m&1]}+=$m&2?-1:1,$k++<$p?:$p+=$m++%2+$k=0)$r[+$y][+$x]=$n;ksort($r);foreach($r as$o){ksort($o);foreach($o as$i)printf(" %".strlen($n).d,$i);echo"
";}

ทำงานเป็นท่อที่มี-nRหรือทดสอบออนไลน์

ทำให้พังถล่ม

for(;$n++<$argn**2;     # loop $n from 1 to N squared
    ${xy[$m&1]}+=$m&2?-1:1, # 2. move cursor
    $k++<$p?:               # 3. if $p+1 numbers have been printed in that direction:
        $p+=$m++%2+             # increment direction $m, every two directions increment $p
        $k=0                    # reset $k
)$r[+$y][+$x]=$n;           # 1. paint current number at current coordinates

ksort($r);              # sort grid by indexes
foreach($r as$o){       # and loop through it
    ksort($o);              # sort row by indexes
    foreach($o as$i)        # and loop through it
        printf(" %".strlen($n).d,$i);   # print formatted number
    echo"\n";               # print newline
}

6

APL (Dyalog Classic) , 32 29 ไบต์

1+×⍨-{⊖∘⌽⍣⍵⌽{⌽⍉,⌸⍵+≢⍵}⍣2⍣⍵⍪⍬}

ลองออนไลน์!

⎕io←1การใช้ประโยชน์ เริ่มต้นด้วยเมทริกซ์ 0 คูณ 1 ( ⍪⍬) 2N ⍣2⍣⍵คูณ( ) เพิ่มความสูงของเมทริกซ์ ( ≢⍵) ให้กับแต่ละองค์ประกอบวาง1 2...heightด้านขวา ( ,⌸) และหมุน ( ⌽⍉) เมื่อเสร็จแล้วให้แก้ไขการวางแนวของผลลัพธ์ ( ⊖∘⌽⍣⍵⌽) และกลับตัวเลขโดยการลบออกจาก N 2 +1 ( 1+×⍨-)


5

Mathematica, 177 ไบต์

(n=#;i=j=Floor[(n+1)/2];c=1;d=0;v={{1,0},{0,-1},{-1,0},{0,1}};a=Table[j+n(i-1),{i,n},{j,n}];Do[Do[Do[a[[j,i]]=c++;{i,j}+=v[[d+1]], {k,l}];d=Mod[d+1,4],{p,0,1}],{l,n-1}];Grid@a)&

8
Waaait ไม่มีในตัวสำหรับเรื่องนี้ใน Mathematica?
Mr. Xcoder

5

C ++, 245 228 ไบต์

void f(){for(int i=0,j=-1,v,x,y,a,b;i<n;i++,j=-1,cout<<endl)while(++j<n){x=(a=n%2)?j:n-j-1;y=a?i:n-i-1;v=(b=y<n-x)?n-1-2*(x<y?x:y):2*(x>y?x:y)-n;v=v*v+(b?n-y-(y>x?x:y*2-x):y+1-n+(x>y?x:2*y-x));cout<<setw(log10(n*n)+1)<<v<<' ';}}

ลองออนไลน์!

ฟังก์ชันคำนวณและพิมพ์ค่าของแต่ละจำนวนของเมทริกซ์ขึ้นอยู่กับตำแหน่งx, yของมันโดยใช้ตรรกะนี้:

การคำนวณค่างูขึ้นอยู่กับตำแหน่ง

เวอร์ชันที่จัดรูปแบบ :

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

void f(int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            int value = 0;

            // Invert x and y when n is even
            int x = n % 2 == 0 ? n - j - 1 : j;
            int y = n % 2 == 0 ? n - i - 1 : i;
            if (y < (n - x))
            {
                // Left-top part of the matrix
                int padding = x < y ? x : y;
                value = n - 1 - padding * 2;
                value *= value;
                value += y >= x ? n - x - y : n + x - y - (y * 2);
            }
            else
            {
                // Right-bottom part of the matrix
                int padding = x > y ? n - x : n - y;
                value = n - padding * 2;
                value *= value;
                value += x > y ? y - padding + 1 : n + y - x - (padding * 2) + 1;
            }

            cout << setw(log10(n * n) + 1);
            cout << value << ' ';
        }

        cout << endl;
    }
}

int main()
{
    int n;
    while (cin >> n && n > 0)
    {
        f(n);
        cout << endl;
    }
}

5

Python 3 , 249 247 ไบต์

ฉันเริ่มต้นอาร์เรย์ 2 มิติและหาจุดเริ่มต้นซึ่งเป็นศูนย์กลางสำหรับคี่ n หรือออฟเซ็ต (-1, -1) สำหรับแม้แต่ n จากนั้นปรับขนาดรูปแบบการเติม / เคอร์เซอร์ด้วยหมายเลข 'แหวน' ปัจจุบัน ฉันรู้สึกเหมือนว่าฉันขาดเคล็ดลับในการตีความเส้นทาง แต่ฉันไม่ได้คิดอะไรถูกลงเลย

def f(n):
 M=[n*[0]for a in range(n)]
 x=y=n//2-1+n%2
 M[x][y]=i=s=1
 while 1:
  t=s*2
  for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t:
   if i==n*n:print(*M,sep='\n');return
   v=[1,-1][d in'LU']
   if d in'UD':x+=v
   else:y+=v
   M[x][y]=i=i+1
  s+=1

ลองออนไลน์!

-2 ขอบคุณ Zachary T!


คุณนับจำนวนไบต์เป็นอย่างไร แท็บการเว้นวรรคและการขึ้นบรรทัดใหม่นับเป็นอย่างดี
Felipe Nardi Batista

ฉันแทนที่ทุก \ n และ \ t ด้วย "" และใช้เลน () ฉันเพิ่งคัดลอกข้างต้นและ redid เพื่อให้แน่ใจว่าฉันไม่ได้เปลี่ยนแปลงอะไรและลืมที่จะนับใหม่ แต่ฉันได้รับหมายเลขเดียวกัน ฉันพลาดอะไรไปหรือเปล่า?
nocturama

ฉันนับ\tและ\nเป็น 1 ไบต์และยังคงได้รับ 249 bytes
Felipe Nardi Batista

e: ^^^ ฉันควรใช้วิธีไหนดีกว่านี้ ดูเหมือนว่าพวกเขาจะใช้แทนฉันได้เสมอ ^^^ แปลกนี่คือสิ่งที่ฉันได้รับใน IDLE:len("def f(n): M=[n*[0]for a in range(n)] x=y=n//2-(n%2<1) M[x][y]=i=s=1 while 1: t=s*2 for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t: if i==n*n:print(*M,sep='\n');return v=[1,-1][d in'LU'] if d in'UD':x+=v else:y+=v M[x][y]=i=i+1 s+=1") 223
nocturama

โดยทั่วไปโปรแกรมแก้ไขข้อความจะบอกให้คุณทราบว่ามีตัวละครกี่ตัวที่เลือกดังนั้น CTRL + A และอ่านสิ่งที่พูด
Felipe Nardi Batista

5

ภาษา Wolfram (Mathematica) , (... ) 83 ไบต์

ไบต์วัดเป็น UTF8, \[LeftFloor]( ) และ\[RightFloor]( ) ราคา 3 ไบต์ต่อหน่วย Mathematica ไม่มีชุดอักขระไบต์พิเศษใด ๆ

Table[Max[4x^2-Max[x+y,3x-y],4y
y-{x+y,3y-x}]+1,{y,b+1-#,b=⌊#/2⌋},{x,b+1-#,b}]&

ลองออนไลน์!


ใช้แบบฟอร์มปิดสำหรับแต่ละ 4 กรณีจากนั้นนำค่าสูงสุดอย่างระมัดระวังเพื่อให้ได้ผลลัพธ์ที่ต้องการ

ส่งคืนอาร์เรย์ของจำนวนเต็ม 2D ฉันไม่แน่ใจว่าสิ่งนี้ได้รับอนุญาตหรือไม่และแม้ว่ามันจะถูกถามในความคิดเห็นแต่ OP ไม่ได้ตอบกลับ


4

Clojure, 206 ไบต์

(defmacro F[s]`(if(~'r(+ ~'p ~'v ~s))~'v ~s))
#(loop[i 1 p(*(quot(dec %)2)(inc %))v 1 r{}](if(<(* % %)i)(partition %(map r(range i)))(recur(inc i)(+ p v)({1(F %)-1(F(- %))%(F -1)(- %)(F 1)}v)(assoc r p i))))

ฉันเดาว่านี่เป็นการเริ่มต้นที่ดีสร้างกระดานตามลำดับแฮชแผนที่แล้วแบ่งพาร์ติชันออกเป็นn x nรายการ ซึ่งdefmacroจบลงด้วยความยาว แต่รหัสก็ยังสั้นกว่าที่ไม่มี มีซินแท็กซ์ที่ใช้ง่ายกว่าในการอธิบาย

vเป็นกลุ่มของไบต์คำนวณจุดเริ่มต้นและสร้างตรรกะมองขึ้นของความเร็วถัดไป บางทีการซ้อนกันvecน่าจะดีกว่า แต่แล้วคุณก็มีดัชนีและความเร็วสองอย่างเพื่อติดตาม


3

J , 41 ไบต์

(]|.@|:@[&0](|.@|:@,.*/@$+#\)@]^:[1:)2*<:

ลองออนไลน์!

ทำสิ่งเดียวกันกับการส่ง APL ของ ngnแต่เริ่มต้นด้วยเมทริกซ์ขนาด 1 คูณ 1 และทำซ้ำ 2 × N − 2 ครั้ง


คุณสามารถปรับปรุงวิธีการทางเลือกของฉัน (ตอนนี้ผูกติดอยู่ที่ 41) เพื่อเอาชนะตัวเองได้หรือไม่? ฉันได้สนามกอล์ฟที่ดีที่สุดมาแล้ว แต่ฉันสงสัยว่าอย่างน้อยสองสามไบต์ก็จะถูกกำจัด
โยนาห์

1

Python 165 (หรือ 144)

from pylab import *
def S(n):
 a=r_[[[1]]];r=rot90;i=2
 while any(array(a.shape)<n):
  q=a.shape[0];a=vstack([range(i,i+q),r(a)]);i+=q
 if n%2==0:a=r(r(a))
 print(a)

สิ่งนี้จะสร้างอาร์เรย์ที่มีค่าขึ้นจากนั้นจึงหมุนและเพิ่มด้านข้างจนกว่าจะถึงขนาดที่ถูกต้อง คำถามไม่ได้ระบุว่าจำเป็นต้องใช้จุดเริ่มต้นเดียวกันสำหรับเลขคู่และเลขคี่หรือไม่ถ้าไม่ใช่ในกรณีที่if n%2==0:a=r(r(a))สามารถลบบรรทัดได้จะช่วยประหยัด 21 ไบต์


1
นี่ไม่ใช่ Python แต่เป็น Python + numpy
ASCII เท่านั้น

@ ASCII-only มีรายการหลักของชื่อภาษาที่ยอมรับได้บ้างหรือไม่? นี่เป็นงูหลามที่ใช้ได้จริง
2699

มันใช้ไลบรารีดังนั้นคุณต้องรวมชื่อของห้องสมุดและ ... สำหรับภาษาที่อนุญาตภาษาใด ๆ ที่มีการใช้งานแบบสาธารณะที่คุณสามารถเรียกใช้ได้
ASCII เท่านั้น

@ ASCII เฉพาะที่เขียนไว้ที่ไหน ฉันไม่ได้เห็นมันทำกับคำตอบหลามส่วนใหญ่
user2699

ใช่เพราะส่วนใหญ่ไม่ใช้ numpy ... และ stdlib ไม่นับเป็นไลบรารีภายนอก
ASCII เท่านั้น

0

J , 41 ไบต์

,~$[:/:[:+/\_1|.1&,(]##@]$[,-@[)2}:@#1+i.

การจัดรูปแบบมาตรฐาน

,~ $ [: /: [: +/\ _1 |. 1&, (] # #@] $ [ , -@[) 2 }:@# 1 + i.

วิธีการนี้มีพื้นฐานมาจากการเล่นกับ J Volutes (APL ของ Uriel ใช้เทคนิคคล้ายกัน)

มันคาดไม่ถึงและสง่างามพอที่จะพิสูจน์คำตอบ J ครั้งที่ 2 ฉันคิดว่า

โดยพื้นฐานแล้วเราจะไม่ทำอะไรตามขั้นตอนหรือแม้แต่รูปทรงเรขาคณิต แต่เราจะสร้างลำดับอย่างง่าย ๆ ที่เมื่อสแกนหาผลรวมและให้คะแนนแล้วลำดับที่ถูกต้องของตัวเลขที่หมุนวนจากซ้ายไปขวาบนลงล่าง จากนั้นเราจะสร้างรูปร่างนั้นเป็นเมทริกซ์และเสร็จสิ้น

ฉันจะเพิ่มคำอธิบายอย่างละเอียดยิ่งขึ้นเมื่อเวลาเอื้ออำนวย แต่บทความที่เชื่อมโยงอธิบายอย่างละเอียด

ลองออนไลน์!


0

Python 3 (เรียงซ้อน) , 192 188 179 150 ไบต์

lambda n:[list(map(v,list(range(t-n,t)),[y]*n))for t in[1+n//2]for y in range(n-t,-t,-1)]
v=lambda x,y,r=0:y>=abs(x)and(3-2*r+4*y)*y+x+1or v(y,-x,r+1)

ลองออนไลน์!

(2y+1)2(yx)2yr

บันทึก 4 ไบต์ตั้งแต่การหมุนเฟสเซอร์ 90 องศาทำได้ง่ายโดยไม่ต้องใช้ตัวเลขที่ซับซ้อน


0

R , 183 ไบต์

x=scan()
b=t(d<-1)
while(2*x-1-d){m=max(b)
y=(m+1):(m+sum(1:dim(b)[2]|1))
z=d%%4
if(z==1)b=cbind(b,y)
if(z==2)b=rbind(b,rev(y))
if(z==3)b=cbind(rev(y),b)
if(z==0)b=rbind(y,b)
d=d+1}
b

ลองออนไลน์!

เอาท์พุทเป็นงูเมทริกซ์ (หรือเมทริกซ์งูอะไรก็ตาม) อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุดและน่าจะเป็นสนามกอล์ฟ แต่ฉันคิดว่ามันควรค่าแก่การแสดง ฉันค่อนข้างภูมิใจกับสิ่งนี้จริง ๆ !

วิธีการสร้างเมทริกซ์จากภายในสู่ด้านนอกมักจะผนวกจำนวนเต็มเพิ่มเติมเท่ากับจำนวนคอลัมน์ในเมทริกซ์ก่อนที่จะผนวก รูปแบบที่ตามมามีผลผูกพันตามคอลัมน์หรือตามแถวในขณะที่กลับรายการบางค่าเพื่อให้ผนวกเข้ากับลำดับที่ถูกต้อง

193 ไบต์

ตรงตามข้างต้น แต่สุดท้ายbคือ

matrix(b,x)

ลองออนไลน์!

ซึ่งให้ผลลัพธ์ที่สะอาดกว่าเล็กน้อย แต่ฉันไม่เห็นเกณฑ์พิเศษสำหรับผลลัพธ์ดังนั้นคำตอบแรกควรใช้ได้ถ้าฉันไม่ผิด

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