Decision tables: Difference between revisions

m (→‎{{header|Sidef}}: Fix link: Perl 6 --> Raku)
Line 849:
 
For large numbers of rules and few actions, J's native support of sparse arrays might provide a performance advantage, particularly in space. A minor note about the implementation here: the verb (function) <tt>troubleshoot</tt> is generalized, and reusable on any set of rule table, questions, and suggested actions. The default is to use those given in the printer troubleshooting table.
 
=={{header|Java}}==
{{trans|Kotlin}}
<lang java>import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Objects;
 
public class DecisionTables {
private static class Pair<T, U> {
private final T t;
private final U u;
 
public static <T, U> Pair<T, U> of(T t, U u) {
return new Pair<>(t, u);
}
 
public Pair(T t, U u) {
this.t = t;
this.u = u;
}
 
public T getFirst() {
return t;
}
 
public U getSecond() {
return u;
}
}
 
private static final List<Pair<String, String>> conditions = List.of(
Pair.of("Printer prints", "NNNNYYYY"),
Pair.of("A red light is flashing", "YYNNYYNN"),
Pair.of("Printer is recognized by computer", "NYNYNYNY")
);
 
private static final List<Pair<String, String>> actions = List.of(
Pair.of("Check the power cable", "NNYNNNNN"),
Pair.of("Check the printer-computer cable", "YNYNNNNN"),
Pair.of("Ensure printer software is installed", "YNYNYNYN"),
Pair.of("Check/replace ink", "YYNNNYNN"),
Pair.of("Check for paper jam", "NYNYNNNN")
);
 
public static void main(String[] args) throws IOException {
final int nc = conditions.size();
final int na = actions.size();
final int nr = conditions.get(0).getSecond().length();
final int np = 7;
 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
System.out.println("Please answer the following questions with a y or n:");
final boolean[] answers = new boolean[nc];
for (int c = 0; c < nc; ++c) {
String input;
do {
System.out.printf(" %s ? ", conditions.get(c).getFirst());
input = br.readLine().toUpperCase();
} while (!Objects.equals(input, "Y") && !Objects.equals(input, "N"));
answers[c] = Objects.equals(input, "Y");
}
System.out.println("\nRecommended action(s)");
 
outer:
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
char yn = answers[c] ? 'Y' : 'N';
if (conditions.get(c).getSecond().charAt(r) != yn) {
continue outer;
}
}
if (r == np) {
System.out.println(" None (no problem detected)");
} else {
for (Pair<String, String> action : actions) {
if (action.getSecond().charAt(r) == 'Y') {
System.out.printf(" %s\n", action.getFirst());
}
}
}
break;
}
}
}</lang>
{{out}}
<pre>Please answer the following questions with a y or n:
Printer prints ? n
A red light is flashing ? n
Printer is recognized by computer ? n
 
Recommended action(s)
Check the power cable
Check the printer-computer cable
Ensure printer software is installed</pre>
 
=={{header|JavaScript}}==
1,452

edits