Арифметичний цикл


13

Вхід:

Ціле число , nяке є >=0або >=1( f(0)необов'язково)

Вихід:

n«Й номер в наступній послідовності, або послідовність аж до і включаючи n» го числа.

Послідовність:

(0),1,-1,-3,0,5,-1,-7,0,9,-1,-11,0,13,-1,-15,0,17,-1,-19,0,21,-1,-23,0,25,-1,-27,0,29,-1,-31,0,33,-1,-35,0,37,-1,-39,0,41,-1,-43,0,45,-1,-47,0,49,-1,-51,0,53,-1,-55,0,57,-1,-59,0,61,-1,-63,0,65,-1,-67,0,69,-1,-71,0,73,-1,-75,0,77,-1,-79,0,81,-1,-83,0,85,-1,-87,0,89,-1,-91,0,93,-1,-95,0,97,-1,-99

Як будується ця послідовність?

f(n=0) = 0(необов’язково)
f(n=1) = f(0) + nабо f(n=1) = 1
f(n=2) = f(1) - n
f(n=3) = f(2) * n
f(n=4) = f(3) / n
f(n=5) = f(4) + n
тощо

Або в псевдокоді:

function f(integer n){
  Integer result = 0
  Integer i = 1
  Loop as long as i is smaller than or equal to n
  {
    if i modulo-4 is 1:
      result = result plus i
    if i modulo-4 is 2 instead:
      result = result minus i
    if i modulo-4 is 3 instead:
      result = result multiplied with i
    if i modulo-4 is 0 instead:
      result = result integer/floor-divided with i
    i = i plus 1
  }
  return result
}

Але, як ви, можливо, зазначали, в послідовності є дві схеми:

0, ,-1,  ,0, ,-1,  ,0, ,-1,   ,0,  ,-1,   ,0,  ,-1,   ,...
 ,1,  ,-3, ,5,  ,-7, ,9,  ,-11, ,13,  ,-15, ,17,  ,-19,...

тому будь-які інші підходи, що призводять до тієї ж послідовності, звичайно, також є цілком чудовими.

Правила виклику:

  • 0-індексовані та 1-індексовані входи призведуть до однакового результату (саме тому f(0)необов'язково для 0-індексованих входів, якщо ви хочете включити його).
  • Вам дозволяється виводити n'-ве число цієї послідовності. Або всю послідовність вгору і включаючи n'-ве число. (Таким чином, це f(5)може призвести до будь-якого 5або 0,1,-1,-3,0,5.)
    • Якщо ви вирішите вивести послідовність до і включати n'число, вихідний формат є гнучким. Може бути список / масив, кома / пробіл / новий рядок з обмеженим рядком або надрукований в STDOUT тощо.
  • /Поділ ( ) - це ділення на ціле число / підлогу, яке округляється до 0 (а не до негативної нескінченності, як це має місце в деяких мовах).

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу return. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Додаткові тестові випадки вище n=100:

Input     Output

1000      0
100000    0
123       -123
1234      -1
12345     12345
123456    0

1
Я не зміг знайти це на oeis.org, тому ви, можливо, захочете подати його туди. Це цікава послідовність, я дивуюсь, що ніхто її не зареєстрував.
труба

1
@pipe здається досить довільним
qwr

Відповіді:


20

JavaScript (ES6), 19 байт

n=>[0,n,-1,-n][n&3]

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

Доказ

Припустимо, що у нас є такі відношення для деякої n кратного 4. Ці відношення тривіально перевіряються для перших членів послідовності.

f(n)   = 0
f(n+1) = n+1
f(n+2) = -1
f(n+3) = -(n+3)

І нехай N = n + 4 . Потім за визначенням:

f(N)   = f(n+4) = f(n+3) // (n+4) = -(n+3) // (n+4) = 0
f(N+1) = f(n+5) = f(n+4) + (n+5)  = 0 + (n+5)       = N+1
f(N+2) = f(n+6) = f(n+5) - (n+6)  = (n+5) - (n+6)   = -1
f(N+3) = f(n+7) = f(n+6) * (n+7)  = -1 * (n+7)      = -(N+3)

Що, за допомогою математичної індукції, доводить, що відносини справедливі для будь-якого N кратного 4 .


2
Оскільки більшість відповідей - це порти цього рішення, я хочу додати, що я переконався, що це можна довести.
Ерік Аутгольфер


Ах, горіхи, відволікалися на роботу, працюючи над чимось дуже схожим. +1
Кудлатий

З цікавості, чи є причина віддати перевагу "n & 3" над "n% 4"?
IanF1

2
@ IanF1 Я вважаю, що це просто навичка програмування низького рівня (обчислювати біт І І в зборі простіше і швидше, ніж обчислення модуля). Але це не має особливого сенсу, і я насправді наполовину спокусився змінити його на n%4потім, щоб він працював з числами, більшими за 32-бітні.
Арнольд

4

05AB1E , 8 байт

Виводить nthчисло

ÎD(®s)sè

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

05AB1E , 14 байт

Виводить список чисел до N за допомогою шаблонів у послідовності

ÅÉāÉ·<*āÉ<‚øí˜

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

Пояснення

Приклад з використанням N = 7

ÅÉ               # List of odd numbers upto N
                 # STACK: [1,3,5,7]
  ā              # Enumerate 1-based
   É             # is odd?
                 # STACK: [1,3,5,7],[1,0,1,0]
    ·<           # double and decrement
                 # STACK: [1,3,5,7],[1,-1,1,-1]
      *          # multiply
                 # STACK: [1,-3,5,-7]
       āÉ<       # enumerate, isOdd, decrement
                 # STACK: [1,-3,5,-7],[0,-1,0,-1]
          ‚ø     # zip
                 # STACK: [[1, 0], [-3, -1], [5, 0], [-7, -1]]
            í    # reverse each
             ˜   # flatten
                 # RESULT: [0, 1, -1, -3, 0, 5, -1, -7]

4

Пітон 2 , 25 байт

Відповідь порту Арнальда:

lambda n:[0,n,-1,-n][n%4]

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


Наївні рішення:

Python 3 , 50 49 байт

lambda n:n and eval('int(f(n-1)%sn)'%'/+-*'[n%4])

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


Python 2 , 78 77 76 58 57 53 52 байт

lambda n:n and eval('int(1.*f(n-1)%sn)'%'/+-*'[n%4])

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

Використовували купу байтів int, тому що питона підлога ділиться, а не назустріч 0, як у питанні.


@KevinCruijssen Так, дякую :)
TFeld


3

TIS -n 2 1 , 123 байти

Виводить nчисло для 0 <= n <= 999. (Верхня межа обумовлена ​​мовними обмеженнями).

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
JRO -5
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY
HCF

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


TIS -n 2 1 , 124 байти

Виводить nчисло для 0 <= n <= 999. (Верхня межа обумовлена ​​мовними обмеженнями). nМожна надати кілька , розділених пробілом.

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
MOV ACC ANY
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

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


ТИС -n 3 1 , 192 байти

Виводить значення 0..nдля 0 <= n <= 999. (Верхня межа обумовлена ​​мовними обмеженнями).

@0
MOV UP ACC
ADD 1
MOV ACC ANY
JRO -1
@1
SUB UP
JLZ C
HCF
C:ADD UP
MOV ACC ANY
ADD 1
SWP
ADD 1
MOV ACC ANY
SUB 4
JEZ W
ADD 4
W:SWP
@2
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

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


Всі використовують числовий введення / виведення (the -n прапор). Перші два рішення використовують два обчислювальні вузли, один розташований над іншим. Третій має стек з трьох вузлів.

Для перших двох рішень верхній вузол зчитує вхід, надсилає вихідне число, потім багаторазово віднімає 4, поки ми не підемо негативно, а потім додає 5 до індексу для нашої таблиці стрибків. Це еквівалентно(n % 4) + 1 .

Третє рішення розділило це завдання на два вузли; верхній просто повторює межу до кінця часу, а середній вузол підраховує паралельно індексу (порівняно з цією межею) та модулю, як вище.

Нижній вузол усіх трьох рішень однаковий; на ній є столик стрибків, і саме тут відбувається магія. Ми зберігати вихідне число в ACC, то JRO(ймовірно , J UMP R elative O ffset) вперед 1, 2, 3або4 , в залежності від того, що вище говорить вузол.

Робота назад:

  • 4буде a ) NEGїв ACCі b ) рухається ACCвниз для виходу.
  • 3помістить 1в ACC, а потім виконати кроки і б .44
  • 2перейде прямо на крок 4b .
  • 1буде SUBпрокладати шлях ACC(ефективно нулюючи ACC), потім зробіть крок 2, який переходить до 4b .

2

C (gcc) , 62 байти

f(n,k){k=~-n;n=n?n%4?k%4?n-2&3?f(k)*n:f(k)-n:f(k)+n:f(k)/n:0;}

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


Ви можете точно вдвічі зменшити кількість байтів (31 байт), створивши порт відповіді Java Олів'є Грегоре : f(n){n=n%2>0?n*(2-n%4):n%4/-2;}Я б додав це як другу відповідь, оскільки мені також подобається ваш рекурсивний підхід. :)
Кевін Крейссен

@KevinCruijssen Я бачив їхнє рішення Java 10 і помітив його стислість, хоча я не хотів просто копіювати їх рішення, оскільки арифметичні синтаксиси двох мов занадто схожі.
Джонатан Фрех



1

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

.+
*
r`(____)*$
_$.=
____
-
___.*
-1
__

_.*
0

Спробуйте в Інтернеті! Пояснення:

.+
*

Перетворити в одинарне.

r`(____)*$
_$.=

Перетворити назад у десятковий, але залишити n%4+1підкреслення.

____
-

У випадку, якщо це 4, то результат такий -n.

___.*
-1

Випадок 3: -1

__

Випадок 2: n

_.*
0

Випадок 1: 0



1

APL (Dyalog Classic) , 22 12 байт

Масивні 10 байтів збереглися завдяки зауваженням Еріка Аутгольфера. Дякую!

4∘|⊃0,⊢,¯1,-

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

Виводить n-е число

Я не знаю APL, я просто намагався зробити так, щоб мій порт J рішення рішення Арнальда працював у Dyalog APL.


2
Приємна спроба! Кілька зауважень: 1) Ви можете замінити (0,⍵,¯1,-⍵)на (0⍵¯1,-⍵). 2) Ви можете видалити 1+, якщо припустити, що ⎕IOсистемна змінна призначена 0(так, це дозволено). 3) Зазвичай ми не рахуємо f←частини під час подання функцій. 4) Ви можете використовувати функцію замість []індексації. Усі разом формують це: ⎕IO←0(не рахуйте цього){(4|⍵)⊃0⍵¯1,-⍵}
Ерік Переможник

@Erik the Outgolfer Дякую!
Гален Іванов

2
Більш просунута гра в гольф на основі цього підходу: 4∘|⊃0,⊢,¯1,-.
Ерік Аутгольфер

1
@Erik the Outgolfer - Так, справді! Я думаю 4∘|⊃0,⊢,¯1,- , що саме те, як моє рішення J 4&|{0,],_1,-виглядатиме в APL. Знову дякую!
Гален Іванов

1
Насправді, J - варіант APL, хоча більш віддалений, ніж інші, схожі на APL, такі як Dyalog та NARS2000.
Ерік Аутгольфер

1

Cubix , 20 19 байт

Iun:^>s1ns:u@Ota3s0

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

Такий же підхід до кубіксу.

На кубі:

    I u
    n :
^ > s 1 n s : u
@ O t a 3 s 0 .
    . .
    . .

Перший біт ^Iu:n>s1ns:u0sбудує стек, а потім 3atкопіює відповідний елемент у TOS, потім Oвиводить і @закінчує програму.


0

Пробіл, 84 83 байт

[S S S N
_Push_0][S N
S _Duplicate_0][T   T   S _Store][S S S T   S N
_Push_2][S S T  T   N
_Push_-1][T T   S _Store][S S S T   N
_Push_1][S N
S _Duplicate_1][T   N
T   T   _Read_STDIN_as_integer][S S S T T   N
_Push_3][S S S T    N
_Push_1][T  T   T   ][S S T T   N
_Push_-1][T S S N
_Multiply][T    T   S _Store][T T   T   _Retrieve_input][S S S T    S S N
_Push_4][T  S T T   _Modulo][T  T   T   _Retrieve_result][T N
S T _Print_as_integer]

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

Спробуйте в Інтернеті (лише із необробленими просторами, вкладками та новими рядками)

Порт відповіді JavaScript @Arnauld .

Пояснення (приклад введення n=7):

Command   Explanation         Stack        Heap                  STDIN   STDOUT   STDERR

SSSN      Push 0              [0]
SNS       Duplicate top (0)   [0,0]
TTS       Store               []           {0:0}
SSSTSN    Push 2              [2]          {0:0}
SSTTN     Push -1             [2,-1]       {0:0}
TTS       Store               []           {0:0,2:-1}
SSSTN     Push 1              [1]          {0:0,2:-1}
SNS       Duplicate top (1)   [1,1]        {0:0,2:-1}
TNTT      Read STDIN as nr    [1]          {0:0,1:7,2:-1}        7
SSSTTN    Push 3              [1,3]        {0:0,1:7,2:-1}
SSSTN     Push 1              [1,3,1]      {0:0,1:7,2:-1}
TTT       Retrieve input      [1,3,7]      {0:0,1:7,2:-1}
SSTTN     Push -1             [1,3,7,-1]   {0:0,1:7,2:-1}
TSSN      Multiply (-1*7)     [1,3,-7]     {0:0,1:7,2:-1}
TTS       Store               [1]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve input      [7]          {0:0,1:7,2:-1,3:-7}
SSSTSSN   Push 4              [7,4]        {0:0,1:7,2:-1,3:-7}
TSST      Modulo (7%4)        [3]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve            [-7]         {0:0,1:7,2:-1,3:-7}
TNST      Print as integer    []           {0:0,1:7,2:-1,3:-7}           -7
                                                                                  error

Зупиняється з помилкою: вихід не визначений.

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