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.


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


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





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

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!


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

-3 bajty na drugim rozwiązaniu, i prawdopodobnie można go jeszcze ulepszyć.
Kudłaty




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




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!



1

Excel, 17 bajtów

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

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



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



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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.