Новая последовательность соседей

24

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

Они придумали следующий алгоритм:

  • Первый элемент 0.
  • Элемент является наименьшим числом, которого еще нет в последовательности, и который не является соседом элемента.nth(n1)th

Это создает следующую бесконечную последовательность:

0,2,4,1,3,5,7,9,6,8,10,12,14,11,13,15,17,19,16,18,20,22,24,21,23,25,27,29,26,28 ...

0это первый элемент. 1наименьшее число еще не в последовательности, но это сосед 0. Следующее наименьшее число - 2это второй элемент последовательности. Теперь остальные цифры 1,3,4,5,6,..., но и как 1и 3являются соседями 2, 4является третьим членом последовательности. Поскольку 1он не является соседом 4, он, наконец, может занять свое место в качестве четвертого элемента.

Задание

Напишите функцию или программу как можно меньше байтов, которая генерирует вышеупомянутую последовательность.

Вы можете

  • выводить последовательность бесконечно,
  • взять вход и вернуть элемент последовательности, илиnnth
  • возьмите вход и верните первые элементов последовательности.nn

И индексирование с нуля или с одной индексацией подойдет, если вы выберете один из двух последних вариантов.

Вам не нужно следовать приведенному выше алгоритму, любой метод, который производит ту же последовательность, вполне подойдет.


Вдохновленный Code Golf лучшая перестановка . Оказывается, это A277618 .
* Ноль имеет буквально одного соседа и ему все равно.

Laikoni
источник

Ответы:

18

JavaScript (ES6), 13 байт

Возвращает й член последовательности.n

n=>n-2-~++n%5

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

Как?

Это вычисляет:

n2+((n+2)mod5)

           n |  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 ...
-------------+--------------------------------------------------
       n - 2 | -2 -1  0  1  2  3  4  5  6  7  8  9 10 11 12 ...
 (n+2) mod 5 |  2  3  4  0  1  2  3  4  0  1  2  3  4  0  1 ...
-------------+--------------------------------------------------
         sum |  0  2  4  1  3  5  7  9  6  8 10 12 14 11 13 ...
Arnauld
источник
8

MathGolf , 5 байтов

⌠5%+⌡

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

Немного хорошей симметрии здесь. Возвращает nthэлемент последовательности.

Объяснение:

⌠      Increment input by 2
 5%    Modulo by 5
   +   Add to copy of input
    ⌡  Decrement by 2
Джо Кинг
источник
3

Пип , 14 байт

02413@a+a//5*5

Принимает (на основе 0) в качестве аргумента командной строки и выводит . Попробуйте онлайн!nпan

Заметьте, что . Мы жестко закодируем первые пять значений и сместим оттуда.an+5=an+5


Или формула, которую все используют, для 12 байтов :

a-2+(a+2)%5
DLosc
источник
2

Common Lisp , 67 байт

(defun x(n)(loop for a from 0 to n collect(+(mod(+ a 2)5)(- a 2))))

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

JRowan
источник
Я думаю, просто (defun x(n)(+(mod(+ n 2)5)(- n 2)))или (lambda(n)(+(mod(+ n 2)5)(- n 2)))достаточно: возвращение n-го термина, а не последовательности терминов.
Миша Лавров
2

Japt , 8 байт

U-2Ò°U%5

Japt Переводчик

Прямой порт ответа Javascript Арнаулда. Связанная версия проходит через первые n элементов, но если -mфлаг удален, он все еще действителен и вместо этого печатает n-й элемент.

Для сравнения, вот наивная версия, которая реализует алгоритм, представленный в вопросе:

@_aX É«NøZ}a}gNhT

Я дам объяснение этому:

              NhT    Set N to [0]
@           }g       Get the nth element of N by filling each index with:
 _        }a          The first integer that satisfies:
  aX É                 It is not a neighbor to the previous element
      «NøZ             And it is not already in N
Камил Дракари
источник
-3 байта на вашем втором решении, и, вероятно, могут быть улучшены в дальнейшем.
Лохматый
2

J , 30 байт

{.2}.[:,_5,./\2(i.-4 0$~])@,~]

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

Возвращает список первых nчисел

Это решение, очевидно, неконкурентное, но я хотел попробовать метод на основе массива.

Объяснение:

Аргумент n

2 ,] - добавить 2 к входу

   (2,~]) 10
10 2

()@ - и использовать этот список, чтобы:

i.- создать матрицу nx 2 с числами в диапазоне 0..2n-1:

   i.10 2
 0  1
 2  3
 4  5
 6  7
 8  9
10 11
12 13
14 15
16 17
18 19

4 0$~]- ~переворачивает аргументы, поэтому это так] $ 4 0 - создает матрицу nx 2 с повторением 4 0

   4 0$~10 2
4 0
4 0
4 0
4 0
4 0
4 0
4 0
4 0
4 0
4 0

- вычтите вторую матрицу из первой, чтобы первый столбец "задержался" на 2 позиции

   2(i.-4 0$~])@,~] 10
_4  1
_2  3
 0  5
 2  7
 4  9
 6 11
 8 13
10 15
12 17
14 19

_5,./\ пройти через матрицу в неперекрывающихся группах из 5 строк и сшить столбцы

   _5,./\2(i.-4 0$~])@,~] 10
_4 _2  0  2  4
 1  3  5  7  9

 6  8 10 12 14
11 13 15 17 19

[:, расстроить весь массив

   ,_5,./\2(i.-4 0$~])@,~] 10
_4 _2 0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19

2}. - опустить первые 2 числа

   2}.,_5,./\2(i.-4 0$~])@,~] 10
0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19

{.взять первые nцифры

   ({.2}.[:,_5,./\2(i.-4 0$~])@,~]) 10
0 2 4 1 3 5 7 9 6 8

J , 9 байт

+_2+5|2+]

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

Возвращает nэлемент th.

Порт Арнаулда ответ

Гален Иванов
источник
1

машинный код x86, 16 байт

00000000: 31d2 89c8 4949 4040 b305 f7f3 9201 c8c3 1...II@@........

Монтаж:

section .text
	global func
func:	;function uses fastcall conventions, 1st arg in ecx, returns in eax
	;reset edx to 0 so division works
	xor edx, edx

	mov eax, ecx
	;calculate ecx (1st func arg) - 2
	dec ecx
	dec ecx

	;calculate (ecx+2) mod 5
	inc eax
	inc eax
	mov bl, 5
	div ebx
	xchg eax, edx
	
	;add (ecx-2) and ((ecx+2) mod 5), returning in eax
	add eax, ecx
	ret

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

Logern
источник
1

Excel, 17 байт

=A1-2+MOD(A1+2,5)

Ничего умного. Реализует общую формулу.

Wernisch
источник
1

QBasic, 30 байтов

INPUT x 
x=x+2 
?-4+x*2-(x\5)*5

Дает 0-индексированную запись списка в поз x.

Попробуйте онлайн! (Обратите внимание, что это ?было расширено, PRINTпотому что интерпретатор не работает в противном случае ...)

steenbergh
источник
1

R , 25 байт

n=1:scan()-1;n-2+(n+2)%%5

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

Ответ Порта Роберта С. (и только добавив всего 4 байта) благодаря R, превосходно работающему с векторами.

Выводит первые n значений.

Sumner18
источник
1

постоянный ток , 9 байт

d2+5%+2-p

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

Тот же метод, что и у большинства. Дублируйте верхнюю часть стопки, добавьте 2, мод 5, добавьте к оригиналу (дублированный ранее), вычтите 2, напечатайте.

brhfl
источник
0

TI-BASIC, 11 байтов

Ans-2+remainder(Ans+2,5

Ans
a(n)

Простой порт других ответов.


Примечание: TI-BASIC - это токенизированный язык. Количество символов не равно количеству байтов.

Тау
источник