Codegolf - Вверх И Вниз, Вверх И Вниз

  • Автор темы Lamaker
  • Обновлено
  • 21, Oct 2024
  • #1

Испытание:

Учитывая положительное целое число входных данных н, создайте вектор, соответствующий этому шаблону:

 
 0  1  0 -1 -2 

Или, объясняя словами: вектор начинается с n = 1 , and makes increments of 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 is reached. The sequence will end on positive n если n is odd, and negative n если n is even.

Выходной формат является гибким.

Тестовые случаи:

1

Вы можете выбрать вариант н с нулевым индексом. 0 would then give 0 1 0 -1 -2 -1 0 1 2 3 2 1 0 -1 -2 -3 -4 -3 -2 -1 ... ±(n-1) ±n .

Это , поэтому побеждает самый короткий код на каждом языке! Пояснения, как всегда, приветствуются!

#код-гольф #код-гольф #последовательность #целое число

Lamaker


Рег
23 Mar, 2020

Тем
68

Постов
200

Баллов
570
  • 26, Oct 2024
  • #2

Р, 58 54 50 48 43 байта

-2 байта благодаря MickyT

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

Попробуйте онлайн!

[0:i;(n>i)*~-i:-1:1] ||answer||

Перл 6, 60 26 байт

i%2*2-1

Попробуйте это

[[0, 1], [0, -1, -2, -1], [0, 1, 2, 3]]

Попробуйте это

Расширено:

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

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

 

Vsesin


Рег
24 Oct, 2006

Тем
78

Постов
198

Баллов
618
  • 26, Oct 2024
  • #3

05AB1E, 9 7 байт

Сэкономлено 2 байта благодаря @Emigna

1

Попробуйте онлайн!

Мой первый ответ 05AB1E (я думаю), поэтому, возможно, мне не хватает некоторых трюков...

Объяснение

1

Я должен поблагодарить @Dennis за оригинальное использование 2 , иначе я возможно и не узнал бы об этом...

 

Erakhimk


Рег
04 Jul, 2008

Тем
74

Постов
212

Баллов
602
  • 26, Oct 2024
  • #4

Питон 2, 69 57 56 байт

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

Попробуйте онлайн!

Для каждого -1 up to the 1 тот inits$summap (inclusive) is calculated, inverted when [0\|>:2%tmo _\tpo#,tr[...rep]flatmap 0\,inits$summap] является четным числом, из него удалены первые два числа (после инверсии), а затем добавлены к выходным данным.

 

Михаил


Рег
06 Jul, 2013

Тем
80

Постов
201

Баллов
621
  • 26, Oct 2024
  • #5

05AB1E, 15 14 байт

:...|>\rev...|>rev#,$#'sortby 1#behead

Попробуйте онлайн!

Объяснение

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

JavaScript (ES6), 56 байт

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

Попробуйте онлайн!

Прокомментировал

⎕IO←0 ||answer||

Хаскелл, 43 байта

⎕CY'dfns'⋄-0,∘∊1↓¨2to/Sׯ1*S←⍳,⊢

Попробуйте онлайн!

Вычисляет отрицательные совокупные суммы списка. 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 } , which is the first 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} ряды

╗)SΘ█☼₧ΘP( ||answer||

Желе, 11 9 байт

_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]

Попробуйте онлайн!

Как это работает

_2+ỊrN×-*$)Ẏ ||answer||

Хаскелл, 48 42 байта

_2+ỊrN)N;¥/

Попробуйте онлайн!

Спасибо Οurous за -1 байт

Несмотря на то, что, оглядываясь назад, это становится очевидным, мне потребовалось некоторое время, чтобы прийти к такому выводу. …·∧ι⁻²ιι which is ×∨﹪ι²±¹ когда is even and 0 когда F⊕N is odd. Previous iterations where:

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 ||answer||

С# (.NET Core), 300 167 байт

Я никогда раньше не делал ничего подобного, но этот показался мне забавным. Я понимаю, почему люди используют эти «игровые» языки, поскольку 167 кажется намного выше, чем некоторые другие ответы. Но ты должен исходить из того, что знаешь.

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

Попробуйте онлайн!

:ṁoṡ₁ŀ⁰_₁⁰ *^⁰_1⁰ ||answer||

Дж, 25 байт

-5 байт благодаря FrownyFrog!

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

Попробуйте онлайн!

Дж, 30 байт

0-I-[0|I]. N-[H|T]-R:-N is -H*(-1)^N,A is N-1,A-[H|T]-R;I is H-(-1)^N,N-[I|[H|T]]-R. N-O:-X is -N*(-1)^N,N-[X]-O.

Объяснение:

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 } creates list 0..n

f=->n{n<1?[0]:f[n-1]+[(r=*2-n..n).map(&:-@),r][n%2]} for each number in the list execute the verb in (...) and box the result (I need boxing because the results have different length)

f=->n{n<1?[0]:f[n-1]+(2-n..n).map{|x|-~0**n*x}} find -1 to the @(n)interp1((t=0:n).^2,-t.*(-1).^t,0:n^2) степень (-1 или 1)

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 make a list -n..n or n..-n, depending on the sign of the above

n=3 unbox

0i:oEqG:EqY"Ysh find n^2 + 1

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;} and take so many numbers from the list

Попробуйте онлайн!

 

Lady mary76


Рег
27 May, 2015

Тем
82

Постов
222

Баллов
652
  • 26, Oct 2024
  • #7

Java 8, 85 83 79 байт

⍳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 ┌─┬─────┬─────────┬─────────────┐ │1│1 1 1│1 1 1 1 1│1 1 1 1 1 1 1│ └─┴─────┴─────────┴─────────────┘ ⊢∘-\⍴∘1¨1+2×⍳4 ⍝ alternate signs ┌─┬────────┬─────────┬────────────────────┐ │1│¯1 ¯1 ¯1│1 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

-6 байт благодаря @ОливьеГрегоир.

Попробуйте онлайн.

Объяснение:

+\⍣¯1 ||answer||

Р, 48 46 42 байта

+\⍣¯1⊢0 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

Попробуйте онлайн!

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

Порт этот ответ Октавы Луис Мендо с использованием ⎕IO←0 is less golfy. +\0,∊⊢∘-\⍴∘1¨1+2×⍳⎕ можно заменить на +\0,¯1*⍳(/⍨)1+2×⍳ ; or by f=function(n)approx((0:n)^2+1,-(-1)^(0:n)*0:n,n=n^2+1)$y (позиционный аргумент xout ) for the same byte count :

Р, 56 байт

0:n^2+1

Попробуйте онлайн!

 

Wbler


Рег
14 Aug, 2004

Тем
82

Постов
203

Баллов
653
  • 26, Oct 2024
  • #8

APL (Диалог Юникод), 17 байт

,,n^2+1

Попробуйте онлайн!

Забил 2 байта благодаря @FrownyFrog, превратив его в поезд. См. старый ответ и его объяснение ниже.


APL (Диалог Юникод), 19 байт

n=n^2+1

Попробуйте онлайн!

(Использует approx )

Мой первый подход состоял в том, чтобы создать несколько диапазонов и объединить их вместе, это легко превысило 30 байт. Затем я начал анализировать последовательность

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

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 denotes the inverse cumulative sum

Существует повторяющийся шаблон из 1 и 1, где длина каждой последовательной последовательности 1 или 1 составляет 1+2×n. И каждая подпоследовательность чередуется между 1 и ¯1. Что я могу сделать сейчас, так это создать список 1 и 1, а затем просканировать его с помощью +

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

Хаскелл, 47 байт

r=k=0;exec'print r;r+=1-k**.5//1%2*2;k+=1;'*-~input()**2

Попробуйте онлайн!

 

Pompyryb118skestSoky


Рег
08 Jul, 2008

Тем
76

Постов
184

Баллов
604
  • 26, Oct 2024
  • #12

Питон 3, 83 байта

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

Шелуха, 18 17 байт

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

Попробуйте онлайн!

 

Xpone


Рег
01 Apr, 2020

Тем
92

Постов
186

Баллов
686
  • 26, Oct 2024
  • #13

Древесный уголь, 19 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

(-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

Альтернативное объяснение:

i

Перебираем целые числа из -x to the input inclusive.

i

Перед печатью преобразуйте результаты в строку.

x

Инвертируйте альтернативные наборы результатов.

(-1)^i*x

Сформируйте список от предыдущего индекса до текущего индекса, исключая предыдущий индекс.

 

Imeegaro


Рег
09 Apr, 2006

Тем
80

Постов
183

Баллов
603
  • 26, Oct 2024
  • #14

Желе, 11 12 байты

Ба, я думал, что у меня 11 с f n=0:[(-1)^i*x|i<-[0..n-1],x<-[1-i..i+1]]

²Ḷƽ-*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.

Попробуйте онлайн!

Как?

²Ḷƽ-*0;Ä ||answer||

Стакс, 10 байты

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

Запустите и отладьте его

 

Nura


Рег
19 Apr, 2007

Тем
64

Постов
230

Баллов
580
  • 26, Oct 2024
  • #15

Скала, 119 байт

n

Негольфед:

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

Вероятно, в этом можно играть гораздо лучше, но мне нужно было решение, использующее ленивые потоки.

 

Вирсавия


Рег
14 Sep, 2011

Тем
70

Постов
213

Баллов
593
  • 26, Oct 2024
  • #16

APL (Диалог Юникод), 34 32 байта

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

Попробуйте онлайн!

Требует 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

-2 байта благодаря @FrownyFrog

 

Illogarict


Рег
16 Oct, 2006

Тем
74

Постов
185

Баллов
575
  • 26, Oct 2024
  • #17

Сложенный, 44 байта

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

Попробуйте онлайн! Прошло много времени с тех пор, как я программировал в Stacked, но, думаю, у меня все еще есть это.

Альтернативы

73 байта: Ý # 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

Это соответствует подходу «диапазоны из сгенерированных индексов», используемому в моем Атташе ответ. Это оказалось довольно долго, поскольку в Stacked нет встроенных функций для обратных диапазонов и свертывания. (Вот что ÝDÉ·<*Ý€û˜ÔsF¨ does.)

53 байта: n

...поэтому я решил использовать подход, который вместо этого находит совокупную сумму ( range(-n,n) ) over input и n repeated by the odd integers, as in the Р ответ.

46 байт: f=lambda n:[0][n:]or f(n-1)+range(-n,n+1)[::n%2*2-1][2:]

...но я понял, что отрицательные целые числа и нечетные целые числа можно получить за один раз, умножив оба сгенерированных массива (значения диапазона по модулю 2 и сам диапазон) на Ÿ then subtracting Ý # 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, ...]] . Это дает чередование Ýā®sm*Ÿ s and 0 1 -2 3 -4 5 s для первого диапазона и нечетные целые числа для второго!

44 байта: (-1,-*...*)Z*0..$_

... и потом я вспомнил, что у меня есть встроенная функция для сопоставления префиксов. ^-^

 

Наталья Коновалова


Рег
28 Oct, 2020

Тем
83

Постов
198

Баллов
643
  • 26, Oct 2024
  • #18

Юлия 0,6, 44 байта

{ # 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 }

Попробуйте онлайн!

Поскольку OP упоминает, что «формат вывода является гибким», он печатает массив подмассивов, например. U(3) => {[...] (-1,-*...*)Z*0..$_} .

{flat {((1,-*...*)ZX*(-$++...0...$++)xx$_)}(),$_*($_%2||-1)} decides the sign of the current subarray - negative for even numbers, positive for odd.

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 is in two parts. 0:i is straightforward, the range of values from 0 to the current i. In the next part, ~-i:-1:1 is the descending range from i-1 to 1. But we want to append this only if we're not yet at the final value, so multiply the upper end of the range by (n>i) so that when n==i, the range will be 0:-1:1 which ends up empty (so the array stops at n correctly).


А вот версия, которая может поддерживать произвольный доступ — внутренняя лямбда здесь возвращает i-й член последовательности без необходимости сохранять какие-либо члены перед ним. Этот результат также дает результат в виде единого аккуратного массива.

49 47 байт

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

Попробуйте онлайн!

 

Гладиолус


Рег
16 Aug, 2011

Тем
58

Постов
172

Баллов
492
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно