ループ配列を生成する


15

前書き

ポインタ配列は配列であるL非ゼロの整数の0 ≤ L[i]+i < len(L)すべてのインデックスに当てはまるi(0ベースのインデックスを想定します)。インデックスはインデックスをi 指していると言いますL[i]+i。インデックスが長さの単一サイクルを形成する場合、ポインタ配列はループですlen(L)。ここではいくつかの例を示します。

  • [1,2,-1,3]3インデックスを指し示していないため、ポインタ配列ではありません。
  • [1,2,-1,-3]はインデックスを指していませんので、ポインタ配列ですが、ループではありません-1
  • [2,2,-2,-2] インデックスは2サイクルを形成するため、ポインタ配列ですが、ループではありません。
  • [2,2,-1,-3] ループです。

入力

入力は、妥当な形式の非ゼロ整数の空でないリストです。ソートされていないか、重複している可能性があります。

出力

出力は、入力リスト内のすべての整数(および場合によっては他の整数も含む)を含むループであり、多重度をカウントします。それらは入力と同じ順序で発生する必要はなく、出力はいかなる意味でも最小である必要はありません。

入力の[2,-4,2]場合、許容可能な出力はになります[2,2,-1,1,-4]

ルールとスコアリング

完全なプログラムまたは関数を作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。回答にいくつかの例の入力と出力を含めることを歓迎します。

テストケース

これらは形式で与えられますinput -> some possible output(s)

[1] -> [1,-1] or [1,1,1,-3]
[2] -> [2,-1,-1] or [1,2,-2,-1]
[-2] -> [1,1,-2] or [3,1,2,-2,-4]
[2,-2] -> [2,-1,1,-2] or [2,-1,2,-2,-1]
[2,2,2] -> [2,-1,2,-2,2,-2,-1] or [2,2,2,2,-3,-5]
[2,-4,2] -> [2,2,-1,1,-4] or [2,5,1,1,1,-4,2,-7,-1]
[3,-1,2,-2,-1,-5] -> [2,3,-1,2,-1,-5] or [3,3,-1,-1,2,2,-1,6,1,1,1,1,-12,-5]
[-2,-2,10,-2,-2,-2] -> [10,-1,1,-2,-2,1,-2,-2,1,-2,-2]
[-15,15,-15] -> [15,-1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,-15,-15]
[1,2,3,4,5] -> [1,2,3,-1,4,-1,5,-1,-1,-9,-1,-1]

回答:


11

ゼリー、12バイト

ż~Ṣ€FxA$;L$U

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

バックグラウンド

整数のペアを検討N、〜nはnは≥0表すビット単位NOT、すなわち、(N + 1) - 〜N =を

配置することによりn個のコピーをn個の左へのn + 1つのコピー〜nは、我々は、右端からポインタ配列を横断開始した場合、〜nは、我々はすべてのトラバースよ2N + 1つの要素をし、一番左の左に自分自身を見つけるのn

たとえば、n = 4の場合:

X  4  4  4  4  -5 -5 -5 -5 -5
                            ^
            ^
                         ^
         ^
                      ^
      ^
                   ^
   ^
                ^
^

特殊なケースn = 0の場合、要素n自体は0回繰り返され、次のようになります。

X -1
   ^
^

各整数のためにK入力に、我々は、対を形成することができるN、N〜含まれるKに設定することにより、N = kの場合にK> 0N =〜kの場合、K <0 がインボリューション、つまり~~ k = kであるため、これは機能します。

あとは、生成されたタプルを連結し、それらを組み合わせた長さを追加するだけです。そのため、左端の要素が右端の要素に戻ります。

[1] -> [3, 1, -2, -2]
[2] -> [5, 2, 2, -3, -3, -3]
[-2] -> [3, 1, -2, -2]
[2, -2] -> [8, 1, -2, -2, 2, 2, -3, -3, -3]
[2, 2, 2] -> [15, 2, 2, -3, -3, -3, 2, 2, -3, -3, -3, 2, 2, -3, -3, -3]
[2, -4, 2] -> [17, 2, 2, -3, -3, -3, 3, 3, 3, -4, -4, -4, -4, 2, 2, -3, -3, -3]
[3, -1, 2, -2, -1, -5] -> [26, 4, 4, 4, 4, -5, -5, -5, -5, -5, -1, 1, -2, -2, 2, 2, -3, -3, -3, -1, 3, 3, 3, -4, -4, -4, -4]
[-2, -2, 10, -2, -2, -2] -> [36, 1, -2, -2, 1, -2, -2, 1, -2, -2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, 1, -2, -2, 1, -2, -2]
[-15, 15, -15] -> [89, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15]
[1, 2, 3, 4, 5] -> [35, 5, 5, 5, 5, 5, -6, -6, -6, -6, -6, -6, 4, 4, 4, 4, -5, -5, -5, -5, -5, 3, 3, 3, -4, -4, -4, -4, 2, 2, -3, -3, -3, 1, -2, -2]

使い方

ż~Ṣ€FxA$;L$U  Main link. Argument: A (list of integers)

 ~            Yield the bitwise not of each k in A.
ż             Zipwith; pair each k in A with ~k.
  Ṣ€          Sort each pair, yielding [~n, n] with n ≥ 0.
    F         Flatten the list of pairs.
       $      Combine the previous two links into a monadic chain:
      A         Yield the absolute values of all integers in the list.
                |n| = n and |~n| = |-(n + 1)| = n + 1
     x          Repeat each integer m a total of |m| times.
          $   Combine the previous two links into a monadic chain:
         L      Yield the length of the generated list.
        ;       Append the length to the list.
           U  Upend; reverse the generated list.

特殊なケースを処理する必要はありません。n = 0仕様には「非ゼロ整数」。
ピーターテイラー

しばらく0入力で発生することはありません、私はまだペア必要な、0を-1場合は-1ありません。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.