-
Notifications
You must be signed in to change notification settings - Fork 0
/
q02.rb
58 lines (51 loc) · 1.88 KB
/
q02.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# sanitizeメソッド以外はとりあえず自分で書き出し。
# 1...3は3未満まで、の意味。i < 3。untilでし。
# 1..3は3までの意味。i < 4。byでし。
# # 演算子と''を変数opに定義する
# 1000から9999までイテレート(.upto() do |i|)
# イテレートの回数をto_sしてあとで数字にできるようにしておく。
# 演算子sをそれぞれイテレート(for i in 1...5)
#iの数をreverseした数に加減乗除演算子を間に挟んだ形にする。
#1つ以上演算子を入れたいので、4より大きいlengthを指定
# 文字列valの中身を式として使えるeval(val)使う。
# 0で割ると例外が起きるので、 ZeroDivisionErrorが起きた時はeという変数に格納しといてという指示
# # 他に例外が起きたら全部eという変数に格納しといて、という指示
def sanitize(val)
nums = val.split(/[-\+*\/]/).collect{|n| n.to_i.to_s}
ops = val.split(/[0-9]/).select{|o| o != ''}
str = ''
nums.each_with_index do |n,i|
str += n
str += ops[i] if ops[i]
end
str
end
# ここから( ^ω^ )
op = ['+', '-', '*', '/', '']
1000.upto(9999) do |i|
c = i.to_s
for j in 0...op.length
for k in 0...op.length
for l in 0...op.length
val = c[3] + op[j] + c[2] + op[k] + c[1] + op[l] + c[0]
val = sanitize(val)
if val.length > 4
begin
if i == eval(val)
puts(val + '=' + c)
end
rescue ZeroDivisionError => e
rescue => e
p e.message
p e.backtrace
p val
end
end
end
end
end
end
# 所感
# ほぼほぼすんなり書けたヽ(*^ω^*)ノ
# 問題を解く時に、一番最初に作る部分はif i == eval(val)のところなんだろうな。
# 8割以上OKだったので、次の問題に行くことにする。