Nouvelle séquence voisine

24

Les entiers non négatifs s'ennuient d'avoir toujours les mêmes deux * voisins, ils décident donc de mélanger un peu les choses. Cependant, ils sont également paresseux et veulent rester aussi près que possible de leur position d'origine.

Ils proposent l'algorithme suivant:

  • Le premier élément est 0.
  • L' élément est le plus petit nombre qui n'est pas encore présent dans la séquence et qui n'est pas un voisin de l' élément .nth(n-1)th

Cela génère la séquence infinie suivante:

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

0est le premier élément. 1est le plus petit nombre qui n'est pas encore dans la séquence, mais c'est un voisin de 0. Le plus petit nombre suivant est 2donc le deuxième élément de la séquence. Maintenant, les nombres restants sont 1,3,4,5,6,..., mais comme les deux 1et 3sont voisins de 2, 4est le troisième membre de la séquence. Comme il 1n'est pas voisin de 4, il peut enfin prendre sa place de quatrième élément.

La tâche

Écrivez une fonction ou un programme en aussi peu d'octets que possible, ce qui génère la séquence ci-dessus.

Tu peux

  • produire la séquence à l'infini,
  • prendre une entrée et renvoyer l' élément de la séquence, ounnth
  • prendre une entrée et renvoyer les premiers éléments de la séquence.nn

L'indexation à zéro ou à une seule est correcte si vous choisissez l'une des deux dernières options.

Vous n'avez pas besoin de suivre l'algorithme donné ci-dessus, toute méthode qui produit la même séquence est très bien.


Inspiré par Code golf la meilleure permutation . Il s'avère que c'est A277618 .
* Zero n'a littéralement qu'un seul voisin et ne s'en soucie pas vraiment.

Laikoni
la source
Message

Réponses:

18

JavaScript (ES6), 13 octets

Renvoie le ème terme de la séquence.n

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

Essayez-le en ligne!

Comment?

Cela calcule:

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
la source
8

MathGolf , 5 octets

⌠5%+⌡

Essayez-le en ligne!

Une belle symétrie ici. Renvoie l' nthélément de la séquence.

Explication:

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

Gelée , 5 octets

æ%2.+

Essayez-le en ligne!

Allez allez gadget obscur intégré!

æ%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
la source
4

R , 25 23 21 octets

-2 octets grâce à Jo King

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

Essayez-le en ligne!

Produit l' nthélément en séquence.

Robert S.
la source
3

Pip , 14 octets

02413@a+a//5*5

nunen

unen+5=unen+5


Ou, la formule que tout le monde utilise, pour 12 octets :

a-2+(a+2)%5
DLosc
la source
2

Lisp commun , 67 octets

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

Essayez-le en ligne!

JRowan
la source
Je pense juste (defun x(n)(+(mod(+ n 2)5)(- n 2)))ou (lambda(n)(+(mod(+ n 2)5)(- n 2)))suffit: renvoyer le n-ième terme plutôt qu'une séquence de termes.
Misha Lavrov
2

Japt , 8 octets

U-2Ò°U%5

Interprète Japt

Un port direct de la réponse Javascript d'Arnauld. La version liée parcourt les n premiers éléments, mais si l' -mindicateur est supprimé, il est toujours valide et imprime le nième élément à la place.

À titre de comparaison, voici la version naïve qui implémente l'algorithme fourni dans la question:

@_aX É«NøZ}a}gNhT

Je vais donner une explication pour celui-ci:

              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
la source
-3 octets sur votre deuxième solution, et peut probablement être encore amélioré.
Shaggy
2

Nettoyer , 31 octets

La formule que tout le monde utilise.

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

Essayez-le en ligne!

Nettoyer , 80 octets

Mon approche initiale, retourner les premiers narticles.

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

Essayez-le en ligne!

Οurous
la source
2

J , 30 octets

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

Essayez-le en ligne!

Renvoie une liste des premiers nnombres

Cette solution n'est évidemment pas compétitive, mais je voulais essayer une méthode basée sur un tableau.

Explication:

L'argument est n

2 ,] - ajouter 2 à l'entrée

   (2,~]) 10
10 2

()@ - et utilisez cette liste pour:

i.- créer une matrice nx 2 avec les nombres dans la plage 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$~]- ~inverse les arguments, c'est donc] $ 4 0 - crée la matrice nx 2 en répétant 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

- soustraire la deuxième matrice de la première, de sorte que la première colonne soit "retardée" avec 2 positions

   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,./\ parcourez la matrice en groupes de 5 rangées qui ne se chevauchent pas et cousez les colonnes

   _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

[:, défiler toute la gamme

   ,_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}. - déposez les 2 premiers chiffres

   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

{.prenez les premiers nchiffres

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

J , 9 octets

+_2+5|2+]

Essayez-le en ligne!

Renvoie le nth élément.

Réponse du port d'Arnauld

Galen Ivanov
la source
1

code machine x86, 16 octets

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

Assemblée:

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

Essayez-le en ligne!

Logern
la source
1

Rouge , 26 octets

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

Essayez-le en ligne!

Réponse du port d'Arnauld

Galen Ivanov
la source
1

Excel, 17 octets

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

Rien d'intelligent. Met en œuvre la formule commune.

Wernisch
la source
1

QBasic, 30 octets

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

Donne l'entrée indexée 0 de la liste à la pos x.

Essayez-le en ligne! (Notez que cela a ?été développé PRINTcar l'interprète échoue sinon ...)

steenbergh
la source
1

R , 25 octets

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

Essayez-le en ligne!

Port de la réponse de Robert S. (et seulement en ajoutant seulement 4 octets) grâce à R étant excellent pour gérer les vecteurs.

Sort les n premières valeurs.

Sumner18
la source
1

dc , 9 octets

d2+5%+2-p

Essayez-le en ligne!

Même méthode que la plupart. Dupliquer le haut de la pile, ajouter 2, mod 5, ajouter à l'original (dupliqué plus tôt), soustraire 2, imprimer.

brhfl
la source
0

TI-BASIC, 11 octets

Ans-2+remainder(Ans+2,5

Ans
une(n)

Un simple portage des autres réponses.


Remarque: TI-BASIC est un langage à jetons. Le nombre de caractères n'est pas égal au nombre d'octets.

Tau
la source