Multiplikatywna undelta

9

Zdefiniujmy „multiplikatywne delty” wartości[za0,zaN.,] tak jak:

[za1/za0,,zaja+1/zaja,,zaN./zaN.-1]

Operacja odwrotna - mianowicie „multiplikatywna undelta” - zwraca takie wartości, że powyższa operacja daje podane wartości.

Przykład

Podane wartości ogólnym rozwiązaniem operacji „ multiplikatywnej undelty ” jest:[1,5,3),2)]

[za0,za01za1,za15za2),za2)3)za3),za3)2)za4]

Konkretne rozwiązanie można uzyskać ustawiając na dowolną wartość inną niż zero, na przykład ustawiając otrzymalibyśmy:za0za0: =1

[1,1,5,15,30]

Wyzwanie

Twoim zadaniem w tym wyzwaniu jest wdrożenie operacji „ multiplikatywna undelta ”, jak zdefiniowano powyżej.

Zasady

Dane wejściowe to:

  • niezerowa wartość za0
  • niepusta lista / tablica / wektor / ... niezerowych „ multiplikatywnych delt

Dane wyjściowe są listą / tablicą / wektorem /… wartości takich, że pierwszym elementem jest za0 i dla których wejściowe są „ multiplikatywne delty ”.

Uwaga: jeśli twój język nie obsługuje ujemnych liczb całkowitych, możesz zamienić niezerową na dodatnią .

Przypadki testowe

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]
ბიმო
źródło
Czy możemy wziąć jedną listę o długości 1 + liczba delt, gdzie pierwszą pozycją jest a₀?
Adám,
@ Adám: Powiem „nie”, ponieważ to zmieniłoby rzeczy w przypadku istniejących odpowiedzi.
ბიმო

Odpowiedzi:

17

Haskell, 8 bajtów

scanl(*)

Wypróbuj online!

nimi
źródło
Sprawdzałem, czy ktoś to napisał, i pomyślałem, że nikt tego nie napisał, i powiedziałem „fajnie, a potem napiszę”, a potem zobaczyłem twoją odpowiedź na dole strony. pozytywnie oceniany.
Windmill Cookies
9

APL (Dyalog), 3 bajty

×\∊

Wypróbuj online!

Jeśli muszę wziąć liczbę po lewej stronie i tablicę po prawej:

-2 dzięki @ H.PWiz

7 5 3 bajty

×\,

Quintec
źródło
2
⊣,⊢może po prostu być,
H.PWiz
@ H.PWiz dzięki, moja milcząca jest bardzo słaba
Quintec
Nie potrzebujesz parenów; ×\,ocenia na funkcję.
Dennis,
@Dennis Nie wydaje się niestety niestety
Quintec
Nie musisz liczyć parenów, ponieważ w niektórych sytuacjach nie są one potrzebne. f←×\działa na przykład. Btw, (-12 3 -17 1311)powinno być w twoim permalink (¯12 3 ¯17 1311).
Dennis,
8

R , 15 bajtów

cumprod(scan())

Wypróbuj online!

Pełny program Funkcja jest dłuższa (chyba że pozwolono nam „skleić” dane wejściowe razem, aby wbudowana cumprodwystarczyła jako pełna odpowiedź):

R , 28 bajtów

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

Wypróbuj online!

Kirill L.
źródło
5

MATL , 3 bajty

hYp

Wypróbuj online!

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

hYpE o Mátl jest prawdziwe.

Giuseppe
źródło
3

JavaScript (ES6), 27 bajtów

Pobiera dane wejściowe jako (m)(a).

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

Wypróbuj online!

Arnauld
źródło
3

Japt, 3 bajty

å*V

Spróbuj


Wyjaśnienie

        :Implicit input of array U and integer V
å       :Cumulatively reduce U
 *      :By multiplication
  V     :With an initial value of V
Kudłaty
źródło
2

Wolfram Language (Mathematica) , 14 bajtów

FoldList@Times

Wypróbuj online!

FoldList[Times, a0, {x1, x2, ..., xn}]produkuje pożądaną moc wyjściową. FoldList[Times]jest formą curry, która wytwarza czystą funkcję, wciąż czekając na jej a0i {x1, x2, ..., xn}.

Misza Ławrow
źródło
2

J , 6 5 bajtów

-1 bajt dzięki Bubbler

*/\@,

Wypróbuj online!

Wyjaśnienie:

Czasownik diadyczny, lewy argument to a0ten sztywny - wektor

     @, - append the vector to a0 and 
  */\   - find the running product
Galen Iwanow
źródło
@Bubbler Tak, oczywiście! Dziękuję Ci!
Galen Iwanow
1

Partia, 69 bajtów

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

Pobiera dane wejściowe z za0 na STDIN i delcie jako argumenty wiersza poleceń.

Neil
źródło
1

Common Lisp, 67 bajtów

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

Wypróbuj online!

Renzo
źródło
1

05AB1E , 5 3 bajty

šηP

-2 bajty dzięki @BMO .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

š      # 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
źródło
1
Nie, sbył tam, aby uzyskać inne dane wejściowe. :) szamienia się i šprzygotowuje na początku listy. Tak czy inaczej, dzięki za -2
Kevin Cruijssen
1

Pyth, 6 bajtów

*FR._s

Przetestuj tutaj!

Alternatywnie 7 bajtów:

.u*NYEQ

Sprawdź to tutaj!

Pierwszy pobiera dane wejściowe jako krotkę, drugi przyjmuje dane wejściowe jako dwie oddzielne linie.

Dzięki @Sok za pomoc w uzyskaniu dobrego mapowania i zaoszczędzeniu 1 bajtu.

Steven H.
źródło
1
Można zapisać bajt wdrażając mapę w drugim roztworze jako R, jak w *FR._s- demonstracja
Sok
@Sok Nice catch! Próbowałem Mzałożyć, że to zadziała, ale potem wystąpił błąd parsowania cukru - głównie dlatego, że nie pamiętam, jak działa parsowanie F <pf2>.
Steven H.,
Będę szczery, ja naprawdę nie rozumiem jak zagnieżdżone M, F, L, i Rpraca, po prostu próbowałem kilka aż jeden pracował: o)
Sok
1

Python 2 , 40 bajtów

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

Wypróbuj online!

Nieoczekiwanie przejście na Python 3 i korzystanie z generatorów pozwala zaoszczędzić tylko 1 bajt w stosunku do rozwiązania rekurencyjnego.

Steven H.
źródło
1

PowerShell , 29 bajtów

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

Wypróbuj online!

Zakłada się, że samo podanie wartości jest w porządku.

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

Jeśli to nie jest w porządku, to faktycznie buduje listę, a następnie wypycha ją doString, który drukuje w ten sam sposób.

param($a,$b)$c=,$a;$b|%{$c+=$_*$c[-1]};$c #41 bytes
Veskah
źródło
Zasady są następujące: Output is a list/array/vector/. Pierwszy jest w porządku.
mazzy
1

MathGolf , 6 5 bajtów

\{\o*

Wypróbuj online!

Myślę, że może to być 5 bajtów ( \{\o*), ale \instrukcja wydaje się nieco nieprzyjemna w przypadku wprowadzania danych. Zostało to teraz naprawione w najnowszej wersji.

Wyjaśnienie:

\       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
źródło
Przeprojektowałem obsługę `` z niejawnym wejściem. Nadal obsługuje elementy na stosie w ten sam sposób, ale teraz wyrzuca dwa elementy z wejścia na stos zamiast jednego. Myślę, że przydałoby się to wyzwanie.
maxb
0

Python 2 , 47 bajtów

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

Wypróbuj online!

Chas Brown
źródło
Interesujące może być to, że rozwiązanie Pythona w Pythonie 3 jest krótsze przy użyciu generatorów
Quintec
0

Węgiel drzewny , 12 bajtów

IE⁺⟦N⟧AΠ⊞Oυι

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

K (oK) , 9 bajtów

{(*\)x,y}

Wypróbuj online!

Łączy pierwszą liczbę z drugim wejściem jako listę, a następnie zwraca kolejne wyniki mnożenia

Przypadki testowe

Wprowadź dane wejściowe po funkcji, jak poniżej, a następnie uruchom, ponieważ nie jestem pewien, jak prawidłowo używać danych wejściowych dla tego języka w TiO

{(*\)x,y}[1;1 5 3 2]
Thaufeki
źródło
0

dc , 13 bajtów

p[*pz1<A]dsAx

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