13
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

最終課題:Google入社試験

Last updated at Posted at 2020-12-22

!macOS-11.0.1 !ruby-2.6.1p33

はじめに

本稿はマルチスケールシミュレーションという講義の最終課題についての記事です

目次

  1. 課題内容

  2. 課題解答

  3. 発展問題

  4. 参考資料

課題内容

課題:Google recruit problem, exp and prime

(Rubyを用いて)e(自然対数の底)の値で連続する10桁の数のうち,最初の素数を求めよ

2.71828182845904523536028747135266249775
7247093699959574966967627724076630353547
5945713821785251664274274663919320030599
2181741359662904357290033429526059563073
81323286279434907632338298807531952510190

課題解答

まぁ、つまりは数値をどんどん読み込んでいって、10桁ずつ数値取り出して、

それらが素数かを判定するプログラムを書けということ。

なるほど。。。

いかに実際に作ったコードを記載する。

Google_Recruit.rb
require "./assert_equal"

# 素数判定
def prime(n)
    monitor = 1
    # max = n-1 #実行時間遅い
    max = Math::sqrt(n).to_i+1 # 実行時間早い
    (2..max).each do |i|
	    if n%i == 0
		    break
	    end
	    monitor = i
    end
    return true if monitor == max
    return false 
end    

# テキストの読み込み
def read_exp
    exp1=gets.to_s.chomp
end

# Main
exp1 = read_exp()
for t in 2..191
    last = t+10-1 
    num = exp1[t..last]
    # puts num + "...実行中" # 動作確認用
    if prime(num.to_i) == true
	    puts "\n\nanswer = " + num
	    break
    end
end

これで完成、と言いたいところですが、、、

一応、class化もしてみました。

Google_Recruit_class.rb
require "./assert_equal"

class Google
    attr_accessor :exp
    def initialize(exp="")
	    @exp = exp
	    @num = 0
    end

    def to_loop
	    len = @exp.length-2 
	    for t in 2..(len-9)
		last = t+9
		@num = @exp[t..last].to_i
		# puts @num.to_s + "...実行中" # 動作確認用
		if to_prime == true
			puts "\n\nanswer = " + @num.to_s
			break
		end
	    end
    end

    def to_prime
	    monitor = 1
	    # max = @num-1 #実行時間遅い
	    max = Math::sqrt(@num).to_i+1 # 実行時間早い
	    (2..max).each do |i|
		    if (@num)%i == 0
			    break
		    end
		    monitor = i
	    end
	    return true if monitor == max
	    return false 
    end    
end

greeter = Google.new()
greeter.exp = gets.to_s.chomp
greeter.to_loop

作ってみたのはいいけど、なんか冗長になっている。。。

でもプログラムとしてはまとまった気もする。

以下に出力結果を載せます。

$ ruby Google_Recruit.rb < exp.txt
answer = 7427466391

$ ruby Google_Recruit_class.rb < exp.txt
answer = 7427466391

発展問題

Congratulations. You've made it to level 2. Go to www.Linux.org and enter Bobsyouruncle as the login and the answer to this equation as the password.

f(1)=7182818284

f(2)=8182845904

f(3)=8747135266

f(4)=7427466391

f(5)=__________

引用:類題

解答編

まずは、これらの法則を見つけたい。。

何番目から始まっているかとか、これらの数字自体が数列になっていないかなど、

いろいろ調べましたが、 結果、足し算したら合計値が49になるということが判明しました。

というわけでプログラムです。↓↓

Google2.rb

# テキストの読み込み
def read_exp
    exp1=gets.to_s.chomp
end

# Main
exp1 = read_exp()
sum = 0
for start in 2..191
    last = start+10-1
    num = exp1[start..last]
    if start == 2 then
		for i in start..last
			sum += exp1[i].to_i
		end
    else
		sum -= exp1[start-1].to_i
		sum += exp1[last].to_i
    end
    if sum == 49
		puts num.to_s + ", " + sum.to_s
    end
end

↓結果画面↓

$ ruby Google2.rb < exp.txt

7182818284
8182845904
8747135266
7427466391
5966290435
2952605956

工夫ポイントとしては、

次の10桁に移る際に、最初の数字を引いて、次の数字を足すだけにした というところです。

個人的には少し早くなったのではないだろうかと予測しています

参考

以下のサイトを参考にしました。


  • source ~/grad_members_20f/members/Rooter-edi/qiita/Google_Recruit.org
13
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?