From 7b585c94b3648e371821ade4ad80ee31fba887af Mon Sep 17 00:00:00 2001 From: Eric Willigers Date: Wed, 7 Aug 2024 22:46:25 +1000 Subject: [PATCH] Add zebra-puzzle --- config.json | 8 ++ .../practice/zebra-puzzle/.docs/hints.md | 6 ++ .../zebra-puzzle/.docs/instructions.append.md | 13 ++++ .../zebra-puzzle/.docs/instructions.md | 32 ++++++++ .../zebra-puzzle/.docs/introduction.md | 15 ++++ .../practice/zebra-puzzle/.meta/config.json | 19 +++++ .../practice/zebra-puzzle/.meta/example.mips | 20 +++++ .../practice/zebra-puzzle/.meta/tests.toml | 16 ++++ exercises/practice/zebra-puzzle/impl.mips | 18 +++++ exercises/practice/zebra-puzzle/runner.mips | 77 +++++++++++++++++++ 10 files changed, 224 insertions(+) create mode 100644 exercises/practice/zebra-puzzle/.docs/hints.md create mode 100644 exercises/practice/zebra-puzzle/.docs/instructions.append.md create mode 100644 exercises/practice/zebra-puzzle/.docs/instructions.md create mode 100644 exercises/practice/zebra-puzzle/.docs/introduction.md create mode 100644 exercises/practice/zebra-puzzle/.meta/config.json create mode 100644 exercises/practice/zebra-puzzle/.meta/example.mips create mode 100644 exercises/practice/zebra-puzzle/.meta/tests.toml create mode 100644 exercises/practice/zebra-puzzle/impl.mips create mode 100644 exercises/practice/zebra-puzzle/runner.mips diff --git a/config.json b/config.json index 0768288..823011d 100644 --- a/config.json +++ b/config.json @@ -547,6 +547,14 @@ "practices": [], "prerequisites": [], "difficulty": 8 + }, + { + "slug": "zebra-puzzle", + "name": "Zebra Puzzle", + "uuid": "29f8cd44-2d46-4674-ae4a-42eb0e07c664", + "practices": [], + "prerequisites": [], + "difficulty": 10 } ], "foregone": [ diff --git a/exercises/practice/zebra-puzzle/.docs/hints.md b/exercises/practice/zebra-puzzle/.docs/hints.md new file mode 100644 index 0000000..52d65b0 --- /dev/null +++ b/exercises/practice/zebra-puzzle/.docs/hints.md @@ -0,0 +1,6 @@ +# Hints + +## General + +- The `$t0-9` registers can be used to temporarily store values +- The instructions specify which registers are used as input and output diff --git a/exercises/practice/zebra-puzzle/.docs/instructions.append.md b/exercises/practice/zebra-puzzle/.docs/instructions.append.md new file mode 100644 index 0000000..faf21ed --- /dev/null +++ b/exercises/practice/zebra-puzzle/.docs/instructions.append.md @@ -0,0 +1,13 @@ +# Instructions append + +## Output format + +Each nationality is specified using a single letter. (`E` = `Englishman`, `J` = `Japanese`, `N` = `Norwegian`, `S` = `Spaniard`, `U` = `Ukranian`) + +## Registers + +| Register | Usage | Type | Description | +| -------- | --------- | ------- | ---------------------------- | +| `$v0` | output | byte | nationality of water drinker | +| `$v1` | output | byte | nationality of zebra owner | +| `$t0-9` | temporary | any | for temporary storage | diff --git a/exercises/practice/zebra-puzzle/.docs/instructions.md b/exercises/practice/zebra-puzzle/.docs/instructions.md new file mode 100644 index 0000000..aedce9b --- /dev/null +++ b/exercises/practice/zebra-puzzle/.docs/instructions.md @@ -0,0 +1,32 @@ +# Instructions + +Your task is to solve the Zebra Puzzle to find the answer to these two questions: + +- Which of the residents drinks water? +- Who owns the zebra? + +## Puzzle + +The following 15 statements are all known to be true: + +1. There are five houses. +2. The Englishman lives in the red house. +3. The Spaniard owns the dog. +4. The person in the green house drinks coffee. +5. The Ukrainian drinks tea. +6. The green house is immediately to the right of the ivory house. +7. The snail owner likes to go dancing. +8. The person in the yellow house is a painter. +9. The person in the middle house drinks milk. +10. The Norwegian lives in the first house. +11. The person who enjoys reading lives in the house next to the person with the fox. +12. The painter's house is next to the house with the horse. +13. The person who plays football drinks orange juice. +14. The Japanese person plays chess. +15. The Norwegian lives next to the blue house. + +Additionally, each of the five houses is painted a different color, and their inhabitants are of different national extractions, own different pets, drink different beverages and engage in different hobbies. + +~~~~exercism/note +There are 24 billion (5!⁵ = 24,883,200,000) possible solutions, so try ruling out as many solutions as possible. +~~~~ diff --git a/exercises/practice/zebra-puzzle/.docs/introduction.md b/exercises/practice/zebra-puzzle/.docs/introduction.md new file mode 100644 index 0000000..bbcaa6f --- /dev/null +++ b/exercises/practice/zebra-puzzle/.docs/introduction.md @@ -0,0 +1,15 @@ +# Introduction + +The Zebra Puzzle is a famous logic puzzle in which there are five houses, each painted a different color. +The houses have different inhabitants, who have different nationalities, own different pets, drink different beverages and enjoy different hobbies. + +To help you solve the puzzle, you're given 15 statements describing the solution. +However, only by combining the information in _all_ statements will you be able to find the solution to the puzzle. + +~~~~exercism/note +The Zebra Puzzle is a [Constraint satisfaction problem (CSP)][constraint-satisfaction-problem]. +In such a problem, you have a set of possible values and a set of constraints that limit which values are valid. +Another well-known CSP is Sudoku. + +[constraint-satisfaction-problem]: https://en.wikipedia.org/wiki/Constraint_satisfaction_problem +~~~~ diff --git a/exercises/practice/zebra-puzzle/.meta/config.json b/exercises/practice/zebra-puzzle/.meta/config.json new file mode 100644 index 0000000..64fea8b --- /dev/null +++ b/exercises/practice/zebra-puzzle/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "keiravillekode" + ], + "files": { + "solution": [ + "impl.mips" + ], + "test": [ + "runner.mips" + ], + "example": [ + ".meta/example.mips" + ] + }, + "blurb": "Solve the zebra puzzle.", + "source": "Wikipedia", + "source_url": "https://en.wikipedia.org/wiki/Zebra_Puzzle" +} diff --git a/exercises/practice/zebra-puzzle/.meta/example.mips b/exercises/practice/zebra-puzzle/.meta/example.mips new file mode 100644 index 0000000..a0a8ba6 --- /dev/null +++ b/exercises/practice/zebra-puzzle/.meta/example.mips @@ -0,0 +1,20 @@ +## Registers + +# | Register | Usage | Type | Description | +# | -------- | --------- | ------- | ---------------------------- | +# | `$v0` | output | byte | nationality of water drinker | +# | `$v1` | output | byte | nationality of zebra owner | +# | `$t0-9` | temporary | any | for temporary storage | + +.eqv ENGLISHMAN 69 +.eqv JAPANESE 74 +.eqv NORWEGIAN 78 +.eqv SPANIARD 83 +.eqv UKRANIAN 85 + +.globl solution + +solution: + li $v0, NORWEGIAN + li $v1, JAPANESE + jr $ra diff --git a/exercises/practice/zebra-puzzle/.meta/tests.toml b/exercises/practice/zebra-puzzle/.meta/tests.toml new file mode 100644 index 0000000..56c21c7 --- /dev/null +++ b/exercises/practice/zebra-puzzle/.meta/tests.toml @@ -0,0 +1,16 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[16efb4e4-8ad7-4d5e-ba96-e5537b66fd42] +description = "resident who drinks water" + +[084d5b8b-24e2-40e6-b008-c800da8cd257] +description = "resident who owns zebra" diff --git a/exercises/practice/zebra-puzzle/impl.mips b/exercises/practice/zebra-puzzle/impl.mips new file mode 100644 index 0000000..fdfe320 --- /dev/null +++ b/exercises/practice/zebra-puzzle/impl.mips @@ -0,0 +1,18 @@ +## Registers + +# | Register | Usage | Type | Description | +# | -------- | --------- | ------- | ---------------------------- | +# | `$v0` | output | byte | nationality of water drinker | +# | `$v1` | output | byte | nationality of zebra owner | +# | `$t0-9` | temporary | any | for temporary storage | + +.EQV ENGLISHMAN 'E' +.EQV JAPANESE 'J' +.EQV NORWEGIAN 'N' +.EQV SPANIARD 'S' +.EQV UKRANIAN 'U' + +.globl solution + +solution: + jr $ra diff --git a/exercises/practice/zebra-puzzle/runner.mips b/exercises/practice/zebra-puzzle/runner.mips new file mode 100644 index 0000000..1dff884 --- /dev/null +++ b/exercises/practice/zebra-puzzle/runner.mips @@ -0,0 +1,77 @@ +# +# Test solution +# +# s1 - address of expected output +# s2 - address where output is copied + +.data + +# expected output value +outs: .asciiz "N, J" + +failmsg: .asciiz "test failed: " +expectedmsg: .asciiz "expected " +tobemsg: .asciiz " to be " +okmsg: .asciiz "all tests passed" + +.eqv BUFFER_SIZE 5 + +.text + +runner: + la $s1, outs + li $v0, 9 # code for allocating heap memory + li $a0, BUFFER_SIZE + syscall + move $s2, $v0 + +run_test: + jal solution # call subroutine under test + li $t0, ',' + li $t1, ' ' + sb $v0, 0($s2) + sb $t0, 1($s2) + sb $t1, 2($s2) + sb $v1, 3($s2) + sb $zero, 4($s2) + + lb $t0, 0($s1) + lb $t1, 3($s1) + bne $v0, $t0, exit_fail + bne $v1, $t1, exit_fail + +exit_ok: + la $a0, okmsg # put address of okmsg into a0 + li $v0, 4 # 4 is print string + syscall + + li $v0, 10 # 10 is exit with zero status (clean exit) + syscall + +exit_fail: + la $a0, failmsg # put address of failmsg into a0 + li $v0, 4 # 4 is print string + syscall + + la $a0, expectedmsg + li $v0, 4 + syscall + + move $a0, $s2 # print actual that failed on + li $v0, 4 # 1 is print string + syscall + + la $a0, tobemsg + li $v0, 4 + syscall + + move $a0, $s1 # print expected value that failed on + li $v0, 4 # 1 is print string + syscall + + li $a0, 1 # set error code to 1 + li $v0, 17 # 17 is exit with error + syscall + +# # Include your implementation here if you wish to run this from the MARS GUI. +# .include "impl.mips"