37 lines
1.3 KiB
Racket
37 lines
1.3 KiB
Racket
#lang racket
|
|
|
|
(define (next s)
|
|
(define v (make-vector 10 0))
|
|
(for ([c s])
|
|
(define d (- (char->integer #\9) (char->integer c)))
|
|
(vector-set! v d (add1 (vector-ref v d))))
|
|
(string-append* (for/list ([x v] [i (in-range 9 -1 -1)] #:when (> x 0))
|
|
(format "~a~a" x i))))
|
|
|
|
(define (seq-of s)
|
|
(reverse (let loop ([ns (list s)])
|
|
(define n (next (car ns)))
|
|
(if (member n ns) ns (loop (cons n ns))))))
|
|
|
|
(define (sort-string s)
|
|
(list->string (sort (string->list s) char>?)))
|
|
|
|
(define-values [len nums seq]
|
|
(for/fold ([*len #f] [*nums #f] [*seq #f])
|
|
([n (in-range 1000000 -1 -1)]) ; start at the high end
|
|
(define s (number->string n))
|
|
(define sorted (sort-string s))
|
|
(cond [(equal? s sorted)
|
|
(define seq (seq-of s))
|
|
(define len (length seq))
|
|
(cond [(or (not *len) (> len *len)) (values len (list s) seq)]
|
|
[(= len *len) (values len (cons s *nums) seq)]
|
|
[else (values *len *nums *seq)])]
|
|
;; not sorted: see if it's a permutation of the best
|
|
[else (values
|
|
*len
|
|
(if (and *nums (member sorted *nums)) (cons s *nums) *nums)
|
|
*seq)])))
|
|
(printf "Numbers: ~a\nLength: ~a\n" (string-join nums ", ") len)
|
|
(for ([n seq]) (printf " ~a\n" n))
|