Scheme

問題141 Scheme での実装例

Scheme で書いてみた。ロジックは先日書いた通りで、単にプログラムを起こしただけです。 (define (problem-141 limit) (let ((lim (expt limit (/ 1 4)))) (define (iter-k q p k sum) (let ((nn (* (+ (* k p p p) q) k q))) (if (>= nn limit) sum (iter-…

約数を求める(完全版)

(define nil '()) (define (gen-primes limit) (let ((v (make-vector (+ limit 1) 1))) (define (set-not-prime! ini-idx) (define (iter i) (if (> i limit) 'done (begin (vector-set! v i 0) (iter (+ i ini-idx))))) (iter (* ini-idx 2))) (define (in…

約数を求める

(define nil '()) (define (element-of-set? x set) (cond ((null? set) #f) ((equal? x (car set)) #t) (else (element-of-set? x (cdr set))))) (define (uniq set) (define (iter x s) (if (null? x) s (iter (cdr x) (if (element-of-set? (car x) s) s …

素数を作る処理の改善

無限ストリームを使って素数を求める処理に、「素数は必ず6の倍数の隣にある」という事実を使って、処理速度を改善してみます。なお、無限ストリームを使った解法は処理速度が遅いので、最速を求める人にはおすすめしません。無限ストリームを実現するため…

合計を求める(第一回)

最近は高等学校でもプログラミングを教えるみたいなので、 高校生でもわかるようにやさしくに解説していきます。まず始めに 1 から 10 までの合計を求めるプログラムを考えます。 (define (sum-ex1) 55) 55 ってわかってるからね。そのまま書いちゃった。 実…

コルーチンによる FizzBuzz の実装

まずコルーチンを実装します。 Scheme は継続(Continuation)を扱えるので、簡単にコルーチンを実装できます。 (use util.queue) (define *tasks* (make-queue)) (define-syntax define-coroutine (syntax-rules () ((_ (routine yield) body ...) (define (r…

チケットナンバー問題

お断り チケットの高額売買に関する問題の事ではありません。 なお、チケットに限らず転売屋は地獄に堕ちてください。 お断り ここまでさて、今回のお題です。 チケットナンバー問題で、もっとも計算方法が多い4桁の数字はいくつか。 最小の値を答えよ。 プ…

暇なので書いた(仕事しろ)

説明不要。 (use srfi-27) (define nil '()) (define zun 'ズン) (define doko 'ドコ) (define (make-zun-doko) (if (= (random-integer 2) 0) zun doko)) (define (init-zun-doko) (define (iter n lst) (if (= n 0) lst (iter (- n 1) (append lst (cons (…

「エラトステネスの篩を使用して素数の無限ストリームを作るプログラムを書いて」を質問してみた

AI に質問して提示したプログラムがこれ。 (define (stream-cons a b) (cons a (delay b))) (define (stream-car s) (car s)) (define (stream-cdr s) (force (cdr s))) (define (stream-filter p s) (cond ((null? s) '()) ((p (stream-car s)) (stream-con…

Scheme で AI に Project Euler 142 を解くように質問してみた

いい線はいっているんだけど、 ・処理速度の改善が全然ダメ ・カッコの対応をいつも間違える ・未定義の関数を使用するのでプログラムがエラーで動作しない でダメだねwww 何度訂正させても、きちんと動作するプログラムが書けなので、 4,5回聞いて諦…

幾星霜の時を経て一問解く

問題 142 です。問題の内容は公式サイトをご覧ください。 公式サイトは英語ですが、有志の方々が日本語に翻訳しているページもあったりします。最初に書いたプログラムはこちら。 (define nil '()) (define (pe142 low high) (define (iter-x x) (if (> x hi…

フィボナッチ数列を一般項から求めてみる

本日のお題 フィボナッチ数列を一般項から求めるプログラムを Scheme で書いてみます。 フィボナッチ数列の一般項は、と表されます。 面倒くさい数式を頑張って書きました。褒めてくださいwポイント このお題を解くにあたってのポイントは、一般項に出てく…

練習問題2.4

同じ c の値に対する例を見つけよ。s=199 でプログラムで調べました。 (make-pythagoras 手続きの引数 limit に 199 を与えました。) (define nil '()) (define (square x) (* x x)) (define (euclid-gcd a b) (if (= b 0) a (euclid-gcd b (remainder a b))…

練習問題1.1

練習問題をプログラムを自分で書いて解いて行きます。 プログラミング言語は Scheme を使います。数学の問題を解くのに Lisp (Scheme) は最適でありましょう。のっけから難しいです(汗a.平方数でも三角数でもある数を見つけなさい。まずは愚直な実装で数値…

継続渡しスタイル第二回(最終回)

第二回にして最終回ですがw、 CPS でもう少しプログラムを書いてみましょう。まずは、階乗を求めるプログラム。鉄板ですねw まずは普通の関数型で書きます。 (define (fact n) (if (= n 1) 1 (* n (fact (- n 1))))) 5! + 7 を計算してみます。 gosh> (+ 7…

継続渡しスタイル

プログラミングスタイルというと主に、・手続き型 ・オブジェクト指向型 ・関数型の3つがよく使われていると思います。 今回は継続渡しスタイル(Continuation Passing Style. 以下 CPS と略します)を紹介したいと思います。CPS の基本的な考え方は、・処理…

ナンプレを解く(改

ナンプレを解くプログラムがバグっていて解けない問題があったので直しました。 このプログラムは人間的な解法で問題を解きます。総当りな方法は使いません。 (use util.list) (define nil '()) ;;; 汎用手続き (define (list->number lis) (fold (lambda (a…

数値リストのコンパクトな表現

ネットを徘徊してどこぞから拾ってきたお題です。 (define nil '()) ;; '(1 3 4 5 6 12 13 15) ;; => '(1 (3 . 6) (12 . 13) 15) (define (compact-number-list sorted-number-list) (define (iter lis prev start end result) (if (null? lis) (append resu…

IEEE 単精度浮動小数点数 の計算

技術士試験の問題によく IEEE 単精度浮動小数点数の計算問題が出てくるので、 Scheme で実装してみました。情報工学部門の技術士を目指すなら、毎回計算してないでプログラム書いて解けよ! と思いますよね?でも試験は頭で解かないとダメですーwww 面倒…

オオカミとヤギとキャベツ

仕様はググってください。 お断り:このプログラムはすべての解を列挙するものではありません。 ;; common procedures (define nil '()) (define (enumerate-interval low high) (if (> low high) nil (cons low (enumerate-interval (+ low 1) high)))) (de…

スタックマシンもどき

技術士試験の平成28年度情報工学部門に出題されたスタックマシンを Scheme で書く。 まずはスタックの実装から (define nil '()) ;; stack (define *stack* nil) (define (last-pushed) (if (empty?) nil (car *stack*))) (define (after-popped) (if (empty…

順列を求める(個数だけ) その後

寝不足のまま続きを考えましたw (define (iter-3 ans rests rests1 count) (if (null? rests) count (iter-3 ans (cdr rests) rests1 (let ((x (car rests))) (+ count (iter-2 (append ans (cons x nil)) x (remove x rests1))))))) (define (iter-2 ans n…

順列を求める(個数だけ)

個数だけ求めるなら、これで十分ですかね。 (define (iter-2 ans num rests) (if (null? rests) (if (check ans) 1 0) (if (not (check ans)) 0 (apply + (map (lambda (x) (iter-2 (append ans `(,x)) x (remove x rests))) rests))))) (define (iter num c…

逆行列を求める 数式の改良

数式を少し改良しました。 (define (sort-sum-values lis) (let ((num (apply + (filter number? lis))) (vals (filter symbol? lis))) (if (= num 0) (sort vals) (append `(,num) (sort vals))))) (define (sort-product-values lis) (let ((num (apply * …

順列を求める

ja.stackoverflow.com暇なので解いてみた。 (define nil '()) (define (enumerate-interval low high) (if (> low high) nil (cons low (enumerate-interval (+ low 1) high)))) (define (accumulate op initial seq) (if (null? seq) initial (op (car seq)…

逆行列を求める

逆行列を計算するプログラムです。まず共通処理から。 (define nil '()) (define *stack* nil) (define level-ratio 100) (define (last-pushed) (if (empty?) nil (car *stack*))) (define (after-popped) (if (empty?) nil (cdr *stack*))) (define (init)…

L-99 P98 再び

お絵かきロジックを、より人間らしく解く!とは言っても、普通の人間には簡単にできる ・解法を自ら学習する ・新たな解法を発見する とかは出来ません。というか、そんなのが出来たら怖いです。人類を敵と見做して核攻撃とかしそう! 人形ロボットを作って…

L-99 P97

数独を解く問題。Euler Project 問題 96 と同じです。まず、問題をスクラッチバッファで加工して sudoku_p97.txt を作ります。 ファイルの中身はこんな感じ。未確定の部分は 0 にします。 Grid 01 004800017 670900000 508030004 300740100 069000780 001069…

L-99 P90

8クイーン問題*1です。1. 普通な実装 (define nil '()) (define (enumerate-interval low high) (if (> low high) nil (cons low (enumerate-interval (+ low 1) high)))) (define (filter predicate sequence) (cond ((null? sequence) nil) ((predicate (c…

L-99 P93

年度始めすぐは、なにかと暇なので勉強が捗っちゃうねーw 2 3 5 7 11 から等式を作って正しい計算結果になる式をリストアップしなさい。 例として、2-3+5+7 = 11 とか 2 = (3*5+7)/11 があるよ。(あと 10 個ある。) という問題。まずは汎用手続き (define n…