Вгору і вниз, вгору і вниз


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 = 1Тоді дали б 0 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це божевільний розумний ха-ха.
Чарівна восьминога урна


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

Желе , 11 9 байт

²Ḷƽ-*0;Ä

Спробуйте в Інтернеті!

Як це працює

²Ḷƽ-*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 байти

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твердження та функції. Це дозволено за замовчуванням, якщо виклик не вказує, що це повинна бути повна програма (навіть якщо це було, ви можете скоротити ім'я класу, що містить).
Οurous

Дякую! Завдяки вашій пропозиції я з’ясував значення розділів «колонтитул» та «колонтитул» сайту TIO. Це скоротило розмір моєї заявки навпіл!
Даррін Каллоп

2
Ласкаво просимо до PPCG! (Це схоже на вашу першу публікацію.) Не хвилюйтесь про інші мови, просто намагайтеся бути якомога кращими на своїй мові. / Поради: Видаліть зайві місця. У C # ви можете видалити всі пробіли, що оточують символи ( [](){};.) (n-1)*2- це просто, 2*n-2і з деякою перестановкою ви можете видалити з них круглі дужки.
користувач202729

Крім того, !=має пріоритет менше, ніж %ви можете видалити пару паролів. І ви можете використовувати >0замість `! = 0, зберігає байт.
користувач202729

1
Також від мене: ласкаво просимо до PPCG! Поради щодо гольфу на C # та Поради щодо гольфу на всіх мовах можуть бути цікавими для прочитання. :) Щодо деяких порад щодо гольфу: static int[] f(int n)можна стати f=n=>, використовуючи (рекурсивну) лямбда, а (n-1)*2можна ~-n*2заощадити на дужках. Я знизив її до 155 (137 + 18) байт: Спробуйте в Інтернеті . 18 байт призначені для using System.Linq;, тому що необхідний імпорт є обов'язковим для підрахунку байтів. Насолодитися перебуванням!
Кевін Круїссен

4

J , 25 байт

-5 байт завдяки FrownyFrog!

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

Спробуйте в Інтернеті!

J , 30 байт

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

Пояснення:

i.,] створює список 0..n

&.> для кожного числа у списку виконайте дієслово в (...) та позначте результат (мені потрібен бокс, бо результати мають різну довжину)

[:( _1&^)знаходити -1 до- iї потужності (-1 або 1)

i:@* складіть список -n..n або n ..- n, залежно від ознаки вище

;@ відключити

>:@*: знайти n ^ 2 + 1

}. і візьміть стільки номерів зі списку

Спробуйте в Інтернеті!


1
Чи могли б ви розглянути можливість написання того ж коду, що і nверсії на нульовій основі ? напр *:{.;@([:(i:@*_1&^)&.>i.).. специфікація дозволяє це
jayprich

"n = 1 тоді дасть 0 1 0 -1 -2"
FrownyFrog

@FrownyFrog - Хм, я не перевіряв. Я повернувся до свого першого рішення. Дякую за спостереження!
Гален Іванов

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

Гарний підхід. Я працював над таким підходом прямо зараз, щоб покращити свою відповідь, але ви побили мене до цього (незважаючи на вашу зустріч), молодець! ;-)
Олів’є Грегуар

1
83 байти (я щойно видалив j).
Олів’є Грегоар

1
79 байт : Я iпідніс, а не вниз, щоб видалити зайве n*n.
Олів’є Грегоар

Привіт. Написавши це, щоб повідомити мені, що я в основному зірвав вашу відповідь. (порт до JavaScript). Сподіваюся, що все нормально
Мухаммед Салман

@MuhammadSalman Звичайно, np. Також я часто надсилаю відповіді від інших. :) Поки згадується оригінальна відповідь, як і ти, все в мене добре.
Кевін Крейссен

3

R , 48 46 42 байт

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

Спробуйте в Інтернеті!

Кіріл Л. Порт відповіді Рубі - і врятував 6 байт завдяки тому ж Кирилу Л.! Тепер коротше рішення Джузеппе ;)

Порт цієї відповіді Октави, який використовує Луїс Мендо, 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, що тут працюватиме подібно до рішення Октава Луїса Мендо.
Джузеппе

@Giuseppe Дякую! Це працює, хоча це довше. Я дізнався diffinvі approxз цього питання ...
JayCe

Хоча я також не знаю, як гольфіст спосіб зробити -1 потужність (в R ~не працює як оператор доповнення :(), ви все одно можете зберегти ще 2 байти , перейшовши на повну програму.
Кирилл Л.

... а оскільки це повноцінна програма, ми також можемо використовувати та зіпсувати заздалегідь заданий вбудований: 42 байти - нарешті, коротший, ніж у Джузеппе!
Кирило Л.

3

APL (Діалог Unicode) , 17 байт

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

Спробуйте в Інтернеті!

Поле з байдами 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 або ¯1s дорівнює 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 та ¯1s з ¯1 * ⌊.5 * ⍨ × ⍨⍳, що, як мінімум, на 3 байти коротше.
Kritixi Lithos

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

Я знав, що моє рішення
почувалося


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 в будь-якому випадку.
Кевін Круїссен

2

MATL , 17 15 байт

-2 байти завдяки Луїсу Мендо!

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

Рубі , 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.
Кирило Л.

Дякую за пояснення - це допомогло мені
перенести


1

Python 3, 83 байти

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

Вугілля деревне , 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 байт

Ба, я думав, що у мене 11 віт _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}

Безголівки:

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 не має вбудованого пристрою для реверсивного діапазону, а також не згортання. (Ось що :...|>\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]

... а потім я згадав, що мав вбудований для картографування префіксів. ^ - ^


1

Джулія 0,6 , 44 байти

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

Спробуйте в Інтернеті!

Оскільки в ОП згадується "формат виводу є гнучким", він друкує масив підмасивів, наприклад. 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 правильно).


І ось версія, яка може підтримувати випадковий доступ - внутрішня лямбда тут повертає i-й член послідовності, не маючи до цього зберігати жоден із термінів. Цей також дає вихід як єдиний акуратний масив.

49 47 байт

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

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.