Penyedia yang Ditentukan menetapkan panjang segmen


17

Masalah

Mari kita tentukan Cantor umum yang ditetapkan dengan secara iteratif menghapus beberapa segmen panjang rasional dari tengah semua interval yang belum dihapus, mulai dari interval kontinu tunggal.

Mengingat panjang relatif segmen yang akan dihapus atau tidak, dan jumlah iterasi yang harus dilakukan, masalahnya adalah menulis program atau fungsi yang menampilkan panjang relatif segmen yang telah atau belum dihapus setelah niterasi.

Contoh 3,1,1,1,2

Contoh: Secara permanen menghapus urutan ke-4 dan ke-6

Memasukkan:

n - jumlah iterasi, diindeks mulai dari 0 atau 1

l- daftar panjang segmen sebagai bilangan bulat positif dengan gcd(l)=1dan panjang ganjil, mewakili panjang relatif dari bagian-bagian yang tetap seperti itu atau dihapus, mulai dari segmen yang tidak bisa dihapus. Karena panjang daftar aneh, segmen pertama dan terakhir tidak pernah dihapus. Misalnya untuk set Cantor reguler ini akan menjadi [1,1,1] untuk sepertiga yang tetap, sepertiga yang akan dihapus dan sepertiga yang tidak.

Keluaran:

Daftar bilangan bulat o, gcd(o)=1, dari panjang segmen relatif dalam niterasi th ketika segmen yang tidak dihapus dalam iterasi sebelumnya digantikan oleh salinan diperkecil dari daftar l. Iterasi pertama adalah adil [1]. Anda dapat menggunakan metode output yang tidak ambigu , bahkan unary.

Contohnya

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]

Anda dapat menganggap input tersebut valid. Ini adalah , sehingga program terpendek yang diukur dalam byte menang.


Apakah dapat diterima untuk memasukkan dan menampilkan indeks segmen yang tidak dihapus alih-alih panjangnya? Misalnya, [0, 1, 2, 4, 6, 7]bukan [3, 1, 1, 1, 2]?

@Mnemonic tidak jauh dari unary, jadi menurut saya tidak apa-apa.
Angs

Bisakah Anda menambahkan satu (atau beberapa) test case untuk daftar input berukuran rata?
Kevin Cruijssen

1
@KevinCruijssen daftar input dijamin berukuran aneh
Angs

Jawaban:


6

Jelly ,  15 13  12 byte

-2 terima kasih kepada Dennis (menggunakan Tautan daripada rantai memungkinkan hak untuk digunakan secara implisit oleh ¡; Tidak perlu membungkus 1dalam daftar karena fakta bahwa Jelly mencetak daftar satu item sama dengan item)
-1 terima kasih kepada Erik the Outgolfer (gunakan Ɗuntuk menyimpan baris baru dari menggunakan Ç)

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

Program lengkap mencetak daftar dalam format Jelly (jadi [1]dicetak sebagai 1)

Cobalah online!

Bagaimana?

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 byte

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

Cobalah online!

Fungsi (%)mengambil daftar panjang garis lsebagai argumen pertama dan jumlah iterasi nsebagai input kedua.

Terima kasih kepada Angs dan Ørjan Johansen untuk -18 byte!


Anda harus dapat menyimpan setidaknya 7 byte dengan beralih ke rekursi ndan menjatuhkan #semuanya
Angs

Terlepas dari saran @Angs, yang asli %dapat disingkat menjadi l%a=do(x,m)<-zip a$a>>[l,[sum l]];(*x)<$>m .
Ørjan Johansen

3

JavaScript (Firefox 42-57), 80 byte

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]

Membutuhkan versi-versi spesifik tersebut karena menggunakan baik pemahaman array dan eksponensial.



2

Java 10, 261 byte

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

Memodifikasi daftar input daripada mengembalikan yang baru untuk menghemat byte.

Cobalah 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`

2

Jelly , 13 byte

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

Cobalah online!

Program lengkap. Output 1bukan [1]. Mengganggu, tidak bekerja seperti ×S¥dalam konteks ini, dan ƭtidak bekerja dengan baik dengan nilad. > _ <



2

K (ngn / k) , 27 byte

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

Cobalah online!

{ }adalah fungsi dengan argumen xdany

(y;+/y)sepasang ydan jumlahnya

{ }[(y;+/y)]proyeksi (alias aplikasi currying atau parsial) dari fungsi diad dengan satu argumen. xakan (y;+/y)dan yakan menjadi argumen saat diterapkan.

,1 daftar tunggal yang mengandung 1

x{ }[ ]/ terapkan proyeksi x kali

(#y)#xmembentuk kembali dengan panjang hasil saat ini, yaitu bergantian antara bagian luar ydan jumlahnya

y* kalikan setiap elemen di atas dengan elemen yang sesuai dari hasil saat ini

,/ menggabungkan



1

Pyth , 20 byte

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

Input adalah array segmen l, lalu iterasi n. Coba online di sini , atau verifikasi semua uji sekaligus di sini .

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.