Set puzzle: Difference between revisions

5,242 bytes added ,  3 years ago
Added Wren
m (→‎{{header|Tailspin}}: syntax update)
(Added Wren)
Line 3,912:
(red,oval,two,striped)
(red,squiggle,two,open)
</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-dynamic}}
{{libheader|Wren-trait}}
{{libheader|Wren-fmt}}
{{libheader|Wren-str}}
{{libheader|Wren-math}}
{{libheader|Wren-sort}}
<lang ecmascript>import "/dynamic" for Enum
import "/trait" for Comparable
import "/fmt" for Fmt
import "/str" for Str
import "/math" for Nums
import "/sort" for Sort
import "random" for Random
 
var Color = Enum.create("Color", ["RED", "GREEN", "PURPLE"])
var Symbol = Enum.create("Symbol", ["OVAL", "SQUIGGLE", "DIAMOND"])
var Number = Enum.create("Number", ["ONE", "TWO", "THREE"])
var Shading = Enum.create("Shading", ["SOLID", "OPEN", "STRIPED"])
var Degree = Enum.create("Degree", ["BASIC", "ADVANCED"])
 
class Card is Comparable {
static zero { Card.new(Color.RED, Symbol.OVAL, Number.ONE, Shading.SOLID) }
 
construct new(color, symbol, number, shading) {
_color = color
_symbol = symbol
_number = number
_shading = shading
_value = color * 27 + symbol * 9 + number * 3 + shading
}
 
color { _color }
symbol { _symbol }
number { _number }
shading { _shading }
value { _value }
 
compare(other) { (_value - other.value).sign }
 
toString {
return Str.lower(Fmt.swrite("$-8s$-10s$-7s$-7s",
Color.members [_color],
Symbol.members [_symbol],
Number.members [_number],
Shading.members[_shading]
))
}
}
 
var createDeck = Fn.new {
var deck = List.filled(81, null)
for (i in 0...81) {
var col = (i/27).floor
var sym = (i/ 9).floor % 3
var num = (i/ 3).floor % 3
var shd = i % 3
deck[i] = Card.new(col, sym, num, shd)
}
return deck
}
 
var rand = Random.new()
 
var isSet = Fn.new { |trio|
var r1 = Nums.sum(trio.map { |c| c.color }) % 3
var r2 = Nums.sum(trio.map { |c| c.symbol }) % 3
var r3 = Nums.sum(trio.map { |c| c.number }) % 3
var r4 = Nums.sum(trio.map { |c| c.shading }) % 3
return r1 + r2 + r3 + r4 == 0
}
 
var playGame = Fn.new { |degree|
var deck = createDeck.call()
var nCards = (degree == Degree.BASIC) ? 9 : 12
var nSets = (nCards/2).floor
var sets = List.filled(nSets, null)
for (i in 0...nSets) sets[i] = [Card.zero, Card.zero, Card.zero]
var hand = []
while (true) {
rand.shuffle(deck)
hand = deck.take(nCards).toList
var count = 0
var hSize = hand.count
var outer = false
for (i in 0...hSize-2) {
for (j in i+1...hSize-1) {
for (k in j+1...hSize) {
var trio = [hand[i], hand[j], hand[k]]
if (isSet.call(trio)) {
sets[count] = trio
count = count + 1
if (count == nSets) {
outer = true
break
}
}
}
if (outer) break
}
if (outer) break
}
if (outer) break
}
Sort.quick(hand)
System.print("DEALT %(nCards) CARDS:\n")
System.print(hand.join("\n"))
System.print("\nCONTAINING %(nSets) SETS:\n")
for (s in sets) {
Sort.quick(s)
System.print(s.join("\n"))
System.print()
}
}
 
playGame.call(Degree.BASIC)
System.print()
playGame.call(Degree.ADVANCED)</lang>
 
{{out}}
Sample output:
<pre>
DEALT 9 CARDS:
 
red oval one open
red oval two open
green oval three striped
green squiggle one open
green squiggle two solid
green diamond one open
purple oval one solid
purple diamond three open
purple diamond three striped
 
CONTAINING 4 SETS:
 
red oval one open
green squiggle two solid
purple diamond three striped
 
red oval two open
green squiggle one open
purple diamond three open
 
red oval two open
green oval three striped
purple oval one solid
 
green oval three striped
green squiggle two solid
green diamond one open
 
 
DEALT 12 CARDS:
 
red oval one solid
red squiggle two solid
red squiggle three open
red diamond two solid
red diamond two striped
green oval two solid
green squiggle two striped
green diamond two open
green diamond two striped
purple oval two striped
purple diamond one solid
purple diamond two striped
 
CONTAINING 6 SETS:
 
red diamond two solid
green diamond two open
purple diamond two striped
 
red diamond two striped
green diamond two striped
purple diamond two striped
 
green oval two solid
green squiggle two striped
green diamond two open
 
red diamond two striped
green squiggle two striped
purple oval two striped
 
red oval one solid
red squiggle three open
red diamond two striped
 
red squiggle two solid
green diamond two open
purple oval two striped
</pre>
 
9,476

edits