正整数のゲーデル数化?
Posted feedbacks - Scheme
なんとなくstreamを使ってみた。 sieveとprimesはSICPのやつ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | (use util.stream)
(use gauche.collection)
(define (integers-starting-from n)
(stream-cons n (integers-starting-from (+ n 1))))
(define (sieve stream)
(define (divisible? x y) (= (remainder x y) 0))
(stream-cons
(stream-car stream)
(sieve (stream-filter
(lambda (x) (not (divisible? x (stream-car stream))))
(stream-cdr stream)))))
(define primes (sieve (integers-starting-from 2)))
(define (number->digit-stream n)
(stream-map
(lambda (c) (- (char->integer c) (char->integer #\0)))
(string->stream (number->string n))))
(define (goedel n)
(apply * (stream->list
(stream-map (lambda (pk nk) (expt pk nk))
primes (number->digit-stream n)))))
|
ストリームの練習も兼ねて。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | (use srfi-1)
(use util.stream)
(define (goedel n)
(let* ((ds (map digit->integer (string->list (number->string n))))
(ps (stream->list (stream-take prime-stream (length ds)))))
(fold * 1 (map expt ps ds))))
(define prime-stream
(letrec ((sieve
(lambda (strm)
(let ((n (stream-car strm)))
(stream-cons n
(sieve
(stream-remove (lambda (m)
(zero? (remainder m n)))
(stream-cdr strm))))))))
(sieve (stream-iota -1 2))))
(define (main args)
(print (goedel (string->number (cadr args))))
0)
|



nobsun
#4420()
Rating2/2=1.00
see: ゲーデル数
[ reply ]