Last active
October 11, 2021 00:13
-
-
Save phasetr/c11ea0fd4085f73cf1c62a2d2e2bca34 to your computer and use it in GitHub Desktop.
素数夜曲P.651で突如出てきた `just?` は何者?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;; P.648 | |
(define (collatz n) | |
(cond ((= n 1) '(1)) | |
((even? n) (cons n (collatz (/ n 2)))) | |
(else (cons n (collatz (+ (* 3 n) 1)))))) | |
;;; P.650 | |
(define (peak n) | |
(map (lambda (i) (apply max (collatz i))) | |
(iota 1 n))) | |
;;; P.651 | |
;;; `just?` は何なのか? | |
(length (filter (just? 9232 (peak 999)))) | |
;;; 代わりに書いたコード: 本にある `353` を出力してくれる | |
(length (filter (lambda (x) (equal? 9232 x)) (peak 999))) | |
;;; 関連コード | |
(define adjust-of | |
(lambda (x) | |
(let ((digit 1000) | |
(slide (if (positive? x) 1/2 -1/2))) | |
(/ (truncate (+ slide (* digit x))) digit)))) | |
(define iota | |
(lambda lst | |
(let* ((x (length lst)) | |
(max (if (= 1 x) (car lst) (cadr lst))) | |
(min (if (< 1 x) (car lst) 1)) | |
(step (if (= 3 x) (caddr lst) 1))) | |
(let loop ((i (- min step)) (tmp '())) | |
(if (< (- max step) i) | |
(reverse tmp) | |
(loop (+ i step) | |
(cons (adjust-of (+ i step)) tmp))))))) |
手元にある素数夜曲は2021/6/28の第1版第1刷発行。
追加コメント。
私は素数夜曲を持ってないので前後の文脈がわかりませんがモナドは無関係で、単に = の部分適用版みたいなものを意図していそうに見えます。
つまり
(define (just? x) (lambda(y) (= x y)))
みたいな。
私も(just? x) ≡ (lambda (y) (= x y)) だと思います。当初定義も示して使っていたけど改稿時にやめしたが一部直し忘れてた、みたいな感じかもしれません。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Twitterでのつぶやきに頂いたコメントを転記。