2016-12-16 3 views
1

Так что я некоторое время сижу на этой проблеме, и после поиска по нескольким другим вопросам не могу найти ответ, который мне нужен.Проверьте, не совпадают ли некоторые элементы списка

У меня была задана задача создать 4-значный генератор случайных чисел, тогда пользователь должен попытаться угадать номер. В каждой попытке они говорят, сколько цифр они получили, и в какой позиции они находятся. Также необходимо, чтобы номер находился в правильном положении.

Это мой текущий код.

import random as r 
def GetNumber(): 
    number = [r.randint(0, 9), r.randint(0, 9), r.randint(0, 9), r.randint(0, 9)] 
    return number 

def Choices(): 
    randomNumber = GetNumber() 
    userChoice = list(input("Enter 4 numbers\n")) #Allows the user to input a number 4 digits long 
    userChoice = [int(i) for i in userChoice] 
    if userChoice == randomNumber: 
     print("Congratulations! You chose the right number") 

Заранее спасибо :)

+2

Почему не 'r.randint (1000,9999)', если вы хотите 4-значное случайное число? –

+0

, так что вы пытаетесь закодировать игру-вдохновителя. Ваш код до сих пор очень приятный. Вы тоже можете это сделать. –

+0

@Chris_Rands Я также хочу, чтобы первый номер был 0 – Jake

ответ

1

Это мое взятие на себя.

import random as r 


def GetNumber(): 
    return [r.randint(0, 9) for i in range(4)] 


def Choices(): 
    randomNumber = GetNumber() 
    userChoice = [int(i) for i in list(input("Enter 4 numbers\n"))] 
    n = 0 
    while userChoice != randomNumber: 
     hits = [str(i+1) for i in range(4) if userChoice[i] == randomNumber[i]] 
     if hits: 
      print('You got position(s) {} correct'.format(', '.join(hits))) 
     else: 
      print('You got all of them wrong!') 
     userChoice = [int(i) for i in list(input("Enter 4 numbers\n"))] 
     n += 1 
    print("Congratulations! You found the right number in {} turns!!".format(n)) 

Choices() 

Код был частично изменен, чтобы обойти его, пока пользователь не найдет секретный номер. Это всего лишь основа, на которой вы можете немного поэкспериментировать и попытаться ее оптимизировать с точки зрения взаимодействия с пользователем или чего-то еще.

Если что-то неясно, дайте мне знать. Ура!

+0

Спасибо за быстрый ответ, дали ему тест, и он отлично работает – Jake

+0

@ Ответ Tobias_k тоже очень интересный. Возможно, вы захотите сплавить эти два, чтобы дать подсказкам пользователю правильные номера в неправильном положении или так –

1

Вы можете zip случайное число и выбор пользователя и сравнить пары:

>>> number = [4, 3, 9, 1] 
>>> choice = [1, 3, 4, 1] 
>>> [n == c for n, c in zip(number, choice)] 
[False, True, False, True] 
>>> sum(n == c for n, c in zip(number, choice)) 
2 

Чтобы получить общее количество совпадающих номеров, независимо от их позиции, вы можете подать как номер, так и выбор пользователя через Counter и перейти на свое пересечение с &:

>>> from collections import Counter 
>>> Counter(number) & Counter(choice) 
Counter({1: 1, 3: 1, 4: 1}) 
>>> sum((Counter(number) & Counter(choice)).values()) 
3 
+0

'sum (n == c для n, c в zip (число, выбор))' return 2 просто красиво –

-1
import random as r 
def GetNumber(): 
    number = r.randint(0000, 9999) 
    return str(number).zfill(4) 

def Choices(): 
    randomNumber = GetNumber() 
    print type(randomNumber),randomNumber 
    userChoice = str(input("Enter 4 numbers\n")).strip("\n") #Allows the user to input a number 4 digits long 
    for a,b in zip(userChoice,randomNumber): 
     if not a==b: 
     print "{0} not match {1}".format(a,b) 
    if userChoice==randomNumber: 
     print "Congratulations! You chose the right number" 

Choices() 
+3

Ну, это не делает то, что задает вопрос, это чистый ответ кода без каких-либо объяснений, это не будет корректно работать в Python 3, и он создает одноэлементный список без причины. – interjay

+0

@interjay thx, я исправлю это, но я всегда стараюсь держать вопрос и решать текущую проблему, я имею в виду, что это не код. Обзор –

+2

Код, который вы публикуете здесь, должен быть хорошим кодом, так как это то, чему люди учатся. В любом случае вы исправили одну из проблем, которые я перечислял, но это все равно фактически не делает то, что задает вопрос (проверьте, какие цифры верны). – interjay

0

Я думаю, что ключом к этому является использование строки цифр, а не числового типа данных. Вот рабочий пример. Вы можете сделать это, сравнивая числа, но в этом случае мы не заботимся о числовом значении так же, как о характере символов.

from random import choice 
from string import digits 


def is_digits(string): 
    """Return true if all characters are digits, otherwise false""" 

    return all([char.isdigit() for char in string]) 


def get_number(length): 
    """Return a string of digits with the number of characters equal to length""" 

    return ''.join(choice(digits) for i in range(length)) 


def guess(): 
    """Receive and evaluate guesses for match to randomly generated number""" 

    guess = '' 
    miss_char = '-' 
    miss_message = 'Try again.' 
    win_message = 'Congratulations! You chose the right number.' 
    answer_length = 4 
    answer = get_number(answer_length) 
    while guess != answer: 
     guess = raw_input('Enter {0} numbers: '.format(len(answer))) 
     if len(guess) != len(answer) or is_digits(guess) is False: 
      continue 
     matches = [answer[i] 
        if answer[i] == guess[i] 
        else miss_char 
        for i in range(len(answer))] 
     matches_string = ''.join(matches) 
     message_base = 'Matched digits: {0}.'.format(matches_string) 
     if guess != answer: 
      print(' '.join([message_base, miss_message])) 
      guess = '' 
     else: 
      print(' '.join([message_base, win_message])) 

guess() 
Смежные вопросы