Skip to content

Commit ef8bd88

Browse files
committed
initial commit
1 parent 96e82e9 commit ef8bd88

File tree

9 files changed

+199
-0
lines changed

9 files changed

+199
-0
lines changed

config.json

+8
Original file line numberDiff line numberDiff line change
@@ -1545,6 +1545,14 @@
15451545
],
15461546
"difficulty": 8
15471547
},
1548+
{
1549+
"slug": "dragon-curve",
1550+
"name": "Dragon curve",
1551+
"uuid": "a577573c-7533-4c40-8b59-b31148362e3a",
1552+
"practices": [],
1553+
"prerequisites": [],
1554+
"difficulty": 8
1555+
},
15481556
{
15491557
"slug": "go-counting",
15501558
"name": "Go Counting",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Instructions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Introduction
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"authors": [
3+
"tasxatzial"
4+
],
5+
"contributors": [],
6+
"files": {
7+
"solution": [
8+
"src/dragon_curve.clj"
9+
],
10+
"test": [
11+
"test/dragon_curve_test.clj"
12+
],
13+
"example": [
14+
".meta/example.clj"
15+
]
16+
},
17+
"blurb": "",
18+
"source": "",
19+
"source_url": ""
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
(ns dragon-curve)
2+
3+
(def start-turn :right)
4+
(def segment-length 2) ; should be even
5+
(def start-points [[0 0] [segment-length 0]])
6+
(def start-direction :east)
7+
8+
9+
(defn swap-turn
10+
[turn]
11+
(case turn
12+
:left :right
13+
:right :left))
14+
15+
(defn unfold-paper-once
16+
[paper-turns]
17+
(-> paper-turns
18+
(into [start-turn])
19+
(into (reverse (map swap-turn paper-turns)))))
20+
21+
(defn unfold-paper-times
22+
[n]
23+
(reduce (fn [result _]
24+
(unfold-paper-once result))
25+
[] (range n)))
26+
27+
(def paper-turn->direction
28+
{:left {:north :west
29+
:west :south
30+
:south :east
31+
:east :north}
32+
:right {:north :east
33+
:east :south
34+
:south :west
35+
:west :north}})
36+
37+
(defn generate-next-point
38+
[point direction]
39+
(let [[x y] point]
40+
(case direction
41+
:north [x (+ y segment-length)]
42+
:east [(+ x segment-length) y]
43+
:south [x (- y segment-length)]
44+
:west [(- x segment-length) y])))
45+
46+
(defn generate-points
47+
[paper-turns]
48+
(loop [result start-points
49+
point (second start-points)
50+
direction start-direction
51+
turns paper-turns]
52+
(if (seq turns)
53+
(let [new-direction (get (paper-turn->direction (first turns)) direction)
54+
new-point (generate-next-point point new-direction)]
55+
(recur (conj result new-point) new-point new-direction (rest turns)))
56+
result)))
57+
58+
(defn find-midpoint
59+
[segment]
60+
(let [[[x1 y1] [x2 y2]] segment]
61+
[(/ (+ x1 x2) 2) (/ (+ y1 y2) 2)]))
62+
63+
(defn generate-midpoints
64+
[points]
65+
(reduce (fn [result segment]
66+
(conj result (find-midpoint segment)))
67+
[] (partition 2 1 points)))
68+
69+
(defn find-bounding-box-corners
70+
[points]
71+
(let [xs (map first points)
72+
ys (map second points)]
73+
[[(- (apply min xs) segment-length) (- (apply min ys) segment-length)]
74+
[(+ (apply max xs) segment-length) (+ (apply max ys) segment-length)]]))
75+
76+
(defn range-with-offset
77+
[start end]
78+
(let [offset (/ segment-length 2)]
79+
(range (+ start offset) (inc (- end offset)) segment-length)))
80+
81+
(defn generate-grid
82+
[bounding-box-corners]
83+
(let [[[x-left y-bottom] [x-right y-top]] bounding-box-corners]
84+
(for [x (range-with-offset x-left x-right)
85+
y (range-with-offset y-bottom y-top)]
86+
[x y])))
87+
88+
(defn find-neighbors
89+
[point]
90+
(map #(generate-next-point point %) [:north :east :south :west]))
91+
92+
(defn can-fill?
93+
[point obstacles]
94+
(let [neighbors (find-neighbors point)
95+
midpoints (map #(find-midpoint [% point]) neighbors)]
96+
(not (every? obstacles midpoints))))
97+
98+
(defn fill-grid
99+
[grid obstacles]
100+
(filter #(can-fill? % obstacles) grid))
101+
102+
(defn count-squares
103+
[n]
104+
(let [curve-points (generate-points (unfold-paper-times n))
105+
curve-midpoints (generate-midpoints curve-points)
106+
bounding-box-corners (find-bounding-box-corners curve-points)
107+
grid (generate-grid bounding-box-corners)
108+
obstacles (set curve-midpoints)]
109+
(- (count grid) (count (fill-grid grid obstacles)))))
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{:aliases {:test {:extra-paths ["test"]
2+
:extra-deps {io.github.cognitect-labs/test-runner
3+
{:git/url "https://github.com/cognitect-labs/test-runner.git"
4+
:sha "705ad25bbf0228b1c38d0244a36001c2987d7337"}}
5+
:main-opts ["-m" "cognitect.test-runner"]
6+
:exec-fn cognitect.test-runner.api/test}}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
(defproject dragon-curve "0.1.0-SNAPSHOT"
2+
:description "dragon-curve exercise."
3+
:url "https://github.com/exercism/clojure/tree/main/exercises/practice/dragon-curve"
4+
:dependencies [[org.clojure/clojure "1.12.0"]])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
(ns dragon-curve)
2+
3+
(defn count-squares
4+
"Counts the number of squares in the unfolded dragon curve after n paper folds."
5+
[n]
6+
;; function body
7+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
(ns dragon-curve-test
2+
(:require [clojure.test :refer [deftest testing is]]
3+
dragon-curve))
4+
5+
(deftest count-squares_test_1
6+
(testing "0 folds"
7+
(is (= 0 (dragon-curve/count-squares 0)))))
8+
9+
(deftest count-squares_test_2
10+
(testing "1 folds"
11+
(is (= 0 (dragon-curve/count-squares 1)))))
12+
13+
(deftest count-squares_test_3
14+
(testing "2 folds"
15+
(is (= 0 (dragon-curve/count-squares 2)))))
16+
17+
(deftest count-squares_test_4
18+
(testing "3 folds"
19+
(is (= 0 (dragon-curve/count-squares 3)))))
20+
21+
(deftest count-squares_test_5
22+
(testing "4 folds"
23+
(is (= 1 (dragon-curve/count-squares 4)))))
24+
25+
(deftest count-squares_test_6
26+
(testing "5 folds"
27+
(is (= 4 (dragon-curve/count-squares 5)))))
28+
29+
(deftest count-squares_test_7
30+
(testing "6 folds"
31+
(is (= 11 (dragon-curve/count-squares 6)))))
32+
33+
(deftest count-squares_test_8
34+
(testing "8 folds"
35+
(is (= 67 (dragon-curve/count-squares 8)))))
36+
37+
(deftest count-squares_test_9
38+
(testing "11 folds"
39+
(is (= 724 (dragon-curve/count-squares 11)))))
40+
41+
(deftest count-squares_test_10
42+
(testing "13 folds"
43+
(is (= 3232 (dragon-curve/count-squares 13)))))

0 commit comments

Comments
 (0)