Undelta multiplikasi

9

Mari kita mendefinisikan "delta multiplikatif" dari nilai sebagai:[a0,aN,]

[a1/a0,,ai+1/ai,,aN/aN1]

Operasi terbalik - yaitu "undelta multiplikatif" - mengembalikan nilai sedemikian rupa sehingga operasi di atas menghasilkan nilai yang diberikan.

Contoh

Nilai yang diberikan solusi umum untuk operasi " multiplicative undelta " adalah:[1,5,3,2]

[a0,a01a1,a15a2,a23a3,a32a4]

Solusi tertentu dapat diperoleh dengan menetapkan ke nilai selain nol, misalnya dengan menetapkan kita akan mendapatkan:a0a0:=1

[1,1,5,15,30]

Tantangan

Tugas Anda untuk tantangan ini adalah mengimplementasikan operasi " undelta multiplikatif " sebagaimana didefinisikan di atas.

Aturan

Inputnya adalah:

  • nilai bukan nola0
  • daftar non-kosong / array / vektor / ... non-zero " delta perkalian "

Output adalah daftar / array / vektor / ... dari nilai-nilai sedemikian rupa sehingga elemen pertama adalah dan untuk itu " delta multiplikatif " adalah input.a0

Catatan: Jika bahasa Anda tidak memiliki dukungan bilangan bulat negatif, Anda dapat mengganti bukan-nol dengan positif .

Uji kasus

2 [21] -> [2,42]
1 [1,5,3,2] -> [1,1,5,15,30]
-1 [1,5,3,2] -> [-1,-1,-5,-15,-30]
7 [1,-5,3,2] -> [7,7,-35,-105,-210]
2 [-12,3,-17,1311] -> [2,-24,-72,1224,1604664]
-12 [7,-1,-12,4] -> [-12,-84,84,-1008,-4032]
1 [2,2,2,2,2,2,2,2] -> [1,2,4,8,16,32,64,128,256]
ბიმო
sumber
Bisakah kita mengambil satu daftar panjang 1 + jumlah delta, di mana item pertama adalah a₀?
Adám
@ Adám: Saya akan mengatakan tidak untuk itu karena itu akan mengubah hal-hal untuk jawaban yang ada.
ბიმო

Jawaban:

17

Haskell, 8 byte

scanl(*)

Cobalah online!

nimi
sumber
Saya sedang memeriksa apakah ada yang menulis ini, dan saya pikir tidak ada yang menulisnya dan saya berkata "keren, maka saya akan menulis" dan kemudian melihat jawaban Anda di bagian bawah halaman. terbalik.
Windmill Cookies
9

APL (Dyalog), 3 byte

×\∊

Cobalah online!

Jika saya harus mengambil nomor di sebelah kiri dan array di sebelah kanan:

-2 terima kasih kepada @ H.PWiz

7 5 3 byte

×\,

Quintec
sumber
2
⊣,⊢bisa saja,
H.PWiz
@ H.PWiz terima kasih, pendiam saya sangat lemah
Quintec
Anda tidak perlu orangtua; ×\,mengevaluasi ke suatu fungsi.
Dennis
@Dennis Sepertinya tidak berhasil sayangnya
Quintec
Anda tidak perlu menghitung paren, karena mereka tidak diperlukan dalam beberapa situasi. f←×\bekerja, misalnya. Btw, (-12 3 -17 1311)permalink Anda seharusnya (¯12 3 ¯17 1311).
Dennis
8

R , 15 byte

cumprod(scan())

Cobalah online!

Program lengkap. Fungsinya lebih lama (kecuali kami diizinkan untuk "merekatkan" input bersama, sehingga cumprodbawaan akan cukup sebagai jawaban yang lengkap):

R , 28 byte

function(i,x)cumprod(c(i,x))

Cobalah online!

Kirill L.
sumber
5

MATL , 3 byte

hYp

Cobalah online!

            #implicit input, x_0 and A
h           #horizontally concatenate
Yp          #cumulative product
            #implicit output

The hYpe tentang MATL adalah nyata.

Giuseppe
sumber
3

JavaScript (ES6), 27 byte

Mengambil input sebagai (m)(a).

m=>a=>[m,...a.map(x=>m*=x)]

Cobalah online!

Arnauld
sumber
3

Japt, 3 byte

å*V

Cobalah


Penjelasan

        :Implicit input of array U and integer V
å       :Cumulatively reduce U
 *      :By multiplication
  V     :With an initial value of V
Shaggy
sumber
2

Bahasa Wolfram (Mathematica) , 14 byte

FoldList@Times

Cobalah online!

FoldList[Times, a0, {x1, x2, ..., xn}]menghasilkan output yang diinginkan. FoldList[Times]adalah bentuk kari yang menghasilkan fungsi murni yang masih menunggu a0dan {x1, x2, ..., xn}.

Misha Lavrov
sumber
2

J , 6 5 byte

-1 byte terima kasih kepada Bubbler

*/\@,

Cobalah online!

Penjelasan:

Sebuah kata kerja diadik, argumen kiri adalah a0, yang kuat - vektor

     @, - append the vector to a0 and 
  */\   - find the running product
Galen Ivanov
sumber
@ Lubbler Ya, tentu saja! Terima kasih!
Galen Ivanov
1

Batch, 69 byte

@set/pa=
@echo %a%
@for %%d in (%*) do @set/aa*=%%d&call echo %%a%%

Sebuah0

Neil
sumber
1

Gangguan Umum, 67 byte

(lambda(a l &aux(y 1))(mapcar(lambda(x)(setf y(* y x)))(cons a l)))

Cobalah online!

Renzo
sumber
1

05AB1E , 5 3 byte

šηP

-2 byte terima kasih kepada @BMO .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

š      # Prepend the (implicit) input-integer at the start of the (implicit) input-list
       #  i.e. -12 and [7,-1,-12,4] → ["-12",7,-1,-12,4]
 η     # Prefixes of this new list
       #  i.e. ["-12",7,-1,-12,4]
       #   → [["-12"],["-12",7],["-12",7,-1],["-12",7,-1,-12],["-12",7,-1,-12,4]]
  P    # Take the product of each inner list (and output implicitly)
       #  i.e. [["-12"],["-12",7],["-12",7,-1],["-12",7,-1,-12],["-12",7,-1,-12,4]]
       #   → [-12,-84,84,-1008,-4032]
Kevin Cruijssen
sumber
1
Tidak, ada di ssana untuk mendapatkan input lainnya. :) sadalah swap, dan šdiawali di awal daftar. Either way, terima kasih untuk -2
Kevin Cruijssen
1

Pyth, 6 byte

*FR._s

Uji yang di sini!

Atau, 7 byte:

.u*NYEQ

Uji di sini!

Yang pertama mengambil input sebagai tuple, yang kedua mengambil input sebagai dua baris terpisah.

Terima kasih kepada @Sok untuk membantu saya dalam memetakan dan menghemat 1 byte.

Steven H.
sumber
1
Anda dapat menyimpan byte dengan mengimplementasikan peta pada solusi kedua seperti R, seperti dalam *FR._s- demonstrasi
Sok
@ Oke tangkapan bagus! Saya telah mencoba Mmenganggap itu akan berhasil, kemudian mengalami kegagalan penguraian gula - terutama karena saya tidak ingat bagaimana penguraian untuk F <pf2>bekerja.
Steven H.
Aku akan jujur, saya tidak benar-benar mengerti bagaimana bersarang M, F, L, dan Rbekerja, saya hanya mencoba a bunch sampai satu bekerja: o)
Sok
1

Python 2 , 40 byte

f=lambda a,b:[a]+(b and f(a*b[0],b[1:]))

Cobalah online!

Anehnya, pindah ke Python 3 dan penggunaan generator di sana hanya menghemat 1 byte dari solusi rekursif.

Steven H.
sumber
1

PowerShell , 29 byte

param($a,$b)$a;$b|%{($a*=$_)}

Cobalah online!

Ini mengasumsikan hanya mengeluarkan nilai-nilai saja.

> .\scratch.ps1 1 (1,5,3,2)
1
1
5
15
30

Jika itu tidak baik, ini sebenarnya membangun daftar dan kemudian mendorongnya ke toString yang mencetak dengan cara yang sama.

param($a,$b)$c=,$a;$b|%{$c+=$_*$c[-1]};$c #41 bytes
Veskah
sumber
Aturan adalah: Output is a list/array/vector/. Jadi, yang pertama baik-baik saja.
mazzy
1

MathGolf , 6 5 byte

\{\o*

Cobalah online!

Saya pikir ini bisa menjadi 5 byte ( \{\o*) tetapi \instruksi tampaknya sedikit mati ketika berhadapan dengan input. Ini sekarang diperbaiki dalam versi terbaru.

Penjelasan:

\       Swap arguments, pushing both to stack
 {      Foreach loop over second argument
  \o    Output counter with newline
    *   Multiply counter by current element
        Implicitly output the last element
Jo King
sumber
Saya telah mendesain ulang penanganan `` dengan input implisit. Masih menangani item pada stack dengan cara yang sama, tetapi sekarang muncul dua elemen dari input ke stack, bukan hanya satu. Saya pikir ini bisa berguna untuk tantangan ini.
Maks.
0

Python 2 , 47 byte

lambda n,A:reduce(lambda a,c:a+[a[-1]*c],A,[n])

Cobalah online!

Chas Brown
sumber
Mungkin menarik bagi Anda bahwa solusi python lebih pendek dalam python 3 menggunakan generator
Quintec
0

Arang , 12 byte

IE⁺⟦N⟧AΠ⊞Oυι

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

    N           Input a₀
   ⟦ ⟧          Wrap in a list
      A         Input deltas as a list
  ⁺              Concatenate lists
 E              Map over elements
           ι    Current element
          υ     Predefined empty list variable
        ⊞O      Push and return updated list
       Π        Product
I               Cast to string
                Implicitly print each value on its own line
Neil
sumber
0

K (oK) , 9 byte

{(*\)x,y}

Cobalah online!

Bergabung dengan angka pertama ke input kedua sebagai daftar, dan kemudian mengembalikan hasil perkalian berturut-turut

Uji Kasus

Masukkan input Anda setelah fungsi seperti di bawah ini dan kemudian jalankan, karena saya tidak yakin bagaimana menggunakan input dengan benar untuk bahasa ini di TiO

{(*\)x,y}[1;1 5 3 2]
Thaufeki
sumber
0

dc , 13 byte

p[*pz1<A]dsAx

Cobalah online!

p[*pz1<A]dsAx
p               # Print the first element
  *p            # Multiply top elements on the stack
 [  z1<A]dsAx   # until only one element is left
eush77
sumber