# Nama  : Brenanda Caesa Pamudya
# NRP   : 5003251085
# Kelas : D

#Soal No.1 A
my_factorial <- function(n) {
  result <- 1
  if (n == 0) return(1)
  for (i in 1:n) {
    result <- result * i
  }
  result
}

maclaurin_exp <- function(x, n) {
  result <- 0
  for (k in 0:n) {
    result <- result + x^k / my_factorial(k)
  }
  result
}

cat("exp(-1) orde 5 =", maclaurin_exp(-1, 5), "\n")
exp(-1) orde 5 = 0.3666667 
#Soal No.1 B
my_factorial <- function(n) {
  result <- 1
  if (n == 0) return(1)
  for (i in 1:n) {
    result <- result * i
  }
  result
}

maclaurin_sin <- function(x) {
  result <- 0
  k <- 0
  repeat {
    term <- (-1)^k * x^(2*k + 1) / my_factorial(2*k + 1)
    if (abs(term) < 1e-5) break
    result <- result + term
    k <- k + 1
  }
  result
}

cat("sin(pi/6) =", maclaurin_sin(pi / 6), "\n")
sin(pi/6) = 0.5000021 
#Soal No.2
moving_average <- function(data, k) {
  n <- length(data)
  result <- rep(NA, n)
  for (t in k:n) {
    total <- 0
    for (i in 0:(k - 1)) {
      total <- total + data[t - i]
    }
    result[t] <- total / k
  }
  result
}

data <- c(4.1, 4.9, 6.2, 6.9, 6.8, 4.4, 5.7, 5.8, 6.9, 4.7, 6, 4.9)

mt3 <- moving_average(data, 3)

print(data.frame(t = 1:length(data), Data = data, Mt3 = mt3),  row.names = FALSE)
  t Data      Mt3
  1  4.1       NA
  2  4.9       NA
  3  6.2 5.066667
  4  6.9 6.000000
  5  6.8 6.633333
  6  4.4 6.033333
  7  5.7 5.633333
  8  5.8 5.300000
  9  6.9 6.133333
 10  4.7 5.800000
 11  6.0 5.866667
 12  4.9 5.200000
LS0tCnRpdGxlOiAiQXNzaWdubWVudCAzIEtvbXB1dGFzaSBTdGF0aXN0aWthIgphdXRob3I6ICJCcmVuYW5kYSBDYWVzYSBQYW11ZHlhIHwgNTAwMzI1MTA4NSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CiMgTmFtYSAgOiBCcmVuYW5kYSBDYWVzYSBQYW11ZHlhCiMgTlJQICAgOiA1MDAzMjUxMDg1CiMgS2VsYXMgOiBECgojU29hbCBOby4xIEEKbXlfZmFjdG9yaWFsIDwtIGZ1bmN0aW9uKG4pIHsKICByZXN1bHQgPC0gMQogIGlmIChuID09IDApIHJldHVybigxKQogIGZvciAoaSBpbiAxOm4pIHsKICAgIHJlc3VsdCA8LSByZXN1bHQgKiBpCiAgfQogIHJlc3VsdAp9CgptYWNsYXVyaW5fZXhwIDwtIGZ1bmN0aW9uKHgsIG4pIHsKICByZXN1bHQgPC0gMAogIGZvciAoayBpbiAwOm4pIHsKICAgIHJlc3VsdCA8LSByZXN1bHQgKyB4XmsgLyBteV9mYWN0b3JpYWwoaykKICB9CiAgcmVzdWx0Cn0KCmNhdCgiZXhwKC0xKSBvcmRlIDUgPSIsIG1hY2xhdXJpbl9leHAoLTEsIDUpLCAiXG4iKQpgYGAKCmBgYHtyfQojU29hbCBOby4xIEIKbXlfZmFjdG9yaWFsIDwtIGZ1bmN0aW9uKG4pIHsKICByZXN1bHQgPC0gMQogIGlmIChuID09IDApIHJldHVybigxKQogIGZvciAoaSBpbiAxOm4pIHsKICAgIHJlc3VsdCA8LSByZXN1bHQgKiBpCiAgfQogIHJlc3VsdAp9CgptYWNsYXVyaW5fc2luIDwtIGZ1bmN0aW9uKHgpIHsKICByZXN1bHQgPC0gMAogIGsgPC0gMAogIHJlcGVhdCB7CiAgICB0ZXJtIDwtICgtMSleayAqIHheKDIqayArIDEpIC8gbXlfZmFjdG9yaWFsKDIqayArIDEpCiAgICBpZiAoYWJzKHRlcm0pIDwgMWUtNSkgYnJlYWsKICAgIHJlc3VsdCA8LSByZXN1bHQgKyB0ZXJtCiAgICBrIDwtIGsgKyAxCiAgfQogIHJlc3VsdAp9CgpjYXQoInNpbihwaS82KSA9IiwgbWFjbGF1cmluX3NpbihwaSAvIDYpLCAiXG4iKQpgYGAKCmBgYHtyfQojU29hbCBOby4yCm1vdmluZ19hdmVyYWdlIDwtIGZ1bmN0aW9uKGRhdGEsIGspIHsKICBuIDwtIGxlbmd0aChkYXRhKQogIHJlc3VsdCA8LSByZXAoTkEsIG4pCiAgZm9yICh0IGluIGs6bikgewogICAgdG90YWwgPC0gMAogICAgZm9yIChpIGluIDA6KGsgLSAxKSkgewogICAgICB0b3RhbCA8LSB0b3RhbCArIGRhdGFbdCAtIGldCiAgICB9CiAgICByZXN1bHRbdF0gPC0gdG90YWwgLyBrCiAgfQogIHJlc3VsdAp9CgpkYXRhIDwtIGMoNC4xLCA0LjksIDYuMiwgNi45LCA2LjgsIDQuNCwgNS43LCA1LjgsIDYuOSwgNC43LCA2LCA0LjkpCgptdDMgPC0gbW92aW5nX2F2ZXJhZ2UoZGF0YSwgMykKCnByaW50KGRhdGEuZnJhbWUodCA9IDE6bGVuZ3RoKGRhdGEpLCBEYXRhID0gZGF0YSwgTXQzID0gbXQzKSwgIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKCg==