Ruby에서 소수를 찾아 보았습니다. (엘라토스테네스의 체)
소수의 정의
이하, Weblio 사전: 소수로부터 인용.
1과 자신 이외에는 약수를 가지지 않는 양의 정수. 1은 소수에 포함되지 않습니다.
엘라토스테네스 체
2
에서 숫자를보고 소수를 찾으십시오, 이상의 공정에서 소수를 찾아내는 것을
エラトステネスのふるい
라고 합니다.표가 실려 있는 사이트를 알기 쉽기 때문에 이하를 소개해 둡니다.
여기입니다. (엘라토스테네스의 체)
구현
eratosthenes_sieve.rbdef eratosthenes_sieve(num)
# nums = Array.new(num, true)
nums = [*0...num]
primes = []
k = 2 # 0, 1 aren't prime-nums
while k*k<=num
for i in k..num/k
nums[k*i] = nil
end
k += 1
while !nums[k]
k += 1
end
end
=begin
primes = nums.each_with_index.select {|num, index| index if num}
primes.clone.each_with_index do |prime, index|
primes[index] = prime[1]
end
primes
=end
nums.compact[2...nums.size]
end
num = rand(100)
prime_nums = eratosthenes_sieve(num)
p "num: #{num}" # "num: 53"
p "prime_nums: #{prime_nums}" # "prime_nums: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]"
덤 (Ruby의 nil 체크?)
코딩 중에 "응???"라고 생각하는 것이있었습니다.
문제 부분은 다음과 같습니다.
primes << i if nums[i] = true
이 문장은, 우연히 if nums[i] == true
라고 쓰고 싶었던 것을 실수해 버린 일문입니다. 하지만 이것이라도 다녔습니다. 나제일까...라고 신기하게 생각해 여러가지 시험해 보았습니다.
a = 'test'
p a # "test"
p a if a = 'change' # "change"
아, if
의 조건식에 배치한 a = 'change'
가 영향해 "change"
이 출력되고 있다!
어쩌면 swift if let
와 비슷한 nil 체크와 같은 기능을 수행하는 것이 아닌가! 라고 생각했습니다.
a = nil
p a # nil
p 'hogehoge' if b = a # nil
a = 'test'
p 'hogehoge' if b = a # "hogehoge"
오 역시 그럴까!
그러나...
a = 'test'
p b if b = a
이렇게하면 b는 변수를 모르겠다고 말해 버렸습니다.
a = 'test'
if b = a
p b # "test"
end
이것이라면 괜찮습니다. Ruby if
의 원 라이너로 쓰는 방법 중 내용을 앞으로 가져올 경우는 이 nil 체크는 사용할 수 없는 것 같네요.
nil 체크라는 단어가 올바른지 어떤지는 확실하지 않습니다. 누군가 아시면 이런 동작의 명칭을 가르쳐 주시면 발광합니다
Reference
이 문제에 관하여(Ruby에서 소수를 찾아 보았습니다. (엘라토스테네스의 체)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/TurkeyLeg0403/items/f623f097002903cc9598
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def eratosthenes_sieve(num)
# nums = Array.new(num, true)
nums = [*0...num]
primes = []
k = 2 # 0, 1 aren't prime-nums
while k*k<=num
for i in k..num/k
nums[k*i] = nil
end
k += 1
while !nums[k]
k += 1
end
end
=begin
primes = nums.each_with_index.select {|num, index| index if num}
primes.clone.each_with_index do |prime, index|
primes[index] = prime[1]
end
primes
=end
nums.compact[2...nums.size]
end
num = rand(100)
prime_nums = eratosthenes_sieve(num)
p "num: #{num}" # "num: 53"
p "prime_nums: #{prime_nums}" # "prime_nums: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]"
코딩 중에 "응???"라고 생각하는 것이있었습니다.
문제 부분은 다음과 같습니다.
primes << i if nums[i] = true
이 문장은, 우연히
if nums[i] == true
라고 쓰고 싶었던 것을 실수해 버린 일문입니다. 하지만 이것이라도 다녔습니다. 나제일까...라고 신기하게 생각해 여러가지 시험해 보았습니다.a = 'test'
p a # "test"
p a if a = 'change' # "change"
아,
if
의 조건식에 배치한 a = 'change'
가 영향해 "change"
이 출력되고 있다! 어쩌면 swift
if let
와 비슷한 nil 체크와 같은 기능을 수행하는 것이 아닌가! 라고 생각했습니다.a = nil
p a # nil
p 'hogehoge' if b = a # nil
a = 'test'
p 'hogehoge' if b = a # "hogehoge"
오 역시 그럴까!
그러나...
a = 'test'
p b if b = a
이렇게하면 b는 변수를 모르겠다고 말해 버렸습니다.
a = 'test'
if b = a
p b # "test"
end
이것이라면 괜찮습니다. Ruby
if
의 원 라이너로 쓰는 방법 중 내용을 앞으로 가져올 경우는 이 nil 체크는 사용할 수 없는 것 같네요.nil 체크라는 단어가 올바른지 어떤지는 확실하지 않습니다. 누군가 아시면 이런 동작의 명칭을 가르쳐 주시면 발광합니다
Reference
이 문제에 관하여(Ruby에서 소수를 찾아 보았습니다. (엘라토스테네스의 체)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TurkeyLeg0403/items/f623f097002903cc9598텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)