55 lines
1.5 KiB
Plaintext
55 lines
1.5 KiB
Plaintext
import "./fmt" for Fmt
|
|
import "./math" for Math
|
|
import "./sort" for Sort
|
|
|
|
class Item {
|
|
construct new(name, weight, value) {
|
|
_name = name
|
|
_weight = weight
|
|
_value = value
|
|
}
|
|
|
|
name { _name }
|
|
weight { _weight }
|
|
value { _value }
|
|
}
|
|
|
|
var items = [
|
|
Item.new("beef", 3.8, 36),
|
|
Item.new("pork", 5.4, 43),
|
|
Item.new("ham", 3.6, 90),
|
|
Item.new("greaves", 2.4, 45),
|
|
Item.new("flitch", 4, 30),
|
|
Item.new("brawn", 2.5, 56),
|
|
Item.new("welt", 3.7, 67),
|
|
Item.new("salami", 3.0, 95),
|
|
Item.new("sausage", 5.9, 98)
|
|
]
|
|
|
|
var maxWeight = 15
|
|
// sort items by value per unit weight in descending order
|
|
var cmp = Fn.new { |i, j| (j.value/j.weight - i.value/i.weight).sign }
|
|
Sort.insertion(items, cmp)
|
|
System.print("Item Chosen Weight Value Percentage")
|
|
System.print("----------- ------ ------ ----------")
|
|
var w = maxWeight
|
|
var itemCount = 0
|
|
var sumValue = 0
|
|
for (item in items) {
|
|
itemCount = itemCount + 1
|
|
if (item.weight <= w) {
|
|
sumValue = sumValue + item.value
|
|
Fmt.print("$-11s $3.1f $5.2f 100.00", item.name, item.weight, item.value)
|
|
} else {
|
|
var value = Math.toPlaces(w / item.weight * item.value, 2)
|
|
var percentage = Math.toPlaces(w / item.weight * 100, 2)
|
|
sumValue = sumValue + value
|
|
Fmt.print("$-11s $3.1f $5.2f $6.2f", item.name, w, value, percentage)
|
|
break
|
|
}
|
|
w = w - item.weight
|
|
if (w == 0) break
|
|
}
|
|
System.print("----------- ------ ------")
|
|
Fmt.print("$d items 15.0 $6.2f", itemCount, sumValue)
|