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

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

ただいまの
回答率

90.53%

  • Python 3.x

    6292questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • アルゴリズム

    407questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

python数値の求め方

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 239

zeitaku_fire

score 18

皆様からのご指摘ありがとうございます。
ルールを明確に伝えられてなくて、本当にすいません・・・・。
ルールがわからなければ、回答できない。・・・おっしゃるとおりだと思います。

『ルール』
・縦の合計が、必ず34
・数字が重複することはありません。
1~16の数字が必ず1個入ります。
・入力データの数字はランダムで形成されます。
・入力データには、0が必ず2個形成されます ※0が形成される場所もランダムです
横もしくは縦に続けて0が配置される可能性もございます。
・縦に0が2個入る場合は、出力する数字はどちらでもかまいません。
下記の場合、1 2 3 4 でも、1 2 11 4でも正となります。

『ケース3.入力データ』
8  7  6  5
1  2  0  4
16 15 14 13
9 10  0 12

『3.出力結果 パターン1』
8  7  6  5
1  2  3  4
16 15 14 13
9 10 11 12

『3.出力結果 パターン2』
8  7  6  5
1  2 11  4
16 15 14 13
9 10  3 12

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/06/19 14:12

    「7,7でも別に良い」って認識だったんだけどな・・・3,11である必要があるなら、R.Shigemoriさんの仰る通り他にルールが必要なので、明文化してください。どんなルールなのか見当がつかない(というかいろいろ考えられる)ので、方針が示せません

    キャンセル

  • fuzzball

    2018/06/19 14:13

    ようするに、1〜16の数字が一つずつあるってことかな‥。

    キャンセル

  • zeitaku_fire

    2018/06/19 14:28

    皆様ご指摘ありがとうございます。 質問本文を一新させました。

    キャンセル

回答 3

checkベストアンサー

+1

縦の合計が、必ず34
・数字が重複することはありません。
1~16の数字が必ず1個入ります。
・入力データには、0が必ず2個形成されます ※0が形成される場所もランダムです

より、入力データから、2つの値が0になってしまった と考えます。
そこで、その数値と位置を特定します。
あとはその2つの数値を0の代わりに埋めてみて、縦計が34であるほうを採用すればよいです。
2つの数値しかないので探索パターンは2×1=2回でよいです。
ちなみに、仮に3個が0になった場合なら3×2×1=6回になります。

import numpy as np
import itertools

"""
条件を満たす行列を生成。テストデータ作成用
for one in itertools.permutations(range(1,17)):
    a = np.array(one).reshape(4,4)
    if all(a.sum( axis=0) == 34):
        print(a)
"""

# 15と14が0に置き換わったデータ例
l =[[ 1, 2, 3, 4],
    [ 8, 7, 6, 5],
    [ 9,10,11,12],
    [16, 0, 0,13]]

# 8と9が0に置き換わったデータ例
l = [[ 1, 2, 3, 4],
     [ 5, 0,10,11],
     [16,15,14,13],
     [12, 0, 7, 6]]

# 8,12,14,15が0に置き換わったデータ例
l =[[ 1, 2, 3, 4],
    [ 0, 7, 6, 5],
    [ 9,10,11, 0],
    [16, 0, 0,13]]

a = np.array(l)
print(a)

# 0になった値を特定
s = set(range(1,17)) - set(a.flatten())
print(s) # {8,9}

# 0の位置を特定
ps = np.where( a == 0)
print(ps) # (array([1, 3], dtype=int64), array([1, 1], dtype=int64))

# あとは 各パターンにおいて、各列計すべて34であるものを採用する
# 縦に0が並んでいれば複数のケースで条件を満たすので、最初のほうでよい。
for vals in itertools.permutations(s): # (8,9), (9,8)
    print(vals)
    # 0を数値で埋める
    tmp = a.copy()
    for i in range(len(s)):
        tmp[ps[0][i],ps[1][i]] = vals[i]

    # 条件を満たす
    if all(tmp.sum( axis=0) == 34):
        print(tmp)
        break

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/19 16:55

    ありがとうございます。
    質問があいまいだったため、大変お手数おかけいたしました。

    キャンセル

  • 2018/06/19 17:59

    問題が整理できれば、比較的素直に解ける問題かと思います。
    なお、0の個数が2以外の場合も考慮して回答を修正しました。

    キャンセル

+1

ケース1とケース2、一要素ずつmax()で大きい方を残すようにするのはいかがでしょう?

ケース1
1  2  3  4
8  7  6  5
9 10 11 12
16  0  0 13

ケース2
1  2  3  0
8  0  6  5
9 10 11 12
16 15 14 13

出力にあったっての計算
max(1, 1)  max(2, 2) ...(あと省略)
max(8, 8)  max(7, 0) ...(あと省略)
max(9, 9)  max(10, 10) ...(あと省略)
max(16, 16) max(0, 15) ...(あと省略)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

問題の定義通り、縦に加算した値を見ていくのでは駄目ですか? 

とりあえず縦に複数の0は出現しないと想定。

data = [[8,7,6,5],
        [1,0,3,4],
        [16,15,14,13],
        [9,10,0,12]]

result = []
for col in zip(*data):
    if sum(col) == 34:
        result.append(col)
    else:
        tmp = list(col)
        tmp[tmp.index(0)] = 34 - sum(col)
        result.append(tmp)

print(list(map(list, zip(*result))))
# => [[8, 7, 6, 5], [1, 2, 3, 4], [16, 15, 14, 13], [9, 10, 11, 12]]

zipでlistを転置する方法を利用しています。参考:
Python標準で転置行列

 追記

作ってみました。上のコードを多少書き換えただけ。ヘンなデータが入ってきたときのことはまったく考えていません。

data1 = [[8,7,6,5],
         [1,0,3,4],
         [16,15,14,13],
         [9,10,0,12]]

data2 = [[8,7,6,5],
         [1,2,0,4],
         [16,15,14,13],
         [9,10,0,12]]

def f(data):
    result = []
    for col in zip(*data):
        if sum(col) == 34:
            result.append(col)
        else:
            if col.count(0) == 1:
                # 一列に0が1つのとき
                tmp = list(col)
                tmp[tmp.index(0)] = 34 - sum(col)
                result.append(tmp)
            else:
                # 一列に2つあるとき
                fillvals = [i for i in range(1, 17) if i not in sum(data, [])]
                result.append([fillvals.pop() if e == 0 else e for e in col])

    return list(map(list, zip(*result)))

print(f(data1))
print(f(data2))
""" =>
[[8, 7, 6, 5], [1, 2, 3, 4], [16, 15, 14, 13], [9, 10, 11, 12]]
[[8, 7, 6, 5], [1, 2, 11, 4], [16, 15, 14, 13], [9, 10, 3, 12]]
"""

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    eclipseでアクセス制限エラーが発生する

    eclipseのjavaプロジェクトでエンコードを変えたら以下のエラーが出るようになってしまいました。 どうすればエラーを無くせるのでしょうか? アクセス制限: 型 BASE6

  • 解決済

    [Laravel] バリデーションで同じ値かどうかのチェック

    Laravelを学習中です。 メールアドレスなどで入力ミスを防ぐために、よく2回入力させるケースなどがありますが、どの場合はどのようにバリデーションすればよいのでしょうか? 現在

  • 解決済

    C# Xamlで雨のアニメーションをする方法について

    Windowsストア向けのゲームをC#, Xamlで作っています。 ゲームの背景に雨のアニメーションを流したいです。 水滴の画像を用意して、Imageコントロールを複数配置する(そ

  • 解決済

    php同士の呼び出し

    職業訓練校を卒業し現場に出たての未経験初心者です。 質問が下手だと思いますが失礼致します。 現場でABテストの作成を任せられて行き詰っています。 パターンA メインのphp(m

  • 受付中

    SVMの評価指標

    SVMについてです. 統計解析ソフトRにて機械学習を行っています. このソフトに限ることではないのですが,SVMにおける ・Training error  ・Cross vali

  • 解決済

    ランダムな条件のSELECTの結果

    なぜそうなるのかわかなくなったので教えてください。 MariaDBなんですが、phpMyAdminを使ってSELECTした結果がなぜそうなるのかわからないんです。 poin

  • 解決済

    【求む】待ち時間の計算方法

    とあるショップの待ち時間の計算をどうしたものかと悩んでいます。 ショップの開店から閉店までの時間を30分で区切って、 その間に来店した顧客の人数を2年間貯めたものがデータと

  • 受付中

    二つの回答を用意して、そのどちらかをランダムで答えさせる方法を教えてください

    // リンゴ、ミカン、バナナのいずれかを認識するサンプルプログラム SPC_ANSWER answer; std::vector<std::string> answerWor

同じタグがついた質問を見る

  • Python 3.x

    6292questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • アルゴリズム

    407questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。