Set puzzle: Difference between revisions

4,379 bytes added ,  6 years ago
Added Kotlin
(added ceylon)
(Added Kotlin)
Line 2,124:
[Card: RED, THREE, OVAL, STRIPED]
[Card: PURPLE, TWO, SQUIGGLE, SOLID]</pre>
 
=={{header|Kotlin}}==
<lang scala>// version 1.1.3
 
import java.util.Collections.shuffle
 
enum class Color { RED, GREEN, PURPLE }
enum class Symbol { OVAL, SQUIGGLE, DIAMOND }
enum class Number { ONE, TWO, THREE }
enum class Shading { SOLID, OPEN, STRIPED }
enum class Degree { BASIC, ADVANCED }
 
class Card(
val color: Color,
val symbol: Symbol,
val number: Number,
val shading: Shading
) : Comparable<Card> {
 
private val value =
color.ordinal * 27 + symbol.ordinal * 9 + number.ordinal * 3 + shading.ordinal
override fun compareTo(other: Card) = value.compareTo(other.value)
 
override fun toString() = (
color.name.padEnd(8) +
symbol.name.padEnd(10) +
number.name.padEnd(7) +
shading.name.padEnd(7)
).toLowerCase()
 
companion object {
val zero = Card(Color.RED, Symbol.OVAL, Number.ONE, Shading.SOLID)
}
}
 
fun createDeck() =
List<Card>(81) {
val col = Color.values() [it / 27]
val sym = Symbol.values() [it / 9 % 3]
val num = Number.values() [it / 3 % 3]
val shd = Shading.values()[it % 3]
Card(col, sym, num, shd)
}
 
fun playGame(degree: Degree) {
val deck = createDeck()
val nCards = if (degree == Degree.BASIC) 9 else 12
val nSets = nCards / 2
val sets = Array(nSets) { Array(3) { Card.zero } }
var hand: Array<Card>
outer@ while (true) {
shuffle(deck)
hand = deck.take(nCards).toTypedArray()
var count = 0
for (i in 0 until hand.size - 2) {
for (j in i + 1 until hand.size - 1) {
for (k in j + 1 until hand.size) {
val trio = arrayOf(hand[i], hand[j], hand[k])
if (isSet(trio)) {
sets[count++] = trio
if (count == nSets) break@outer
}
}
}
}
}
hand.sort()
println("DEALT $nCards CARDS:\n")
println(hand.joinToString("\n"))
println("\nCONTAINING $nSets SETS:\n")
for (s in sets) {
s.sort()
println(s.joinToString("\n"))
println()
}
}
 
fun isSet(trio: Array<Card>): Boolean {
val r1 = trio.sumBy { it.color.ordinal } % 3
val r2 = trio.sumBy { it.symbol.ordinal } % 3
val r3 = trio.sumBy { it.number.ordinal } % 3
val r4 = trio.sumBy { it.shading.ordinal } % 3
return (r1 + r2 + r3 + r4) == 0
}
 
fun main(args: Array<String>) {
playGame(Degree.BASIC)
println()
playGame(Degree.ADVANCED)
}</lang>
 
Sample output:
<pre>
DEALT 9 CARDS:
 
red oval three solid
red diamond two solid
green oval one open
green oval three open
green squiggle one open
green diamond one open
purple oval three striped
purple squiggle three solid
purple diamond two striped
 
CONTAINING 4 SETS:
 
red oval three solid
green squiggle one open
purple diamond two striped
 
red oval three solid
green oval three open
purple oval three striped
 
green oval one open
green squiggle one open
green diamond one open
 
red diamond two solid
green squiggle one open
purple oval three striped
 
 
DEALT 12 CARDS:
 
red squiggle two solid
red diamond two solid
red diamond two open
red diamond two striped
green oval one open
green oval three solid
green oval three open
green squiggle one solid
green diamond one striped
purple oval one solid
purple oval three open
purple squiggle one striped
 
CONTAINING 6 SETS:
 
red diamond two open
green oval three solid
purple squiggle one striped
 
red diamond two solid
red diamond two open
red diamond two striped
 
red diamond two solid
green oval three open
purple squiggle one striped
 
red squiggle two solid
green diamond one striped
purple oval three open
 
green oval one open
green squiggle one solid
green diamond one striped
 
red diamond two striped
green squiggle one solid
purple oval three open
</pre>
 
=={{header|Mathematica}}==
9,476

edits