Set puzzle: Difference between revisions

(→‎{{header|Python}}: incorrect template)
(→‎{{header|Java}}: added Java)
Line 197:
Card(purple, two, squiggle, solid)
Card(red, one, squiggle, open)</pre>
 
=={{header|Java}}==
<lang java>package setpuzzle;
 
import java.util.Arrays;
import java.util.Collections;
import org.apache.commons.lang3.ArrayUtils;
 
public class SetPuzzle {
 
enum Color {
 
GREEN(0), PURPLE(1), RED(2);
 
private Color(int v) {
val = v;
}
public final int val;
}
 
enum Number {
 
ONE(0), TWO(1), THREE(2);
 
private Number(int v) {
val = v;
}
public final int val;
}
 
enum Symbol {
 
OVAL(0), DIAMOND(1), SQUIGGLE(2);
 
private Symbol(int v) {
val = v;
}
public final int val;
}
 
enum Fill {
 
OPEN(0), STRIPED(1), SOLID(2);
 
private Fill(int v) {
val = v;
}
public final int val;
}
 
private static class Card implements Comparable<Card> {
 
Color c;
Number n;
Symbol s;
Fill f;
 
@Override
public String toString() {
return String.format("[Card: %s, %s, %s, %s]", c, n, s, f);
}
 
@Override
public int compareTo(Card o) {
return (c.val - o.c.val) * 10 + (n.val - o.n.val);
}
}
private static Card[] deck;
 
public static void main(String[] args) {
deck = new Card[81];
Color[] colors = Color.values();
Number[] numbers = Number.values();
Symbol[] symbols = Symbol.values();
Fill[] fillmodes = Fill.values();
for (int i = 0; i < deck.length; i++) {
deck[i] = new Card();
deck[i].c = colors[i / 27];
deck[i].n = numbers[(i / 9) % 3];
deck[i].s = symbols[(i / 3) % 3];
deck[i].f = fillmodes[i % 3];
}
findSets(12);
}
 
private static void findSets(int numCards) {
int target = numCards / 2;
Card[] cards;
Card[][] sets = new Card[target][3];
outer:
while (true) {
int cnt = 0;
Collections.shuffle(Arrays.asList(deck));
cards = ArrayUtils.subarray(deck, 0, numCards);
 
for (int i = 0; i < cards.length - 2; i++) {
for (int j = i + 1; j < cards.length - 1; j++) {
for (int k = j + 1; k < cards.length; k++) {
if (validSet(cards[i], cards[j], cards[k])) {
sets[cnt] = new Card[]{cards[i], cards[j], cards[k]};
if (++cnt == target) {
break outer;
}
}
}
}
}
}
Arrays.sort(cards);
 
System.out.printf("GIVEN %d CARDS:\n\n", numCards);
for (Card c : cards) {
System.out.println(c);
}
System.out.println();
 
System.out.println("FOUND " + target + " SETS:\n");
for (Card[] set : sets) {
for (Card c : set) {
System.out.println(c);
}
System.out.println();
}
}
 
private static boolean validSet(Card c1, Card c2, Card c3) {
int tot = 0;
tot += (c1.c.val + c2.c.val + c3.c.val) % 3;
tot += (c1.n.val + c2.n.val + c3.n.val) % 3;
tot += (c1.s.val + c2.s.val + c3.s.val) % 3;
tot += (c1.f.val + c2.f.val + c3.f.val) % 3;
return tot == 0;
}
}</lang>
<pre>GIVEN 12 CARDS:
 
[Card: GREEN, ONE, OVAL, OPEN]
[Card: GREEN, ONE, DIAMOND, STRIPED]
[Card: GREEN, TWO, OVAL, OPEN]
[Card: GREEN, THREE, SQUIGGLE, OPEN]
[Card: GREEN, THREE, DIAMOND, STRIPED]
[Card: GREEN, THREE, SQUIGGLE, SOLID]
[Card: GREEN, THREE, SQUIGGLE, STRIPED]
[Card: PURPLE, TWO, DIAMOND, STRIPED]
[Card: RED, ONE, OVAL, STRIPED]
[Card: RED, ONE, DIAMOND, STRIPED]
[Card: RED, TWO, SQUIGGLE, SOLID]
[Card: RED, THREE, DIAMOND, OPEN]
 
FOUND 6 SETS:
 
[Card: RED, ONE, OVAL, STRIPED]
[Card: RED, TWO, SQUIGGLE, SOLID]
[Card: RED, THREE, DIAMOND, OPEN]
 
[Card: RED, ONE, OVAL, STRIPED]
[Card: PURPLE, TWO, DIAMOND, STRIPED]
[Card: GREEN, THREE, SQUIGGLE, STRIPED]
 
[Card: RED, TWO, SQUIGGLE, SOLID]
[Card: PURPLE, TWO, DIAMOND, STRIPED]
[Card: GREEN, TWO, OVAL, OPEN]
 
[Card: PURPLE, TWO, DIAMOND, STRIPED]
[Card: GREEN, THREE, DIAMOND, STRIPED]
[Card: RED, ONE, DIAMOND, STRIPED]
 
[Card: GREEN, TWO, OVAL, OPEN]
[Card: GREEN, THREE, SQUIGGLE, SOLID]
[Card: GREEN, ONE, DIAMOND, STRIPED]
 
[Card: GREEN, THREE, SQUIGGLE, OPEN]
[Card: GREEN, THREE, SQUIGGLE, SOLID]
[Card: GREEN, THREE, SQUIGGLE, STRIPED]</pre>
 
=={{header|Python}}==
Anonymous user