Skip to content

Instantly share code, notes, and snippets.

@wvdlaan
Last active August 29, 2015 14:18
Show Gist options
  • Save wvdlaan/c00dfe916b3509bd90ef to your computer and use it in GitHub Desktop.
Save wvdlaan/c00dfe916b3509bd90ef to your computer and use it in GitHub Desktop.
(ns dojo.core
(:require [clojure.math.combinatorics :as combo]
[clojure.set :as cs]))
(def board
[[0 1 0]
[0 0 0]
[1 0 0]])
(def human-board
[[1 :? 0]])
(def b1
[[0 0] [0 1]])
(defn board-positions
"(board-positions 2 2) => ([0 0] [0 1] [1 0] [1 1])"
[rows cols]
(for [row (range rows)
col (range cols)]
[row col]))
(defn bomb-placements
[bombs coll]
(->> coll
combo/subsets
(filter #(= bombs (count %)))))
(defn gen-boards
"(gen-boards 2 2 1) => (([0 0]) ([0 1]) ([1 0]) ([1 1]))"
[rows cols bombs]
(->> (board-positions rows cols)
(bomb-placements bombs)))
(defn gen-clicks
[boards positions]
(for [board boards
position positions]
[board position]))
(defn neighbours
"(neighbours [0 1] 3 3) => ([0 0] [0 2] [1 0] [1 1] [1 2])"
[[row col] rows cols]
(->> (for [r (range (dec row) (+ 2 row))
c (range (dec col) (+ 2 col))]
[r c])
(remove #(= [row col] %))
(filter #(< -1 (first %) rows))
(filter #(< -1 (second %) cols))))
(defn solve
[rows cols board position]
(empty? (cs/intersection
(set board)
(set (neighbours position rows cols)))))
(defn solved?
[rows cols [board position]]
(if (some #(= position %) board)
false
(solve rows cols board position)))
(defn sweep
"(take 1 (sweep 5 5 1)) => ([([0 0]) [0 2]])
(take 1 (sweep 5 5 3)) => ([([0 0] [0 1] [0 2]) [0 4]])"
[rows cols bombs]
(let [boards (gen-boards rows cols bombs)
positions (board-positions rows cols)]
(->> (gen-clicks boards positions)
(filter #(solved? rows cols %)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment