Nowa sekwencja sąsiadów

24

Nieujemne liczby całkowite nudzą się zawsze posiadaniem tych samych dwóch * sąsiadów, więc decydują się trochę pomieszać. Są jednak leniwi i chcą pozostać jak najbliżej swojej pierwotnej pozycji.

Wymyślają następujący algorytm:

  • Pierwszy element to 0.
  • Element jest najmniejszą liczbą, która nie jest jeszcze obecna w sekwencji i która nie jest sąsiadem elementu .nth(n-1)th

Generuje to następującą nieskończoną sekwencję:

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

0jest pierwszym elementem. 1jest najmniejszą liczbą jeszcze nie w sekwencji, ale jest sąsiadem 0. Następna najmniejsza liczba to 2, więc jest to drugi element sekwencji. Teraz pozostałe liczby są 1,3,4,5,6,..., ale jako oba 1i 3są sąsiadami 2, 4jest trzecim członkiem sekwencji. Ponieważ 1nie jest sąsiadem 4, może w końcu zająć swoje miejsce jako czwarty element.

Zadanie

Napisz funkcję lub program w jak najmniejszej liczbie bajtów, która wygeneruje powyższą sekwencję.

Możesz

  • wypisuje sekwencję bez końca,
  • weź wejście i zwróć element sekwencji, lubnnth
  • weź wejście i zwróć pierwsze elementów sekwencji.nn

Zarówno indeksowanie zerowe, jak i jednoindeksowe jest w porządku, jeśli wybierzesz jedną z dwóch ostatnich opcji.

Nie musisz przestrzegać powyższego algorytmu, każda metoda, która wytwarza tę samą sekwencję, jest w porządku.


Inspirowana Code Code najlepsza permutacja . Okazuje się, że to A277618 .
* Zero ma dosłownie tylko jednego sąsiada i tak naprawdę go to nie obchodzi.

Laikoni
źródło
Wpis w

Odpowiedzi:

18

JavaScript (ES6), 13 bajtów

Zwraca ty ciąg sekwencji.n

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

Wypróbuj online!

W jaki sposób?

To oblicza:

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
źródło
8

MathGolf , 5 bajtów

⌠5%+⌡

Wypróbuj online!

Dobra symetria tutaj. Zwraca nthelement sekwencji.

Wyjaśnienie:

⌠      Increment input by 2
 5%    Modulo by 5
   +   Add to copy of input
    ⌡  Decrement by 2
Jo King
źródło
6

Galaretka , 5 bajtów

æ%2.+

Wypróbuj online!

Go go gadżet ukryty wbudowany!

æ%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
źródło
4

R , 25 23 21 bajtów

-2 bajty dzięki Jo King

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

Wypróbuj online!

Wyprowadza nthelement po kolei.

Robert S.
źródło
3

Pip , 14 bajtów

02413@a+a//5*5

nzan

zan+5=zan+5


Lub wzór, którego wszyscy używają, na 12 bajtów :

a-2+(a+2)%5
DLosc
źródło
2

Common Lisp , 67 bajtów

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

Wypróbuj online!

JRowan
źródło
Myślę, że wystarczy (defun x(n)(+(mod(+ n 2)5)(- n 2))), lub (lambda(n)(+(mod(+ n 2)5)(- n 2)))wystarczy: zwrócenie n-tego terminu zamiast sekwencji terminów.
Misha Lavrov
2

Japt , 8 bajtów

U-2Ò°U%5

Japt Interpreter

Prosty port odpowiedzi Javascript Arnaulda. Połączona wersja przechodzi przez pierwsze n elementów, ale jeśli -mflaga zostanie usunięta, nadal jest ważna i zamiast tego drukuje n-ty element.

Dla porównania, oto naiwna wersja, która implementuje algorytm podany w pytaniu:

@_aX É«NøZ}a}gNhT

Wyjaśnię to:

              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
źródło
-3 bajty na drugim rozwiązaniu, i prawdopodobnie można go jeszcze ulepszyć.
Kudłaty
2

Czysty , 31 bajtów

Formuła, której wszyscy używają.

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

Wypróbuj online!

Czysty , 80 bajtów

Moje początkowe podejście, zwracanie pierwszych nelementów.

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

Wypróbuj online!

Obrzydliwe
źródło
2

J , 30 bajtów

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

Wypróbuj online!

Zwraca listę pierwszych nliczb

To rozwiązanie oczywiście nie konkuruje, ale chciałem wypróbować metodę opartą na macierzy.

Wyjaśnienie:

Argumentem jest n

2 ,] - dołącz 2 do wejścia

   (2,~]) 10
10 2

()@ - i użyj tej listy do:

i.- utwórz macierz nx 2 o liczbach z zakresu 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$~]- ~odwraca argumenty, więc jest] 4 $ 0 - tworzy macierz nx 2 powtarzając 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

- odejmij drugą macierz od pierwszej, tak aby pierwsza kolumna była „opóźniona” o 2 pozycje

   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,./\ przemierzaj macierz w nienakładających się grupach po 5 rzędów i zszyj kolumny

   _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

[:, zepsuć całą tablicę

   ,_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}. - upuść pierwsze 2 cyfry

   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

{.weź pierwsze nliczby

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

J , 9 bajtów

+_2+5|2+]

Wypróbuj online!

Zwraca nelement th.

Odpowiedź Portu Arnaulda

Galen Iwanow
źródło
2

Pepe , 65 bajtów

REeeeeeeEerEeERRrEEEEEERREeeeeeEeErEEeEeErRrEEEEEEEErRrEEEEEereEE

Wypróbuj online!

Odpowiedź Portu Kinga.

niezdefiniowany
źródło
1

kod maszynowy x86, 16 bajtów

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

Montaż:

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

Wypróbuj online!

Logern
źródło
1

Czerwony , 26 bajtów

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

Wypróbuj online!

Odpowiedź Portu Arnaulda

Galen Iwanow
źródło
1

Excel, 17 bajtów

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

Nic mądrego. Implementuje wspólną formułę.

Wernisch
źródło
1

QBasic, 30 bajtów

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

Daje indeksowany 0 wpis listy na poz x.

Wypróbuj online! (Zauważ, że ?został rozwinięty, PRINTponieważ w przeciwnym razie interpreter zawiedzie ...)

Steenbergh
źródło
1

R , 25 bajtów

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

Wypróbuj online!

Port odpowiedzi Roberta S. (i tylko przez dodanie zaledwie 4 bajtów) dzięki doskonałej obsłudze R w wektorach.

Zwraca pierwsze n wartości.

Sumner18
źródło
1

dc , 9 bajtów

d2+5%+2-p

Wypróbuj online!

Ta sama metoda jak większość. Duplikuj górę stosu, dodaj 2, mod 5, dodaj do oryginału (powielono wcześniej), odejmij 2, wydrukuj.

brhfl
źródło
0

TI-BASIC, 11 bajtów

Ans-2+remainder(Ans+2,5

Ans
za(n)

Prosty port innych odpowiedzi.


Uwaga: TI-BASIC jest językiem tokenizowanym. Liczba znaków nie jest równa liczbie bajtów.

Tau
źródło