라켓 -126 바이트 이하 98 바이트 91 바이트
매우 순진한 솔루션-아마도 알 수없는 괜찮은 알고리즘과 lips 트릭으로 많이 줄일 수 있습니다.
(define(g x[c 0][d 0][i 2])(cond[(= x 0)c][(= i x)(g d(+ 1 c))][(=(modulo x i)0)(g x c d(+ 1 i))][else(g x c(+ 1 d)(+ 1 i))]))
편집 : 요청에 의한 설명. 내가 말했듯이, 이것은 매우 순진한 재귀 솔루션이며 훨씬 짧을 수 있습니다.
(define (g x [c 0] [d 0] [i 2]) ;g is the name of the function - arguments are x (input), c (counter for steps), d (non-divisor counter), i (iterator)
(cond
[(= x 0) c] ;once x gets to 0 c is outputted
[(= i x) (g d (+ 1 c))] ;if iterator reaches x then we recurse with d as input and add 1 to c
[(= (modulo x i) 0) (g x c d (+ 1 i))] ;checks if iterator is non divisor, then adds it to d and increments iterator
[else(g x c (+ 1 d) (+ 1 i))])) ;otherwise just increments iterator
편집 2 : 덜 멍청한 알고리즘으로 98 바이트 버전 (아직 꽤 멍청하지만 짧을 수 있음)
(define(g x)(if(< x 1)0(+ 1(g(length(filter(λ(y)(>(modulo x y)0))(cdr(build-list x values))))))))
설명:
(define (g x) ;function name g, input x
(if (< x 1)
0 ;returns 0 if x < 1 (base case)
(+ 1 ;simple recursion - adds 1 to output for each time we're looping
(g (length ;the input we're passing is the length of...
(filter (λ (y) (> (modulo x y) 0)) ;the list where all numbers which are 0 modulo x are 0 are filtered out from...
(cdr (build-list x values)))))))) ;the list of all integers up to x, not including 0
편집 3 :로 대체 (cdr(build-list x values))
하여 7 바이트 저장(build-list x add1)
(define(g x)(if(< x 1)0(+ 1(g(length(filter(λ(y)(>(modulo x y)0))(build-list x add1)))))))