Summarize and say sequence: Difference between revisions

Content added Content deleted
m (→‎{{trans|Common Lisp}}: Drop @(do ...))
m (→‎{{trans|Racket}}: Drop @(do ...))
Line 3,106: Line 3,106:
==={{trans|Racket}}===
==={{trans|Racket}}===


<lang txrlisp>;; Macro very similar to Racket's for/fold
<lang txr>@(do
(defmacro for-accum (accum-var-inits each-vars . body)
;; Macro very similar to Racket's for/fold
(defmacro for-accum (accum-var-inits each-vars . body)
(let ((accum-vars [mapcar first accum-var-inits])
(block-sym (gensym))
(let ((accum-vars [mapcar first accum-var-inits])
(block-sym (gensym))
(next-args [mapcar (ret (progn @rest (gensym))) accum-var-inits])
(next-args [mapcar (ret (progn @rest (gensym))) accum-var-inits])
(nvars (length accum-var-inits)))
(nvars (length accum-var-inits)))
^(let ,accum-var-inits
^(let ,accum-var-inits
(flet ((iter (,*next-args)
(flet ((iter (,*next-args)
,*[mapcar (ret ^(set ,@1 ,@2)) accum-vars next-args]))
,*[mapcar (ret ^(set ,@1 ,@2)) accum-vars next-args]))
(each ,each-vars
(each ,each-vars
,*body)
,*body)
(list ,*accum-vars)))))
(list ,*accum-vars)))))


(defun next (s)
(defun next (s)
(let ((v (vector 10 0)))
(let ((v (vector 10 0)))
(each ((c s))
(each ((c s))
(inc [v (- #\9 c)]))
(inc [v (- #\9 c)]))
(cat-str
(cat-str
(collect-each ((x v)
(collect-each ((x v)
(i (range 9 0 -1)))
(i (range 9 0 -1)))
(when (> x 0)
(when (> x 0)
`@x@i`)))))
`@x@i`)))))


(defun seq-of (s)
(defun seq-of (s)
(for* ((ns ()))
(for* ((ns ()))
((not (member s ns)) (reverse ns))
((not (member s ns)) (reverse ns))
((push s ns) (set s (next s)))))
((push s ns) (set s (next s)))))


(defun sort-string (s)
(defun sort-string (s)
[sort (copy s) >])
[sort (copy s) >])


(tree-bind (len nums seq)
(tree-bind (len nums seq)
(for-accum ((*len nil) (*nums nil) (*seq nil))
(for-accum ((*len nil) (*nums nil) (*seq nil))
((n (range 1000000 0 -1))) ;; start at the high end
((n (range 1000000 0 -1))) ;; start at the high end
(let* ((s (tostring n))
(let* ((s (tostring n))
(sorted (sort-string s)))
(sorted (sort-string s)))
(if (equal s sorted)
(if (equal s sorted)
(let* ((seq (seq-of s))
(let* ((seq (seq-of s))
(len (length seq)))
(len (length seq)))
(cond ((or (not *len) (> len *len)) (iter len (list s) seq))
(cond ((or (not *len) (> len *len)) (iter len (list s) seq))
((= len *len) (iter len (cons s *nums) seq))))
((= len *len) (iter len (cons s *nums) seq))))
(iter *len
(iter *len
(if (and *nums (member sorted *nums)) (cons s *nums) *nums)
(if (and *nums (member sorted *nums)) (cons s *nums) *nums)
*seq))))
*seq))))
(put-line `Numbers: @{nums ", "}\nLength: @len`)
(put-line `Numbers: @{nums ", "}\nLength: @len`)
(each ((n seq)) (put-line ` @n`)))</lang>
(each ((n seq)) (put-line ` @n`)))</lang>


{{out}}
{{out}}