'2008/07'에 해당되는 글 13건

  1. 2008/07/31 스킴 걸음마의 코드 - GLAT 문제 by sloth_chord
  2. 2008/07/31 스킴 걸음마의 코드 - n번째 소수 구하기 by sloth_chord
  3. 2008/07/23 블로그 host 자리를비웁니다 by sloth_chord
; 블로그 host 자리비운단 글을 올린지 얼마 안되서 슬쩍 들어와볼수있게 됐네요^^
; 앞으로도 이렇게 가끔 들어올수 있을듯 생각이되는군요



; plt scheme 의 개발환경 DrScheme에서 language를 standard(R5RS)로 맞춘후 테스트


; 정수 1에서 n 까지 숫자를 f(n)에 n이하의 수에1이 들어가는 갯수를 k라 할때, f(n) = k

; f(13) = 6 => 1,10,11,12,13 (총 1이 6개)

; n = k 이 되는 최초의 n은 1일때가 된다. 두번째로 n = k가 되는 n을 구하라


(define (num-of-1 n)
  (define (next n) (truncate (/ n 10)))

  (let loop ((n n) (cnt 0))
    (if (<= n 0) cnt
        (if (= 1 (remainder n 10)) (loop (next n) (+ cnt 1))
            (loop (next n) cnt)))))

; 규칙을 생각하면 f(n)의 값은 (f(n - 1) + (n에 있는 1의 개수))  의 값이다
; 그러니까 무조건 1부터 계속 중복 계산을 할 필요 없이
; 그 앞항의 값을 계산해놓구 더해가면 된다

(define (glat max-try)
  (define (calcul-k i k) (+ k (num-of-1 i)))

  (define (how-many-found i k cnt)
    (if (= i k) (+ cnt 1)
        cnt))

  (define (solve i k cnt)
    (if (> i max-try) -1
        (let* ((new-k (calcul-k i k)) (new-cnt (how-many-found i new-k cnt)))
          (if (= 2 new-cnt) i
              (solve (+ i 1) new-k new-cnt)))))

  (solve 1 0 0))



(define (test ans max-try)
  (if (= ans (glat max-try)) 'ok
      'failed))

(test 199981 200000)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord
; 블로그 host 자리비운단 글을 올린지 얼마 안되서 슬쩍 들어와볼수있게 됐네요^^
; 앞으로도 이렇게 가끔 들어올수 있을듯 생각이되는군요

; plt scheme 의 개발환경 DrScheme에서 language를 standard(R5RS)로 맞춘후 테스트




(
define-syntax when
  (syntax-rules ()
    ((_ e0 e1 e2 ...)
     (if e0 (begin e1 e2 ...)))))


(define (make-sieve n sqrt-n)

  ; list대신 vector을 이용해서 임의접근을 효율적으로 만드는것
  ; sicp 에서는 stream filter를
  ; 이용하여 에라토스테네스의 체를
  ; 매우 우아하지만 매우 비효율적인 방법으로 구현


  (let ((prime-tab (make-vector (+ n 1) '#t)))
    (define (marking! i)
      (define (mark-composite! mul-of-i)
        (when (<= mul-of-i n)
          (vector-set! prime-tab mul-of-i '#f)
          (mark-composite! (+ mul-of-i i))))

      (if (vector-ref prime-tab i) (mark-composite! (+ i i))))


    (define (sieve! i)
      (cond ((> i sqrt-n) prime-tab)
            ((<= i 1) (vector-set! prime-tab i #f) (sieve! (+ i 1)))
            (else (marking! i) (sieve! (+ i 1)))))


    (sieve! 0)))



; 에라토스테네스의 체를 이용하여서 모든 소수를 구하는 것임

(define (all-prime n)
  (let ((prime-tab (make-sieve n (sqrt n))))
    (define (num-of-prime i cnt)
      (cond ((> i n) cnt)
            ((vector-ref prime-tab i) (num-of-prime (+ i 1) (+ cnt 1)))
            (else (num-of-prime (+ i 1) cnt))))

    (num-of-prime 0 0)))



(define (test ans input)
  (if (= ans (all-prime input)) 'ok
      'failed))

(test 78498 1000000)

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord
사실 찾는사람도없어서 굳이 이런 멘트를안해두될꺼같지만....
남들보니까 하기에 따라서해봅니다^^..

한동안 관리는힘들것같네요
하지만 블로그폐쇄는하지않구요
가끔씩 들를수도있구요

얼마뒤에 다시 올수도있구..
하여튼간 공지사항였어요
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord
TAG 공지