모리바사 소설 속 문제를 루비로 해결했다

12675 단어 Ruby
Ruby Advent Calendar 2018 11일째 투고다.
열흘째는 @Yuki-Inoue씨가 쓴'Daru에 대한 상세 설명: Index, Vector, 데이터 Frame에 대한 데이터 구조입니다.
다만 "수학 문제를 루비로 해결했다"는 기사가 나왔다.
잘못 붙인 것 같지만 달력이 하늘밖에 없어서 미끄러져 들어갔어요.

의사 일정

  • 개요
  • 문제.
  • 각본
  • 사고의 방향
  • 답안
  • 끝맺다
  • 개요


      웃지 않는 수학자 MATHMATICAL GOODBYE -
    센보사 저 1996년 9월 강담사 간행물
    천재수학자 천왕사 박사가 작품에서 수학 문제를 제기하다.
    극중 답을 밝히지 않아 이야기는 끝났다.
    읽은 후에 나는 그 문제에 도전했지만 결국 수학을 열심히 배워서 몇 년 동안 풀지 못했다.
    하지만 그간 배운 루비를 이용해 드디어 답을 찾았기 때문에 이번에는 기사를 써봤다.
    답은 마지막이며, 시간이 있는 사람은 스스로 해답을 시도해 볼 수 있다책을 손에 들고 좀 보아라.
    별말이지만 루비는 아무렇게나 쓸 수 있는 느낌을 좋아한다.나와 동갑인 곳도 괜찮다.형제object.c나랑 같은 날 태어났어.나는 언제 너에게 보양을 해 주고 싶다.
    루비이스트 님께서'더 짧게 써도 돼요!'"이게 뭐냐, 그 비주얼 코드는"이라고 토로해 주세요.잡담이 끝나다.

    문제.


    "그럼 질문 하나 더 할게요. 당구 다섯 개를 진주 목걸이처럼 반지에 연결해 주세요.
    옥에는 각각 번호가 쓰여 있다.그러면 이 다섯 개의 공 중 몇 개를 뽑을 수 있지만 인접한 연속구만 뽑을 수 있다.하나, 둘, 다섯 개 다 돼요.하지만 멀리 있는 물건은 찾을 수 없어요.
    이 조건에서 얻은 옥의 번호를 더하면 1부터 21까지의 모든 수량이 될 수 있다고 생각합니다.그렇다면 어떤 번호의 옥을 어떻게 배열해서 목걸이를 만들면 좋을까요?
    ※ 당구의 디지털 볼은 1~15종
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

    각본


    나는 내가 알고 있는 루비의 문법(극소수)을 활용하여 상술한 문제를 해결하는 스크립트를 썼다.
    몇 가지 답이 나왔지만 귀찮아서 그냥 같은 배열을 보여줬어요.답은 똑같을 거야.반대로 배열 패턴을 넣으면 두 개가 되겠죠.
    15부터 5순까지 모든 조합을 만들어 1-21의 숫자를 만들 수 있는지 판정한다.무력으로 해결하다.
    mathematical_goodbye.rb
    
    # ビリヤードの数字球は1-15
    billiard_ball = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
    
    # [f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f]
    # 22個のフラグ(可読性の為に22個用意、0番目は未使用)
    # 5つのビリヤード球から1を作れたら1番目をtに、15を作れたら15番目をtに…
    generated = Array.new(22, false)
    
    # [f,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t]
    # 1-21の数字を作れた場合の22個のフラグの状態。
    # 最終的にgeneratedとの比較に使用する。
    # 0番目のみがfになっている
    goal = Array.new(22, true)
    goal[0] = false
    
    # 15球から5つを選んだ場合の順列、全ての組み合わせに対して
    billiard_ball.to_a.permutation(5).to_a.each do |combination|
        # インデックス0,1,2,3,4
        (0..4).each do |n|
            # 数字球1つによる数字のフラグをtに
            generated[ combination[n] ] = true
            # 数字球2つ〃
            # 配列インデックスにおいて0未満を指定すると配列末尾にアクセス
            generated[ combination[n-1] + combination[n] ] = true
            # 数字球3つ〃
            generated[ combination[n-2] + combination[n-1] + combination[n]] = true
            # 数字球4つ〃
            generated[ combination[n-3] + combination[n-2] + combination[n-1] + combination[n]] = true
            # 数字球5つ〃
            generated[ combination[n-4] + combination[n-3] + combination[n-2] + combination[n-1] + combination[n]] = true
        end
    
        # 1-21を作れた場合、その順列を表示
        p combination if generated == goal
        # フラグを初期化 - すべてがFになる(笑
        generated = Array.new(22, false)
    end
    
    

    사고의 방향


    여기서 루비를 벗어나면 관심 없는 사람이 쏘기 때문이다답안.
    중도를 고려해 포기하는 부분을 설명하겠다.
    문제문을 읽고 필수적인 옥, 배제할 수 있는 옥 등을 열거하며 조합을 축소했다.상세한 해설을 알고 싶은 사람옛 격식이 얻을 수 있다면 수학적으로 답을 도출할 수 있는 기사를 찾을 수 있을 것이다.

    1. 규칙에 따라 만들 수 있는 숫자의 종류는 21가지이다


    한 옥...5종, 인접한 연속 2개...5종, 인접한 연속 3개...5종, 인접한 연속 4개...5종, 5옥...1종
    따라서 1~21씩 한 조씩 만들어야 한다.

    2. 1 과 2가 있어야 합니다.


    1과 2는 숫자구로 조합할 수 없다.그러므로使用する玉「1,2,?,?,?」 残りの玉「3,4,5,6,7,8,9,10,11,12,13,14,15」

    3. 공 5개를 뽑았을 때 가장 큰 숫자는 21이다.


    1과 2는 이미 확정되었기 때문에 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 중 3개를 선택한다.
    이 세 개는 총계 21-1-2=18이다.
    12를 선택했다면 나머지 2개는 어느 팀 3개를 선택했는지 총 18개가 넘는다.따라서 12를 제외한다.
    같은 이유로 13, 14, 15도 제외했다.그러므로使用する玉「1,2,?,?,?」 残りの玉「3,4,5,6,7,8,9,10,11」

    그리고 촌스러움...


    3, 4, 5, 6, 7, 8, 9, 10, 11 중 3개를 선택해 총 18개로 구성했다.
    이를 만족시키는 조합은:(3,4,11), (3,5,10), (3,6,9), (3,7,8), (4,5,9), (4,6,8), (5,6,7)(이 세 공에 1,2.)
    그중 (5,6,7)4를 만들 수 없기 때문에 제외
    나머지 조합은요.(3,4,11), (3,5,10), (3,6,9), (3,7,8), (4,5,9), (4,6,8)여기에 3이 포함된 4조, 1, 2는 인접할 수 없다(∵3이 되어 이미 있는 3개의 공과 중복된다)
    또한 4가 포함된 두 그룹은 1, 2와 인접해야 한다(∵3을 만들기 위해)(3,4,11) 이러한 조건을 동시에 충족할 수 없으므로 제외
    따라서 축소(3,5,10), (3,6,9), (3,7,8), (4,5,9), (4,6,8)할 수 있다.
    숫자구 한두 개를 더하다(1,2,3,5,10), (1,2,3,6,9), (1,2,3,7,8), (1,2,4,5,9), (1,2,4,6,8)되다
    여기에 투항합니다!\(^o^)/
    이 정도면 나머지는 종이와 연필로도 힘을 쓸 수 있다?
    난 못해.
    말하자면 그룹 문제가 잘 해결된다면 이런 지루한 말을 쓸 필요가 없을지도 모른다.
    천왕사 박사서천 선생님에게 해법을 알려주세요.
    그나저나 지금까지 사용한 당구는 1, 23,4,5,6,7,8,9,10から3つ로, 스크립트billiard_ball에서 11개 이상의 숫자를 삭제하면 계산량을 줄여 컴퓨터를 편하게 할 수 있다.

    답안


     (1, 3, 10, 2, 5)
     (1, 5, 2, 10, 3)
    각 숫자의 취법을 생략하다.

    끝맺다


    올해가 사회 첫해였고 익숙하지 않은 부분도 있었다. 이렇게 여유롭게 advent callendar에 투고할 수 있어서 한숨 돌렸다.
    새해 복 많이 받으세요!2019년에도 좋은 해가 됐으면 좋겠다.
    그럼 신원호를 일찍 알고 싶군요!원림그럼 어떡해.

    좋은 웹페이지 즐겨찾기