Code Monkey home page Code Monkey logo

clojure-katas's Introduction

Clojure Katas

This project contains a set of problems to help you get your hands dirty with Clojure. I hope we can add more problems and treat this as an ongoing project.

Get started

The project is set up so that you can solve problems one by one. All the problem skeletons are set up here, which is the place you can put your solutions.

Set up your environment

This project runs within Docker Compose, no need to set up additional dependencies!

Run Clojure Katas

To verify your answer, you can run:

$ docker-compose up test

We also implemented solution manual, to run katas with their solutions;

$ docker-compose up answer

How to practice


Say arranged-prob is not implemented under /src/clojure_katas/sine_angle.clj:

$ docker-compose up test
Performing task 'run' with profile(s): 'test'
Current kata to tackle:  clojure-katas.sine-angle/sine
false

After arranged-prob is implemented, it moves to the next problem:

Performing task 'run' with profile(s): 'test'

Testing clojure-katas.sine-angle-test

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.
Current kata to tackle:  clojure-katas.arranged-prob/prob
false

Example: create a new kata


Create /src-answers/clojure-katas/arranged_prob.clj for solution.

(defn prob
  "p: total population,
   m: total number of sub-category,
   n: number of consecutive draws"
  [p, m, n]
  (if (>= 0 n) 1
    (* (double (/ m p)) (prob (- p 1) (- m 1) (- n 1)))))

Create /src/clojure-katas/arranged_prob.clj for problem challenge.

When using core/defproblem, you are required to put comments to describe the problem.

(ns clojure-katas.arranged-prob
  (:require [clojure-katas.core :as core]))

(core/defproblem prob
 "required documentation goes here"
  [p, m, n])

Creates test under /test/clojure-katas/arranged_prob_test.clj

(deftest arranged-prob-test
  (testing "conditional probability"
    (is (= (float 0.12311558) (float (prob 200 100 3))))))

Add clojure-katas.arranged-prob-test inside the problemsets defined in test_runner

(def problems
  '[clojure-katas.sine-angle-test
    clojure-katas.arranged-prob-test))

Run through solution to make sure it works:

$ docker-compose up answer

Look for contributors

We want to keep this project ongoing, if you are interested in helping out, feel free to:

  1. Open an issue (I will try to be as responsive as possible! :-)).
  2. Submit a Pull Request (bugfix, or submit a new problem!)

If you have any questions, feel free to messaage me on Github or Twitter: @marshallshen

Many thanks to the contributors, you made this project awesome!

clojure-katas's People

Contributors

baskeboler avatar gfredericks avatar gregoriokusowski avatar kamn avatar malinmnnikk avatar marshallshen avatar taltmann avatar vihangd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

clojure-katas's Issues

Difficult to understand how to get started

Hello

This looks like a great tool, but I'm confused as to how to actually get started with solving Kata:

The readme says:

arranged-prob is not implemented under /src/clojure_katas/sine_angle.clj:

Is this saying that the first step is to create a new file called arranged-prob.clj? or define a function called arranged-prob in the sine_angle.clj file? arranged-prob seems to be a separate problem and I don't understand how the two are related.

Maybe some more granular instructions would be useful? e.g.

  1. Find the next kata with x
  2. Run the tests for that kata with x
  3. Edit file y to implement the solution

Apologies if these are noob questions - I'm new to Clojure

If I try defining a sine function in src/clojure-koans/sine_angle.clj, and running lein test test/clojure_katas/sine_angle_test.clj Then I get the following error:

Exception in thread "main" clojure.lang.ExceptionInfo: Unimplemented problem {:symbol clojure-katas.sine-angle/sine}

Incorporate feedbacks

One thing you might want is a better getting started guide. If people are learning Clojure, they might not even have it installed. So a "dependencies" guide that has links to the things that need to be installed previously (Clojure, leiningen, a text editor).

And then, you just point to the github as to where to put solutions, but what a learner actually needs to do isn't put their answers on your github. I assume you want people to clone your repo, edit it in place, and run lein katas-run. So say that. You might even walk people through the individual steps of the first problem -- including telling them what to type -- so they know they're set up properly.

Hrm, I just looked at your examples, and they're rather complicated for beginners. It seems like you're looking for people that are good mathematical programmers who have already gone through several Clojure tutorials.

Clojure version upgrade breaks the katas

Hello,

Since the the upgrade to Clojure 1.10 the katas-run and katas-answers commands are broken. On master, when running lein katas-run, I get:

Exception in thread "main" Syntax error macroexpanding core/defproblem at (clojure_katas/sine_angle.clj:4:1).
Unimplemented problem
	at clojure.lang.Compiler.macroexpand1(Compiler.java:7009)
	at clojure.lang.Compiler.macroexpand(Compiler.java:7074)
	at clojure.lang.Compiler.eval(Compiler.java:7160)
	at clojure.lang.Compiler.load(Compiler.java:7635)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:463)
	at clojure.lang.RT.load(RT.java:428)
	at clojure.core$load$fn__6824.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6765.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:669)
	at clojure.core$use.invokeStatic(core.clj:6093)
	at clojure.core$use.doInvoke(core.clj:6093)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure_katas.sine_angle_test$eval177$loading__6706__auto____178.invoke(sine_angle_test.clj:1)
	at clojure_katas.sine_angle_test$eval177.invokeStatic(sine_angle_test.clj:1)
	at clojure_katas.sine_angle_test$eval177.invoke(sine_angle_test.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7176)
	at clojure.lang.Compiler.eval(Compiler.java:7165)
	at clojure.lang.Compiler.load(Compiler.java:7635)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:463)
	at clojure.lang.RT.load(RT.java:428)
	at clojure.core$load$fn__6824.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6765.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$require.invokeStatic(core.clj:6007)
	at clojure.core$require.doInvoke(core.clj:6007)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure_katas.test_runner$run_tests$fn__168.invoke(test_runner.clj:27)
	at clojure_katas.test_runner$run_tests.invokeStatic(test_runner.clj:26)
	at clojure_katas.test_runner$run_tests.invoke(test_runner.clj:21)
	at clojure.lang.Var.invoke(Var.java:380)
	at user$eval140.invokeStatic(form-init9063866589446978454.clj:1)
	at user$eval140.invoke(form-init9063866589446978454.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7176)
	at clojure.lang.Compiler.eval(Compiler.java:7166)
	at clojure.lang.Compiler.load(Compiler.java:7635)
	at clojure.lang.Compiler.loadFile(Compiler.java:7573)
	at clojure.main$load_script.invokeStatic(main.clj:452)
	at clojure.main$init_opt.invokeStatic(main.clj:454)
	at clojure.main$init_opt.invoke(main.clj:454)
	at clojure.main$initialize.invokeStatic(main.clj:485)
	at clojure.main$null_opt.invokeStatic(main.clj:519)
	at clojure.main$null_opt.invoke(main.clj:516)
	at clojure.main$main.invokeStatic(main.clj:598)
	at clojure.main$main.doInvoke(main.clj:561)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.main.main(main.java:37)
Caused by: clojure.lang.ExceptionInfo: Unimplemented problem {:symbol clojure-katas.sine-angle/sine}
	at clojure_katas.core$defproblem.invokeStatic(core.clj:8)
	at clojure_katas.core$defproblem.doInvoke(core.clj:4)
	at clojure.lang.RestFn.invoke(RestFn.java:500)
	at clojure.lang.AFn.applyToHelper(AFn.java:171)
	at clojure.lang.RestFn.applyTo(RestFn.java:132)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.lang.Compiler.macroexpand1(Compiler.java:6992)
	... 74 more
Error encountered performing task 'run' with profile(s): 'test'
Suppressed exit

and when running lein katas-answers I get:

Testing clojure-katas.sine-angle-test

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.

Testing clojure-katas.arranged-prob-test

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.

Testing clojure-katas.exponential-test

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.

Testing clojure-katas.nth-fibonacci-test

Ran 2 tests containing 14 assertions.
0 failures, 0 errors.

Testing clojure-katas.greatest-common-divisor-test

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.

Testing clojure-katas.reverse-binary-test

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.

Testing clojure-katas.max-prime-factor-test

Ran 1 tests containing 4 assertions.
0 failures, 0 errors.

Testing clojure-katas.pascal-triangle-test

Ran 2 tests containing 4 assertions.
0 failures, 0 errors.

Testing clojure-katas.count-coin-change-test

Ran 2 tests containing 2 assertions.
0 failures, 0 errors.

Testing clojure-katas.procedural-sum-test

Ran 2 tests containing 2 assertions.
0 failures, 0 errors.

Testing clojure-katas.square-root-test

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.

Testing clojure-katas.integral-test

Ran 1 tests containing 2 assertions.
0 failures, 0 errors.
Exception in thread "main" Syntax error compiling at (clojure/contrib/math.clj:46:1).
	at clojure.lang.Compiler.analyze(Compiler.java:6808)
	at clojure.lang.Compiler.analyze(Compiler.java:6745)
	at clojure.lang.Compiler$MapExpr.parse(Compiler.java:3103)
	at clojure.lang.Compiler.analyze(Compiler.java:6797)
	at clojure.lang.Compiler.analyze(Compiler.java:6745)
	at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:1020)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:7106)
	at clojure.lang.Compiler.analyze(Compiler.java:6789)
	at clojure.lang.Compiler.analyze(Compiler.java:6745)
	at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6120)
	at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5467)
	at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4029)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:7104)
	at clojure.lang.Compiler.analyze(Compiler.java:6789)
	at clojure.lang.Compiler.eval(Compiler.java:7173)
	at clojure.lang.Compiler.eval(Compiler.java:7165)
	at clojure.lang.Compiler.load(Compiler.java:7635)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:463)
	at clojure.lang.RT.load(RT.java:428)
	at clojure.core$load$fn__6824.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6765.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$require.invokeStatic(core.clj:6007)
	at clojure.core$require.doInvoke(core.clj:6007)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure_katas.fixed_point$eval660$loading__6706__auto____661.invoke(fixed_point.clj:1)
	at clojure_katas.fixed_point$eval660.invokeStatic(fixed_point.clj:1)
	at clojure_katas.fixed_point$eval660.invoke(fixed_point.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7176)
	at clojure.lang.Compiler.eval(Compiler.java:7165)
	at clojure.lang.Compiler.load(Compiler.java:7635)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:463)
	at clojure.lang.RT.load(RT.java:428)
	at clojure.core$load$fn__6824.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6765.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:669)
	at clojure.core$use.invokeStatic(core.clj:6093)
	at clojure.core$use.doInvoke(core.clj:6093)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure_katas.fixed_point_test$eval654$loading__6706__auto____655.invoke(fixed_point_test.clj:1)
	at clojure_katas.fixed_point_test$eval654.invokeStatic(fixed_point_test.clj:1)
	at clojure_katas.fixed_point_test$eval654.invoke(fixed_point_test.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7176)
	at clojure.lang.Compiler.eval(Compiler.java:7165)
	at clojure.lang.Compiler.load(Compiler.java:7635)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:463)
	at clojure.lang.RT.load(RT.java:428)
	at clojure.core$load$fn__6824.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6765.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$require.invokeStatic(core.clj:6007)
	at clojure.core$require.doInvoke(core.clj:6007)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure_katas.test_runner$run_tests$fn__168.invoke(test_runner.clj:27)
	at clojure_katas.test_runner$run_tests.invokeStatic(test_runner.clj:26)
	at clojure_katas.test_runner$run_tests.invoke(test_runner.clj:21)
	at clojure.lang.Var.invoke(Var.java:380)
	at user$eval140.invokeStatic(form-init1531134031240191782.clj:1)
	at user$eval140.invoke(form-init1531134031240191782.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7176)
	at clojure.lang.Compiler.eval(Compiler.java:7166)
	at clojure.lang.Compiler.load(Compiler.java:7635)
	at clojure.lang.Compiler.loadFile(Compiler.java:7573)
	at clojure.main$load_script.invokeStatic(main.clj:452)
	at clojure.main$init_opt.invokeStatic(main.clj:454)
	at clojure.main$init_opt.invoke(main.clj:454)
	at clojure.main$initialize.invokeStatic(main.clj:485)
	at clojure.main$null_opt.invokeStatic(main.clj:519)
	at clojure.main$null_opt.invoke(main.clj:516)
	at clojure.main$main.invokeStatic(main.clj:598)
	at clojure.main$main.doInvoke(main.clj:561)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: Unable to resolve symbol: remainder in this context
	at clojure.lang.Util.runtimeException(Util.java:221)
	at clojure.lang.Compiler.resolveIn(Compiler.java:7413)
	at clojure.lang.Compiler.resolve(Compiler.java:7357)
	at clojure.lang.Compiler.analyzeSymbol(Compiler.java:7318)
	at clojure.lang.Compiler.analyze(Compiler.java:6768)
	... 115 more
Error encountered performing task 'run' with profile(s): 'test,answers'
Suppressed exit

I'm willing to provide a solution, however I'm new to Clojure and am not sure what the problem is. Alternatively, we could rollback the version upgrade until a proper PR for a version upgrade is submitted?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.