Genelleştirilmiş Cantor seti segment uzunlukları


17

Sorun

Tek bir sürekli aralıktan başlayarak, henüz silinmemiş tüm aralıkların ortasından bazı rasyonel uzunluk segmentlerini tekrar tekrar silerek genelleştirilmiş bir Cantor tanımlayalım .

Silinecek veya silinmeyecek segmentlerin göreli uzunlukları ve yapılacak yineleme sayısı göz önüne alındığında, sorun yinelemeden sonra silinmiş veya silinmemiş segmentlerin göreli uzunluklarını çıktılayan bir program veya işlev yazmaktır n.

Örnek 3,1,1,1,2

Örnek: 4. ve 6. sekizinci bölümü silinerek

Giriş:

n - 0 veya 1'den başlayarak dizine alınan yineleme sayısı

l- Silinmeyen gcd(l)=1bir segmentten başlayarak, oldukları gibi kalan veya silinen parçaların göreli uzunluklarını temsil eden segment uzunluklarının ve tek uzunluklu pozitif tamsayılar olarak listesi . Liste uzunluğu garip olduğu için, ilk ve son segmentler asla silinmez. Örneğin, normal Cantor seti için bu, kalan üçte biri için silinir, üçte biri silinir ve yine üçte biri için olmaz.

Çıktı:

Tamsayı listesi o, gcd(o)=1, bağıl kademeli uzunluklarının ninci tekrarında, önceki tekrarında silinmemiş bölümler listesinden bir küçültülmüş kopya ile değiştirilir ve zaman l. İlk yineleme sadece [1]. Herhangi bir belirsiz çıktı yöntemini kullanabilirsiniz , hatta tek bile.

Örnekler

n=0, l=[3,1,1,1,2] →                 [1]
n=1, l=[3,1,1,1,2] →     [3,    1,    1,    1,    2]
n=2, l=[3,1,1,1,2] → [9,3,3,3,6,8,3,1,1,1,2,8,6,2,2,2,4]

n=3, l=[5,2,3]     → [125,50,75,100,75,30,45,200,75,30,45,60,45,18,27]
n=3, l=[1,1,1]     → [1,1,1,3,1,1,1,9,1,1,1,3,1,1,1]

Girişin geçerli olduğunu varsayabilirsiniz. Bu , bu nedenle bayt cinsinden ölçülen en kısa program kazanır.


Uzunluklar yerine silinmemiş segmentlerin indekslerinin girilmesi ve çıkarılması kabul edilebilir mi? Örneğin, [0, 1, 2, 4, 6, 7]yerine [3, 1, 1, 1, 2]?

@Mnemonic, tek başına çok uzak değil, bu yüzden iyi olduğunu söyleyebilirim.
Angs

Eşit boyutlu giriş listeleri için bir (veya birden çok) test örneği ekleyebilir misiniz?
Kevin Cruijssen

1
@KevinCruijssen giriş listelerinin tek boyutlu olması garanti edilmektedir
Angs

Yanıtlar:


6

Jöle ,  15 13  12 bayt

-2 sayesinde Dennis (bir zincir yerine bir Link kullanmak, dolaylı olarak kullanılma hakkına izin verir ¡; 1Jelly'in bir öğenin aynı öğe listelerini yazdırması nedeniyle bir listeye sarmaya gerek yoktur )
-1 sayesinde Outgolfer Erik ( Ɗyeni satırı kullanmaktan kurtarmak için kullanın Ç)

1×€³§JḤ$¦ẎƊ¡

Jöle formatında bir liste basan tam bir program (bu [1]şekilde yazdırılır 1)

Çevrimiçi deneyin!

Nasıl?

1×€³§JḤ$¦ẎƊ¡ - Main link: segmentLengths; iterations
1            - literal 1 (start with a single segment of length 1)
           ¡ - repeat...
             - ...times: implicitly use chain's right argument, iterations
          Ɗ  - ...do: last 3 links as a monad (with 1 then the previous output):
   ³         - (1) program's 3rd argument = segmentLengths
 ×€          -  1  multiply €ach (e.g. [1,2,3] ×€ [1,2,1] = [[1,4,3],[2,4,2],[3,6,3]])
        ¦    -  2  sparse application... 
       $     - (2) ...to: indices: last two links as a monad:
     J       - (2)          range of length = [1,2,3,...,numberOfLists]
      Ḥ      - (2)          double            [2,4,6,...] (note: out-of bounds are ignored by ¦)
    §        - (2) ...of: sum each (i.e. total the now split empty spaces)
         Ẏ   -  3  tighten (e.g. [[1,2,3],4,[5,6,7]] -> [1,2,3,4,5,6,7])
             - implicit print



4

Haskell , 76 58 bayt

l%0=[1]
l%n=do(x,m)<-l%(n-1)`zip`cycle[l,[sum l]];map(*x)m

Çevrimiçi deneyin!

İşlev (%), satır uzunluklarının listesini lilk bağımsız değişken olarak ve yineleme sayısını nikinci girdi olarak alır.

-18 bayt için Angs ve Ørjan Johansen'a teşekkürler!


Bir özyinelemeyi açıp tamamen nbırakarak en az 7 bayt kaydedebilmeniz gerekir#
Angs

@Angs'ın önerisinden bağımsız olarak, orijinal %kısaltılabilirl%a=do(x,m)<-zip a$a>>[l,[sum l]];(*x)<$>m .
Ørjan Johansen

3

JavaScript (Firefox 42-57), 80 bayt

f=(n,l,i=0)=>n--?[for(x of l)for(y of(i^=1)?f(n,l):[eval(l.join`+`)**n])x*y]:[1]

Hem dizi kavrayışlarını hem de üstellemeyi kullandığından bu belirli sürümlere ihtiyaç duyar.



2

Java 10, 261 bayt

L->n->{if(n<1){L.clear();L.add(1);}else if(n>1){var C=new java.util.ArrayList<Integer>(L);for(int l=C.size(),i,x,t,s;n-->1;)for(i=x=0;i<L.size();){t=L.remove(i);if(i%2<1)for(;i%-~l<l;)L.add(i,C.get((i++-x)%l)*t);else{x++;s=0;for(int c:C)s+=c;L.add(i++,t*s);}}}}

Bayt kaydetmek için yenisini döndürmek yerine giriş Listesini değiştirir.

Çevrimiçi deneyin.

L->n->{                       // Method with List and integer parameters and no return-type
  if(n<1){                    //  If `n` is 0:
    L.clear();                //   Remove everything from the List
    L.add(1);}                //   And only add a single 1
                              //  Else-if `n` is 1: Leave the List as is
  else if(n>1){               //  Else-if `n` is 2 or larger:
    var C=new java.util.ArrayList<Integer>(L);
                              //   Create a copy of the input-List
    for(int l=C.size(),       //   Set `l` to the size of the input-List
        i,x,t,s;              //   Index and temp integers
        n-->1;)               //   Loop `n-1` times:
      for(i=x=0;              //    Reset `x` to 0
          i<L.size();){       //    Inner loop `i` over the input-List
        t=L.remove(i);        //     Remove the current item, saving its value in `t`
        if(i%2<1)             //     If the current iteration is even:
          for(;i%-~l<l;)      //      Loop over the copy-List
            L.add(i,C.get((i++-x)%l)*t);
                              //       And add the values multiplied by `t`
                              //       at index `i` to the List `L`
        else{                 //     Else (the current iteration is odd):
          x++;                //      Increase `x` by 1
          s=0;for(int c:C)s+=c;
                              //      Calculate the sum of the copy-List
          L.add(i++,t*s);}}}} //      Add this sum multiplied by `t`
                              //      at index `i` to the List `L`

2

Jöle , 13 bayt

Ø1××S¥ƭ€³Ẏ$¡Ṗ

Çevrimiçi deneyin!

Tam program. Çıkışlar 1yerine [1]. Can sıkıcı bir şekilde, bu bağlamdaki gibi çalışmaz ve niladlarla iyi çalışmaz. > _ <×S¥ƭ



2

K (ngn / k) , 27 bayt

{x{,/y*(#y)#x}[(y;+/y)]/,1}

Çevrimiçi deneyin!

{ }bağımsız değişkenleri olan bir işlevdir xvey

(y;+/y)bir çift yve toplamı

{ }[(y;+/y)]bir argümanla ikili bir fonksiyonun izdüşümü (körelme veya kısmi uygulama). uygulandığında argüman xolacak (y;+/y)ve yolacaktır.

,1 1 içeren singleton listesi

x{ }[ ]/yansıtma xzamanlarını uygular

(#y)#xmevcut sonucun uzunluğuna göre yeniden şekillendirir, yani dış yve toplamı arasında geçiş yapar

y* yukarıdakilerin her bir elemanını mevcut sonucun karşılık gelen elemanıyla çarpın

,/ concatenate



1

Pyth , 20 bayt

us.e?%k2*bsQ*LbQGE]1

Girdi bölüm dizisidir l, sonra yinelemelerdir n. Buradan çevrimiçi olarak deneyin veya tüm test senaryolarını burada bir kerede doğrulayın .

us.e?%k2*bsQ*LbQGE]1   Implicit, Q=1st arg (segment array), E=2nd arg (iterations)
u                E     Execute E times, with current value G...
                  ]1   ... and initial value [1]:
  .e            G        Map G, with element b and index k:
        *bsQ               Multiply b and the sum of Q {A}
            *LbQ           Multiply each value of Q by b {B}
    ?%k2                   If k is odd, yield {A}, otherwise yield {B}
 s                       Flatten the resulting nested array
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.