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


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 .
* Ноль имеет буквально одного соседа и ему все равно.


Ответы:


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 ...







3

Пип , 14 байт

02413@a+a//5*5

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

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


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

a-2+(a+2)%5


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

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



1

Excel, 17 байт

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

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



1

QBasic, 30 байтов

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

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

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



1

R , 25 байт

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

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

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

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



0

TI-BASIC, 11 байтов

Ans-2+remainder(Ans+2,5

Ans
a(n)

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.