回文素数
30分プログラム、その741。回文素数を求めてみる。
旅先の宿からこんにちは。ただいま旅行中につき、ほとんどネットワークにつなげません。というわけで、今日の30分プログラムは一切ぐぐらずに書いてます。かなりつらいですが、なんとかなるものですね。
Twitterのだれかの発言で知ったのだけれども、回文素数なるものがあるらしい。詳しくは調べてないけど、きっと素数+回文数なんでしょうね。
回文数の判定も素数の計算もやったことあるので、さくさくっと書いちゃいましょう。
使い方
gosh> (take-kaibun-primes 20) (2 3 5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929)
ソースコード
#! /opt/local/bin/gosh ;; -*- mode:scheme; coding:utf-8 -*- (use util.stream) (define (sieve xs) (let1 x (stream-car xs) (stream-cons x (sieve (stream-filter (lambda (n) (not (= 0 (modulo n x)))) (stream-cdr xs)))))) (define (ints n) (stream-cons n (ints (+ n 1)))) (define (kaibun? n) (let1 xs (string->list (number->string n)) (equal? xs (reverse xs)))) (define primes (sieve (ints 2))) (define kaibun-primes (stream-filter kaibun? primes)) (define (take-kaibun-primes n) (stream->list (stream-take kaibun-primes n)))
参考
- 過去の30分プログラム
- /opt/local/share/gauche/0.9/lib/util/stream.scm