Uogólnione długości segmentów ustawione na kantor

17

Problem

Zdefiniujmy uogólniony zestaw Cantor , iteracyjnie usuwając niektóre segmenty racjonalnej długości ze środka wszystkich przedziałów, które nie zostały jeszcze usunięte, zaczynając od pojedynczego przedziału ciągłego.

Biorąc pod uwagę względne długości segmentów do usunięcia lub nie oraz liczbę iteracji do wykonania, problemem jest napisanie programu lub funkcji, która wyświetli względne długości segmentów, które zostały lub nie zostały usunięte po niteracjach.

Przykład 3,1,1,1,2

Przykład: Iteracyjnie usuń 4. i 6. ósmy

Wejście:

n - liczba iteracji, indeksowana od 0 lub 1

l- lista długości segmentów jako dodatnie liczby całkowite o gcd(l)=1długości nieparzystej, reprezentujące względne długości części, które albo pozostają, albo zostają usunięte, zaczynając od segmentu, który nie zostanie usunięty. Ponieważ długość listy jest nieparzysta, pierwszy i ostatni segment nigdy nie zostaną usunięte. Na przykład dla zwykłego zestawu Cantor będzie to [1,1,1] dla jednej trzeciej, która pozostanie, jednej trzeciej, która zostanie usunięta, i jednej trzeciej, która nie zostanie.

Wynik:

Lista Integer o, gcd(o)=1, względnych długości segmentu w nXX iteracji gdy segmenty, które nie zostały usunięte w poprzedniej iteracji są zastępowane przez zmniejszoną kopię listy l. Pierwsza iteracja jest słuszna [1]. Możesz użyć dowolnej jednoznacznej metody wyjściowej , nawet jednostkowej.

Przykłady

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]

Możesz założyć, że dane wejściowe są prawidłowe. To jest , więc wygrywa najkrótszy program mierzony w bajtach.

Angs
źródło
Czy akceptowalne byłoby wprowadzanie i wyprowadzanie wskaźników nieskasowanych segmentów zamiast długości? Na przykład [0, 1, 2, 4, 6, 7]zamiast [3, 1, 1, 1, 2]?
@Memoniczny nie jest zbyt daleko od jedności, więc powiedziałbym, że jest w porządku.
Angs
Czy możesz dodać jeden (lub wiele) przypadków testowych dla list wejściowych o równej wielkości?
Kevin Cruijssen
1
@KevinCruijssen listy wejściowe mają nieparzyste rozmiary
Angs

Odpowiedzi:

6

Galaretka ,  15 13  12 bajtów

-2 dzięki Dennisowi (użycie Link zamiast łańcucha pozwala na niejawne korzystanie z prawa ¡; Nie ma potrzeby zawijania 1listy ze względu na fakt, że Jelly drukuje listy jednego elementu tak samo jak przedmiot)
-1 dzięki Erik the Outgolfer (użyj, Ɗaby zapisać nowy wiersz przed użyciem Ç)

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

Pełny program drukujący listę w formacie galaretki (więc [1]jest drukowany jako 1)

Wypróbuj online!

W jaki sposób?

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
Jonathan Allan
źródło
4

Python 2 , 120 107 104 103 100 99 89 bajtów

f=lambda n,l:n and[x*y for i,x in enumerate(l)for y in[f(n-1,l),[sum(l)**~-n]][i%2]]or[1]

Wypróbuj online!


Zapisano

  • -10 bajtów, dzięki Neilowi
TFeld
źródło
1
89 bajtów
Neil
@Neil, Thanks :)
TFeld
4

R , 94 bajty

f=function(n,a)"if"(n,unlist(Map(function(g,i)g(i),c(c,sum),split(m<-a%o%f(n-1,a),row(m)))),1)

Wypróbuj online!

Kirill L.
źródło
4

Haskell , 76 58 bajtów

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

Wypróbuj online!

Funkcja (%)przyjmuje listę długości linii ljako pierwszy argument, a liczbę iteracji njako drugie wejście.

Dzięki Angs i Ørjan Johansen za -18 bajtów!

Laikoni
źródło
Powinieneś być w stanie zaoszczędzić co najmniej 7 bajtów, przełączając się na rekurencję ni #całkowicie
usuwając
Niezależnie od sugestii @Angs oryginał %można skrócić l%a=do(x,m)<-zip a$a>>[l,[sum l]];(*x)<$>m .
Ørjan Johansen
3

JavaScript (Firefox 42-57), 80 bajtów

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]

Potrzebuje tych konkretnych wersji, ponieważ wykorzystuje zarówno wyrażenia tablicowe, jak i potęgowanie.

Neil
źródło
2

Java 10, 261 bajtów

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

Zmienia listę wejściową zamiast zwracać nową, aby zapisać bajty.

Wypróbuj online.

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`
Kevin Cruijssen
źródło
2

Galaretka , 13 bajtów

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

Wypróbuj online!

Pełny program Wyjścia 1zamiast [1]. Irytujące, nie działa jak ×S¥w tym kontekście i ƭnie działa dobrze z niladami. > _ <

Erik the Outgolfer
źródło
2

K (ngn / k) , 27 bajtów

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

Wypróbuj online!

{ }jest funkcją z argumentami xiy

(y;+/y)para yi jej suma

{ }[(y;+/y)]rzutowanie (inaczej curry lub częściowe zastosowanie) funkcji diadadowej z jednym argumentem. xpo zastosowaniu będzie (y;+/y)i ybędzie argumentem.

,1 lista singletonów zawierająca 1

x{ }[ ]/zastosuj xczasy projekcji

(#y)#xzmienić kształt na długość bieżącego wyniku, tj. na przemian między zewnętrznym ya jego sumą

y* pomnóż każdy z powyższych elementów przez odpowiedni element bieżącego wyniku

,/ powiązać

ngn
źródło
1

Pyth , 20 bajtów

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

Dane wejściowe to tablica segmentów l, a następnie iteracje n. Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

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
Sok
źródło