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.


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


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

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




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

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!


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

-3 octets sur votre deuxième solution, et peut probablement être encore amélioré.
Shaggy




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




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!



1

Excel, 17 octets

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

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



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



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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.