Anonymous user
Set puzzle: Difference between revisions
→{{header|Java}}: added Java
(→{{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}}==
|