Nueva secuencia de vecinos

24

Los enteros no negativos están aburridos de tener siempre los mismos dos * vecinos, por lo que deciden mezclar un poco las cosas. Sin embargo, también son flojos y quieren mantenerse lo más cerca posible de su posición original.

Vienen con el siguiente algoritmo:

  • El primer elemento es 0.
  • El elemento es el número más pequeño que aún no está presente en la secuencia y que no es vecino del elemento .norteth(norte-1)th

Esto genera la siguiente secuencia 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 ...

0Es el primer elemento. 1es el número más pequeño que aún no está en la secuencia, pero es vecino de 0. El siguiente número más pequeño es 2, por lo que es el segundo elemento de la secuencia. Ahora los números restantes son 1,3,4,5,6,..., pero como ambos 1y 3son vecinos de 2, 4es el tercer miembro de la secuencia. Como 1no es vecino 4, finalmente puede tomar su lugar como cuarto elemento.

La tarea

Escriba una función o programa en la menor cantidad de bytes posible que genere la secuencia anterior.

Puedes

  • dar salida a la secuencia infinitamente,
  • tome una entrada devuelva el elemento de la secuencia, onortenorteth
  • tome una entrada devuelva los primeros n elementos de la secuencia.nortenorte

Tanto la indexación cero como la única están bien en caso de que elija una de las dos últimas opciones.

No necesita seguir el algoritmo dado anteriormente, cualquier método que produzca la misma secuencia está bien.


Inspirado en Code golf la mejor permutación . Resulta que esto es A277618 .
* Zero tiene literalmente solo un vecino y realmente no le importa.

Laikoni
fuente
Publicación de

Respuestas:

18

JavaScript (ES6), 13 bytes

Devuelve el º término de la secuencia.norte

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

Pruébalo en línea!

¿Cómo?

Esto calcula:

norte-2+((norte+2)mod5 5)

           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
fuente
8

MathGolf , 5 bytes

⌠5%+⌡

Pruébalo en línea!

Alguna buena simetría aquí. Devuelve el nthelemento de la secuencia.

Explicación:

⌠      Increment input by 2
 5%    Modulo by 5
   +   Add to copy of input
    ⌡  Decrement by 2
Jo King
fuente
6

Jalea , 5 bytes

æ%2.+

Pruébalo en línea!

Go go gadget obscure incorporado!

æ%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
fuente
4

R , 25 23 21 bytes

-2 bytes gracias a Jo King

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

Pruébalo en línea!

nthElemento de salidas en secuencia.

Robert S.
fuente
3

Pip , 14 bytes

02413@a+a//5*5

norteunanorte

unanorte+5 5=unanorte+5 5


O, la fórmula que todos usan, para 12 bytes :

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

Lisp común , 67 bytes

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

Pruébalo en línea!

JRowan
fuente
Creo que solo (defun x(n)(+(mod(+ n 2)5)(- n 2))), o (lambda(n)(+(mod(+ n 2)5)(- n 2)))es suficiente: devolver el enésimo término, en lugar de una secuencia de términos.
Misha Lavrov
2

Japt , 8 bytes

U-2Ò°U%5

Intérprete Japt

Un puerto directo de la respuesta Javascript de Arnauld. La versión vinculada se ejecuta a través de los primeros n elementos, pero si -mse elimina la bandera, sigue siendo válida e imprime el enésimo elemento.

En aras de la comparación, aquí está la versión ingenua que implementa el algoritmo proporcionado en la pregunta:

@_aX É«NøZ}a}gNhT

Daré una explicación 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
fuente
-3 bytes en su segunda solución, y probablemente pueda mejorarse aún más.
Shaggy
2

Limpio , 31 bytes

La fórmula que todos usan.

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

Pruébalo en línea!

Limpio , 80 bytes

Mi enfoque inicial, devolviendo los primeros nartículos.

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

Pruébalo en línea!

Οurous
fuente
2

J , 30 bytes

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

Pruébalo en línea!

Devuelve una lista de los primeros nnúmeros.

Obviamente, esta solución no es competitiva, pero quería probar un método basado en una matriz.

Explicación:

El argumento es n

2 ,] - agregar 2 a la entrada

   (2,~]) 10
10 2

()@ - y usa esta lista para:

i.- cree una matriz nx 2 con los números en el rango 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$~]- ~invierte los argumentos, entonces es] $ 4 0 - crea una matriz nx 2 repitiendo 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

- reste la segunda matriz de la primera, de modo que la primera columna se "retrase" con 2 posiciones

   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,./\ atravesar la matriz en grupos no superpuestos de 5 filas y unir las columnas

   _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

[:, desentrañar todo el conjunto

   ,_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}. - suelta los primeros 2 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

{.toma los primeros 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+]

Pruébalo en línea!

Devuelve el nelemento th.

La respuesta del puerto de Arnauld

Galen Ivanov
fuente
1

código de máquina x86, 16 bytes

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

Montaje:

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

Pruébalo en línea!

Logern
fuente
1

Excel, 17 bytes

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

Nada inteligente Implementa la fórmula común.

Wernisch
fuente
1

QBasic, 30 bytes

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

Da la entrada indexada 0 de la lista en pos x.

Pruébalo en línea! (Tenga en cuenta que ?se expandió a PRINTporque el intérprete falla de lo contrario ...)

Steenbergh
fuente
1

R , 25 bytes

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

Pruébalo en línea!

La respuesta del puerto de Robert S. (y solo agregando solo 4 bytes) gracias a que R es excelente en el manejo de vectores.

Emite los primeros n valores.

Sumner18
fuente
1

dc , 9 bytes

d2+5%+2-p

Pruébalo en línea!

El mismo método que la mayoría. Duplique la parte superior de la pila, agregue 2, mod 5, agregue al original (duplicado anteriormente), reste 2, imprima.

brhfl
fuente
0

TI-BASIC, 11 bytes

Ans-2+remainder(Ans+2,5

La entrada está adentro Ans.
Salidasuna(norte).

Un puerto simple de las otras respuestas.


Nota: TI-BASIC es un lenguaje tokenizado. El recuento de caracteres no es igual al recuento de bytes.

Tau
fuente