새로운 이웃 시퀀스


24

음이 아닌 정수는 항상 동일한 두 * 이웃을 갖는 것에 지루하므로 물건을 조금 섞기로 결정합니다. 그러나 그들은 또한 게으 르며 가능한 한 원래 위치에 가깝게 머물기를 원합니다.

그들은 다음 알고리즘을 생각해냅니다.

  • 첫 번째 요소는 0입니다.
  • h 요소가 아직 시퀀스에 존재하지 않는 가장 작은 개수의 인접하지 않다 (1)h 요소.

다음과 같은 무한 시퀀스가 ​​생성됩니다.

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

0첫 번째 요소입니다. 1는 시퀀스에서 아직 가장 작은 수이지만의 이웃입니다 0. 다음으로 가장 작은 숫자는 2이므로 시퀀스의 두 번째 요소입니다. 이제 나머지 수는 1,3,4,5,6,...있지만, 모두 같은 1그리고 3의 이웃 2, 4시퀀스의 제 3 부재이다. 으로 1의 이웃 아닌 4, 마침내 네 번째 요소로 자리를 취할 수 있습니다.

작업

함수 또는 프로그램을 가능한 한 적은 바이트로 작성하여 위의 순서를 생성하십시오.

당신은 할 수있다

  • 시퀀스를 무한대로 출력하고
  • 입력 가져 와서 시퀀스 의 h 요소를 반환 하거나
  • 입력 취하여 시퀀스 의 처음 요소를 반환합니다 .

후자의 두 옵션 중 하나를 선택하는 경우 0 또는 1 인덱싱이 좋습니다.

위에 주어진 알고리즘을 따를 필요는 없습니다. 동일한 시퀀스를 생성하는 모든 방법이 좋습니다.


영감을받은 코드 골프 최고의 순열 . 이것이 A277618 입니다.
* Zero는 말 그대로 이웃이 하나 뿐이며 실제로 신경 쓰지 않습니다.


답변:


18

자바 스크립트 (ES6), 13 바이트

시퀀스 의 번째 항을 반환합니다 .

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

온라인으로 사용해보십시오!

방법?

이것은 다음을 계산합니다.

2+((+2)모드5)

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









2

Japt , 8 바이트

U-2Ò°U%5

apt 인터프리터

Arnauld의 Javascript 답변의 직선 포트. 링크 된 버전은 첫 번째 n 요소를 통해 실행되지만-m 플래그가 제거되면 여전히 유효하며 대신 n 번째 요소를 인쇄합니다.

비교를 위해 다음 은 질문에 제공된 알고리즘을 구현하는 순진 버전입니다.

@_aX É«NøZ}a}gNhT

이것에 대한 설명을 드리겠습니다 :

              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 바이트 이며 아마도 더 향상 될 수 있습니다.
Shaggy




2

J , 30 바이트

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

온라인으로 사용해보십시오!

첫 번째 목록을 반환 n 숫자

이 솔루션은 분명히 비 경쟁적이지만 배열 기반 방법을 시도하고 싶었습니다.

설명:

논쟁은 n

2 ,] -입력에 2 추가

   (2,~]) 10
10 2

()@ -이 목록을 사용하여 다음을 수행하십시오.

i.n-0..2n-1 범위의 숫자로 행렬 x 2를 만듭니다 .

   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$~]- ~인수를 반대로하므로] $ 4 0-4 nx 반복되는 행렬 x 2를 만듭니다.

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

- 첫 번째 열이 두 위치로 "지연"되도록 첫 번째 열에서 두 번째 행렬을 뺍니다.

   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,./\ 겹치지 않는 5 행 그룹의 행렬을 탐색하고 열을 연결합니다.

   _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

[:, 전체 배열을 풀다

   ,_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}. -처음 두 숫자를 버립니다

   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

{.첫 번째 n숫자를 가져 가라

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

J , 9 바이트

+_2+5|2+]

온라인으로 사용해보십시오!

수익 n번째 요소입니다.

Arnauld의 답변




1

x86 기계 코드, 16 바이트

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

어셈블리:

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

온라인으로 사용해보십시오!



1

Excel, 17 바이트

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

똑똑하지 않습니다. 공통 수식을 구현합니다.







0

TI-BASIC, 11 바이트

Ans-2+remainder(Ans+2,5

입력이입니다 Ans.
출력에이().

다른 답변의 간단한 포트.


참고 : TI-BASIC은 토큰 화 된 언어입니다. 문자 수는 바이트 수와 같지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.