```{r, echo = FALSE, results = "hide"}
# use the same graphics type (pdf, svg, png) as the current xweave() call
typ <- match_exams_device()

# logical operators
ops <- list(
  "or"   = function(a, b) a | b,
  "and"  = function(a, b) a & b,
  "xor"  = function(a, b) !(a & b) & (a | b),
  "nand" = function(a, b) !(a & b),
  "nor"  = function(a, b) !(a | b)
)

# tikz gate
tikz_gate <- function(op) {
  c("\\begin{tikzpicture}[thick]",
    paste0("  \\node[left,draw, logic gate inputs=nn, ", op," gate US,fill=none,,scale=2.5] (G1) at (0,0) {};"),
    "  \\draw (G1.output) --++ (0.5,0) node[right] (y) {$y$};",
    "  \\draw (G1.input 1) --++ (-0.5,0) node[left] {$a$};",
    "  \\draw (G1.input 2) --++ (-0.5,0) node[left] {$b$};",
    "\\end{tikzpicture}")
}

tikz_gate_libraries <- c("arrows", "shapes.gates.logic.US", "calc")

# tikz truth table
tikz_truth_table <- function(op) {
  a <- c(0, 0, 1, 1)
  b <- c(0, 1, 0, 1)
  if(is.character(op)) op <- ops[[op]]

  c("\\node {",
    "  \\begin{tabular}{ccc}\\toprule",
    "    $a$ & $b$ & $y$\\\\",
    "    \\midrule",
    paste("   ", a, "&", b, "&", as.numeric(op(a, b)), "\\\\"),
    "    \\bottomrule",
    "  \\end{tabular}",
    "};")
}

## sample operators
ops4 <- sample(names(ops), 4)
ops3 <- sample(ops4, 3)
ops1 <- sample(ops4, 1)
sol <- ops3 == ops1
sol <- c(sol, !any(sol))
ans <- c("A", "B", "C", "None of these")

## generate all gate images
img <- c(
  include_tikz(tikz_gate(ops3[1]), name = "A", markup = "none", format = typ, library = tikz_gate_libraries),
  include_tikz(tikz_gate(ops3[2]), name = "B", markup = "none", format = typ, library = tikz_gate_libraries),
  include_tikz(tikz_gate(ops3[3]), name = "C", markup = "none", format = typ, library = tikz_gate_libraries)
)
```

Question
========

Consider the following gates coding logical operators:

|              A             |              B             |              C             |
|:--------------------------:|:--------------------------:|:--------------------------:|
| ![](`r img[1]`){width=3cm} | ![](`r img[2]`){width=3cm} | ![](`r img[3]`){width=3cm} |

Which of these gates belongs to the following logical truth table?

```{r, echo = FALSE, results = "asis"}
include_tikz(tikz_truth_table(ops1), name = "table", markup = "markdown",
  format = typ, packages = "booktabs", width = "2cm")
```

```{r, echo = FALSE, results = "asis"}
answerlist(ans, markup = "markdown")
```


Solution
========

The truth table codes the logical **`r ops1`** operator.

The gates displayed code the following logical operators:
A = **`r ops3[1]`**,
B = **`r ops3[2]`**,
C = **`r ops3[3]`**.

Hence, the truth table corresponds to:
`r ans[sol]`.

```{r, echo = FALSE, results = "asis"}
answerlist(ifelse(sol, "True", "False"), markup = "markdown")
```


Meta-information
================
exname: Logical operators
extype: schoice
exsolution: `r mchoice2string(sol)`
