Neue Nachbarsequenz

24

Die nicht-negativen Ganzzahlen haben die Langeweile, immer die gleichen zwei * Nachbarn zu haben, und beschließen, die Dinge ein wenig durcheinander zu bringen. Sie sind aber auch faul und wollen so nah wie möglich an ihrer ursprünglichen Position bleiben.

Sie kommen mit dem folgenden Algorithmus:

  • Das erste Element ist 0.
  • Das -Element ist die kleinste Zahl, die noch nicht in der Sequenz vorhanden ist und die kein Nachbar des -Elements ist.nth(n-1)th

Dies erzeugt die folgende unendliche Folge:

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

0ist das erste Element. 1ist die kleinste Zahl, die noch nicht in der Sequenz enthalten ist, aber ein Nachbar von 0. Die nächstkleinere Zahl ist 2, also das zweite Element der Sequenz. Jetzt sind die restlichen Zahlen 1,3,4,5,6,..., aber da beide 1und 3Nachbarn von sind 2, 4ist das dritte Mitglied der Sequenz. Da 1es kein Nachbar von ist 4, kann es endlich seinen Platz als viertes Element einnehmen.

Die Aufgabe

Schreiben Sie eine Funktion oder ein Programm in so wenigen Bytes wie möglich, um die obige Sequenz zu erzeugen.

Du könntest

  • die Sequenz unendlich ausgeben,
  • Nehmen Sie eine Eingabe und geben Sie das -Element der Sequenz zurück, odernnth
  • Nehmen Sie eine Eingabe und geben Sie die ersten Elemente der Sequenz zurück.nn

Für den Fall, dass Sie eine der beiden letztgenannten Optionen wählen, ist sowohl die Null- als auch die Eins-Indizierung in Ordnung.

Sie müssen den oben angegebenen Algorithmus nicht befolgen. Jede Methode, die dieselbe Sequenz erzeugt, ist in Ordnung.


Inspiriert von Code Golf die beste Permutation . Es stellt sich heraus, dass dies A277618 ist .
* Zero hat buchstäblich nur einen Nachbarn und interessiert sich nicht wirklich dafür.

Laikoni
quelle

Antworten:

18

JavaScript (ES6), 13 Byte

Gibt den ten Term der Sequenz zurück.n

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

Probieren Sie es online!

Wie?

Dies berechnet:

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

MathGolf , 5 Bytes

⌠5%+⌡

Probieren Sie es online!

Einige nette Symmetrie hier. Gibt das nthElement der Sequenz zurück.

Erläuterung:

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

Gelee , 5 Bytes

æ%2.+

Probieren Sie es online!

Go go Gadget obskure eingebaut!

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

R , 25 23 21 Bytes

-2 Bytes dank Jo King

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

Probieren Sie es online!

Gibt das nthElement der Reihe nach aus.

Robert S.
quelle
3

Pip , 14 Bytes

02413@a+a//5*5

Nimmt (0-basiert) als Befehlszeilenargument und gibt . Probieren Sie es online!neinn

Beachten Sie, dass . Wir codieren die ersten fünf Werte hart und versetzen sie von dort aus.einn+5=einn+5


Oder die Formel, die jeder verwendet, für 12 Bytes :

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

Common Lisp , 67 Bytes

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

Probieren Sie es online!

JRowan
quelle
Ich denke nur (defun x(n)(+(mod(+ n 2)5)(- n 2))), oder (lambda(n)(+(mod(+ n 2)5)(- n 2)))ist genug: Rückgabe des n-ten Terms anstelle einer Folge von Terms.
Mischa Lawrow
2

Japt , 8 Bytes

U-2Ò°U%5

Japt Interpreter

Eine einfache Portierung von Arnauld's Javascript-Antwort. Die verknüpfte Version durchläuft die ersten n Elemente, aber wenn das -mFlag entfernt wird, ist es immer noch gültig und gibt stattdessen das n-te Element aus.

Zum Vergleich ist hier die naive Version, die den in der Frage angegebenen Algorithmus implementiert:

@_aX É«NøZ}a}gNhT

Ich werde eine Erklärung für diese geben:

              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
quelle
-3 Bytes auf Ihrer zweiten Lösung und kann wahrscheinlich weiter verbessert werden.
Shaggy
2

Sauber , 31 Bytes

Die Formel, die jeder benutzt.

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

Probieren Sie es online!

Sauber , 80 Bytes

Mein erster Ansatz, die ersten nArtikel zurückzugeben.

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

Probieren Sie es online!

Οurous
quelle
2

J , 30 Bytes

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

Probieren Sie es online!

Gibt eine Liste der ersten nZahlen zurück

Diese Lösung ist offensichtlich nicht wettbewerbsfähig, aber ich wollte eine Array-basierte Methode ausprobieren.

Erläuterung:

Das Argument ist n

2 ,] - 2 an die Eingabe anhängen

   (2,~]) 10
10 2

()@ - und benutze diese Liste um:

i.- Erstelle eine Matrix nx 2 mit den Zahlen im Bereich 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$~]- ~kehrt die Argumente um, so dass es] $ 4 0 ist - erstellt eine Matrix nx 2, die 4 0 wiederholt

   4 0$~10 2
4 0
4 0
4 0
4 0
4 0
4 0
4 0
4 0
4 0
4 0

- subtrahieren Sie die zweite Matrix von der ersten, so dass die erste Spalte um 2 Stellen "verzögert" ist

   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,./\ Durchqueren Sie die Matrix in nicht überlappenden Gruppen von 5 Zeilen und nähen Sie die Spalten

   _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

[:, Ravel das gesamte Array

   ,_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}. - Lass die ersten 2 Zahlen fallen

   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

{.Nimm die ersten nZahlen

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

J 9 Bytes

+_2+5|2+]

Probieren Sie es online!

Gibt das nth-Element zurück.

Antwort von Port of Arnauld

Galen Ivanov
quelle
1

x86-Maschinencode, 16 Byte

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

Versammlung:

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

Probieren Sie es online!

Logern
quelle
1

Rot , 26 Bytes

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

Probieren Sie es online!

Antwort von Port of Arnauld

Galen Ivanov
quelle
1

Excel, 17 Bytes

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

Nichts Schlaues. Implementiert die allgemeine Formel.

Wernisch
quelle
1

QBasic, 30 Bytes

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

Gibt den 0-indizierten Eintrag der Liste an Pos x.

Probieren Sie es online! (Beachten Sie, dass ?erweitert wurde, PRINTweil der Interpreter sonst ausfällt ...)

steenbergh
quelle
1

R , 25 Bytes

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

Probieren Sie es online!

Portierung der Antwort von Robert S. (und nur durch Hinzufügen von 4 Bytes), da R Vektoren hervorragend verarbeiten kann.

Gibt die ersten n Werte aus.

Sumner18
quelle
1

Gleichstrom , 9 Bytes

d2+5%+2-p

Probieren Sie es online!

Gleiche Methode wie die meisten. Duplizieren Sie den Stapelanfang, fügen Sie 2 hinzu, modifizieren Sie 5, fügen Sie zum Original hinzu (zuvor dupliziert), subtrahieren Sie 2, drucken Sie.

brhfl
quelle
0

TI-BASIC, 11 Bytes

Ans-2+remainder(Ans+2,5

Ans
ein(n)

Ein einfacher Port der anderen Antworten.


Hinweis: TI-BASIC ist eine Token-Sprache. Die Anzahl der Zeichen entspricht nicht der Anzahl der Bytes.

Tau
quelle