Yukarı ve aşağı, yukarı ve aşağı


34

Meydan okuma:

Olumlu bir tamsayı girişi n verildiğinde , bu modeli izleyen bir vektör oluşturun:

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

Veya, kelimelerle açıklanır: Vektör başlar ve dizinin bir parçası olmayan en küçük tek tam sayıya ulaşana kadar 0artış yapar 1, daha sonra en küçük (en büyük boyutta) en küçük tam sayıya ulaşana kadar azalır. dizinin bir parçası değil. nUlaşılana kadar bu şekilde devam eder . Dizisi pozitifliği sona erecek n, eğer ntek ve negatif nise nbile bir.

Çıkış formatı esnektir.

Test durumları:

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 sıfır dizinli almayı seçebilirsiniz . n = 1sonra verirdi 0 1 0 -1 -2.

Bu , yani her dilde en kısa kod kazanıyor! Açıklamalar her zaman olduğu gibi teşvik edilir!


2
İlgili: OEIS A196199 .
Bay Xcoder

Yanıtlar:


10

R , 58 54 50 48 43 bayt

MickyT sayesinde -2 bayt

function(n)diffinv(rep(1:n%%2*2-1,1:n*2-1))

Çevrimiçi deneyin!

function(n)
 diffinv(                           # take cumulative sum, starting at 0 of
             1:n%%2*2-1,            # a vector of alternating 1,-1
         rep(                       # repeated
                        1:n*2-1))   # 1, 3, 5, etc. times


8

Perl 6 ,  60  26 bayt

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

Dene

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

Dene

Expanded:

{  # 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..$_ diziyi oluşturur 0 1 -2 3 -4 5


7

Python 2 , 69 57 56 bayt

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

Çevrimiçi deneyin!

Her biri için n için kadar (dahil) zaman ters hesaplanır, ayrılabilir ve daha sonra çıkış eklenmiş, bu bir çift sayıdır (ters çevirme işleminden sonra) yumruk iki sayı vardır.inputrange(-n,n)n


7

05AB1E , 9 7 bayt

@Emigna sayesinde 2 bayt kaydedildi

Ýā®sm*Ÿ

Çevrimiçi deneyin!

İlk 05AB1E cevabım (sanırım), bu yüzden bazı püf noktaları eksik olabilir ...

açıklama

Ý         # 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, ...]]

Ben @Dennis teşekkür etmeliyim orijinal kullanımŸ yoksa ben, olmayabilir muhtemelen bu konuda bilinen asla ...


Güzel :)! Bende ÝεDÈi®*}}Ÿkontrol etmeden, ā®smdeli akıllı haha olduğunu.
Sihirli Ahtapot Urn

6

05AB1E , 15 14 bayt

ÝDÉ·<*Ý€û˜ÔsF¨

Çevrimiçi deneyin!

açıklama

Ý                # push range [0 ... n]
 D               # duplicate
  É·<            # (x % 2 == 1)*2-1 for each
     *           # multiply
      Ý          # range [0 ... a] for each
       €û        # palendromize each
         ˜       # flatten
          Ô      # connected uniqueified
           sF¨   # remove the last n elements

6

JavaScript (ES6), 56 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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 , 43 bayt

f n=scanl(-)0[(-1)^k|k<-[1..n],_<-[2..2*k]]

Çevrimiçi deneyin!

Listenin [(-1)^k|k<-[1..n],_<-[2..2*k]]ilk nsatırları olan olumsuz sayılan kümülatif toplamları hesaplar .

[-1,
 +1, +1, +1,
 -1, -1, -1, -1, -1,
 +1, +1, +1, +1, +1, +1, +1

6

Jöle , 11 9 bayt

²Ḷƽ-*0;Ä

Çevrimiçi deneyin!

Nasıl çalışır

²Ḷƽ-*0;Ä  Main link. Argument: n

²          Square; yield n².
 Ḷ         Unlength; yield [0, ..., n²-1].
  ƽ       Take the integer square root of each k in the range.
    -*     Compute (-1)**r for each integer square root r.
      0;   Prepend a zero.
        Ä  Accumulate; take the sums of all prefixes.

6

Haskell , 48 42 bayt

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

Çevrimiçi deneyin!

-1 byte için Οurous sayesinde

Gördüğüm kadar açık olmasına rağmen, bana ne zaman ve ne zaman tuhaf bir şey gelmesi (-1)^i*xbiraz xzaman aldı . Önceki yinelemeler nerede:i-xi

(-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
Sen kullanarak bir bayt kaydedebilirsiniz 1-iyerine -i+1de ..ifade.
18:30

4

C # (.NET Core) , 300  167 bayt

Bunları daha önce hiç yapmadım, ama bu eğlenceli görünüyordu. İnsanların neden bu "golf" dillerini 167 olarak kullandıklarını diğer bazı cevaplardan biraz daha yüksek olarak görüyorum. Ama bildiğin şeyle gitmelisin.

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

Çevrimiçi deneyin!

// 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
Bunu sadece usingifadeleri ve işlevi sayarsanız daha da kısaltabilirsiniz. Zorluğun tam bir program olması gerektiğini belirtmediği sürece, buna varsayılan olarak izin verilir (uygulasanız bile, içeren sınıf adını kısaltabilirsiniz).
Büyük

Teşekkür ederim! Öneriniz sayesinde, TIO sitesinin "başlık" ve "altbilgi" bölümlerinin anlamını anladım. Bu benim gönderim boyutunu yarı yarıya düşürdü!
Darrin Cullop

2
PPCG'ye Hoşgeldiniz! (Bu, ilk gönderinize benziyor.) Diğer diller için endişelenmeyin, sadece kendi dilinizde mümkün olduğunca iyi olmaya çalışın. / İpuçları: Gereksiz boşlukları kaldırın. C # 'da sembollerin etrafındaki tüm boşlukları kaldırabilirsiniz ( [](){};.) (n-1)*2sadece 2*n-2ve bazı düzenlemelerle oradaki parantezleri kaldırabilirsiniz.
user202729

Ayrıca, bir !=öncekinden daha az önceliğe sahip olduğu %için bir çift ebeveyni çıkarabilirsiniz. Ve >0`! = 0 yerine kullanabilirsiniz , bayt kaydeder.
user202729

1
Ayrıca benden: PPCG'ye hoş geldiniz! C # ile golf için ipuçları ve tüm dillerde golf için ipuçları üzerinden okumak için ilginç olabilir. :) bazı golf ipuçları gelince: static int[] f(int n)haline gelebilir f=n=>bir (özyinelemeli) lambda kullanarak ve (n-1)*2olabilir ~-n*2parantez tasarruf etmek. 155 (137 + 18) bayta indirdim : Çevrimiçi deneyin . 18 bayt içindir using System.Linq;, çünkü bayt sayısı için zorunlu ithalat zorunludur. Kaldınız!
Kevin Cruijssen

4

J , 25 bayt

FrownyFrog sayesinde -5 bayt!

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

Çevrimiçi deneyin!

J , 30 bayt

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

Açıklama:

i.,] liste oluşturur.

&.> listedeki her sayı için (...) fiilini yürütün ve sonucu kutulayın (sonuçlar farklı uzunluklara sahip olduğundan boks yapmam gerekir)

[:( _1&^)bulmak -1 iinci güç (1 veya 1)

i:@* Yukarıdakilerin işaretine bağlı olarak -n..n veya n ..- n 'in bir listesini yapın

;@ Unbox

>:@*: n ^ 2 + 1 bul

}. ve listeden çok fazla numara alın

Çevrimiçi deneyin!


1
Sıfır tabanlı bir nsürümle aynı kodu yazmayı düşünür müsünüz ? örneğin *:{.;@([:(i:@*_1&^)&.>i.).. şartname buna izin veriyor
jayprich 28:18

"n = 1 daha sonra 0 0 -1 -2" verir
FrownyFrog

@ FrownyFrog - Hmm, kontrol etmedim. İlk çözümüme geri döndüm. Gözlem için teşekkür ederim!
Galen Ivanov

1
25$ Kesme için kullanın , gerek yok &.>çünkü *sıralama 0.
FrownyFrog


3

Java 8, 85 83 79 bayt

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

@ OlivierGrégoire sayesinde 6 bayt .

Çevrimiçi deneyin.

Açıklama:

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

Güzel yaklaşım. Cevabımı iyileştirmek için şu anda bu tür bir yaklaşım üzerinde çalışıyordum, ama beni karşıladınız (toplantınıza rağmen), aferin! ;-)
Olivier Grégoire

1
83 bayt (yeni çıkardım j).
Olivier Grégoire

1
79 bayt : iYedekli kaldırmak için aşağı yerine yukarı yaptım n*n.
Olivier Grégoire

Merhaba. Bunu, sizi temelde cevabınızdan mahrum ettiğimi bildirmek için yazmak . (JavaScript’e bağlantı noktası). Umarım her şey yolunda
Muhammad Salman

@MuhammadSalman Tabii, np. Diğerlerinden gelen cevapları da oldukça sık aralıklarla aktarıyorum. :) Özgün cevaptan bahsedildiği sürece, yaptığınız gibi, benim için her şey yolunda.
Kevin Cruijssen

3

R , 48 46 42 bayt

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

Çevrimiçi deneyin!

Ruby'nin bir limanı Kirill L. tarafından cevaplandı - ve aynı Kirill L. sayesinde 6 byte kazandı! Şimdi Giuseppe'nin çözümünden daha kısa ;)

Luis Mendo'nun kullandığı bu Octave cevabının bir limanı approxdaha az golf oynuyor. n=n^2+1ile değiştirilebilir ,,n^2+1; veya aynı bayt sayısı için 0:n^2+1(konum argümanı xout):

R , 56 bayt

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

Çevrimiçi deneyin!


approxBurada Luis Mendo'nun Octave çözümüne benzer şekilde çalışacağını düşünüyorum .
Giuseppe

@Giuseppe Teşekkürler! Daha uzun olsa da işe yarıyor. Öğrendiğim diffinvve approxbu sorudan ...
Jayce

Ayrıca -1 güç yapmanın daha kolay bir yolunu bilmeme rağmen (R'de ~tamamlayıcı operatör olarak çalışmaz :(), yine de tam bir programa geçerek 2 byte daha tasarruf edebilirsiniz .
Kirill L.

... ve tam bir program olduğu için önceden tanımlanmış bir yerleşik de kullanabilir ve bozabiliriz: 42 bayt - sonunda, Giuseppe'ninkinden daha kısa!
Kirill L.

3

APL (Dyalog Unicode) , 17 bayt

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

Çevrimiçi deneyin!

Bir trene dönüştürerek @ FrownyFrog sayesinde 2 bayt golf oynadı. Aşağıdaki eski cevaba ve açıklamasına bakınız.


APL (Dyalog Unicode) , 19 bayt

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

Çevrimiçi deneyin!

(Kullanır ⎕IO←0)

İlk yaklaşımım birden fazla aralık oluşturmak ve bunları birleştirmek oldu, bu kolayca 30 bayttan fazlaydı. Sonra diziyi analiz etmeye başladım.

      +\⍣¯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 ters kümülatif toplamı belirtir

1s ve ¯1s yinelenen bir desen vardır, burada 1s veya ¯1s ardışık her sekansının uzunluğu 1 + 2 x n'dir. Ve her bir sıra, 1 ile ¯1 arasında değişir. Şimdi yapabileceğim şey 1'ler ve ¯1'ler listesini oluşturmak ve ardından +

      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

Şimdi diğer cevapları kontrol ederken, birçok kişinin de + \ yöntemini kullandığını görüyorum, ancak en az 3 bayt daha kısa olan s1 * ⌊.5 * ⍨ × ⍨⍳ değerinde 1 ve ¯1 dizisini oluşturuyorum.
Kritixi Lithos

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

Benim çözüm uzun keçe biliyordu
Zachary


2

Java (JDK 10) , 98 bayt

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

Çevrimiçi deneyin!


Ah, toplantımdayken benden önce bir cevabın içine gizlice girdin ..;) Madeni de bırakacağım, çünkü tamamen farklı bir yaklaşım kullanıyoruz. Her iki şekilde de + 1.
Kevin Cruijssen

2

Matl , 17 15 bayt

Luis Mendo sayesinde -2 bayt!

0i:oEqG:EqY"Ysh

Çevrimiçi deneyin!

Açıklama 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 bayt

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

Çevrimiçi deneyin!

Aşağıda bir açıklama ile orijinal 52-byte versiyonu:

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

Çevrimiçi deneyin!

Bakış

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
}

Bilmiyorum Ruby - bunun özellikle map(&:-@)porsiyonun ne yaptığını açıklayabilir misin?
JayCe

@JayCe Bir açıklama eklendi. Temel olarak, bu sadece olumsuzlama, R'de basitçe ne olurdu -r.
Kirill L.

Açıklama için teşekkürler - bu beni R'ye
aktarmamda


1

Python 3, 83 bayt

def c(n):print([(-1)**j*(abs(j-i)-j)for j in range(n+1)for i in range(2*j)][:-n+1])


1

Kömür , 19 bayt

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

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

  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

Alternatif açıklama:

F⊕N

Tam sayıları üzerinden 0giriş (dahil) arasında dolaştırın.

Yazdırmadan önce sonuçları dizeye yayın.

×∨﹪ι²±¹

Alternatif sonuç kümelerini olumsuzlayın.

…·∧ι⁻²ιι

Önceki dizinden hariç, önceki dizinden geçerli dizine bir liste oluşturun.


1

Jöle ,  11  12 bayt

Bah, sanırım 11 yaşım vardı _2+ỊrN)N;¥/

_2+ỊrN×-*$)Ẏ

Çevrimiçi deneyin!

Nasıl?

_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

Scala, 119 Bayt

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
}

Bu muhtemelen çok daha iyi golf oynayabilir, ancak tembel akışları kullanan bir çözüm istedim.



1

Yığılmış , 44 bayt

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

Çevrimiçi deneyin! Stacked’a programladığımdan bu yana bir süre geçti ama sanırım hala anladım.

Alternatifler

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

Bu, Atache cevabımda kullanılan "oluşturulan endekslerden menziller" yaklaşımıyla gider . Bu çok uzun sürdü, çünkü Stacked’ın geri vites aralıklarına ve çökmelerine sebep olmadı. (İşte :...|>\rev...|>rev#,$#'sortby 1#beheadöyle.)

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

... bu yüzden R cevabında olduğu gibi tek tamsayılar inits$summapüzerinden kümülatif toplamı ( ) tekrarlayan 1ve -1tekrarlayan bir yaklaşıma gitmeye karar verdim. .

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

... ancak negatif tam sayıların ve tek tam sayıların tek seferde yapılabileceğini, hem oluşturulan dizileri (aralığın mod 2 değerleri ve aralığın kendisinin) 2sonradan çıkartarak çarpılabileceğini fark ettim 1. Bu , birinci aralık için alternatif 1s ve -1s'leri ve ikincisi için tek tamsayıları verir!

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

... ve daha sonra, öneklerin haritalanması için bir yerleşimin olduğunu hatırladım. ^ - ^


1

Julia 0.6 , 44 bayt

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

Çevrimiçi deneyin!

OP "çıktı formatı esnek" olduğundan bahsettiğinden, bu bir dizi alt dizi yazdırır, örn. U (3) =>[[0, 1], [0, -1, -2, -1], [0, 1, 2, 3]] .

i%2*2-1 Geçerli alt dizinin işaretine karar verir - çift sayılar için negatif, tekler için pozitif.

[0:i;(n>i)*~-i:-1:1]iki bölümden oluşuyor. 0: i basittir, 0'dan geçerli i'ye kadar olan değerler aralığı. Bir sonraki bölümde, ~ -i: -1: 1, i-1'den 1'e inen aralıktır. Fakat bunu sadece nihai değerde değilsek eklemek istiyoruz, bu yüzden aralığın üst ucunu çarpın (n> i) ile, n == i olduğunda, aralık 0: -1: 1 olacak ve bu da boş biter (dizi n'de doğru durur).


Ve burada rastgele erişimi destekleyebilecek bir sürüm var - buradaki iç lambda diziden önceki terimden önce herhangi bir terimi saklamak zorunda kalmadan geri döndürür. Bu, çıktıyı da tek bir temiz dizi olarak verir.

49 47 bayt

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

Çevrimiçi deneyin!

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.