新邻居序列


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,...,但作为13的邻居24是序列的第三个成员。由于1不是的邻居4,它最终可以代替第四元素。

任务

编写尽可能少的字节的函数或程序,以生成上述序列。

你可以

  • 无限输出序列
  • 输入并返回序列的元素,或者nnth
  • 接受输入并返回序列的前元素。nn

如果选择后两个选项之一,则零索引或一索引都可以。

您不需要遵循上面给出的算法,任何产生相同序列的方法都可以。


灵感来自Code golf的最佳排列。原来这是A277618
*零实际上只有一个邻居,并不在乎。


Answers:


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


8

MathGolf,5个字节

⌠5%+⌡

在线尝试!

这里有些对称。返回nth序列的元素。

说明:

⌠      Increment input by 2
 5%    Modulo by 5
   +   Add to copy of input
    ⌡  Decrement by 2

6

果冻,5个字节

æ%2.+

在线尝试!

内置Go go小工具!

æ%2.      Symmetric modulo 5: map [0,1,2,3,4,5,6,7,8,9] to [0,1,2,-2,-1,0,1,2,-2,-1]
    +     Add to input




3

,14字节

02413@a+a//5*5

ñ一种ñ

一种ñ+5=一种ñ+5


或者,每个人都在使用的公式为12个字节

a-2+(a+2)%5


2

Japt,8字节

U-2Ò°U%5

Japt口译员

Arnauld的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

干净,31字节

每个人都在使用的公式。

import StdEnv
?n=n-2+(n+2)rem 5

在线尝试!

干净,80字节

我最初的方法,返回第一个n项目。

import StdEnv
$n=iter n(\l=l++[hd[i\\i<-[0..]|all((<>)i)l&&abs(i-last l)>1]])[0]

在线尝试!



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(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}.,_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+]

在线尝试!

返回nth元素。

阿尔瑙尔德港的答案




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

在pos处给出列表的0索引条目 x

在线尝试!(请注意,它?被扩展为,PRINT因为解释器否则会失败...)



1

R,25个字节

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

在线尝试!

罗伯特·S(Robert S.)的答案端口(仅添加了4个字节),这要归功于R在处理矢量方面表现出色。

输出前n个值。


1

dc,9个字节

d2+5%+2-p

在线尝试!

与大多数方法相同。复制栈顶,添加2,mod 5,添加到原始副本(先前复制),减去2,打印。


0

TI-BASIC,11个字节

Ans-2+remainder(Ans+2,5

输入为Ans
产出一种ñ

其他答案的简单移植。


注意: TI-BASIC是一种标记化语言。字符数不等于字节数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.