'program'에 해당되는 글 42건

  1. 2008/07/31 스킴 걸음마의 코드 - GLAT 문제 by sloth_chord
  2. 2008/07/31 스킴 걸음마의 코드 - n번째 소수 구하기 by sloth_chord
  3. 2008/07/07 Ruby 걸음마의 코드 - self number 문제 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
# Ruby 1.8에서테스트

# 유명해진지 조금 된 셀프넘버 문제

# 1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라


def
d(n)

  ret = n

  while n > 0
    ret += (n % 10)
    n /= 10
  end

  return ret

end

# i가 어떤수의 generator인가를 계산을해가지구
# i가 generate를 하는 수인 generated는 self number가 아님
# 범위안에 있는수면은 tab에 false 넣음
# bound.times 만을 d에 호출하면 되는 이유는
# generated 보다 큰 generator는 없기 때문

def sum_of_self_number(bound)

  tab = Array.new(bound, true)

  bound.times do |i|
    generated = d(i)
    (tab[generated] = false) if (generated < bound)
  end

  sum = 0
  bound.times do |i| ((sum += i) if tab[i]) end

  return sum

end

require 'test/unit'

class TestSumOfSelfNum < Test::Unit::TestCase

  def test_method
    assert_equal(1227365, sum_of_self_number(5000))
  end

end
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord
TAG program, ruby