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, функції / метод з відповідними параметрами та повним програмами типу "повернення". Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це можливо.

Тестові приклади:

Пастебін з першими 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байтів.


Використовуючи той самий підхід, 1індексовано дає 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-нотації.

-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 icesдицензії (від 0 до n–1


Ах, це було моє рішення ... здогадуйтесь, це було досить схоже.
Ерік Атголфер

3

Желе , 6 байт

HḶS‘_Ḃ

Монадічне посилання, що приймає (1-індексоване), 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)

Гм, цікавий підхід саме там.
Ерік Аутгольфер

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 покращує цикл та втрату кінцевої мітки.

Мінус 1 байт, використовуючи побітове або "|" а не "(int)"

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

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

Другий метод

Зіставив мою попередню відповідь цілком новим методом!

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

Використовуючи XOR та оператора підрядника для перемикання між сумами в циклі.

Редагувати: це не працює при n = 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
Сем Дін

@Wernisch дякую за вашу формулу!
Сем Дін

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


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

Матлаб / Октава, 31 26 байт

5 байт збережено THX для Луїса Мендо!

@(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 працювати - так багато речей, які можуть піти не так, але насправді не так :)
Leander Moesinger




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, тому я можу, дякую! Я повинен був бачити другий, але я не думав, що перший буде працювати, як я вважав, що петлі перевіряють лише умовні після першого циклу. TIL
Skidsdev

Ні, він перевіряється вже до першої ітерації. А 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')повинна бути коротшою.
тш

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

Він повертає значення твердження (яке може бути висвітлено у doтвердженні в наступній версії).
тш

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 на Python .
Спробуй це

Розширено

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
}

Зауважте, що це має перевагу, яку ви можете передати * щоб отримати всю послідовність, або пройти в діапазон, щоб більш ефективно генерувати декілька значень.

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>¹É-

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

Заснований на підході Джонатана Аллана «Желе» (який, ймовірно, ґрунтувався на редагуванні ОП питання з іншим визначенням послідовності), так 1-індексований.


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

@KevinCruijssen розмістив би вчора, якби я мав можливість більш глибоко думати, але, ну, це фінальний період, занадто глибоко думати про це заборонено. : P
Ерік Аутгольфер

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

1

Опукла , 10 9 байт

_½,ª)\2%-

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

Заснований на підході Джонатана Аллана «Желе» (який, ймовірно, ґрунтувався на редагуванні питання ОП з іншим визначенням послідовності). 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.