Skip to content

Instantly share code, notes, and snippets.

@unixpickle unixpickle/puzzle.go
Created Dec 24, 2018

Embed
What would you like to do?
Logic puzzle
// Solve this logic puzzle:
// https://xmonader.github.io/prolog/2018/12/21/solving-murder-prolog.html
package main
import (
"fmt"
"github.com/unixpickle/approb"
)
const (
Bathroom = iota
DiningRoom
Kitchen
LivingRoom
Pantry
Study
)
const (
George = iota
John
Robert
Barbara
Christine
Yolanda
)
const (
Bag = iota
Firearm
Gas
Knife
Poison
Rope
)
type Configuration struct {
People []int
Weapons []int
}
func main() {
for people := range approb.Perms(6) {
for weapons := range approb.Perms(6) {
cfg := &Configuration{people, weapons}
if !clue1(cfg) || !clue2(cfg) || !clue3(cfg) || !clue4(cfg) || !clue5(cfg) ||
!clue6(cfg) || !clue7(cfg) || !clue8(cfg) || !clue9(cfg) {
continue
}
fmt.Println("person,weapon:", cfg.People[Pantry], cfg.Weapons[Pantry])
}
}
}
func clue1(cfg *Configuration) bool {
return isMan(cfg.People[Kitchen]) && (cfg.Weapons[Kitchen] == Knife || cfg.Weapons[Kitchen] == Gas)
}
func clue2(cfg *Configuration) bool {
if cfg.People[Study] == Barbara {
return cfg.People[Bathroom] == Yolanda
} else if cfg.People[Study] == Yolanda {
return cfg.People[Bathroom] == Barbara
} else {
return false
}
}
func clue3(cfg *Configuration) bool {
bagRoom := indexOf(cfg.Weapons, Bag)
if cfg.People[bagRoom] == Barbara || cfg.People[bagRoom] == George {
return false
}
return bagRoom != Bathroom && bagRoom != DiningRoom
}
func clue4(cfg *Configuration) bool {
if cfg.Weapons[Study] != Rope {
return false
}
return !isMan(cfg.People[Study])
}
func clue5(cfg *Configuration) bool {
return cfg.People[LivingRoom] == John || cfg.People[LivingRoom] == George
}
func clue6(cfg *Configuration) bool {
return cfg.Weapons[DiningRoom] != Knife
}
func clue7(cfg *Configuration) bool {
return cfg.People[Study] != Yolanda && cfg.People[Pantry] != Yolanda
}
func clue8(cfg *Configuration) bool {
firearmRoom := indexOf(cfg.Weapons, Firearm)
return cfg.People[firearmRoom] == George
}
func clue9(cfg *Configuration) bool {
return cfg.Weapons[Pantry] == Gas
}
func isMan(person int) bool {
return person < 3
}
func indexOf(l []int, x int) int {
for i, y := range l {
if y == x {
return i
}
}
panic("unreachable")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.