質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1112閲覧

rubyからpythonへの移植でループが起きてしまう

WindowppleMacin

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/06 00:10

前提・実現したいこと

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デバックで不具合箇所を探すと、ループ箇所が上記の通りとなりました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

二分探索がちゃんと書けてるのであれば、途中でbreakしなくても止まります。
移植前後で何をするコードなのかわからないので、正常な動作かはわかりませんが、無限ループは

Python

1 toal = ans

ここのタイポが原因です

投稿2020/08/06 01:19

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WindowppleMacin

2020/08/06 02:06

なんとも単純なミス... すみません、正常に動きました ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問