Чергова послідовність знаків


16

Вступ

Ознака ряду є або +, або -для кожного ненульового цілого числа. Нуль сам по собі безнадійний ( +0те саме, що -0). У наступній послідовності ми будемо чергувати позитивний знак , нульовий і негативний знак . Послідовність починається з 1, тому ми пишемо 1з позитивного знака, з нуля (це дивно, але ми просто множимо число на 0) і від’ємного знака:

1, 0, -1

Наступне число - 2і ми знову робимо те саме:

2, 0, -2

Послідовність зрештою така:

1, 0, -1, 2, 0, -2, 3, 0, -3, 4, 0, -4, 5, 0, -5, 6, 0, -6, 7, 0, -7, ...

Або більш читабельна форма:

a(0) = 1
a(1) = 0
a(2) = -1
a(3) = 2
a(4) = 0
a(5) = -2
a(6) = 3
a(7) = 0
a(8) = -3
a(9) = 4
...

Завдання

Враховуючи невід'ємне ціле число n , виведіть n- й член зазначеної послідовності. Ви можете вибрати, чи використовуватимете нульову або одноіндексовану версію.

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

Нульова індексація:

a(0) = 1
a(11) = -4
a(76) = 0
a(134) = -45
a(296) = -99

Або якщо ви віддаєте перевагу одноіндексованому:

a(1) = 1
a(12) = -4
a(77) = 0
a(135) = -45
a(297) = -99

Це , тому подання з найменшою кількістю байтів виграє!


Чи гаразд, якщо ви почнете з[0, 0, 0, -1, 0, 1...
Синій

@muddyfish не вибачте, це повинно починатися з 1.
Аднан

Відповіді:



6

JavaScript ES6, 18 байт

n=>-~(n/3)*(1-n%3)

Виявилося дуже схоже на відповідь @ LeakyNun, але я його не побачив, поки не опублікував свою.

Пояснення та Недоліки

-~це скорочення Math.ceilабо округлення:

n =>               // input in var `n`
    Math.ceil(n/3) // Get every 3rd number 1,1,1,2,2,2, etc.
    *
    (1-n%3)        // 1, 0, -1, 1, 0, -1, ...


1
(Я засвідчую, що він не бачив мого рішення перед тим, як опублікувати своє рішення)
Leaky Nun,

Math.ceilі -~різні; Math.ceil(1) == 1тоді як-~1 == 2
Кіос

1
На 1 байт коротше:n=>~(n/3)*~-(n%3)
Cyoce

6

MarioLANG, 93 81 байт

одноіндексований

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

;(-))+(-
"============<
>:(![<:![<:)![
 !=#="!#="!=#=
!  < !-< !- <
#==" #=" #=="

Пояснення:

ми починаємо з прийняття імпульсу

;

які нам дають

          v
... 0 0 input 0 0 ...

Потім ми декрементуємо лівий байт і збільшуємо правий байт

;(-))+(
=======

ми закінчуємо

           v
... 0 -1 input +1 0 ...

потім встановлюємо цикл

;(-))+(-
"============<
>  ![< ![<  ![
   #=" #="  #=
!  < !-< !- <
#==" #=" #=="

петля буде тривати, поки не буде схожа пам'ять

         v 
... 0 -X 0 +X 0 ...

тоді нам потрібно лише вивести результат

;(-))+(-
"============<
>:(![<:![<:)![
 !=#="!#="!=#=
!  < !-< !- <
#==" #=" #=="

2
Приємно! Вам, здається, подобається MarioLang.
Rɪᴋᴇʀ

@EasterlyIrk Почуття не здається взаємним від MarioLang до EtherFrog, хоча: ;(і >:(. Хоча, два рази [<:можна було б вважати трохи щасливим. ; P
Кевін Круїссен

4

Python 2, 24 байти

lambda n:(n/3+1)*(1-n%3)

Повна програма:

a=lambda n:(n/3+1)*(1-n%3)

print(a(0))   #   1
print(a(11))  #  -4
print(a(76))  #   0
print(a(134)) # -45
print(a(296)) # -99

4

MATL, 15 12 байт

3/XkG3X\2-*_

Для цього використовується одна індексація на основі.

Спробуйте в Інтернеті! або перевірити тестові випадки

Пояснення:

    G          #Input
     3X\       #Modulus, except multiples of 3 give 3 instead of 0
        2-     #Subtract 2, giving -1, 0 or 1
3/Xk           #Ceiling of input divided by 3.
          *    #Multiply 
           _   #Negate

Щоб піклуватися про більшість питань, щось подібне Q3/Xk-1:1G_)*може працювати краще. Він, ймовірно, може бути замінений на будь-якому етапі для індексації на основі 1.
Suever

4

Haskell, 27 байт

f x=div(x+3)3*(1-mod(x+3)3)

Трохи цікавіше байтове рішення:

(((\i->[i,0,-i])=<<[1..])!!)

(Обоє - 0додані)


3

MATL , 8 байт

:t~y_vG)

Результат на основі 1.

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

Пояснення

Це будує 2D масив

 1  2  3  4  5 ...
 0  0  0  0  0 ...
-1 -2 -3 -4 -5 ...

а потім використовує лінійну індексацію для отримання потрібного терміна. Лінійна індексація означає індекс вниз, потім через (так що в наведеному вище масиві перші записи в лінійному порядку є 1, 0, -1, 2, 0, ...)

:     % Vector [1 2 ... N], where N is implicit input
t~    % Duplicate and logical negate: vector of zeros
y_    % Duplicate array below the top and negate: vector [-1 -2 ... -N]
v     % Concatenate all stack contents vertically
G)    % Index with input. Implicit display

3

Perl 5, 22 байти

21 плюс один для -p:

$_=(-$_,$_+2)[$_%3]/3

Використовує індексацію на основі 1.

Пояснення:

-pвстановлює змінну, $_рівну вхідному. Потім код встановлює його рівним $_%3th елементу, розділеному на 3, списку на основі 0 (-$_,$_+2)(де %є модуль). Зауважте, що якщо $_%3два, то такого елемента немає, і подальший поділ на 3 нумерує невизначений на 0., -pа потім друкує $_.



2

Перл 6 ,  26  23 байти

{({|(++$,0,--$)}...*)[$_]}
{($_ div 3+1)*(1-$_%3)}

(Коротший був перекладений з інших відповідей)

Пояснення (першого):

{ # bare block with implicit parameter 「$_」
  (

    # start of sequence generator

    { # bare block
      |(  # slip ( so that it flattens into the outer sequence )
        ++$, # incrementing anon state var =>  1, 2, 3, 4, 5, 6
        0,   # 0                           =>  0, 0, 0, 0, 0, 0
        --$  # decrementing anon state var => -1,-2,-3,-4,-5,-6
      )
    }
    ...  # repeat
    *    # indefinitely

    # end of sequence generator

  )[ $_ ] # get the nth one (zero based)
}

Тест:

#! /usr/bin/env perl6
use v6.c;
use Test;

# store it lexically
my &alt-seq-sign = {({|(++$,0,--$)}...*)[$_]}
my &short-one = {($_ div 3+1)*(1-$_%3)}

my @tests = (
    0 =>   1,
   11 =>  -4,
   76 =>   0,
  134 => -45,
  296 => -99,
  15..^30  => (6,0,-6,7,0,-7,8,0,-8,9,0,-9,10,0,-10)
);

plan @tests * 2 - 1;

for @tests {
  is alt-seq-sign( .key ), .value, 'alt-seq-sign  ' ~ .gist;

  next if .key ~~ Range; # doesn't support Range as an input
  is short-one(    .key ), .value, 'short-one     ' ~ .gist;
}
1..11
ok 1 - alt-seq-sign  0 => 1
ok 2 - short-one     0 => 1
ok 3 - alt-seq-sign  11 => -4
ok 4 - short-one     11 => -4
ok 5 - alt-seq-sign  76 => 0
ok 6 - short-one     76 => 0
ok 7 - alt-seq-sign  134 => -45
ok 8 - short-one     134 => -45
ok 9 - alt-seq-sign  296 => -99
ok 10 - short-one     296 => -99
ok 11 - alt-seq-sign  15..^30 => (6 0 -6 7 0 -7 8 0 -8 9 0 -9 10 0 -10)

2

J, 19 15 байт

>.@(%&3)*1-3|<:

Ймовірно, потрібно ще в гольф ...

1-індексований.

Безголівки:

>> choose_sign      =: 1-3|<:      NB. 1-((n-1)%3)
>> choose_magnitude =: >.@(%&3)    NB. ceil(n/3)
>> f                =: choose_sign * choose_magnitude
>> f 1 12 77
<< 1 _4 0

Де >>означає вхід (STDIN) і <<означає вихід (STDOUT).


2

Pyke, 8 7 байт (стара версія)

3.DeRt*

Спробуйте тут! - Зауважте, що посилання, ймовірно, не триватиме довго

3.D      - a,b = divmod(input, 3)
   e     - a = ~a -(a+1)
     t   - b -= 1
      *  - a = a*b
         - implicit output a

Найновіша версія

3.DhRt*_

Спробуйте тут!

3.D      - a,b = divmod(input, 3)
   h     - a+=1
     t   - b-=1
      *  - a = a*b
       _ - a = -a
         - implicit output a

Чи можете ви надати посилання на (стару версію)
Пуховик

Остання фіксація, де працює тут старий код (це раніше сьогодні)
Блакитний

2

J, 27 байт

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

>.@(>:%3:)*1:`0:`_1:@.(3|])

Ось декомпозиція дерева:

         ┌─ >.      
  ┌─ @ ──┤    ┌─ >: 
  │      └────┼─ %  
  │           └─ 3: 
  ├─ *              
──┤           ┌─ 1: 
  │      ┌────┼─ 0: 
  │      │    └─ _1:
  └─ @. ─┤          
         │    ┌─ 3  
         └────┼─ |  
              └─ ]  

Це дуже схоже на відповідь Дж. Кенні тим, що він вибирає величину та знак, але відрізняється тим, що я використовую порядок денний для вибору знаку.


2

MATL, 8 байт

_3&\wq*_

Це рішення використовує індексацію на основі 1 в послідовності.

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

Модифікована версія, що показує всі тестові випадки

Пояснення

        % Implicitly grab the input
_       % Negate the input
3&\     % Compute the modulus with 3. The second output is floor(N/3). Because we negated
        % the input, this is the equivalent of ceil(input/3)
w       % Flip the order of the outputs
q       % Subtract 1 from the result of mod to turn [0 1 2] into [-1 0 1]
*       % Take the product with ceil(input/3)
_       % Negate the result so that the sequence goes [N 0 -N] instead of [-N 0 N]
        % Implicitly display the result

2

Pyth, 10 байт

*h/Q3-1%Q3

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

Пояснення:

*     : Multiply following two arguments
h/Q3  : 1 + Input/3
-1%Q3 : 1 - Input%3

Примітка. Я припустив нульову індексовану послідовність.



Я дуже наблизився до вашого рішення ...*@(1ZtZ)%Q3h/Q3
FliiFe

@FliiFe (1ZtZ)=-L1 2
Leaky Nun

2

Власне, 10 байт

3@│\u)%1-*

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

Пояснення:

3@│\u)%1-*
3@│         push 3, swap, duplicate entire stack ([n 3 n 3])
   \u)      floor division, increment, move to bottom ([n 3 n//3+1])
      %1-   mod, subtract from 1 ([1-n%3 n//3+1])
         *  multiply ([(1-n%3)*(n//3+1)])

2

05AB1E, 7 байт

Код:

(3‰`<*(

Пояснили:

(           # negate input: 12 -> -12
 3‰         # divmod by 3: [-4, 0]
   `        # flatten array: 0, -4
    <       # decrease the mod-result by 1: -1, -4
     *      # multiply: 4
      (     # negate -4

2

GeoGebra, 44 байти

Element[Flatten[Sequence[{t,0,-t},t,1,n]],n]

де n одноіндексований.

Пояснення:

Element[                      , n] # Return the nth element of the list                  .
 Flatten[                    ]     # Strip all the unnecessary braces from the list     /|\
  Sequence[{t,0,-t}, t, 1, n]      # Generate a list of lists of the form {t, 0, -t}     |
                             # This list will start with {1,0,-1} and end with {n,0,-n}  |

Не потрібно генерувати всі трійки наскрізь {n, 0, -n}, але це коротше, ніж писати ceil(n/3)чи щось для цього. Зауважте, що nдля створення цього об’єкта необхідно визначити його (якщо він не визначений під час запуску, GeoGebra запропонує вам створити повзунок для n).


Привіт і ласкаво просимо до PPCG! Чи є у вас посилання, я можу це перевірити (бажано онлайн)?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ, дякую! Ось посилання на онлайн-аплет thingamabob. Сторінка деякий час виглядала порожньою, але потім вона з’явилася.
Джо

О, круто. Але як де я кладу у формулу? > _> Я спробував вставити її в порожню, і це запропонувало створити повзунок, але більше нічого не сталося.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ: Зліва на лівій частині, де написано "Введення ..." Спочатку для ініціалізації nвведіть щось на кшталт n=297(це дасть вам слайдер, який добре налаштований). Потім вставте формулу у поле Введення, яке тепер має бути нижче n. (Переконайтеся, що натисніть return;) Формула повинна оцінюватись до nпершого строку послідовності, і вона повинна змінюватися при переміщенні повзунка.
Джо

2

Лабіринт , 17 15 14 байт

Збережено 3 байти, використовуючи ідею Сока використовувати 1-(n%3)замість ~(n%3-2).

1?:#/)}_3%-{*!

Програма закінчується помилкою (поділом на нуль), але повідомлення про помилку переходить до STDERR.

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

Пояснення

Програма є повністю лінійною, хоча в кінці деякий код виконується зворотно.

1     Turn top of stack into 1.
?:    Read input as integer and duplicate.
#     Push stack depth (3).
/)    Divide and increment.
}     Move over to auxiliary stack.
_3%   Take other copy modulo 3.
-     Subtract from 1. This turns 0, 1, 2 into 1, 0, -1, respectively.
{*    Move other value back onto main stack and multiply.
!     Output as integer.

Покажчик інструкцій тепер потрапляє в глухий кут і обертається, тому він починає виконувати код з кінця:

*     Multiply two (implicit) zeros.
{     Pull an (implicit) zero from the auxiliary to the main stack.
-     Subtract two (implicit) zeros from one another.
      Note that these were all effectively no-ops due to the stacks which are
      implicitly filled with zeros.
%     Attempt modulo, which terminates the program due to a division-by-zero error.

2

Ерланг, 40 байт

F=fun(N)->trunc((N/3+1)*(1-N rem 3))end.

На жаль, Ерланг не має оператора модуля "%", і "rem" вимагає пробілів, навіть перед 3.


2

Шестикутник , 25 байт

?'+}@/)${':/3$~{3'.%(/'*!

Або в неміфікованому форматі:

    ? ' + }
   @ / ) $ {
  ' : / 3 $ ~
 { 3 ' . % ( /
  ' * ! . . .
   . . . . .
    . . . .

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

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

Обчислює -(n%3 - 1)на одному краю пам'яті, n/3 + 1на сусідньому, а потім множує їх разом.


Ух, дуже цікаво це побачити! :)
Аднан

2

R, 28 байт

-((n=scan())%%3-1)*(n%/%3+1)

Схоже, це варіація більшості відповідей тут. Нульова основа.

   n=scan()                  # get input from STDIN
  (        )%%3-1            # mod by 3 and shift down (0,1,2) -> (-1,0,1)
-(               )           # negate result (1,0,-1), this handles the alternating signs
                  *(n%/%3+1) # integer division of n by 3, add 1, multiply by previous

Приємно в тому, що він обробляє кілька входів

> -((n=scan())%%3-1)*(n%/%3+1)
1: 0 3 6 9 1 4 7 10 2 5 8 11
13: 
Read 12 items
 [1]  1  2  3  4  0  0  0  0 -1 -2 -3 -4
> 

Спочатку я хотів зробити наступне, але не зміг обрізати зайві байти.

rbind(I<-1:(n=scan()),0,-I)[n]

Використовує rbindдля додавання 0 та мінусів до діапазону 1, nа потім повертає n'-й термін (один заснований).

# for n = 5
rbind(                    )    # bind rows 
            n=scan()           # get input from STDIN and assign to n
      I<-1:(        )          # build range 1 to n and assign to I
                     ,0        # add a row of zeros (expanded automatically)
                       ,-I     # add a row of negatives
                           [n] # return the n'th term

2

Пакетна версія (Windows), 86 байт

Alternate.bat

SET /A r=%1%%3
SET /A d=(%1-r)/3+1
IF %r%==0 ECHO %d%
IF %r%==1 ECHO 0
IF %r%==2 ECHO -%d%

Ця програма працює як Alternate.bat nде nномер , який ви хочете викликати функцію на.



2

Ява 7, 38 37 36 байт

Мій перший гольф, будь ласкавим

int a(int i){return(1+i/3)*(1-i%3);}

Спробуйте тут! (тестові випадки включені)

Edit: я прорахувався, а також golfed від ще одного символу, замінивши (-i%3+1)з (1-i%3).


1
Привіт, і ласкаво просимо до PPCG! Ви можете видалити пробіл після returnі використовувати лямбду Java 8.
NoOneIsHere

Я повинен зазначити, що це була Java 7. Я все-таки видалю цей простір. Спасибі!
Стівен Х.

1

Сітківка, 45 байт

.+
11$&$*
(111)+(1)*
$#2$#1
T`d`+0-`^.
^0.+
0

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

Тестовий набір.

Приймає вхід / вихід у базовому десятку. 1-індексований.

Одинарний вхід, базовий десять вихід, 1-індексований: 40 байт

$
11
(111)+(1)*
$#2$#1
T`d`+0-`^.
^0.+
0

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

Тестовий набір.


1

MATLAB / Октава, 27 байт

@(n)ceil(n/3)*(mod(-n,3)-1)

Це створює анонімну функцію, яку можна викликати за допомогою ans(n). Це рішення використовує індексацію на основі 1.

Усі тестові справи


1

Mathematica 26 байт

З 4 байтами збережено завдяки Мартіну Ендеру.

⎡#/3⎤(-#~Mod~3-1)&

Використовує той же підхід, що і Сьювер.


1

Октава, 23 байти

Без модних мінусів ...

@(n)(-[-1:1]'*[1:n])(n)

Використовує магію індексації на основі 1.


Пояснення

Створює анонімну функцію, яка буде:

(-[-1:1]'*[1:n])(n)
  [-1:1]              % make a row vector [-1 0 1]
 -      '             % negate and take its transpose making a column vector
          [1:n]       % make a row vector [1..n], where n is the input
         *            % multiply with singleton expansion
               (n)    % use linear indexing to get the nth value

Після кроку множення у нас вийде така матриця 3xn (для n = 12):

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

Створення nстовпців є надмірним, але це зручне число, яке гарантовано буде досить великим. Лінійна індексація підраховує кожен стовпець зліва направо, тому елемент у лінійному індексі 4буде 2.

Усі тестові справи на ideone .


1

постійний струм, 10

?2+3~1r-*p

Використовує індексацію на основі 1.

?              # Push input to stack
 2+            # Add 2
   3~          # divmod by 3
     1r-       # subtract remainder from 1
        *      # multiply by quotient
         p     # print
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.