Probem37
30分プログラム、その310。Problem37 - ProjectEuler。
3797は面白い性質を持っている. まずそれ自身が素数であり, 左から右に桁を除いたときに全て素数になっている (3797, 797, 97, 7). 同様に右から左に桁を除いたときも全て素数である (3797, 379, 37, 3).
右から切り詰めても左から切り詰めても素数になるような素数は11個しかない. 総和を求めよ.
注: 2, 3, 5, 7を切り詰め可能な素数とは考えない.
ダメだ。10個までしかどうしても見付からない。あと、1個か。何か見落しがあるんだろうか。
使い方
$ gosh problem37.scm 0 23 1 37 2 53 3 73 4 313 5 317 6 373 7 797 8 3137 9 3797 ^C*** UNHANDLED-SIGNAL-ERROR: unhandled signal 2 (SIGINT)
ソースコード
#! /opt/local/bin/gosh ;; -*- mode:scheme; coding:utf-8 -*- ;; ;; problem37.scm - ;; ;; Copyright(C) 2008 by mzp ;; Author: MIZUNO Hiroki / mzpppp at gmail dot com ;; http://howdyworld.org ;; ;; Timestamp: 2008/05/25 21:03:47 ;; ;; This program is free software; you can redistribute it and/or ;; modify it under MIT Lincence. ;; (use srfi-1) (define (prime? n) (cond ([= n 2] #t) ([<= 2 n] (every (lambda (x) (not (= (modulo n x) 0))) (iota (- (ceiling->exact (sqrt n)) 1) 2))) (else #f))) (define (shift n) (floor->exact (/. n 10))) (define (log10 n) (/ (log n) (log 10))) (define (r-shift n) (let1 w (expt 10 (floor->exact (log10 n))) (modulo n w))) (define (shift-list n) (unfold (cut = <> 0) identity (cut shift <>) n)) (define (rshift-list n) (unfold (cut = <> 0) identity (cut r-shift <>) n)) (define (satisfy? n) (and (every prime? (shift-list n)) (every prime? (rshift-list n)))) (define (loop c sum n) (cond ([= c 11] sum) ([satisfy? n] (print c " " n) (loop (+ c 1) (+ sum n) (+ n 1))) (else (loop c sum (+ n 1))))) (define (main _) (print (loop 0 0 10)))
追記(2008/05/26)
走らせ続けたら解けました。だいたい5分ぐらいかかりました。