lat_x <- c(12, 7, 19, 7, 25)

# 11A
seq_boolean <- function(x, t) {
  k <- FALSE; p <- 0
  for(i in seq_along(x)) if(x[i] == t) { k <- TRUE; p <- i; break }
  p
}

# 11B
seq_tanpa_boolean <- function(x, t) {
  if(length(x) == 0) return(NULL)
  for(i in seq_along(x)) if(x[i] == t) return(i)
  NULL
}

# 11C
seq_terurut <- function(x, t) {
  for(i in seq_along(x)) {
    if(x[i] == t) return(i)
    if(x[i] > t) break
  }
  NULL
}

# 11D
seq_sentinel <- function(x, t) {
  xc <- c(x, t); i <- 1
  while(xc[i] != t) i <- i + 1
  if(i <= length(x)) i else NA
}


print(seq_boolean(lat_x, 7))
## [1] 2
print(seq_tanpa_boolean(lat_x, 8))
## NULL
print(seq_tanpa_boolean(numeric(), 8))
## NULL
print(seq_terurut(c(5, 10, 15, 20, 25), 12))
## NULL
lat_awal <- lat_x
print(seq_sentinel(lat_x, 99))
## [1] NA
print(identical(lat_x, lat_awal))
## [1] TRUE
print(match(7, lat_x))
## [1] 2
print(which(lat_x == 7))
## [1] 2 4
print(tryCatch(seq_boolean(c(12, NA, 19), 19), error = function(e) conditionMessage(e)))
## [1] "missing value where TRUE/FALSE needed"
# Latihan soal pertemuan 12
lat_urut <- seq(10, 100, by = 10)

produk <- data.frame(
  kode = c(104, 101, 107, 103, 106, 102, 105),
  nama = c("Telur", "Beras", "Kopi", "Minyak", "Garam", "Gula", "Tepung"),
  stok = c(25, 40, 18, 30, 50, 35, 28)
)
urutan <- order(produk$kode)
produk_urut <- produk[urutan, , drop = FALSE]

# 12A Jejak pencarian 80 
print(which(lat_urut == 80))
## [1] 8
# 12B Kasus batas pada kedua varian binary
print(match(10, lat_urut))
## [1] 1
print(length(lat_urut))
## [1] 10
print(match(105, lat_urut))
## [1] NA
# 12C Duplikasi dan posisi pertama
print(match(20, c(10, 20, 20, 20, 30)))
## [1] 2
print(which(c(10, 20, 20, 20, 30) == 20)[1])
## [1] 2
# 12D Kode 103 pada tabel produk
p <- which(produk_urut$kode == 103)
print(c(posisi_terurut = p, baris_asli = urutan[p]))
## posisi_terurut     baris_asli 
##              3              4
print(produk_urut[p, , drop = FALSE])
##   kode   nama stok
## 4  103 Minyak   30
# 12E Validasi menolak data yang belum terurut
print(tryCatch(stop("Data harus terurut menaik"),
  error = function(e) conditionMessage(e)))
## [1] "Data harus terurut menaik"
# 12F Bandingkan kunjungan target terakhir
print(c(sequential = 1024, binary = 11))
## sequential     binary 
##       1024         11