Nova sequência de vizinhos

24

Os números inteiros não negativos estão cansados ​​de sempre ter os mesmos dois * vizinhos, então eles decidem misturar um pouco as coisas. No entanto, eles também são preguiçosos e querem ficar o mais próximo possível de sua posição original.

Eles vêm com o seguinte algoritmo:

  • O primeiro elemento é 0.
  • O elemento é o menor número que ainda não está presente na sequência e não é um vizinho do elemento .nth(n1)th

Isso gera a seguinte sequência infinita:

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é o primeiro elemento 1é o menor número ainda não na sequência, mas é um vizinho de 0. O próximo menor número é 2, portanto, é o segundo elemento da sequência. Agora, os números restantes são 1,3,4,5,6,..., mas como ambos 1e 3são vizinhos de 2, 4é o terceiro membro da sequência. Como 1não é um vizinho 4, ele pode finalmente tomar seu lugar como quarto elemento.

A tarefa

Escreva uma função ou programa no menor número de bytes possível, o que gera a sequência acima.

Você pode

  • produzir a sequência infinitamente,
  • pegue uma entrada e retorne o elemento da sequência, ounnth
  • pegue uma entrada n e retorne os primeiros n elementos da sequência.

A indexação zero ou uma é boa caso você escolha uma das duas últimas opções.

Você não precisa seguir o algoritmo fornecido acima; qualquer método que produz a mesma sequência é adequado.


Inspirado pelo Code Golf, a melhor permutação . Acontece que este é A277618 .
* Zero tem literalmente apenas um vizinho e realmente não se importa.

Laikoni
fonte
Mensagem da
caixa de

Respostas:

18

JavaScript (ES6), 13 bytes

Retorna a th termo da sequência.n

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

Experimente online!

Quão?

Isso calcula:

n-2+((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
fonte
8

MathGolf , 5 bytes

⌠5%+⌡

Experimente online!

Alguma simetria agradável aqui. Retorna o nthelemento da sequência.

Explicação:

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

Geléia , 5 bytes

æ%2.+

Experimente online!

Ir vai gadget obscuro embutido!

æ%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
Lynn
fonte
4

R , 25 23 21 bytes

-2 bytes graças a Jo King

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

Experimente online!

nthElemento de saída em sequência.

Robert S.
fonte
3

Pip , 14 bytes

02413@a+a//5*5

nan

an+5=an+5


Ou, a fórmula que todos estão usando, para 12 bytes :

a-2+(a+2)%5
DLosc
fonte
2

Lisp comum , 67 bytes

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

Experimente online!

JRowan
fonte
Eu acho justo (defun x(n)(+(mod(+ n 2)5)(- n 2))), ou (lambda(n)(+(mod(+ n 2)5)(- n 2)))basta: retornar o nono termo, em vez de uma sequência de termos.
Misha Lavrov
2

Japonês , 8 bytes

U-2Ò°U%5

Intérprete Japt

Uma porta direta da resposta Javascript de Arnauld. A versão vinculada percorre os primeiros n elementos, mas se o -msinalizador for removido, ele ainda é válido e imprime o enésimo elemento.

Para fins de comparação, aqui está a versão ingênua que implementa o algoritmo fornecido na pergunta:

@_aX É«NøZ}a}gNhT

Vou dar uma explicação para este:

              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
Kamil Drakari
fonte
-3 bytes na sua segunda solução e provavelmente pode ser melhorada ainda mais.
Shaggy
2

Limpo , 31 bytes

A fórmula que todo mundo está usando.

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

Experimente online!

Limpo , 80 bytes

Minha abordagem inicial, retornando os primeiros nitens.

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

Experimente online!

Furioso
fonte
2

J , 30 bytes

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

Experimente online!

Retorna uma lista dos primeiros n números

Essa solução é obviamente não competitiva, mas eu queria tentar um método baseado em array.

Explicação:

O argumento é n

2 ,] - acrescente 2 à entrada

   (2,~]) 10
10 2

()@ - e use esta lista para:

i.- crie uma matriz nx 2 com os números no intervalo 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$~]- ~inverte os argumentos, então é] $ 4 0 - cria matriz nx 2 repetindo 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

- subtrair a segunda matriz da primeira, para que a primeira coluna seja "atrasada" com 2 posições

   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,./\ atravessar a matriz em grupos sem sobreposição de 5 linhas e costurar as colunas

   _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

[:, percorrer toda a matriz

   ,_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}. - solte os 2 primeiros números

   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

{.pegue os primeiros nnúmeros

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

J , 9 bytes

+_2+5|2+]

Experimente online!

Retorna o nth elemento.

Resposta do porto de Arnauld

Galen Ivanov
fonte
1

código de máquina x86, 16 bytes

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

Montagem:

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

Experimente online!

Logern
fonte
1

Vermelho , 26 bytes

func[n][n + 2 % 5 + n - 2]

Experimente online!

Resposta do porto de Arnauld

Galen Ivanov
fonte
1

Excel, 17 bytes

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

Nada inteligente. Implementa a fórmula comum.

Wernisch
fonte
1

QBasic, 30 bytes

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

Dá a entrada indexada em 0 da lista na pos x.

Experimente online! (Observe que ?foi expandido para PRINTporque o intérprete falha de outra maneira ...)

steenbergh
fonte
1

R , 25 bytes

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

Experimente online!

Resposta de Port of Robert S. (e apenas adicionando apenas 4 bytes) graças ao R ser excelente no manuseio de vetores.

Produz os primeiros n valores.

Sumner18
fonte
1

dc , 9 bytes

d2+5%+2-p

Experimente online!

Mesmo método que a maioria. Duplique o topo da pilha, adicione 2, mod 5, adicione ao original (duplicado anteriormente), subtraia 2, imprima.

brhfl
fonte
0

TI-BASIC, 11 bytes

Ans-2+remainder(Ans+2,5

A entrada é no Ans.
Saídasuma(n).

Uma porta simples das outras respostas.


Nota: TI-BASIC é um idioma tokenizado. Contagem de caracteres não é igual à contagem de bytes.

Tau
fonte