51 lines
1.4 KiB
Racket
51 lines
1.4 KiB
Racket
; 20231024 Racket programming naive solution
|
|
#lang racket
|
|
(require control)
|
|
(require text-block/text)
|
|
|
|
(define (is-palindrome n)
|
|
(define (digit-list n)
|
|
(if (zero? n)
|
|
'()
|
|
(cons (remainder n 10) (digit-list (quotient n 10)))))
|
|
|
|
(define (reverse-list lst)
|
|
(if (null? lst)
|
|
'()
|
|
(append (reverse-list (cdr lst)) (list (car lst)))))
|
|
|
|
(define digits (digit-list n))
|
|
(equal? digits (reverse-list digits)))
|
|
|
|
(define (perfect-square? n)
|
|
(if (rational? (sqrt n))
|
|
(= n (expt (floor (sqrt n)) 2))
|
|
false))
|
|
|
|
(define (reverse-number n)
|
|
(string->number (string-reverse (number->string n))))
|
|
|
|
(define (find-rare-numbers count)
|
|
(define rare-numbers '())
|
|
(define i 1)
|
|
|
|
(define (is-rare? n)
|
|
(and (not (is-palindrome n))
|
|
(let* ((r (reverse-number n))
|
|
(sum (+ n r))
|
|
(diff (- n r)))
|
|
(and (perfect-square? sum)
|
|
(perfect-square? diff)))))
|
|
|
|
(define start-time (current-inexact-milliseconds))
|
|
|
|
(while (< (length rare-numbers) count)
|
|
(cond [(is-rare? i)
|
|
(displayln (format "Number: ~a | Elapsed time: ~a ms" i (round (- (current-inexact-milliseconds) start-time))))
|
|
(set! rare-numbers (cons i rare-numbers))])
|
|
(set! i (+ i 1)))
|
|
|
|
(reverse rare-numbers))
|
|
|
|
(displayln "The first 5 rare numbers are:")
|
|
(for-each (λ (x) (display x) (display "\n")) (find-rare-numbers 5))
|