Входные данные:
Целое число, 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 и т. Д.
- Если вы решите вывести последовательность вплоть до
- Divide (
/
) - это целочисленное / минимальное деление, которое округляется до 0 (не до отрицательной бесконечности, как в некоторых языках).
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Дополнительные тестовые примеры выше n=100
:
Input Output
1000 0
100000 0
123 -123
1234 -1
12345 12345
123456 0
Ответы:
JavaScript (ES6), 19 байт
Попробуйте онлайн!
доказательство
Предположим, что мы имеем следующие отношения для некоторого n, кратного 4. Эти отношения тривиально проверяются для первых членов последовательности.
И пусть N = n + 4 . Тогда по определению:
Что в силу математической индукции доказывает, что соотношения верны для любого N, кратного 4 .
источник
n%4
потом, чтобы он работал с числами больше 32-битных.05AB1E , 8 байтов
Выводит
nth
числоПопробуйте онлайн!
05AB1E , 14 байтов
Выводит список чисел до N, используя шаблоны в последовательности
Попробуйте онлайн!
объяснение
Пример использования N = 7
источник
Python 2 , 25 байт
Порт Арнаулда ответ:
Попробуйте онлайн!
Наивные решения:
Python 3 ,
5049 байтовПопробуйте онлайн!
Python 2 ,
78777658575352 байтаПопробуйте онлайн!
Используется куча байтов
int
, потому что пол питона делится, а не навстречу0
, как в вопросе.источник
J , 12 байт
Порт Арнаулда ответ:
Попробуйте онлайн!
J , 28 байт
Наивное решение:
Выводит n-е число
Попробуйте онлайн!
источник
TIS
-n
2
1
, 123 байтаВыводится
n
число для0 <= n <= 999
. (Верхний предел обусловлен языковыми ограничениями).Попробуйте онлайн!
TIS
-n
2
1
, 124 байтаВыводится
n
число для0 <= n <= 999
. (Верхний предел обусловлен языковыми ограничениями).n
Можно указать несколько , разделенных пробелами.Попробуйте онлайн!
TIS
-n
3
1
, 192 байтаВыводит значения
0..n
для0 <= n <= 999
. (Верхний предел обусловлен языковыми ограничениями).Попробуйте онлайн!
Все используют числовой ввод / вывод (
-n
флаг). Первые два решения используют два вычислительных узла, один из которых расположен над другим. Третий имеет стек из трех узлов.Для первых двух решений верхний узел считывает ввод, отправляет исходное число, затем многократно вычитает 4 до отрицательного значения, а затем добавляет 5 к индексу для нашей таблицы переходов. Это эквивалентно
(n % 4) + 1
.Третье решение разделило эту задачу на два узла; верхний просто повторяет ограничение до конца времени, а средний узел параллельно подсчитывает индекс (по сравнению с этим пределом) и по модулю, как указано выше.
Нижний узел всех трех решений одинаков; у него есть таблица прыжков, и здесь происходит волшебство. Мы хранить исходное число в
ACC
, тоJRO
(вероятно , J UMP R elative O ffset) вперед1
,2
,3
, или4
, в зависимости от того, что выше говорит узел.Работа в обратном направлении:
4
будет а )NEG
съелACC
, а б ) двигатьсяACC
вниз для выхода.3
поместит1
вACC
, а затем выполнить шаги и4
4
б .2
прыгнет прямо к шагу4
б .1
будетSUB
тянутьACC
себя (фактически обнулениеACC
), затем делать шаг2
, который переходит на4
b .источник
C (gcc) , 62 байта
Попробуйте онлайн!
источник
f(n){n=n%2>0?n*(2-n%4):n%4/-2;}
я бы добавил его в качестве второго ответа, поскольку мне также нравится ваш рекурсивный подход. :)Желе , 8 байт
Попробуйте онлайн!
-1 спасибо Линн .
То, что делают другие (порт Арнаулда), поддерживает
0
.Желе , 17 байт
Попробуйте онлайн!
0
не поддерживается.источник
Java (JDK 10) , 25 байт
Попробуйте онлайн!
Короче, чем алгоритм соперника в других языках с 28 байтами
Попробуйте онлайн!
источник
Сетчатка , 46 байт
Попробуйте онлайн! Объяснение:
Преобразовать в одинарный.
Преобразовать обратно в десятичную, но оставить
n%4+1
подчеркивания.В случае, если это 4, то результат
-n
.Случай 3:
-1
Случай 2:
n
Дело 1:
0
источник
Haskell , 50 байтов
Попробуйте онлайн!
Решение Арно, портированное на Haskell, составляет 23 байта:
источник
APL (Dyalog Classic) ,
2212 байтМассивные 10 байтов сохранены благодаря замечаниям Эрика Аутгольфера. Спасибо!
Попробуйте онлайн!
Выводит n-е число
Я не знаю APL, я просто пытался заставить мой J-порт решения Арно работать в Dyalog APL.
источник
(0,⍵,¯1,-⍵)
на(0⍵¯1,-⍵)
. 2) Вы можете удалить1+
, предполагая, что⎕IO
системная переменная назначена0
(да, это разрешено). 3) Обычно мы не учитываемf←
роль при отправке функций. 4) Вы можете использовать⊃
функцию вместо[]
индексации. Все вместе они формируют это:⎕IO←0
(не{(4|⍵)⊃0⍵¯1,-⍵}
4∘|⊃0,⊢,¯1,-
.4∘|⊃0,⊢,¯1,-
, что именно так4&|{0,],_1,-
будет выглядеть мое решение J в APL. Еще раз спасибо!Cubix ,
2019 байтовПопробуйте онлайн!
Порты аналогичны подходу к cubix.
На кубе:
Первый бит
^Iu:n>s1ns:u0s
создает стек, а затем3at
копирует соответствующий элемент в TOS, затемO
выводит и@
завершает программу.источник
Пробел,
8483 байтаБуквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.[..._some_action]
добавлено только в качестве объяснения.Попробуйте онлайн (только с пробелами, вкладками и новыми строками).
Порт ответа @Arnauld на JavaScript .
Пояснение (пример ввода
n=7
):Останавливается с ошибкой: выход не определен.
источник