0

これは3 桁の数字を使った牛と牛のゲームのシミュレーションです

2 つの数値の間で牛と雄牛の数を取得しようとしています。1 つはコンピューターによって生成され、もう 1 つはユーザーによって推測されます。私が持っている 2 つの数値を解析したので、それぞれ 3 つの要素を持つ 2 つのリストがあり、各要素は数値の数字の 1 つです。そう:

237 でリストが表示され[2,3,7]ます。そして、相対インデックスが維持されるようにします。一般的なパターンは次のとおり(hundreds, tens, units)です。

machineそして、これら 2 つのリストはとの 2 つのリストに格納されますperson

アルゴリズム 1

そこで、次のコードを書きました。最も直感的なアルゴリズム:

cowsbullsこのループの開始前に 0 に初期化されます。

for x in person:
    if x in machine:
        if machine.index(x) == person.index(x):
            bulls += 1
            print x,' in correct place'
        else:
            print x,' in wrong place'
            cows += 1

そして、コンピューターが推測したさまざまな種類の数字でこれをテストし始めました。

かなり無作為に 277 に決めました。そして推測では 447 でした。ここで、このアルゴリズムが機能しない可能性があるという最初の手がかりを得ました。牛1頭、雄牛0頭です。雄牛1頭と牛1頭を飼うべきだったのに。

これは、最初のアルゴリズムを使用した出力の表です。

Guess        Output            Expected Output

447     0 bull, 1 cow          1 bull, 0 cow 
477     2 bulls, 0 cows        2 bulls, 0 cows
777     0 bulls, 3 cows        2 bulls, 0 cows

したがって、コンピューターによってランダムに選択された数字に数字が繰り返されている場合、明らかにこのアルゴリズムは機能していませんでした。

これらのエラーが発生する理由を理解しようとしましたが、できませんでした。私はたくさん試しましたが、アルゴリズムに間違いは見られませんでした(おそらく私が書いたからです!)

アルゴリズム 2

これについて数日間考えたとき、私はこれを試しました:

cowsbullsこのループの開始前に 0 に初期化されます。

for x in range(3):
    for y in range(3):
            if x == y and machine[x] == person[y]:
                bulls += 1
            if not (x == y) and machine[x] == person[y]:                   
                cows += 1

こっちの方が期待できました。しかし、私がこれをテストしたとき、これは私が得たものです:

Guess        Output            Expected Output

447     1 bull, 1 cow          1 bull, 0 cow 
477     2 bulls, 2 cows        2 bulls, 0 cows
777     2 bulls, 4 cows        2 bulls, 0 cows

ここで私が犯している間違いは明らかです。数字が何度も何度も数えられていることがわかりました。

例: 277 対 477

雄牛を数えると、2頭の雄牛が出てきて大丈夫です。しかし、牛を数える場合:

  1. 1 位の 277 の 7 は 10 位の 477 の 7 と一致するため、牛が生成されます。
  2. 10 の位の 277 の 7 は、1 の位の 477 の 7 と一致するため、牛が生成されます。

ここで、コードをそのように書いたので、一致は正確です。しかし、これは私が望むものではありません。そして、この後どうすればいいのか全くわかりません。

さらに...

コンピューターによって選択された数字に数字が繰り返されていない場合、両方のアルゴリズムが完全に機能することを強調したいと思います。

4

6 に答える 6

5
def digits(number):
    return [int(d) for d in str(number)]

def bulls_and_cows(guess, target):
    guess, target = digits(guess), digits(target)
    bulls = [d1 == d2 for d1, d2 in zip(guess, target)].count(True)
    bovine = 0
    for digit in set(guess):
      bovine += min(guess.count(digit), target.count(digit))
    return bulls, bovine - bulls

bulls_and_cows(277, 447)1 頭の雄牛と 0 頭の牛が返されることに注意してください。これは私が個人的に予想することです: 447 の 7 には雄牛が既にいるのに、なぜ 277 の最初の 7 が牛としてカウントされるのでしょうか?

于 2013-06-26T10:18:48.083 に答える
1
Here is an algorithm which compares digits and positions.
I use it in a program for finding the target in a 4-digit 
version of the game when the target can begin with "0". 
It works with or without repeating digits equally well.
In the table below are shown all 9 results/values of variable 
ED (Equal Digits) when comparing digits in each position of  
the guess 447 with each digit of the target 447, for the 
special case when the guess G$(3) equals the target T$(3)*.
For any other case the table is different and the values for 
B and C will change accordingly. 
It's a fact that for us, humans it's easier to count 
Bulls and Cows without repeating digits. 
With repeating digits I need to see the table below.
        !!!Important!!! 
Do not judge the values for B and C. Just use them. 

    4  4  7       3 Bulls      3 Cows
   --------        (I=J)       (I<>J)
 4| 1  1  0       1  .  .      .  1  .   
  |                    
 4| 1  1  1       .  1  .      1  .  1
  |                      
 7| 0  0  1       .  .  1      .  .  .



Here is the algorithm in Liberty BASIC:
'-------------------------------------
[calculate_Bulls_and_Cows]
B = 0: C = 0
        FOR I=1 TO 3
            FOR J=1 TO 3
                ED=(T$(I)=G$(J)) 'finding Equal Digits makes ED=1
                B = B+ED*(I=J)   'Bulls increment when ED*(I=J)=1
                C = C+ED*(I<>J)  'Cows increment when ED*(I<>J)=1
            NEXT J
        NEXT I
return
'------------------------------------
_________

*In this case I decided Digits to be considered 
text variables because of some benefits when 
it wasn't restricted the target to begin with "0".
于 2013-11-23T05:09:07.420 に答える
1

.index()指定された入力が最初に出現したインデックスを返します。

>>> [1, 5, 5].index(5)
1

enumerate()可能なすべてのインデックスを取得するには、代わりに使用する必要があります。

>>> for i, j in enumerate([1, 5, 5]):
...     if j == 5:
...             print i
... 
1
2

zip()ただし、私が間違っていない限り、これは で実行できるようです:

for x, y in enumerate(zip(player,computer)):
    if y[0] in computer and not y[0] == y[1]:
        print y[0], "is in the number"
        cows += 1
    elif y[0] == y[1]:
        print y[0], "in the correct place"
        bulls += 1
    else:
        print y[0], "is not in the number"

player = [4, 4, 7]:

4 is not in the number
4 is not in the number
7 in the correct place
>>> cows
0
>>> bulls
1

player = [4, 7, 7]:

4 is not in the number
7 in the correct place
7 in the correct place
>>> cows
0
>>> bulls
2
于 2013-06-26T09:45:28.357 に答える
0
def game(a,b,c,d):
    from random import randint
    m=randint(0,9)
    n=randint(0,9)
    o=randint(0,9)
    p=randint(0,9)
    cow=bull=0
    A={a:m,b:n,c:o,d:p}
    k=A.keys()
    v=A.values()
    bull=cow=0
    for i in k:
        if i==A[i]:
            bull+=1
        elif i in v:
            cow+=1
    if (cow>0 or bull>0):
        print(bull,"Bull and ",cow,"Cow")
    print("Correct No. :       ",m,n,o,p)
    print("You've Entered : ",a,b,c,d)
于 2014-11-27T14:33:56.040 に答える
-1

雄牛と牛(コードはちょっと初歩的で、YouTubeから学び始めたばかりです)

import random

def num_checker(guess_num,answer):
    guess_num=list(str(guess_num))
    ans=list(str(answer))
    cow=0
    bull=0
    for a in range(0,4):
        if guess_num[a]==ans[a]:
            bull+=1
            ans[a]=10#changed values to counter reccuring digits
            guess_num[a]=20#changed values to counter reccuring digits

    for a in range(0,4):
        for b in range (0,4):
            if guess_num[a]==ans[b]:
                cow+=1
                ans[b]=30#changed values to counter reccuring digits
                break

    final=[bull,cow]
    return final

#..................................................
ans=random.randrange(1000,10000)
print("this is the program to gues a four digit number")

#......................................................#continue asking until you get it right
while True:
    print("just for reference answer is:",ans)
    num_typed=int(input("please guess a four digit the number?\n "))
    reply=num_checker(num_typed,ans)
    if reply==[4,0]:
        print("correct")
        print(reply[0],"bull",reply[1],"cows and the ans is",ans)
        break
    else:
        print(reply[0],"bulls",reply[1],"cows")
于 2015-01-25T23:18:15.317 に答える
-1

牛牛プログラムを作成する最良の方法は、数字ではなく文字と文字列で遊ぶことです。そうすれば、百の位や十の位を気にする必要がなくなります。Python での 4 桁の牛と牛のゲームに関する私のチュートリアルに従うことができます: http://funpythonprojects.blogspot.in/2013/07/cow-bull-game-aka-guess-number-in-python.html

于 2013-07-10T18:09:52.557 に答える