Urutan Neighbor Baru


24

Bilangan bulat non-negatif bosan selalu memiliki dua tetangga yang sama, sehingga mereka memutuskan untuk mencampuradukkan sedikit. Namun, mereka juga malas dan ingin tetap sedekat mungkin dengan posisi semula.

Mereka datang dengan algoritma berikut:

  • Elemen pertama adalah 0.
  • The nth unsur adalah jumlah terkecil yang belum hadir dalam urutan dan yang bukan merupakan tetangga dari (n-1)th elemen.

Ini menghasilkan urutan tak terbatas berikut:

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

0adalah elemen pertama. 1adalah angka terkecil yang belum berurutan, tetapi merupakan tetangga 0. Angka terkecil berikutnya adalah 2, jadi itu adalah elemen kedua dari urutan. Sekarang angka yang tersisa 1,3,4,5,6,..., tetapi karena keduanya 1dan 3tetangga 2,4 adalah anggota ketiga dari urutan. Karena 1bukan tetangga4 , ia akhirnya bisa menggantikannya sebagai elemen keempat.

Tugas

Tulis fungsi atau program sesedikit mungkin byte yang menghasilkan urutan di atas.

Kamu boleh

  • output urutan yang tak terbatas,
  • ambil input n dan kembalikan nth unsur urutan, atau
  • mengambil input n dan mengembalikan elemen n pertama dari urutan.

Indeks nol atau satu indeks baik-baik saja jika Anda memilih salah satu dari dua opsi terakhir.

Anda tidak perlu mengikuti algoritma yang diberikan di atas, metode apa pun yang menghasilkan urutan yang sama baik-baik saja.


Terinspirasi oleh golf Code permutasi terbaik . Ternyata ini adalah A277618 .
* Zero secara harfiah hanya memiliki satu tetangga dan tidak terlalu peduli.


Jawaban:


18

JavaScript (ES6), 13 byte

Mengembalikan istilah ke- n dari urutan.

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

Cobalah online!

Bagaimana?

Ini menghitung:

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 byte

⌠5%+⌡

Cobalah online!

Simetri yang bagus di sini. Mengembalikan nthelemen urutan.

Penjelasan:

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

6

Jelly , 5 byte

æ%2.+

Cobalah online!

Go-go gadget yang tidak jelas built-in!

æ%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 byte

02413@a+a//5*5

nSebuahn

Sebuahn+5=Sebuahn+5


Atau, rumus yang digunakan semua orang, selama 12 byte :

a-2+(a+2)%5

2

Gangguan Umum , 67 byte

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

Cobalah online!


Saya pikir adil (defun x(n)(+(mod(+ n 2)5)(- n 2))), atau (lambda(n)(+(mod(+ n 2)5)(- n 2)))cukup: mengembalikan istilah ke-n, bukan urutan istilah.
Misha Lavrov

2

Japt , 8 byte

U-2Ò°U%5

Japt Interpreter

Port langsung dari jawaban Javascript Arnauld. Versi tertaut berjalan melalui elemen n pertama, tetapi jika -mflag dihapus itu masih valid dan mencetak elemen n sebagai gantinya.

Demi perbandingan ini, di sini adalah versi naif yang mengimplementasikan algoritma yang disediakan dalam pertanyaan:

@_aX É«NøZ}a}gNhT

Saya akan memberikan penjelasan untuk yang ini:

              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 byte pada solusi kedua Anda, dan mungkin dapat ditingkatkan lebih lanjut.
Shaggy


2

Bersihkan , 31 byte

Formula yang digunakan semua orang.

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

Cobalah online!

Bersih , 80 byte

Pendekatan awal saya, mengembalikan nitem pertama .

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

Cobalah online!



2

J , 30 byte

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

Cobalah online!

Mengembalikan daftar nangka pertama

Solusi ini jelas tidak bersaing, tetapi saya ingin mencoba metode berbasis array.

Penjelasan:

Argumennya adalah n

2 ,] - tambahkan 2 ke input

   (2,~]) 10
10 2

()@ - dan gunakan daftar ini untuk:

i.- buat matriks nx 2 dengan angka di kisaran 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$~]- ~membalikkan argumen, jadi] $ 4 0 - membuat matriks nx 2 mengulangi 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

- kurangi matriks kedua dari yang pertama, sehingga kolom pertama "tertunda" dengan 2 posisi

   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,./\ melintasi matriks dalam kelompok 5 baris yang tidak tumpang tindih dan jahit kolom

   _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

[:, lepaskan seluruh 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}. - jatuhkan 2 angka pertama

   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

{.ambil nangka pertama

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

J , 9 byte

+_2+5|2+]

Cobalah online!

Mengembalikan nelemen th.

Jawaban Port of Arnauld




1

kode mesin x86, 16 byte

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

Majelis:

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

Cobalah online!



1

Excel, 17 byte

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

Tidak ada yang pintar. Menerapkan formula umum.



1

QBasic, 30 byte

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

Memberikan entri daftar yang terindeks 0 pada pos x.

Cobalah online! (Catatan yang ?diperluas ke PRINTkarena penerjemah gagal kalau tidak ...)



1

R , 25 byte

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

Cobalah online!

Jawaban Port of Robert S. (dan hanya dengan menambahkan hanya 4 byte) berkat R yang sangat baik dalam menangani vektor.

Menghasilkan nilai n pertama.


1

dc , 9 byte

d2+5%+2-p

Cobalah online!

Metode yang sama seperti kebanyakan. Gandakan top-of-stack, tambahkan 2, mod 5, tambahkan ke aslinya (digandakan sebelumnya), kurangi 2, cetak.


0

TI-BASIC, 11 byte

Ans-2+remainder(Ans+2,5

Input di Ans.
KeluaranSebuah(n).

Port sederhana dari jawaban lainnya.


Catatan: TI-BASIC adalah bahasa tokenized. Jumlah karakter tidak sama dengan jumlah byte.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.