# Fungsi Sequential Search Boolean
seq_boolean <- function(data, target) {
  if (!is.numeric(data) || anyNA(data)) {
    stop("Data tidak sah: data harus numerik dan tidak mengandung NA")
  }

  for (i in seq_along(data)) {
    if (data[i] == target) {
      return(i)
    }
  }

  return(NA_integer_)
}

# Fungsi Sequential Search tanpa Boolean
seq_tanpa_boolean <- function(data, target) {
  if (!is.numeric(data) || anyNA(data)) {
    stop("Data tidak sah: data harus numerik dan tidak mengandung NA")
  }

  for (i in seq_along(data)) {
    if (data[i] == target) {
      return(i)
    }
  }

  return(NA_integer_)
}

# Fungsi Sequential Search Terurut
seq_terurut <- function(data, target) {
  if (!is.numeric(data) || anyNA(data)) {
    stop("Data tidak sah: data harus numerik dan tidak mengandung NA")
  }

  for (i in seq_along(data)) {
    if (data[i] == target) {
      return(i)
    }

    if (data[i] > target) {
      break
    }
  }

  return(NA_integer_)
}

# Fungsi Sequential Search Sentinel
seq_sentinel <- function(data, target) {
  if (!is.numeric(data) || anyNA(data)) {
    stop("Data tidak sah: data harus numerik dan tidak mengandung NA")
  }

  n <- length(data)
  data_sentinel <- c(data, target)

  i <- 1

  while (data_sentinel[i] != target) {
    i <- i + 1
  }

  if (i <= n) {
    return(i)
  } else {
    return(NA_integer_)
  }
}

# Pembahasan enam latihan pertemuan 11 ----
lat_x <- c(12, 7, 19, 7, 25)

# 11A Sequential Boolean posisi pertama 7
print(seq_boolean(lat_x, 7))
## [1] 2
# 11B Tanpa Boolean target tidak ada dan larik kosong
print(seq_tanpa_boolean(lat_x, 8))
## [1] NA
print(seq_tanpa_boolean(numeric(), 8))
## [1] NA
# 11C Terurut berhenti ketika nilai melebihi target
print(seq_terurut(c(5, 10, 15, 20, 25), 12))
## [1] NA
# 11D Sentinel dan keutuhan data asli
lat_awal <- lat_x
print(seq_sentinel(lat_x, 99))
## [1] NA
print(identical(lat_x, lat_awal))
## [1] TRUE
# 11E Posisi pertama berbeda dengan semua posisi
print(match(7, lat_x))
## [1] 2
print(which(lat_x == 7))
## [1] 2 4
# 11F Data tidak sah ditolak dan pesan ditangkap
print(tryCatch(
  seq_boolean(c(12, NA, 19), 19),
  error = function(e) conditionMessage(e)
))
## [1] "Data tidak sah: data harus numerik dan tidak mengandung NA"