108 lines
3.4 KiB
Plaintext
108 lines
3.4 KiB
Plaintext
type Row { values: List<Int>
|
|
count: Int }
|
|
|
|
appendValue(item: Int, state: Row) (next: Row) {
|
|
values = append(state.values, item)
|
|
next = Row { values = values
|
|
count = state.count + 1 }
|
|
}
|
|
|
|
preserved(state: Row) (next: Row) {
|
|
added = append(state.values, 99)
|
|
next = state
|
|
next.count = length(added)
|
|
}
|
|
|
|
appendObserved(item: Int, state: Row) (next: Row) {
|
|
values = append(state.values, item + length(state.values))
|
|
next = Row { values = values
|
|
count = length(state.values) }
|
|
}
|
|
|
|
appendCounted(item: Int, state: Row) (next: Row) {
|
|
values = append(state.values, item)
|
|
next = Row { values = values
|
|
count = length(values) }
|
|
}
|
|
|
|
type Pair { values: List<Int>
|
|
first: Int
|
|
second: Int }
|
|
|
|
appendPair(item: Int, state: Pair) (next: Pair) {
|
|
values = append(state.values, item + state.first)
|
|
next = Pair { second = state.first
|
|
values = values
|
|
first = state.second + item }
|
|
}
|
|
|
|
appendFault(item: Int, state: Pair) (next: Pair) {
|
|
values = append(state.values, item * state.first)
|
|
next = Pair { second = state.second + 1
|
|
values = values
|
|
first = state.first + 1 }
|
|
}
|
|
|
|
prefixFault() (answer: Pair) {
|
|
answer = reduce(appendFault, [2], Pair { values = [1]
|
|
first = 9223372036854775807
|
|
second = 9223372036854775807 })
|
|
}
|
|
|
|
firstFieldFault() (answer: Pair) {
|
|
answer = reduce(appendFault, [0], Pair { values = [1]
|
|
first = 9223372036854775807
|
|
second = 9223372036854775807 })
|
|
}
|
|
|
|
lastFieldFault() (answer: Pair) {
|
|
answer = reduce(appendFault, [0], Pair { values = [1]
|
|
first = 9223372036854775807
|
|
second = 0 })
|
|
}
|
|
|
|
type Table { values: Map<Text, Int>
|
|
total: Int }
|
|
|
|
readTable(item: Int, state: Table) (next: Table) {
|
|
next = Table { values = state.values
|
|
total = state.total + item + length(state.values) }
|
|
}
|
|
|
|
verify() (answer: Bool) {
|
|
original = Row { values = [1]
|
|
count = 1 }
|
|
changed = reduce(appendValue, [2, 3, 4], original)
|
|
answer = changed.values == [1, 2, 3, 4] and changed.count == 4
|
|
answer = answer and original.values == [1] and original.count == 1
|
|
answer = answer and reduce(appendValue, [], original) == original
|
|
copy = preserved(original)
|
|
answer = answer and copy.values == [1] and copy.count == 2
|
|
row = appendValue(5, original)
|
|
first = append(row.values, row.count)
|
|
second = append(row.values, 8)
|
|
answer = answer and first == [1, 5, 2] and second == [1, 5, 8]
|
|
row.values = [9]
|
|
answer = answer and row.values == [9] and row.count == 2
|
|
observed = reduce(appendObserved, [2, 3], original)
|
|
counted = reduce(appendCounted, [2, 3], original)
|
|
answer = answer and observed.values == [1, 3, 5] and observed.count == 2
|
|
answer = answer and counted.values == [1, 2, 3] and counted.count == 3
|
|
bytes = reduce(appendValue, dever.bytes.fromText("AB"), original)
|
|
answer = answer and bytes.values == [1, 65, 66] and bytes.count == 3
|
|
pair = Pair { values = [1]
|
|
first = 10
|
|
second = 20 }
|
|
swapped = reduce(appendPair, [2, 3], pair)
|
|
answer = answer and swapped.values == [1, 12, 25]
|
|
answer = answer and swapped.first == 13 and swapped.second == 22
|
|
answer = answer and pair.values == [1] and pair.first == 10 and pair.second == 20
|
|
answer = answer and reduce(appendPair, [], pair) == pair
|
|
table = Table { values = {"key" = 1}
|
|
total = 1 }
|
|
counted_table = reduce(readTable, [2, 3], table)
|
|
answer = answer and counted_table.total == 8 and counted_table.values == table.values
|
|
answer = answer and table.total == 1 and table.values == {"key" = 1}
|
|
answer = answer and reduce(readTable, [], table) == table
|
|
}
|