广义Cantor集段长度


17

问题

让我们定义一个广义的Cantor集,方法是从单个连续间隔开始,从所有尚未删除的间隔的中间迭代删除一些有理长度段。

给定要删除或不删除的段的相对长度,以及要执行的迭代次数,问题在于编写程序或函数,该程序或函数输出n迭代后已删除或未删除的段的相对长度。

示例3,1,1,1,2

示例:迭代删除第四个和第六个第八个

输入:

n –迭代次数,从0或1开始索引

l–分段长度的列表,以正整数gcd(l)=1表示,带有奇数个长度和奇数个长度,表示从保持不变的分段开始的,保持不变或被删除的部分的相对长度。由于列表长度是奇数,因此永远不会删除第一个和最后一个段。例如,对于常规的Cantor集合,这将是[1,1,1],其中三分之一将保留,三分之一将被删除,三分之一将被删除。

输出:

整数列表o,第一次迭代gcd(o)=1中相对片段的长度,n当上一迭代中没有删除的片段被列表的缩小副本所取代l。第一次迭代是[1]。您可以使用任何明确的输出方法,甚至是一元的。

例子

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]

您可以假定输入有效。这是,因此以字节为单位的最短程序将获胜。


输入和输出未删除段的索引而不是长度是否可以接受?例如,[0, 1, 2, 4, 6, 7]代替[3, 1, 1, 1, 2]

@Mnemonic离一元算法不太远,所以我说很好。
昂斯(Angs)

您可以为偶数输入列表添加一个(或多个)测试用例吗?
凯文·克鲁伊森

1
@KevinCruijssen输入列表被保证是奇数大小
Angs

Answers:


6

果冻 15 13  12 字节

-2多亏了丹尼斯(使用Link而不是链子允许权利被隐式使用¡1由于Jelly会打印一个项目与该项目相同的列表,因此无需将其包装在列表中)
-1多亏了-暴民埃里克(使用Ɗ保存的换行符Ç

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

完整程序以Jelly格式打印列表(因此 [1]打印为1

在线尝试!

怎么样?

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

Haskell76 58字节

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

在线尝试!

该函数(%)将行长列表l作为第一个参数,将迭代次数n作为第二个输入。

感谢Angs和ØrjanJohansen提供-18个字节!


通过切换到递归n#完全删除,您应该至少可以保存7个字节
Angs,

可以独立于@Angs的建议而将原件%缩短为l%a=do(x,m)<-zip a$a>>[l,[sum l]];(*x)<$>m
与Orjan约翰森

3

JavaScript(Firefox 42-57),80字节

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]

需要这些特定版本,因为它同时使用了数组推导和幂运算。



2

Java 10,261个字节

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);}}}}

修改输入列表,而不是返回一个新的列表以节省字节。

在线尝试。

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

果冻,13个字节

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

在线尝试!

完整程序。输出1代替[1]。令人讨厌的是,×S¥在这种情况下ƭ无法正常工作,并且不适用于尼拉德犬。> _ <



2

K(ngn / k),27个字节

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

在线尝试!

{ }是带有参数的函数xy

(y;+/y)一对y

{ }[(y;+/y)]具有一个参数的二进位函数的投影(aka currying或部分应用)。x应用时将是(y;+/y)并且y将是参数。

,1 包含1的单例列表

x{ }[ ]/应用投影x时间

(#y)#x调整为当前结果的长度,即外部y和其总和之间交替

y* 将上述每个元素与当前结果的对应元素相乘

,/ 连接



1

Pyth,20个字节

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

输入是段数组l,然后是迭代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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.