0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【今更ながらChatGPT③】QuizKnock動画内の問題を解くRubyプログラムを作ってもらう

Posted at

前提条件

  • QuizKnockの動画を見て、動画内容の様なプログラムを作りたくなったのでChatGPTに作って貰う。
- Rubyプログラムを1度も書いたことが無い。

ChatGPTへの依頼

以下は、Rubyプログラムの要件定義をまとめたものとなり、この要件に従いプログラムを作成して。

ゲームの要件定義

ゲームの目的:
このゲームの目的は、プレイヤーが与えられた数字を全て使って、目標数字を作成する数式を見つけることです。

ルール:

  1. プレイヤーが提供する入力は、"使う数字"(4個~6個、順不同、カンマ区切り、全て利用)と "求める数字"(1個)です。
  2. プログラムは、"求める数字"を作成するための可能な数式を1つ提示します。
  3. 数式は、四則演算(演算記号と括弧)を使用して構築されます。
  4. 四則演算は、括弧内の計算、乗算/除算、加算/減算の順序に従います。同じ優先順位の演算子は左から順に処理されます。
  5. 数式が出来ない場合は「階なし」と出力します。

サンプル入力と出力の例:

  1. 入力: "2,5,5,9"、"13"
    出力:

    答えの数式:(9-5)*2+5=13
    
  2. 入力: "4,8,8,9"、"23"
    出力:

    答えの数式:(8-4)*8-9=23
    
  3. 入力: "5,6,7,9"、"19"
    出力:

    答えの数式:6*9-5*7=19
    

以上がゲームの要件定義です。この要件に基づいて、Rubyプログラムを開発し、与えられた数字と目標数字に基づいて数式を生成し、解を見つけるロジックを実装してください。


結論

  • なかなかと難しくまだ出来ていない。
def find_equation(numbers, target)
    # 数字の組み合わせを試すための再帰関数
    def find_solution(numbers, target)
      if numbers.length == 1
        return numbers[0] == target ? numbers[0].to_s : nil
      end
  
      (0...numbers.length).each do |i|
        num = numbers[i]
        remaining = numbers[0...i] + numbers[i+1..-1]
  
        # 加算の場合
        add_solution = find_solution(remaining, target - num)
        return "(#{add_solution}+#{num})" if add_solution
  
        # 減算の場合
        sub_solution = find_solution(remaining, target + num)
        return "(#{num}-#{sub_solution})" if sub_solution
  
        # 乗算の場合
        if target % num == 0
          mul_solution = find_solution(remaining, target / num)
          return "(#{mul_solution}*#{num})" if mul_solution
        end
  
        # 除算の場合
        div_solution = find_solution(remaining, target * num)
        return "(#{num}/#{div_solution})" if div_solution
      end
  
      return nil
    end
  
    solution = find_solution(numbers, target)
  
    if solution
      solution = solution.gsub(/[\[\]\"\\]/, '') # 不要なエスケープ文字を削除
      return "答えの数式:#{solution}=#{target}"
    else
      return "階なし"
    end
  end
  
  # 4文字から6文字の数字を入力するように制限
  input_numbers = []
  until input_numbers.length >= 4 && input_numbers.length <= 6
    puts "4文字から6文字の数字をカンマ区切りで入力してください(例: 2,5,5,9,1,3):"
    input_numbers = gets.chomp.split(',').map(&:to_i)
  end
  
  puts "求める数字を入力してください(例: 13):"
  target_number = gets.chomp.to_i
  
  # ゲームをプレイ
  result = find_equation(input_numbers, target_number)
  puts result

4文字から6文字の数字をカンマ区切りで入力してください:
2,5,5,9
求める数字を入力してください:
13
答えの数式:(((5-9)*2)+5)=13
→(9-5)*2+5だと正解。

4文字から6文字の数字をカンマ区切りで入力し
てください:
3,5,8,9
求める数字を入力してください:
24
答えの数式:(3-((5-8)*9))=24
→(8-5)*9-3だと正解。

4文字から6文字の数字をカンマ区切りで入力し
てください:
1,3,5,7
求める数字を入力してください:
19
答えの数式:(1-((3-7)*5))=19
→(7-3)*5-1だと正解。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?