Emirp
Challenge: Reversible Primes
> +emirp 10
638Solutions
Solution #1
:: emirp.hoon
:: Finds a sum of first n emirp numbers
|^
|= [n=@ud]
=/ i 0
=/ sum 0
=/ number 13
=| emirps=(set @ud)
|-
?: =(i n)
sum
=^ x=@ud emirps (find-emirp number emirps)
%= $
i +(i)
sum (add sum x)
:: iterating only over 6k +- 1 numbers
number (add ?:(=((mod x 6) 1) 4 2) x)
==
:: Finds a smallest emirp which is greater than or equal to x.
:: Adds flipped emirp to the set of emirps
:: If emirp is in the set, returns it immediately
::
++ find-emirp
|= [x=@ud emirps=(set @ud)]
^- [@ud (set @ud)]
=/ flipped (flip x)
?: (~(has in emirps) x)
[x emirps]
?: &(!=(x flipped) (is-prime x) (is-prime flipped))
[x (~(put in emirps) flipped)]
$(x (add ?:(=((mod x 6) 1) 4 2) x))
:: Checks if x is a prime.
::
++ is-prime
|= [x=@ud]
^- ?
?: (lte x 3)
(gth x 1)
?: |(=((mod x 2) 0) =((mod x 3) 0))
%.n
=/ limit p:(sqt x)
=/ j 5
|-
?: (gth j limit)
%.y
?: |(=((mod x j) 0) =((mod x (add 2 j)) 0))
%.n
$(j (add j 6))
:: Flips a number.
::
++ flip
|= [number=@ud]
^- @ud
=/ m 0
=/ rip (curr div 10)
=/ last (curr mod 10)
|-
?: =(number 0)
m
%= $
number (rip number)
m (add (mul 10 m) (last number))
==
--Solution #2
Unit Tests
Last updated