ขึ้นและลงขึ้นและลง


34

ท้าทาย:

รับอินพุตจำนวนเต็มบวกnสร้างเวกเตอร์ที่ตามหลังรูปแบบนี้:

0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4 -3 -2 -1 ... ±(n-1) ±n

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

รูปแบบผลลัพธ์มีความยืดหยุ่น

กรณีทดสอบ:

n = 1
0  1
-----------
n = 2
0  1  0 -1 -2
-----------
n = 3
0  1  0 -1 -2 -1  0  1  2  3
-----------
n = 4
0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4
-----------
n = 5
0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4 -3 -2 -1  0  1  2  3  4  5

คุณอาจเลือกที่จะใช้ดัชนีnเป็นศูนย์ จากนั้นก็จะให้ n = 10 1 0 -1 -2

นี่คือดังนั้นรหัสที่สั้นที่สุดในแต่ละภาษาชนะ! คำอธิบายได้รับการสนับสนุนเช่นเคย!


2
ที่เกี่ยวข้อง: OEIS A196199
นาย Xcoder

คำตอบ:



8

Perl 6 ,  60  26 ไบต์

{flat {((1,-*...*)ZX*(-$++...0...$++)xx$_)}(),$_*($_%2||-1)}

ลองมัน

{[...] (-1,-*...*)Z*0..$_}

ลองมัน

ขยาย:

{  # bare block lambda with implicit parameter $_

  [...]  # reduce using &infix:«...» (sequence generator)

          ( -1, -* ... * ) # (-1, 1, -1, 1 ... *)

      Z*                   # zip multiplied with

          0 .. $_          # range up to and including input
}

(-1,-*...*)Z*0..$_ สร้างลำดับ 0 1 -2 3 -4 5


7

Python 2 , 69 57 56 ไบต์

f=lambda n:[0][n:]or f(n-1)+range(-n,n+1)[::n%2*2-1][2:]

ลองออนไลน์!

สำหรับแต่ละn ขึ้นไป(รวม) มีการคำนวณคว่ำเมื่อเป็นเลขคู่มีกำปั้นตัวเลขสอง (หลังจากการผกผัน) ลบออกแล้วผนวกเข้ากับการส่งออกinputrange(-n,n)n


7

05AB1E , 9 7 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Emigna

Ýā®sm*Ÿ

ลองออนไลน์!

คำตอบแรกของฉันคือ 05AB1E (ฉันคิดว่า) ดังนั้นฉันจึงอาจพลาดเทคนิคบางอย่าง ...

คำอธิบาย

Ý         # push range [0 ... n]   stack: [[0 ... n]]
 ā        # push range [1 ... len(prev)]  [[0 ... n], [1 ... n+1]]
  ®       # push value of register        [[0 ... n], [1 ... n+1], -1]
   s      # swap top two values           [[0 ... n], -1, [1 ... n+1]]
    m     # power                         [[0 ... n], [-1, 1, -1, 1, ...]]
     *    # multiply                      [[0, 1, -2, 3, -4, 5, ...]]
      Ÿ   # range interpolation           [[0, 1, 0, -1, -2, -1, ...]]

ฉันต้องขอบคุณ @Dennis สำหรับการใช้งานดั้งเดิมของŸฉันไม่เช่นนั้นฉันอาจไม่เคยรู้เลย ...


เยี่ยมมาก :)! ฉันÝεDÈi®*}}Ÿไม่ได้ตรวจสอบā®smมันเป็นสมาร์ทบ้าฮ่า
Magic Octopus Urn


6

JavaScript (ES6), 56 ไบต์

f=(n,b=d=1,k=0)=>[k,...k-d*n?f(n,k-b?b:(d=-d)-b,k+d):[]]

ลองออนไลน์!

แสดงความคิดเห็น

f = (               // f = recursive function taking:
  n,                //   n = input
  b =               //   b = boundary value, initialized to 1
  d = 1,            //   d = current direction, initialized to 1
  k = 0             //   k = current sequence value, initialized to 0
) =>                //
  [                 // update the sequence:
    k,              //   append the current value
    ...k - d * n ?  //   if |k| is not equal to |n|:
      f(            //     append the (spread) result of a recursive call:
        n,          //       use the original input
        k - b ?     //       if k has not reached the boundary value:
          b         //         leave b unchanged
        :           //       else:
          (d = -d)  //         reverse the direction
          - b,      //         and use a boundary of higher amplitude and opposite sign
        k + d       //       update k
      )             //     end of recursive call
    :               //   else:
      []            //     stop recursion and append nothing
  ]                 // end of sequence update



6

Haskell , 48 42 ไบต์

f n=0:[(-1)^i*x|i<-[0..n-1],x<-[1-i..i+1]]

ลองออนไลน์!

ขอบคุณΟurousสำหรับ -1 ไบต์

แม้ว่ามันจะชัดเจนในการเข้าใจถึงปัญหาย้อนหลังมันใช้เวลาสักครู่ที่ฉันจะมาถึง(-1)^i*xซึ่งxเมื่อiถึงแม้จะเป็นและ-xเมื่อiใดที่แปลก การทำซ้ำก่อนหน้านี้โดยที่:

(-1)^i*x
x-2*mod i 2*x
(-1)^mod i 2*x
[x,-x]!!mod i 2
(1-sum[2|odd i])*x

1
คุณสามารถบันทึกไบต์โดยใช้1-iแทน-i+1ในการ..แสดงออก
Οurous

4

C # (. NET Core) , 300  167 ไบต์

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

static int[] f(int n){if (n==1) return new int[]{0,1};var a=f(n-1);return a.Concat(a.Skip(a.Length-(n-1)*2).Select(x=>-x)).Concat(new int[]{(n%2)!=0?n:-n}).ToArray();}

ลองออนไลน์!

// Recursive Worker Function
static public int[] f( int n )
{
    // Start with the simple case
    if ( n == 1 ) return new int[]{0,1};

    // Recusively build off of that
    var a = f(n-1);

    // To be added at the end
    int[] b = { (n%2) !=0 ? n : -n };

    // Skip some based on length
    int s = a.Length - (n-1)*2;

    // With the rest, multiply by -1 and then append to the end
    // And append the part
    return a.Concat( a.Skip(s).Select( x => -x ) ).Concat( b ).ToArray();
}

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

ขอขอบคุณ! ขอบคุณคำแนะนำของคุณฉันพบความหมายของส่วน "ส่วนหัว" และ "ส่วนท้าย" ของเว็บไซต์ TIO นั่นทำให้ฉันลดขนาดลงครึ่งหนึ่ง!
Darrin Cullop

2
ยินดีต้อนรับสู่ PPCG! (ดูเหมือนว่าโพสต์แรกของคุณ) ไม่ต้องกังวลเกี่ยวกับภาษาอื่นเพียงแค่พยายามทำให้ดีที่สุดในภาษาของคุณ / เคล็ดลับ: ลบช่องว่างที่ไม่จำเป็นออก ใน C # คุณสามารถลบช่องว่างโดยรอบสัญลักษณ์ ( [](){};.) (n-1)*2เป็นเพียง2*n-2และด้วยการจัดเรียงใหม่คุณสามารถลบวงเล็บที่นั่น
user202729

นอกจากนี้!=ยังมีลำดับความสำคัญน้อยกว่า%เพื่อให้คุณสามารถลบ parens คู่หนึ่งออกได้ และคุณสามารถใช้>0แทน `! = 0 บันทึกไบต์
user202729

1
นอกจากนี้จากฉัน: ยินดีต้อนรับสู่ PPCG! เคล็ดลับสำหรับการเล่นกอล์ฟใน C #และเคล็ดลับสำหรับการเล่นกอล์ฟในทุกภาษาอาจเป็นเรื่องที่น่าสนใจสำหรับการอ่าน :) สำหรับเคล็ดลับการเล่นกอล์ฟ: static int[] f(int n)สามารถทำได้f=n=>โดยใช้แลมบ์ดา (แบบเรียกซ้ำ) และ(n-1)*2สามารถ~-n*2บันทึกลงในวงเล็บได้ ผมได้รับมันลงไปที่155 (137 + 18) ไบต์: ลองออนไลน์ 18 ไบต์มีไว้สำหรับusing System.Linq;เนื่องจากจำเป็นต้องมีการนำเข้าที่จำเป็นสำหรับการนับไบต์ เพลิดเพลินไปกับการพักผ่อนของคุณ!
Kevin Cruijssen

4

J , 25 ไบต์

-5 ไบต์ขอบคุณ FrownyFrog!

>:@*:$i.;@(<@i:@*_1&^)@,]

ลองออนไลน์!

J , 30 ไบต์

>:@*:{.;@([:(i:@*_1&^)&.>i.,])

คำอธิบาย:

i.,] สร้างรายการ 0..n

&.> สำหรับแต่ละหมายเลขในรายการจะใช้คำกริยาใน (... ) และทำเครื่องหมายที่ช่องผลลัพธ์ (ฉันต้องการมวยเพราะผลลัพธ์มีความยาวต่างกัน)

[:( _1&^)หา -1 ถึงiกำลัง th (-1 หรือ 1)

i:@* ทำรายการ -n..n หรือ n ..- n ขึ้นอยู่กับเครื่องหมายข้างต้น

;@ Unbox

>:@*: ค้นหา n ^ 2 + 1

}. และรับตัวเลขจำนวนมากจากรายการ

ลองออนไลน์!


1
คุณจะลองเขียนโค้ดตัวเดียวกับnเวอร์ชั่นที่เป็นศูนย์หรือไม่? เช่น*:{.;@([:(i:@*_1&^)&.>i.).. สเปคอนุญาตให้
jayprich

"n = 1 จะให้ 0 1 0 -1 -2"
FrownyFrog

@ FronyFrog - อืมฉันไม่ได้ตรวจสอบ ฉันเปลี่ยนกลับเป็นวิธีแก้ปัญหาแรก ขอบคุณสำหรับการสังเกต!
Galen Ivanov

1
25 ใช้$สำหรับการตัดโดยไม่ต้องใช้&.>เพราะ*เป็นอันดับ -0
FrownyFrog


3

Java 8, 85 83 79 ไบต์

n->{for(int p=0,i=0;i<=n*n;p+=1-(int)Math.sqrt(i++)%2*2)System.out.println(p);}

-6 ไบต์ขอบคุณที่@ OlivierGrégoire

ลองออนไลน์

คำอธิบาย:

n->{                            // Method with integer parameter and no return-type
  for(int p=0,                  //  Set both `p` to 0
      i=0;i<=n*n;               //  Loop `i` in the range [0, `n*n`]
      p+=                       //    After every iteration, increase `p` by:
         1-                     //     1, minus:
           (int)Math.sqrt(i++)  //     The square-root of `i`, truncated to its integer
           %2*2)                //     Modulo 2, and multiplied by 2
     System.out.println(p);}    //   Print integer `p` with a trailing new-line

วิธีการที่ดี ฉันกำลังทำงานเกี่ยวกับวิธีการดังกล่าวในขณะนี้เพื่อปรับปรุงคำตอบของฉัน แต่คุณเอาชนะฉันมัน (แม้จะมีการประชุมของคุณ) ทำได้ดี! ;-)
Olivier Grégoire

1
83 ไบต์ (ฉันเพิ่งลบj)
Olivier Grégoire

1
79 ไบต์ : ฉันทำขึ้นไปแทนลงไปลบซ้ำซ้อนi n*n
Olivier Grégoire

สวัสดี เขียนนี้เพื่อแจ้งให้ฉันคุณว่าฉันเป็นพื้นฉีกคำตอบของคุณ (พอร์ตสู่ JavaScript) หวังว่ามันโอเค
Muhammad Salman

@ MuhammadSalman Sure, np. ฉันพอร์ตคำตอบจากคนอื่นค่อนข้างบ่อยเช่นกัน :) ตราบใดที่คำตอบเดิมถูกกล่าวถึงอย่างที่คุณทำมันก็ดีสำหรับฉัน
Kevin Cruijssen

3

R , 48 46 42 ไบต์

for(i in 1:scan())F=c(F,-(-1)^i*(2-i):i);F

ลองออนไลน์!

พอร์ตของคำตอบทับทิมโดย Kirill L. - และบันทึกไว้ 6 ไบต์ด้วย Kirill L. อันเดียวกัน! ตอนนี้สั้นกว่าโซลูชันของ Giuseppe ;)

พอร์ตของคำตอบระดับแปดเสียงนี้โดย Luis Mendo ที่ใช้approxนั้นไม่ค่อยมีกอล์ฟ n=n^2+1สามารถถูกแทนที่ด้วย,,n^2+1; หรือโดย 0:n^2+1(อาร์กิวเมนต์ตำแหน่งxout) สำหรับจำนวนไบต์เดียวกัน:

R , 56 ไบต์

f=function(n)approx((0:n)^2+1,-(-1)^(0:n)*0:n,n=n^2+1)$y

ลองออนไลน์!


ฉันคิดว่าapproxจะทำงานที่นี่ในลักษณะที่คล้ายคลึงกับวิธีอ็อกเทฟของ Luis Mendo เช่นกัน
Giuseppe

@iuseppe ขอบคุณ! มันใช้งานได้แม้ว่ามันจะนานขึ้น ฉันได้เรียนรู้diffinvและapproxจากคำถามนี้ ...
JayCe

แม้ว่าฉันจะไม่รู้วิธีการเล่นกอล์ฟที่จะทำ -1 power (ใน R ~ไม่ทำงานเป็นโอเปอเรเตอร์เสริม :() คุณยังสามารถบันทึกอีก2 ไบต์ได้โดยเปลี่ยนเป็นโปรแกรมเต็ม
Kirill L.

... และเนื่องจากเป็นโปรแกรมเต็มรูปแบบเราจึงสามารถใช้งานและสร้างความเสียหายในตัวที่กำหนดไว้ล่วงหน้า: 42 ไบต์ - ในที่สุดก็สั้นกว่าของ Giuseppe!
คิริลล์ลิตร

3

APL (Dyalog Unicode)ขนาด 17 ไบต์

+\01*⍳(/⍨)1+2×⍳

ลองออนไลน์!

Golfed 2 ไบต์ด้วย @FrownyFrog โดยเปลี่ยนเป็นรถไฟ ดูคำตอบเก่าและคำอธิบายด้านล่าง


APL (Dyalog Unicode)ขนาด 19 ไบต์

+\0,∊⊢∘-\⍴1¨1+2×⍳⎕

ลองออนไลน์!

(ใช้⎕IO←0)

วิธีแรกของฉันคือการสร้างหลายช่วงและเชื่อมต่อเข้าด้วยกันสิ่งนี้ง่ายกว่า 30 ไบต์ จากนั้นฉันก็เริ่มวิเคราะห์ลำดับ

      +\⍣¯10  1  0 ¯1 ¯2 ¯1  0  1  2  3  2  1  0 ¯1 ¯2 ¯3 ¯4
0 1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1

+\⍣¯1 หมายถึงผลรวมสะสมผกผัน

มีรูปแบบการทำซ้ำ 1s และ¯1sโดยที่ความยาวของลำดับ 1s หรือ of1 ต่อเนื่องคือ 1 + 2 × n และแต่ละลำดับสลับระหว่าง 1 และ¯1 สิ่งที่ฉันทำได้ตอนนี้คือการสร้างรายการ 1s และ¯1sจากนั้นสแกนด้วย +

      4  creates range 0..4
0 1 2 3
      2×⍳4
0 2 4 6
      1+2×⍳4
1 3 5 7
      ⍴∘1¨1+2×⍳4  for-each create that many 1s
┌─┬─────┬─────────┬─────────────┐
11 1 11 1 1 1 11 1 1 1 1 1 1
└─┴─────┴─────────┴─────────────┘
      ⊢∘-\⍴1¨1+2×⍳4  alternate signs
┌─┬────────┬─────────┬────────────────────┐
1│¯1 ¯1 ¯11 1 1 1 1│¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
└─┴────────┴─────────┴────────────────────┘
      ∊⊢∘-\⍴1¨1+2×⍳4  flatten
1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
      0,∊⊢∘-\⍴1¨1+2×⍳4
0 1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
      +\0,∊⊢∘-\⍴1¨1+2×⍳4  cumulative sum
0 1 0 ¯1 ¯2 ¯1 0 1 2 3 2 1 0 ¯1 ¯2 ¯3 ¯4

ตรวจสอบคำตอบอื่น ๆ ในตอนนี้ฉันเห็นหลายคนใช้วิธี + \ แต่สร้างลำดับของ 1s และ¯1ด้วย¯1 * ⌊.5 * ⍨×⍨⍳ซึ่งสั้นลงอย่างน้อย 3 ไบต์
Kritixi Lithos

+\0,¯1*⍳(/⍨)1+2×⍳คือ 17
FrownyFrog

ฉันรู้ว่าวิธีแก้ปัญหาของฉันรู้สึกยาว
Zacharý


2

Java (JDK 10) , 98 ไบต์

n->{var s="0";for(int i=0,r=0,d=1;i++<n;s+=" "+r,d=-d)for(r+=d;r!=i&r!=-i;r+=d)s+=" "+r;return s;}

ลองออนไลน์!


อาในขณะที่ฉันอยู่ในที่ประชุมของคุณคุณแอบเข้ามาตอบก่อนฉัน .. ;) จะทำให้ฉันผ่านเพราะเราใช้วิธีการที่แตกต่างกันโดยสิ้นเชิง +1 ทางใดทางหนึ่ง
Kevin Cruijssen

2

MATL , 17 15 ไบต์

-2 ไบต์ขอบคุณ Luis Mendo!

0i:oEqG:EqY"Ysh

ลองออนไลน์!

คำอธิบายสำหรับn=3:

0		% push 0
 i:		% read input as integer, push range
		% stack: [0, [1 2 3]]
   o		% modulo 2, stack: [0, [1 0 1]]
    Eq		% double and decrement, stack: [0, [1 -1 1]]
      G:	% push input and range again
		% stack: [0, [1 -1 1], [1 2 3]]
        Eq	% double and decrement,
		% stack: [0, [1 -1 1], [1 3 5]]
	  Y"	% run-length decoding
		% stack: [0, [1 -1 -1 -1 1 1 1 1 1]]
	    Ys	% cumulative sum
		% stack: [0, [1  0 -1 -2 -1  0  1  2  3]]
	      h	% horizontally concatenate
		% end of program, automatically print the stack


2

Ruby , 52 47 ไบต์

f=->n{n<1?[0]:f[n-1]+(2-n..n).map{|x|-~0**n*x}}

ลองออนไลน์!

ด้านล่างเป็นเวอร์ชั่น 52 ไบต์ดั้งเดิมพร้อมคำอธิบาย:

f=->n{n<1?[0]:f[n-1]+[(r=*2-n..n).map(&:-@),r][n%2]}

ลองออนไลน์!

คำแนะนำ

f=->n{           #Recursive approach
 n<1?[0]         #Init with 0 if n=0
 :f[n-1]         #else make a recursive call
 +               #and append an array of numbers
 [(r=*2-n..n)    #Init r as splatted range from 2-n to n
 .map(&:-@)      #"-@" is unary minus, so this a fancy way to do map{|x|-x} for -1 byte
                 #For even n use this negated r, e.g. for n=4: [2, 1, 0, -1, -2, -3, -4]
 ,r]             #For odd n use r directly, e.g. for n=3: [-1, 0, 1, 2, 3]
 [n%2]           #Odd/even selector
}

ฉันไม่รู้รูบี - คุณช่วยอธิบายสิ่งนี้ได้อย่างไรโดยเฉพาะในmap(&:-@)ส่วนนี้?
JayCe

@JayCe เพิ่มคำอธิบายแล้ว โดยทั่วไปนี้เป็นเพียงการปฏิเสธสิ่งที่ใน R -rจะเป็นเพียงแค่
คิริลล์ลิตร

ขอบคุณสำหรับคำอธิบาย - มันช่วยให้ฉันบอกสิ่งนี้กับอาร์
JayCe




1

ถ่าน 19 ไบต์

F⊕NI×∨﹪ι²±¹…·∧ι⁻²ιι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

  N                 Input as a number
 ⊕                  Increment
F                   Loop over implicit range
                ²   Literal 2
                 ι  Current index
               ⁻    Subtract
              ι     Current index
             ∧      Logical And
                  ι Current index
           …·       Inclusive range
       ι            Current index
        ²           Literal 2
      ﹪             Modulo
          ¹         Literal 1
         ±          Negate
     ∨              Logical Or
    ×               Multiply
   I                Cast to string and implicitly print

คำอธิบายทางเลือก:

F⊕N

วนรอบจำนวนเต็มตั้งแต่0ถึงอินพุตรวม

ส่งผลลัพธ์ไปยังสตริงก่อนพิมพ์

×∨﹪ι²±¹

คัดค้านชุดผลลัพธ์อื่น

…·∧ι⁻²ιι

สร้างรายการจากดัชนีก่อนหน้านี้ไปยังดัชนีปัจจุบันยกเว้นดัชนีก่อนหน้า


1

เจลลี่ ,  11  12 ไบต์

Bah ฉันคิดว่าฉันมี 11 wih _2+ỊrN)N;¥/

_2+ỊrN×-*$)Ẏ

ลองออนไลน์!

อย่างไร?

_2+ỊrN×-*$)Ẏ - Main Link: n           e.g. 4
          )  - for x in [1...n]:           1       2          3               4
_2           -   subtract 2 from x        -1       0          1               2
   Ị         -   is x insignificant?       1       0          0               0
  +          -   add                       0       0          1               2
     N       -   negate x                 -1      -2         -3              -4
    r        -   inclusive range          [0,-1]  [0,-1,-2]  [1,0,-1,-2,-3]  [2,1,0,-1,-2,-3,-4]
         $   -   last two links as a monad:
       -     -     minus one              -1      -1         -1              -1
        *    -     raised to the power x  -1       1         -1               1
      ×      -   multiply                 [0,1]   [0,-1,-2]  [-1,0,1,2,3]    [2,1,0,-1,-2,-3,-4]
           Ẏ - tighten                    [0,1,0,-1,-2,-1,0,1,2,3,2,1,0,-1,-2,-3,-4]


1

สกาลา, 119 ไบต์

def a(n: Int)={lazy val s:Stream[Int]=0#::Stream.from(0).map{x=>s(x)+1 -2*(Math.sqrt(x).toInt%2)}
s.take(n*n+1).toList}

Ungolfed:

def a(n: Int)={
  lazy val s:Stream[Int]= 0#::Stream.from(0).map //Give the starting point and indexing scheme
  {
    x=>
    {
      val sign = 1-2*(Math.sqrt(x).toInt%2) //Determine whether we are adding or subtracting at the current index
      s(x)+sign
    }
  }
  s.take(n*n+1).toList //Take the desired values
}

นี่อาจจะเป็นสิ่งที่ดีกว่าในการเล่นกอล์ฟ แต่ฉันต้องการวิธีการแก้ปัญหาที่ใช้สายน้ำไหลเชื่องช้า



1

ซ้อนกัน 44 ไบต์

[~>0\:2%\#,2*1-tr[...rep]flatmap,$sumonpref]

ลองออนไลน์! เป็นเวลานานแล้วที่ฉันตั้งโปรแกรมใน Stacked แต่ฉันคิดว่าฉันยังได้รับอยู่

ทางเลือก

73 ไบต์: [0\|>:2%tmo*2 infixes[:...|>\rev...|>rev#,$#'sortby 1#behead]flatmap 0\,]

สิ่งนี้จะไปกับวิธี "ช่วงจากดัชนีที่สร้างขึ้น" ที่ใช้ในคำตอบของAttacheของฉัน สิ่งนี้พิสูจน์แล้วว่าค่อนข้างยาวเนื่องจาก Stacked ไม่มี builtin สำหรับช่วงที่กลับด้านและไม่ยุบ (นั่นคือสิ่งที่:...|>\rev...|>rev#,$#'sortby 1#beheadทำ)

53 ไบต์: [0\|>:2%tmo _\tpo#,tr[...rep]flatmap 0\,inits$summap]

... ดังนั้นผมจึงตัดสินใจที่จะไปสำหรับวิธีการซึ่งแทนที่จะพบว่าผลรวมสะสม ( inits$summap) มากกว่า1และ-1ทำซ้ำโดยจำนวนเต็มคี่ในขณะที่คำตอบ R

46 ไบต์: [~>0\:2%\#,2*1-tr[...rep]flatmap,inits$summap]

... แต่ฉันตระหนักว่าจำนวนเต็มเชิงลบและจำนวนเต็มคี่อาจจะทำในหนึ่งไปโดยคูณอาร์เรย์ทั้งสองสร้าง (Mod 2 ค่าของช่วงช่วงและตัวเอง) จากนั้นลบ2 1สิ่งนี้จะให้สลับ1s และ-1s สำหรับช่วงแรกและจำนวนเต็มคี่สำหรับที่สอง!

44 ไบต์: [~>0\:2%\#,2*1-tr[...rep]flatmap,$sumonpref]

... และจากนั้นฉันจำได้ว่าฉันมี builtin สำหรับการทำแผนที่คำนำหน้า ^ - ^


1

Julia 0.6 , 44 bytes

n->[(i%2*2-1)*[0:i;(n>i)*~-i:-1:1]for i=1:n]

ลองออนไลน์!

เนื่องจาก OP ระบุว่า "รูปแบบผลลัพธ์มีความยืดหยุ่น" สิ่งนี้จะพิมพ์อาร์เรย์ของอาร์เรย์ย่อยเช่น U (3) [[0, 1], [0, -1, -2, -1], [0, 1, 2, 3]]=>

i%2*2-1 ตัดสินใจสัญลักษณ์ของระบบย่อยปัจจุบัน - ลบสำหรับเลขคู่, บวกกับคี่

[0:i;(n>i)*~-i:-1:1]อยู่ในสองส่วน 0: i ตรงไปตรงมาช่วงของค่าจาก 0 ถึง i ปัจจุบัน ในส่วนถัดไป ~ -i: -1: 1 เป็นช่วงจากมากไปน้อยจาก i-1 ถึง 1 แต่เราต้องการที่จะผนวกสิ่งนี้เฉพาะในกรณีที่เรายังไม่ได้ที่ค่าสุดท้ายดังนั้นคูณส่วนท้ายของช่วง โดย (n> i) ดังนั้นเมื่อ n == i, ช่วงจะเป็น 0: -1: 1 ซึ่งจบลงด้วยความว่างเปล่า (ดังนั้นอาร์เรย์จะหยุดที่ n อย่างถูกต้อง)


และนี่คือรุ่นที่สามารถรองรับการเข้าถึงแบบสุ่ม - แลมบ์ดาภายในที่นี่ส่งคืนคำในลำดับที่ฉันไม่ต้องเก็บข้อกำหนดใด ๆ ไว้ก่อนหน้านี้ อันนี้ให้เอาต์พุตเป็นอาเรย์เรียบร้อยหนึ่งอัน

49 47 ไบต์

n->map(i->((m=isqrt(i))%2*2-1)*(m-i+m^2),0:n^2)

ลองออนไลน์!

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