X шагов вперед, 1 шаг назад


21

Вот первые 100 чисел простой последовательности:

0,1,0,2,1,4,3,7,6,11,10,16,15,22,21,29,28,37,36,46,45,56,55,67,66,79,78,92,91,106,105,121,120,137,136,154,153,172,171,191,190,211,210,232,231,254,253,277,276,301,300,326,325,352,351,379,378,407,406,436,435,466,465,497,496,529,528,562,561,596,595,631,630,667,666,704,703,742,741,781,780,821,820,862,861,904,903,947,946,991,990,1036,1035,1082,1081,1129,1128,1177,1176,1226

Как работает эта последовательность?

n: 0 1     2           3     4     5     6     7     8      9       10      11      12

   0,      1-1=0,      2-1=1,      4-1=3,      7-1=6,       11-1=10,        16-1=15,      
     0+1=1,      0+2=2,      1+3=4,      3+4=7,      6+5=11,        10+6=16,        15+7=22
  • a(0) = 0
  • Для каждого нечетного n(0-индексированного) это a(n-1) + X(где X=1и увеличивается на 1 каждый раз, когда к нему обращаются)
  • Для каждого четного n(0-индексированного) этоa(n-1) - 1

Вызов:

Один из:

  • Учитывая входное целое число n, выведите nчисло в последовательности.
  • Учитывая введенное целое число n, выведите первые nчисла последовательности.
  • Вывести последовательность на неопределенный срок, не беря вход ( или принимая пустой неиспользуемый вход ).

Правила соревнований:

  • Ввод nможет быть 0- или 1-индексирован.
  • Если вы выводите (часть) последовательности, вы можете использовать список / массив, печатать в STDOUT с любым разделителем (пробел, запятая, перевод строки и т. Д.). Ваш звонок.
  • Пожалуйста, укажите, какой из трех вариантов вы использовали в своем ответе.
  • Вы должны будете поддержать как минимум первые 10000 номеров (10,000-й номер 12,497,501).

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это возможно.

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

Pastebin с первыми 10,001 числами в последовательности. Не стесняйтесь выбирать любой, который вы хотите.

Некоторые более высокие цифры:

n (0-indexed)    Output:

68,690           589,772,340
100,000          1,249,975,000
162,207          3,288,888,857
453,271          25,681,824,931
888,888          98,765,012,346
1,000,000        124,999,750,000

Ответы:



8

Excel, 31 байт

Ответ 0индексируется. Выводит nчисло.

=(A1^2+IF(ISODD(A1),7,-2*A1))/8

Описанная последовательность в конечном итоге представляет собой две чередующиеся последовательности:

ODD:   (x^2+x+2)/2
EVEN:  (x^2-x)/2

Объединение их в одну 0индексированную последовательность дает:

a = (x^2 - 2x)/8 if even
a = (x^2 + 7 )/8 if odd

Который дает:

=IF(ISODD(A1),(A1^2+7)/8,(A1^2-2*A1)/8)

который мы играем в гольф до 31байтов.


Используя тот же подход, 1indexed дает 37байты:

=(A1^2-IF(ISODD(A1),4*A1-3,2*A1-8))/8



4

Haskell , 40 38 37 байт

scanl(flip($))0$[1..]>>=(:[pred]).(+)

Возвращает бесконечный список, попробуйте онлайн!

объяснение

scanlпринимает три аргумента f, initа xs( [ х 0 , х 1 ... ] ) и строит новый список:

[ a 0 = init , a 1 = f (a 0 , x 0 ) , a 2 = f (a 1 , x 1 ) ... ]

Мы устанавливаем init = 0и используем ($)оператор перевернутого приложения (таким образом, он применяет a i к функции x i ), теперь нам нужен только список функций - список [1..]>>=(:[pred]).(+)представляет собой бесконечный список с правильными функциями:

[(+1),(-1),(+2),(-1),(+3),(-1),(+4),...

Интересная альтернатива, 37 байт

flipимея тип, который (a -> b -> c) -> b -> a -> cмы могли бы также использовать id :: d -> dвместо того, чтобы ($)из-за логического вывода типа Haskell, тип dбыл бы унифицирован a -> b, давая нам то же самое.

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

редактировать

-2 байта, используя (>>=)вместо do-notation.

-1 байт, используя scanlвместо zipWith.



3

05AB1E , 10 байтов

ÎF<NÈi¼¾>+

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

объяснение

Î             # initialize stack with: 0, input
 F            # for N in [0 ... input-1] do:
  <           # decrement the current number
   NÈi        # if N is even
      ¼       # increment a counter
       ¾>     # push counter+1
         +    # add to current number

Еще 10 байт: ÎFNÈN;Ì*<O


ÎGDN+D<генерирует последовательность, но захват n-го элемента кажется ... сложным в 3 байта.
Волшебная Урна Осьминога


3

APL (Dyalog Unicode) , 16 12 байтов SBCS

Функция анонимного молчаливого префикса. 0 индексированные.

+/⊢↑∘∊¯1,¨⍨⍳

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

+/ сумма

⊢↑ первые nэлементы

∘∊ из й nlisted (уплощенные)

¯1,¨⍨ отрицательные один прилагаются к каждому

 первые n разы (от 0 до n–1


Ах, это было мое решение ... думаю, это было достаточно похоже.
Эрик Outgolfer

3

Желе , 6 байт

HḶS‘_Ḃ

Принимается монадическая ссылка (1-indexed), nкоторая возвращает a(n).

Попробуйте онлайн! Или посмотрите набор тестов

Как?

HḶS‘_Ḃ - link: n
H      - halve         -> n/2.0
 Ḷ     - lowered range -> [0,1,2,...,floor(n/2.0)-1]
  S    - sum           -> TriangleNumber(floor(n/2.0)-1)
   ‘   - increment     -> TriangleNumber(floor(n/2.0)-1)+1
     Ḃ - bit = 1 if n is odd, 0 if it's even
    _  - subtract      -> TriangleNumber(floor(n/2.0)-1)+isEven(n)

Хм, интересный подход тут же.
Эрик Outgolfer

3

PHP , 73 64 55 51 47 байт

Первый способ

Первый код ответа в гольф!
Я уверен, что есть PHP-трюки, чтобы сделать его короче, и математика, вероятно, может быть улучшена.

Принимает n в качестве первого аргумента и выводит n-е число в последовательности.

$y=$argv[1]/2;for(;$i<$y+1;)$x+=$i++;echo$x-($y|0);

Минус 9 байтов путем удаления "$ x = 0;" и "$ i = 0".

Минус 9 байтов благодаря @Kevin Cruijssen, улучшающему цикл for и потерю конечного тега.

Минус 1 байт с использованием побитового или "|" а не "(int)"

Минус 3 байта благодаря @Dennis, поскольку вы можете удалить теги, запустив их из командной строки с помощью "php -r 'code here'"

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

Второй метод

Сопоставил мой предыдущий ответ с совершенно новым методом!

for(;$i<$argv[1];$i++)$x+=($y^=1)?$i/2+1:-1;echo$x;

Использование XOR и оператора tenary для переключения между суммами в цикле.

Изменить: это не работает для п = 0, и я понятия не имею, почему. $ i не назначен, поэтому он должен быть 0, поэтому цикл ($i<$argv[1])должен завершиться с ошибкой (0<0==false), поэтому неназначенный $ x должен вывести как 0, а не 1.

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

Третий метод

Преобразование формулы Excel @Wernisch, созданной в PHP, дает 47-байтовое решение.

$z=$argv[1];echo(pow($z,2)+(($z&1)?7:-2*$z))/8;

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


1
Привет, добро пожаловать в PPCG! Если вы еще этого не сделали, вам может быть интересно прочитать советы по игре в гольф на PHP и советы по игре в гольф на <все языки> . Некоторые вещи в гольф: вы можете удалить трейлинг ?>. Удаление $x=0и $i=0действительно разрешено (если нет, $x=$i=0то было бы и короче). Кроме того, цикл может быть сокращен до for(;$i<$y+1;)$x+=$i++;. А это всего -15 байт. Приятного пребывания! :)
Кевин Круйссен

@KevinCruijssen большое спасибо!
Сэм Дин

Пожалуйста. Кстати, ваш TIO в настоящее время все еще 60 байтов вместо 58. И не уверен, почему вы указали 57. Попробуйте онлайн.
Кевин Круйссен

@KevinCruijssen Я продолжал размещать неправильный TIO! Сейчас TIO говорит 58, но я написал 55, так как вы можете удалить «php» из открывающего тега, но не в TIO
Сэм Дин,

@ Верниш спасибо за твою формулу!
Сэм Дин

3

R 35 байт

diffinv(rbind(n<-1:scan(),-1)[n-1])

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

Я подумал, что это интересная альтернатива ответу @ JayCe, так как он не очень хорошо переносится на языки без встроенной поддержки матриц и оказывается просто гольфом.

1-индексированный, возвращает первые nэлементы последовательности.

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

rbind(n<-1:scan(),-1) строит следующую матрицу:

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   -1   -1   -1   -1

Поскольку R содержит матрицы в мажорном столбце, если бы мы преобразовали это в a vector, мы получили бы вектор

1 -1 2 -1 3 -1 4 -1

который, если мы возьмем совокупную сумму, мы получим

1 0 2 1 4 3 7 6

которая является последовательностью, просто без ведущих 0. diffinvк счастью, добавляет ведущий ноль, поэтому мы берем первые n-1значения из матрицы и diffinvих, получая первые nзначения последовательности.


2
Я большой поклонник ваших ответов "diffinv".
JayCe

@JayCe кредит пользователю 2390246 за представление diffinvмне!
Джузеппе

3

R , 35 34 байта

(u=(n=scan())-n%%2-1)-n+(15+u^2)/8

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

Первый вариант вывода. Та же формула, что и во многих других ответах (я бы хотел указать на первый ответ, предоставив формулу, я не могу понять, какая это).

Второй и третий варианты вывода ниже:

R , 43 байта

function(m,n=1:m,u=n%%2+1)((n-u)^2-1)/8+2-u

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

R , 51 байт

while(T){cat(((T-(u=T%%2+1))^2-1)/8+2-u," ");T=T+1}

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


3

Matlab / Octave, 31 26 байт

5 байтов сэкономили Луису Мендо!

@(n)sum(1:n/2+.5)-fix(n/2)

1
Вы, вероятно, можете использовать fixвместо floor, а n/2+.5вместоceil(n/2)
Луис Мендо

@LuisMendo Ty! Не знал fix()и не ожидал 1:n/2+.5работать - так много вещей, которые могут пойти не так, но на самом деле они этого не делают :)
Леандер Мезингер




3

QBasic, 31 байт

Решение «просто реализуй спецификацию» длится немного дольше, чем решение Эрика .

DO
?n
i=i+1
n=n+i
?n
n=n-1
LOOP

Это выводит на неопределенный срок. В целях его запуска я рекомендую изменить последнюю строку на что-то вроде LOOP WHILE INPUT$(1) <> "q", что будет ждать нажатия клавиши после каждого второго ввода последовательности и завершаться, если нажата клавиша q.


2

C # (.NET Core) , 56 байт

n=>{int a=0,i=0;for(;++i<n;)a+=i%2<1?-1:i/2+1;return a;}

-2 байта благодаря Кевину Круйссену

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

1 проиндексировано. Возвращаетa(n)

Ungolf'd:

int f(int n)
{
    // a needs to be outside the for loop's scope,
    // and it's golfier to also define i here
    int a = 0, i = 1;
    // basic for loop, no initializer because we already defined i
    for (; ++i < n;)
    {
        if (i%2 < 1) {
            // if i is even, subtract 1
            a -= 1;
        }
        else
        {
            // if i is odd, add (i / 2) + 1
            // this lets us handle X without defining another int
            a += i / 2 + 1;
        }
    }
    // a is the number at index n
    return a;
}

1
i=1;for(;i<n;i++)может быть i=0;for(;++i<n;)и i%2==0может быть i%2<1.
Кевин Круйссен

@KevinCruijssen, так что я могу, спасибо! Я должен был видеть 2-й, но я не думал, что первый будет работать, поскольку я думал, что для циклов проверяется только условное условие после первого цикла. TIL
Скидсдев

Нет, он проверяет перед первой итерацией уже. A do-whileпроверит после завершения первой итерации. :)
Кевин Круйссен

В очень редких случаях вы можете даже объединить ifс for-loop. Например: if(t>0)for(i=0;i<l;i++)к for(i=0;t>0&i<l;i++). Хотя я почти никогда не мог использовать это в своих ответах.
Кевин Круйссен

это довольно круто, мне определенно придется помнить об этом в следующий раз, когда я буду заниматься гольфом на C #, что в наши дни довольно редко: P большая часть моей работы на C # явно нечистоплотна
Skidsdev

2

Шелуха , 11 9 8 байт

ΘṁṠe→Θ∫N

Сохраненный байт благодаря H.PWiz.
Выходы в виде бесконечного списка.
Попробуйте онлайн!

объяснение

ΘṁṠe→Θ∫N
      ∫N   Cumulative sum of natural numbers (triangular numbers).
     Θ     Prepend 0.
 ṁṠe→      Concatenate [n + 1, n] for each.
Θ          Prepend 0.

2

Додос , 69 байт

	. w
w
	. h
	+ r . ' dab h '
h
	h ' '
	. dab
r
	
	r dip
.
	dot
'
	dip

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


Почему-то это самый длинный ответ.

Объяснение.

┌────┬─────────────────────────────────────────────────┐
│Name│Function                                         │
├────┼─────────────────────────────────────────────────┤
│.   │Alias for "dot", computes the sum.               │
├────┼─────────────────────────────────────────────────┤
│'   │Alias for "dip".                                 │
├────┼─────────────────────────────────────────────────┤
│r   │Range from 0 to n, reversed.                     │
├────┼─────────────────────────────────────────────────┤
│h   │Halve - return (n mod 2) followed by (n/2) zeros.│
└────┴─────────────────────────────────────────────────┘

1

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

I∨ΣEN⎇﹪ι²±¹⊕⊘ι⁰

Попробуйте онлайн! 0 индексированные. Ссылка на подробную версию кода. Формула, вероятно, будет короче, но что в этом хорошего? Объяснение:

    N           Input as a number
   E            Map over implicit range
     ⎇          Ternary
      ﹪ι²       Current value modulo 2
         ±¹     If true (odd) then -1
           ⊕⊘ι  Otherwise calculate X as i/2+1
  Σ             Take the sum
 ∨            ⁰ If the sum is empty then use zero
I               Cast to string and implicitly print

1

JavaScript, 49 48 45 байт

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')

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

Не так красиво, как ответ @tsh, но мой работает для больших чисел.

А теперь спасибо @tsh, за evalрешение!


<=x+1может быть<x+2
Кевин Круйссен

x=>eval('for(i=0,r=1;++i<x+2;)r+=i%2?-1:i/2')должно быть короче.
1818 года

evalВозвращает ли последнее измененное значение? Я до сих пор не до конца понимаю, на что он способен.
Случайный парень

Он возвращает значение оператора (который может быть рассмотрен в doзаявлении в более поздней версии).
Tsh

1

Befunge 93, 26 байт

<v0p030
 >:.130g+:30p+:.1-

Запускается бесконечно.
Попробуйте онлайн , хотя вывод становится немного шатким и возвращается после x = 256, предположительно, TIO не может обрабатывать символы выше U + 256. Прекрасно работает на https://www.bedroomlan.org/tools/befunge-playground (к сожалению, только в Chrome. С Firefox по какой-то причине конечные линии удаляются во время выполнения ...)



1

Pyth , 8 байт

s<s,R_1S

Возвращает nчисло в последовательности с 0 индексами. Попробуйте онлайн

Пояснение, с примером для n=5:

s<s,R_1SQQ   Final 2 Q's are implicit, Q=eval(input())

       SQ    1-indexed range        [1,2,3,4,5]
   ,R_1      Map each to [n,-1]     [[1,-1],[2,-1],[3,-1],[4,-1],[5,-1]]
  s          Sum (Flatten)          [1,-1,2,-1,3,-1,4,-1,5,-1]
 <       Q   Take 1st Q             [1,-1,2,-1,3]
s            Sum, implicit output   4

1

Perl 6 ,  38  26 байт

{(0,{$_+(($+^=1)??++$ !!-1)}...*)[$_]}

Попытайся

{(+^-$_+|1)**2 div 8+$_%2}

Основано на обратной инженерии TFeld's Python answer .
Попытайся

расширенный

38 байт (генератор последовательности):

{  # bare block lambda with implicit parameter $_

  (
    # generate a new sequence everytime this function is called

    0,    # seed the sequence

    {     # bare block that is used to generate the rest of the values

      $_  # parameter to this inner block (previous value)

      +

      (
          # a statement that switches between (0,1) each time it is run
          ( $ +^= 1 )

        ??     # when it is 1 (truish)
          # a statement that increments each time it is run
          ++$ # &prefix:« ++ »( state $foo )

        !!     # or else subtract 1
          -1
      )
    }

    ...  # keep generating until:

    *    # never stop

  )[ $_ ] # index into the sequence
}

Обратите внимание, что это дает преимущество, которое вы можете передать, *чтобы получить всю последовательность, или передать Range для более эффективной генерации нескольких значений.

26 байт (прямой расчет):

{  # bare block lambda with implicit parameter $_

  (

    +^     # numeric binary negate
      -$_  # negative of the input
      +|   # numeric binary or
      1

  ) ** 2   # to the power of 2

  div 8     # integer divide it by 8

  + $_ % 2  # add one if it is odd
}

1

05AB1E , 8 байтов

;L¨O>¹É-

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

Основанный на желеобразном подходе Джонатана Аллана (который, вероятно, был основан на OP, редактирующем вопрос с другим определением последовательности), так что 1-индексируется.


+1. У меня был подобный подход, подготовленный в 05AB1E, который я планировал опубликовать через несколько дней, если никто другой не опубликовал его. Это немного отличается (я сначала уменьшаю половину перед созданием списка, вместо удаления хвоста; я использую Iвместо ¹), но общий подход и количество байтов точно такие же:;<LO>IÉ-
Кевин Круйссен

@KevinCruijssen написал бы вчера, если бы у меня была способность мыслить глубже, но, ну, это финальный период, слишком глубоко размышлять об этом запрещено. : P
Эрик Outgolfer

Ах, я рад, что у меня больше нет финалов. Я тоже довольно занят на работе, и иногда приходится откладывать код-гольф чаще, чем хотелось бы. ; p Удачи с экзаменами!
Кевин Круйссен,

1

Выпуклый , 10 9 байт

_½,ª)\2%-

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

Основано на подходе Джонатана Аллана Jelly (который, вероятно, был основан на OP, редактирующем вопрос с другим определением последовательности). 1-индексироваться.

Объяснение:

_½,ª)\2%- Stack: [A]
_         Duplicate. Stack: [A A]
 ½        Halve. Stack: [A [A]½]
  ,       Range, [0..⌊N⌋). Stack: [A [[A]½],]
   ª      Sum. Stack: [A [[A]½],]ª]
    )     Increment. Stack: [A [[[A]½],]ª])]
     \    Swap. Stack: [[[[A]½],]ª]) A]
      2   2. Stack: [[[[A]½],]ª]) A 2]
       %  Modulo. Stack: [[[[A]½],]ª]) [A 2]%]
        - Minus. Stack: [[[[[A]½],]ª]) [A 2]%]-]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.