🎉 Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io 🎉
Avatar of PEZ

PEZ's solution

to Armstrong Numbers in the Clojure Track

Published at Feb 02 2020 · 0 comments
Instructions
Test suite
Solution

An Armstrong number is a number that is the sum of its own digits each raised to the power of the number of digits.

For example:

  • 9 is an Armstrong number, because 9 = 9^1 = 9
  • 10 is not an Armstrong number, because 10 != 1^2 + 0^2 = 1
  • 153 is an Armstrong number, because: 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
  • 154 is not an Armstrong number, because: 154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190

Write some code to determine whether a number is an Armstrong number.

Source

Wikipedia https://en.wikipedia.org/wiki/Narcissistic_number

Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

armstrong_numbers_test.clj

(ns armstrong-numbers-test
  (:require [clojure.test :refer [deftest is testing]]
            [armstrong-numbers :refer [armstrong?]]))

(deftest armstrong-number-0
  (testing "Zero is an Armstrong number"
    (is (armstrong? 0))))

(deftest armstrong-number-5
  (testing "Single digit numbers are Armstrong numbers"
    (is (armstrong? 5))))

(deftest not-armstrong-number-10
  (testing "There are no 2 digit Armstrong numbers"
    (is (not (armstrong? 10)))))

(deftest armstrong-number-153
  (testing "Three digit number that is an Armstrong number"
    (is (armstrong? 153))))

(deftest not-armstrong-number-100
  (testing "Three digit number that is not an Armstrong number"
    (is (not (armstrong? 100)))))

(deftest armstrong-number-9474
  (testing "Four digit number that is an Armstrong number"
    (is (armstrong? 9474))))

(deftest not-armstrong-number-9475
  (testing "Four digit number that is not an Armstrong number"
    (is (not (armstrong? 9475)))))

(deftest armstrong-number-9926315
  (testing "Seven digit number that is an Armstrong number"
    (is (armstrong? 9926315))))

(deftest not-armstrong-number-9926314
  (testing "Seven digit number that is not an Armstrong number"
    (is (not (armstrong? 9926314)))))

(deftest armstrong-number-21897142587612075
  (testing "Seventeen digit number that is an Armstrong number"
    (is (armstrong? 21897142587612075))))
(ns armstrong-numbers)

(defn armstrong? [num] ;; <- arglist goes here
  (let [digits (count (str num))]
    (->> num
         str
         (map int)
         (map #(- % 48))
         (map #(apply * (repeat digits %)))
         (apply +)
         (= num))))

(comment
  (armstrong? 9)
  (armstrong? 10)
  (armstrong? 153)
  (armstrong? 154)
  (filter armstrong? (range 100000))
  (armstrong? 21897142587612075)
  ;; => true
  )

Community comments

Find this solution interesting? Ask the author a question to learn more.

PEZ's Reflection

My first solution to this couldn't cope with the 17-digit test, because floating point math. But without my mentor I wonder if I had ever figured the problem out.