前提・実現したいこと
ruby初心者です。pythonは長い間触っています。二分探索のrubyのプログラムをpythonに書き換えることをやっています。rubyでの動作は正常なのですが、pythonで実行するとループを抜け出せず探索終了されません。
発生している問題・エラーメッセージ
移植後pythonのchecking_answer関数が、
python
1checking_answer( n, ans , d) == True
とならないため、
python
1while i + 1 < total
を繰り返している感じになっています。
該当のソースコード
元のソース
ruby
1@d = [ 2 13, 7, 10, 6, 11, 11, 5, 8, 16, 7, 11, 18, 12, 9, 3 14, 13, 7, 15, 12, 16, 15, 12, 9, 20, 22, 15, 12, 11, 8 4] 5 6@n = gets.chomp.to_i 7@total = @d.inject(:+) 8 9# 指定した間隔を開けて配置できるかチェック 10def puttable(interval) 11 @d.length.times do |start| # 開始駅 12 pos = start 13 over = 0 # 1周回った回数 14 1.upto(@n) do |i| 15 d = 0 16 while d < interval do 17 d += @d[pos] 18 pos = (pos + 1) % @d.length 19 over += 1 if pos == start 20 end 21 end 22 # 1周回っていないか、1周回ってちょうど開始駅にいればOK 23 return true if (over == 0) || ((over == 1) && (pos == start)) 24 end 25 false 26end 27 28l = 0 29h = @total 30 31while l + 1 < h do 32 # 二分探索 33 m = (l + h) / 2 34 if puttable(m) 35 l = m 36 else 37 h = m 38 end 39end 40 41puts l 42
pythonに移植後が以下です。data.pyには、d = [ 8, 14, 13, 7, 15 ]などの配列が入っています。配列を別ファイルから取ってくることは、printで動作確認できています。
python
1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4import data 5 6def checking_answer( n, ans , d): 7 for start in range( len( d ) ): 8 current = start 9 loop = 0 10 11 for sentinel in range( n ): 12 dist = 0 13 while dist < ans: 14 dist += d[current] 15 current = ( ( current + 1) % len( d ) ) 16 17 if ( current == start): 18 loop += 1 19 20 if ( loop == 0 ) or ( (loop == 1 and current == start) ): 21 return True 22 23 return False 24 25 26def main(): 27 # 別ファイル data.py の変数を持ち込み 28 d_num = int(input("What number of data do you use? → ")) 29 print("Use the data named 'd%d'" %d_num) 30 if d_num == 0: 31 d = data.d0 32 elif d_num ==1: 33 d = data.d1 34 elif d_num ==2: 35 d = data.d2 36 elif d_num ==3: 37 d = data.d3 38 elif d_num ==4: 39 d = data.d4 40 41 #print(d) 42 43 # 人数nを指定 44 n = int(input("Please input n . → ")) 45 46 # 2分探査 47 i = 0 48 #c = 0 49 total = sum(d) 50 while i + 1 < total: 51 #c += 1 52 ans = (i + total) // 2 53 #print(ans) 54 if checking_answer( n, ans , d) == True: 55 i = ans 56 #print("No.%d is ok" %c) 57 break 58 else: 59 toal = ans 60 61 print("ans = %d\n" %(i)) 62 63 print("Finish the program.") 64 65main() 66
試したこと
データを別ファイルから取ってくるのが原因かと、プログラム内で直接データを指定しても関係なし。printデバックで不具合箇所を探すと、ループ箇所が上記の通りとなりました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/06 02:06