일반화 된 Cantor 세트 세그먼트 길이


17

문제

단일 연속 간격에서 시작하여 아직 삭제되지 않은 모든 간격의 중간에서 일부 합리적인 길이 세그먼트를 반복적으로 삭제 하여 일반화 된 Cantor 세트 를 정의 해 봅시다 .

삭제할 세그먼트의 상대적 길이와 반복 횟수를 고려할 때 문제는 반복 후에 삭제되었거나 삭제되지 않은 세그먼트의 상대 길이를 출력 하는 프로그램 또는 함수 를 작성하는 것 n입니다.

예 3,1,1,1,2

예 : 4 번째와 6 번째 8 번째를 반복적으로 삭제

입력:

n – 0 또는 1에서 시작하여 색인화 된 반복 횟수

lgcd(l)=1삭제되지 않은 세그먼트에서 시작하여 그대로 유지되거나 삭제되는 부분의 상대 길이를 나타내는 홀수 길이와 홀수 길이를 갖는 양의 정수로 세그먼트 길이 목록 . 목록 길이가 홀수이므로 첫 번째 세그먼트와 마지막 세그먼트는 절대 삭제되지 않습니다. 예를 들어 일반 Cantor 세트의 경우 3 분의 1, 삭제 된 3 분의 1, 삭제되지 않은 3 분의 1은 [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

짝수 크기의 입력 목록에 대해 하나 또는 여러 개의 테스트 사례를 추가 할 수 있습니까?
Kevin Cruijssen

1
@KevinCruijssen 입력 목록은 홀수 크기를 보장합니다
Angs

답변:


6

젤리 ,  15 13  12 바이트

-2 Dennis 덕분에 (체인 대신 링크를 사용하면 묵시적으로 사용할 수 있습니다 ¡; 1Jelly가 한 항목의 목록을 항목과 동일하게 인쇄한다는 사실 때문에 목록 을 감싸지 않아도 됨 )
-1 덕분에 아웃 골퍼 에릭 (사용Ɗ 하여 줄 바꿈을 저장하는 데 사용 Ç)

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

젤리 형식으로 목록을 인쇄하는 전체 프로그램 [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

하스켈 , 76 58 바이트

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

온라인으로 사용해보십시오!

이 함수 (%)는 행 길이 목록을 l첫 번째 인수 및 반복 횟수로 사용합니다.n 를 두 번째 입력으로 사용합니다.

-18 바이트의 Angs와 Ørjan Johansen에게 감사합니다!


재귀로 전환하고 완전히 n삭제 하여 7 바이트 이상을 절약 할 수 있어야 #합니다.
Angs

@Angs의 제안과는 별도로 원본을로 %줄일 수 있습니다 l%a=do(x,m)<-zip a$a>>[l,[sum l]];(*x)<$>m .
Ørjan Johansen

3

자바 스크립트 (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

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

바이트를 절약하기 위해 새로운 것을 반환하는 대신 input-List를 수정합니다.

온라인으로 사용해보십시오.

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

K (ngn / k) , 27 바이트

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

온라인으로 사용해보십시오!

{ }인수가있는 함수 x이며y

(y;+/y)한 쌍의 y합계

{ }[(y;+/y)]하나의 인수로 이분 함수의 투영 (일명 카레 또는 부분 적용). 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.