松下昇への接近

 旧 湾曲していく日常

numdot問題とは

この2週間ほど、結城先生のnumdot問題に取り組んでいた。
https://codeiq.jp/ace/yuki_hiroshi/q468
問題完了しているので見れないが、次に書かれた数列のうち真ん中の半分ほどが消えていて見えないのでそれを復元せよとの問題。*1

挑戦完了後、結城先生から次の呟きが。

ナムドット問題の挑戦者さんへ。結城の問題についてはあなたの書いたコードを公開することはWelcomeです。明日(9/25)夜に送る解説にもリンクを入れたいので、このツイートにリプください。リンクを含むリプは挑戦者ご自身がツイートお願いします。明日朝10:00まで。 #CodeIQ


そこで、ここで公開することにしました。とりあえず。*2

もんだい!もんだい!

12345
1234.5
1235.4
123.45
123.4.5
1245.3
124.35
124.3.5
125.34
12.345
12.34.5
125.3.4
12.35.4
12.3.45
12.3.4.5
1345.2
134.25
134.2.5
135.24
13.245
13.24.5
135.2.4
13.25.4
13.2.45
13.2.4.5
145.23
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
1.2.34.5
15.2.3.4
1.25.3.4
1.2.35.4
1.2.3.45
1.2.3.4.5

回答(私の考え方)

ENV: 手書き、Ruby1.92、エクセル代用品(キングソフト
POINT: 「132.45」のような文字列がないのは何故か等考えていた。1〜5の数字を順に、最初のグループ、次のグループと置いていくという形で記述することができる。「12.3.4.5」を[11234]、「1345.2」を[12111]と読み取ることができる。これで翻訳してみるとみごとに規則性がでてきた。
0、恥ずかしながら正味一週間以上かかっている。19日の夜会社からの帰り道歩いている時ひらめいた。
1、最初rubyで、["1","2","3","4","5",".",".",".","."]という配列を作り、隣同士置換する手続きで既知の数列をすべて記述してみたが、規則性を発見できず。
2、上のような手続きでやると、「132.45」のような文字列も作れるが、それがないのはどうしてか等考えていた。1〜5の数字を最初のグループ次のグループと置いていくという形で記述することができる。「12.3.4.5」を[11234]、「1345.2」を[12111]と読み取ることができる。これで翻訳してみるとみごとに規則性がでてきた。しかしそれをプログラムで実行することができず、手書きでやって見ると行数もあった。
3、後者の操作数値列をエクセル類似品で適当に作成、テキストファイル化。
4、下記プログラム1で操作数値列を、dot付数字列に変換。
5、プログラム2で上の文字列の後ろに不要なdotが付いているのを削除。
6、CODEIQにエントリーし提出。
7、操作数値列をプログラムで作成できないか考える。
操作数値列は、11111から12345なので、最後を除くと、
1桁1個、2桁2個、3桁3個、4桁4個、5桁4個の96通りある。
これらのうち、数列のn桁目は「それまでの最大値+1」以下というルールがあるのでそれを選別。52通りになる。プログラム3のとおり。CODEIQに再度提出。9/23
8、プログラム3を少しきれいに訂正。三度目提出。 


・・・・プログラム1 (Rubyです。)

infile = open("suu2.txt","r:SJIS")
sa=""
sb=""
sc=""
sd=""
se=""
ss =""
while
line = infile.gets
i=0
while i<5
case line[i]
when "1" then
sa<< (i+1).to_s
when "2" then
sb<< (i+1).to_s
when "3" then
sc<< (i+1).to_s
when "4" then
sd<< (i+1).to_s
when "5" then
se<< (i+1).to_s
end
i=i+1
end
ss=sa<<'.'<

・・・・プログラム2

open("suu3.txt") {|file|
while line = file.gets
pos=line.rindex(/[1-5]/)
(9-pos).times{
line.chop!
}
p line
end
}

・・・・プログラム3

def ookii(num1, num2)
if num1 >= num2 then
return num1
else
return num2
end
end
mx=1
nuku=0
open("suu1.txt") {|file|
while line = file.gets
nb=line.split(",")
i=0
while i<5
if nb[i].to_i - mx >1 then
nuku= 99
i=i+1
else
mx=ookii(nb[i].to_i,mx)
i=i+1
end
end
if nuku == 0 then
print line[1,1]<

Anserの後書き

#書き直した。とりあえず次は、プログラムを1つにまとめたい。

私のようにプログラミング能力が低いものも参加できる問題を作っていただきありがとうございました。貴重な体験ができました。センスオブワンダーならぬセンスオブ数学、それは万人に開かれたものだという先生の精神を感じることができる問題でした。
ひどいプログラムなど読んでいただきありがとうございました。(終わり)

文化とは

何を恥と感じるかである。
上のプログラムは人様に公開できるものではない、それは分かっている。・・・ その文化にすっかりひたってないので、まあいいか。

*1:私はプログラミングの知識がほどんどない。それでもやってみた。

*2:このブログは、思想、反ネトウヨ系ブログかなあ、場違いだが