'lisp'에 해당되는 글 25건

  1. 2008/07/31 스킴 걸음마의 코드 - GLAT 문제 by sloth_chord
  2. 2008/07/31 스킴 걸음마의 코드 - n번째 소수 구하기 by sloth_chord
  3. 2008/02/18 스킴 걸음마의 코드 - 중첩리스트 풀기 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
; plt scheme 의 개발환경 DrScheme에서 language를 standard(R5RS)로 맞춘후 테스트
; flatten nested list
; lisp 계열의 언어들이 빛을발할수 있는 그런문제다


(define (flat ls)
  (cond ((null? ls) '())
        ((not (pair? ls)) (list ls))
        (else (append (flat (car ls)) (flat (cdr ls))))))


(define (test ans input)
  (for-each (lambda (x y)
              (if (not (equal? x (flat y))) (display "failed\n")))
            ans input)
  'done)

(define nested-input (list (cons (list 1 2) (list 3 4))
                           '(1 (2 3) (4 5 6) (7 (8 (9)))) '(1 2 (3 4 (5)) 6 ((7 8)))))

(define ans-for-nested (list '(1 2 3 4) '(1 2 3 4 5 6 7 8 9) '(1 2 3 4 5 6 7 8)))


(define flat-input (list '() (list 1 2) (list 1)))
(define ans-for-flat (list '() '(1 2) '(1)))

(test ans-for-nested nested-input)
(test ans-for-flat flat-input)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord