Döngüsel bir dizi oluşturma


15

Giriş

Bir işaretçi dizisi bir dizidir Lsıfırdan farklı tamsayılar 0 ≤ L[i]+i < len(L)tüm indeksleri için de geçerlidir i(0 tabanlı dizin varsayılarak). Biz endeks söylemek i işaret endekse L[i]+i. Bir işaretçi dizisi olan döngü endeksleri uzunluğunun tek bir döngü oluşturur ise len(L). İşte bazı örnekler:

  • [1,2,-1,3]bir işaretçi dizisi değildir, çünkü 3bir dizine işaret etmez.
  • [1,2,-1,-3]bir işaretçi dizisidir, ancak bir döngü değildir, çünkü hiçbir dizin -1.
  • [2,2,-2,-2] bir işaretçi dizisidir, ancak bir döngü değildir, çünkü indeksler iki döngü oluşturur.
  • [2,2,-1,-3] bir döngüdür.

Giriş

Girişiniz, makul olmayan herhangi bir biçimde, sıfır olmayan tam sayıların boş olmayan bir listesidir. Sıralanmamış olabilir ve / veya kopyalar içerebilir.

Çıktı

Çıktınız, giriş listesindeki tüm tam sayıları (ve muhtemelen diğer tam sayıları) içeren ve çoklukları sayan bir döngü olmalıdır. Giriş ile aynı sırada olmaları gerekmez ve çıkışın hiçbir anlamda minimum olması gerekmez.

Misal

Giriş [2,-4,2]için kabul edilebilir bir çıkış olacaktır [2,2,-1,1,-4].

Kurallar ve puanlama

Tam bir program veya işlev yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez. Cevabınıza birkaç örnek giriş ve çıkış eklemek takdir edilmektedir.

Test senaryoları

Bunlar formatta verilmiştir 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]

Yanıtlar:


11

Jöle, 12 bayt

ż~Ṣ€FxA$;L$U

Çevrimiçi deneyin!

Arka fon

N, ~ n tamsayılarını düşünün , burada n ≥ 0 ve ~ bitsel olarak NOT anlamına gelir, yani, ~ n = - (n + 1) .

Yerleştirerek N kopyalarını n soluna , n + 1 kopyaları ~ n, biz en sağdaki işaretçi dizi çaprazlayan başlarsak, ~ n , tüm hareket olacak 2n + 1 elemanları ve en soldaki sol kendimizi bulmak n .

Örneğin, n = 4 ise :

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

Özel bir durum için , n = 0 , eleman n kendisi tekrarlanır 0 bu bırakarak kez:

X -1
   ^
^

Girişteki her k tamsayısı için, k> 0 ise n = k ve k <0 ise n = ~ k ayarlayarak k içeren n, ~ n çifti oluşturabiliriz . Bu işe yarar çünkü ~ bir girişimdir, yani ~~ k = k .

Yapılması gereken tek şey, üretilen tuplleri zincirlemek ve kombine uzunluklarını eklemek, böylece en soldaki eleman bizi en sağdaki öğeye geri götürüyor.

Örnekler

[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]

Nasıl çalışır

ż~Ṣ€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.

Özel durumu ele almanıza gerek yoktur n = 0, çünkü spec " sıfır olmayan tamsayılar " der .
Peter Taylor

İken 0 girdi meydana asla, hala çift gerekir , 0 -1 eğer -1 yapar.
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.