新しいネイバーシーケンス


24

負でない整数は常に同じ2つの*隣人を持っていることにうんざりしているので、少し混同することにします。しかし、彼らも怠け者であり、元の位置にできるだけ近くに滞在したい。

それらは次のアルゴリズムを思い付きます:

  • 最初の要素は0です。
  • 要素がまだ配列には存在しないとの隣接していない最小の数であるの要素。nthn1th

これにより、次の無限シーケンスが生成されます。

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なので、これはシーケンスの2番目の要素です。今残っている数である1,3,4,5,6,...が、両方として13の隣人であり24シーケンスの第三のメンバーです。の1隣人ではないので、4最終的に4番目の要素としての位置を占めることができます。

タスク

上記のシーケンスを生成する関数またはプログラムをできる限り少ないバイトで記述します。

してもいいです

  • シーケンスを無限に出力し、
  • 入力を取得し、シーケンスの要素を返す、またはnnth
  • 入力を受け取り、シーケンスの最初の要素を返します。nn

後者の2つのオプションのいずれかを選択する場合、ゼロまたは1インデックスのどちらでも問題ありません。

上記のアルゴリズムに従う必要はありません。同じシーケンスを生成する方法であれば問題ありません。


コードゴルフにインスパイアされた最高の順列。これはA277618であることがわかります。
*ゼロには文字通り隣人が1人しかいないので、気にしません。


回答:


18

JavaScript(ES6)、13バイト

シーケンスのn番目の項を返します。

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

オンラインでお試しください!

どうやって?

これは計算します:

n2+n+2mod5

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







3

ピップ、14バイト

02413@a+a//5*5

nan

an+5=an+5


または、12バイトで誰もが使用している式:

a-2+(a+2)%5


2

Japt、8バイト

U-2Ò°U%5

ジャプト通訳

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

2番目のソリューションでは-3バイトであり、おそらくさらに改善できます。
シャギー




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になりますn-4 0を繰り返す行列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番目の行列を引き、最初の列が2つの位置で「遅延」するようにします

   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つの数字をドロップします

   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番目の要素を返します。

アーナウド港の答え




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

オンラインでお試しください!









0

TI-BASIC、11バイト

Ans-2+remainder(Ans+2,5

Ans
an

他の答えの簡単な移植。


注: TI-BASICはトークン化された言語です。文字数がバイト数と等しくありませ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.