rubyです。
0以上且つ9桁以下の整数値データを渡すと、加工して返す関数を作成しました。
行っている処理は
①送り値の数値を一桁ずつ調べていき、
1.その桁の数値が『1』 且つ
2.左右隣二ケタが『0』 の時、その桁の値を0にする。 (20011001 -> 20011000)
②数値の一の位が『0』の時、その桁が0にならなくなるまで削除する(10で割る) (20011000 -> 20011)
です。
一応動くには動くのですが、
エンターキー一つで100回くらい呼び出されることもあるので
出来る限り処理を軽くしたいです。
お知恵を拝借できればと思います。
よろしくお願いいたします。
尚、関係することはないと思いますが
各桁の数値は最高4で、5以上の数値は入りません。
ruby
1def mj_arano(arano) 2 maisu = [0,0,0,0,0,0,0,0,0,0,0,0,0] # 0 to 12 3 maisu[2] = arano / 100000000 4 maisu[3] = (arano / 10000000) % 10 5 maisu[4] = (arano / 1000000) % 10 6 maisu[5] = (arano / 100000) % 10 7 maisu[6] = (arano / 10000) % 10 8 maisu[7] = (arano / 1000) % 10 9 maisu[8] = (arano / 100) % 10 10 maisu[9] = (arano / 10) % 10 11 maisu[10] =(arano / 1) % 10 12 i = 2 13 while i <= 10 14 if maisu[i]==1 then 15 if maisu[i-2]==0 && maisu[i-1]==0 && maisu[i+1]==0 && maisu[i+2]==0 then 16 maisu[i] = 0 17 i = i + 2 #少しでもループを短くする 18 end 19 end 20 i = i + 1 21 end 22 arano = 0 23 arano = arano + (maisu[2] * 100000000) 24 arano = arano + (maisu[3] * 10000000) 25 arano = arano + (maisu[4] * 1000000) 26 arano = arano + (maisu[5] * 100000) 27 arano = arano + (maisu[6] * 10000) 28 arano = arano + (maisu[7] * 1000) 29 arano = arano + (maisu[8] * 100) 30 arano = arano + (maisu[9] * 10) 31 arano = arano + (maisu[10] * 1) 32 33 #後ろ0の削除(2011200 -> 20112) 34 while (arano % 10) == 0 && arano != 0 35 arano = arano / 10 36 end 37 38 return arano 39end 40 41okuri=1010001 #数値は一例 42mj_arano(okuri) # 101 43 44okuri=200010100 45mj_arano(okuri) # 200010100 46 47okuri=10010001 48mj_arano(okuri) # 0
▼▼追記10/03/21 17:46▼▼
▼▼改定10/03/23 20:57▼▼
下に長くなったのでまとめたコードを記載しておきます。
ruby
1def mj_arano(arano) 2 if "00#{arano}00".index('00100') 3 if arano < 1000000 then 4 arano = "00#{arano}00".gsub(/001(?=00)/, '000').to_i 5 else 6 maisu = [0,0,0,0,0,0,0,0,0,0,0,0,0] # 0 to 12 7 maisu[2] = arano / 100000000 8 maisu[3] = (arano / 10000000) % 10 9 maisu[4] = (arano / 1000000) % 10 10 maisu[5] = (arano / 100000) % 10 11 maisu[6] = (arano / 10000) % 10 12 maisu[7] = (arano / 1000) % 10 13 maisu[8] = (arano / 100) % 10 14 maisu[9] = (arano / 10) % 10 15 maisu[10] =(arano / 1) 16 i = 2 17 while i <= 10 18 if maisu[i]==1 then 19 if maisu[i-2]==0 && maisu[i-1]==0 && maisu[i+1]==0 && maisu[i+2]==0 then 20 maisu[i] = 0 21 i += 2 22 end 23 end 24 i += 1 25 end 26 arano = 0 27 arano += maisu[2] * 100000000 28 arano += maisu[3] * 10000000 29 arano += maisu[4] * 1000000 30 arano += maisu[5] * 100000 31 arano += maisu[6] * 10000 32 arano += maisu[7] * 1000 33 arano += maisu[8] * 100 34 arano += maisu[9] * 10 35 arano += maisu[10] 36 end 37 end 38 #後ろ0の削除(2011200 -> 20112) 39 arano /= 10 while (arano % 10) == 0 && arano != 0 40end
問題文読解力不足のため削除
回答5件
あなたの回答
tips
プレビュー