Помогите пожалуйста с программой. Задача такая: Напишите программу для нахождения среднего значения и стандартного отклонения оптимального счета в данном пасьянсе. Покажите, что число рассмотренных игр обеспечивает достоверность полученных статистических результатов. Подсчитайте также, если сумеете, среднее число ходов и среднее число точек принятия решения на пути к оптимальному результату. Единственный входной параметр программы — число пасьянсов, которые нужно разложить. Вывод обязательно должен содержать требуемую статистику, но иногда оказываются полезными и другие данные. Как вариант, я думал сделать сначала пасьянс, а потом уже статистику. То есть две программы, но не знаю будет ли это правильно. Если кто-то делал подобное, прошу объясните, как это все сделать, пожалуйста. Готов отблагодарить деньгами, сразу же отпишу в лс, если кто напишет хотя бы рабочий код, без объяснений. Желательно сегодня. Молю, прошу.
Код
from random import randint
# 52 deck of cards ranked 1-13 # shuffle the deck at game start # board of 10 spots # discard pile # rank: ace=low k=high # when placing card, every space to left is empty or lower rank # every space to right is empty or higher rank # loss = 6th discard # win = at least one card on every spot on board
lossCount=0; winCount=0; # 10,000 play-thrus for z in range(0,7): # new deck deck = list(); # new discard pile discard = list(); # 4 of each card for i in range(1,5): for x in range(1,14): deck.append(x);
# shuffling the deck for z in range(0,51): w = randint(z,51) tempCard = deck[z]; deck[z] = deck[w]; deck[w] = tempCard;
#print deck; #print len(deck);
# Initializing the board board = [None]*10; # Automating card draws from the deck for i in range(0,51): #print board; card = deck.pop();
# Place card in it's corresponding spot if game isn't over yet if (None in board) and (len(discard)<6): if len(board)>=card: board[card-1] = card; else: discard.append(card);
# Loss conditions if len(discard)==6: lossCount +=1; print ("You lose! :("); # Win conditions if ((None in board) == False): winCount +=1; print ("You win! :)")
Нашел код пасьянса, не уверен что правильно. И код статистики:
Код
#program to calculate the statistical mean, variance, and standard deviation from a text file with a number on each line import statistics
#list to store all the students' scores scores = [] scoreFile = open(C:\Users\Brandon\Documents\GradingStatistics\studentScores, 'r') outputFile = open(C:\Users\Brandon\Documents\GradingStatistics\scoreStatistics, 'w')
for line in scoreFile.readlines(): line = line.strip() #getting rid of the \n characters scores.append(line)
#writes a student's score line by line def display_scores(scoreList) for score in scoreList: outputFile.write(score) outputFile.write("\n")
def display_average(scoreList) average = statistics.mean(scoreList) outputFile.write("Average score: %s", %average) outputFile.write("\n")
def display_variance(scoreList) variance = statistics.pvariance(scoreList) outputFile.write("Variance of the scores: %s", %variance) outputFile.write("\n")
def display_stdev(scoreList) stdev = statistics.stdev(scoreList) outputFile.write("Standard deviation of the scores: %s", %stdev) outputFile.write("\n")
display_average(scores) display_stdev(scores)
scoreFile.close() outputFile.close()
Как это объединить все в одну программу? Нужно сделать так, чтобы задание выполнялось.
Сообщение отредактировал graniza - Среда, 23 Января 2019, 18:42
graniza, ещё актуально? Какой именно пасьянс нужен? В коде статистики импортируется statistics. Стандартная библиотека для Python? Если нет, то код бесполезный
graniza, ещё актуально? Какой именно пасьянс нужен? В коде статистики импортируется statistics. Стандартная библиотека для Python? Если нет, то код бесполезный
Актуально. Вообще обычный пасьянс. Игра кончается, когда не остается ни одного допустимого хода и ни одну карту нельзя положить в счетную стопку. Счет игры равен суммарному числу карт в счетных стопках.
graniza, хорошо. Пасьянс работает, насколько я могу судить. В статистике что нужно? Только развёрнуто. То есть, что подразумевается под средним значением и стандартным отклонением? Так как, как я уже сказал, код статистики в принципе бесполезен
Добавлено (23 Января 2019, 22:35) --------------------------------------------- Хотя нет, стоп. Ошибаюсь. Увидел statistics. В чём сложность связать эти два файла?
graniza, хорошо. Пасьянс работает, насколько я могу судить. В статистике что нужно? Только развёрнуто. То есть, что подразумевается под средним значением и стандартным отклонением? Так как, как я уже сказал, код статистики в принципе бесполезен
Во первых в этом пасьянсе нельзя вводить число пасьянсов, которые нужно разложить. Просто по заданию это необходимо. По поводу статистики, среднее значение оптимального счета, стандартное отклонение от оптимального счета (такие вещи так и называются, они высчитываются по формулам), среднее число ходов и среднее число точек принятия решения на пути к оптимальному результату. Два последних не обязательно, но по возможности, если получится, было бы круто. Помимо этого, код этого пасьянса не выдает счет. Соответственно и статистики никакой не будет.
Сообщение отредактировал graniza - Среда, 23 Января 2019, 22:46
graniza, а счёт - это число карт в списке board? (то есть 10 для победного кейса) Или же сумма всех карт в том же списке? (то есть 55 в случае победы)
Сумма всех карт
Добавлено (23 Января 2019, 23:15) --------------------------------------------- Для того чтобы найти оптимальный результат, реализуем на базе этих процедур стратегию поиска. После сдачи карт получаем некоторую начальную позицию. Стратегия поиска состоит в выполнении для каждой позиции, получающейся в ходе игры, следующих действий:
Подсчитать, сколько возможных ходов имеется для данной позиции. Их всегда не более семи.
Если возможных ходов нет, то данная последовательность ходов закончена, и можно записать ее счет. Установить новую текущую позицию, взяв верхний элемент со стека позиций, и возвратиться к началу цикла. Если стек позиций пуст, то закончить поиск. Если есть только один ход, то выполнить его и вернуться к началу цикла. Счет игры равен суммарному числу карт в счетных стопках
Надеюсь это как-то поможет в решении.
Сообщение отредактировал graniza - Среда, 23 Января 2019, 23:16
graniza, оперируешь такими терминами и не можешь решить такую простецкую задачу Счёт и ввод количества пасьянсов сделал. Статистику не сделал - у меня отсутствует та самая statistics, о которою я уже трижды запнулся Сегодня уже не закончу. Могу попробовать завтра, если ещё поздно не будет)
Сообщение отредактировал DivES - Среда, 23 Января 2019, 23:34
graniza, оперируешь такими терминами и не можешь решить такую простецкую задачу Счёт и ввод количества пасьянсов сделал. Статистику не сделал - у меня отсутствует та самая statistics, о которою я уже трижды запнулся Сегодня уже не закончу. Могу попробовать завтра, если ещё поздно не будет)
А завтра примерно во сколько? Спасибо большое за твое неравнодушие. Отблагодарю. Термины такие, потому что курсовая это) В связи с тем, что болел долго + уезжал далеко, так получилось, что ну не смог я это сделать. Да еще и дали курсач на 3 недели. Я общие вещи знаю, но такое не могу написать сам. Сдача уже завтра вечером. Такие дела. Еще раз огромное спасибо
Сообщение отредактировал graniza - Среда, 23 Января 2019, 23:43
graniza, вечером? Я только с работы вечером вернусь Попробую сейчас дописать, что смогу. Не отвечай, я просто дополню сообщение!
Добавлено (24 Января 2019, 00:13) --------------------------------------------- Тут старый код:
Код
#!/usr/bin/env python # -*- coding: utf-8 -*- from random import randint
# 52 deck of cards ranked 1-13 # shuffle the deck at game start # board of 10 spots # discard pile # rank: ace=low k=high # when placing card, every space to left is empty or lower rank # every space to right is empty or higher rank # loss = 6th discard # win = at least one card on every spot on board
lossCount = 0; winCount = 0;
#Список полученных результатов (очков): scoresList = list();
#Даём пользователю возможность ввести количество пасьянсов #(без каких-либо проверок: ожидаем, что пользователь не дурак и введёт число) solitaireCount = input("Введите количество пасьянсов: ");
for z in range(0, solitaireCount): # new deck deck = list(); # new discard pile discard = list(); # 4 of each card for i in range(1,5): for x in range(1,14): deck.append(x);
# shuffling the deck for z in range(0,51): w = randint(z,51) tempCard = deck[z]; deck[z] = deck[w]; deck[w] = tempCard;
#print deck; #print len(deck);
# Initializing the board board = [None]*10; # Automating card draws from the deck for i in range(0,51): #print board; card = deck.pop();
# Place card in it's corresponding spot if game isn't over yet if (None in board) and (len(discard)<6): if len(board)>=card: board[card-1] = card; else: discard.append(card);
# Loss conditions if len(discard)==6: lossCount +=1; print ("Поражение!");
# Win conditions if ((None in board) == False): winCount +=1; print ("Победа! :)");
#Записываем результат в список: score = 0; for curCard in board: if (None != curCard): score += curCard; scoresList.append(score);
#Выводим на экран таблицу результатов (не обязательно, конечно же): print ('"Таблица" результатов:'); print (scoresList);
#Дальше работаем со статистикой на основе полученной таблицы результатов. #Хорошо, если у тебя есть этот самый модуль statistics. #В ином случае тебе придётся самому написать функции нахождения #среднего значения (что, вроде бы, просто) и стандартного отклонения. #Тем более, формулы у тебя есть, вроде бы :) mean = statistics.mean(scoresList); pvariance statistics.pvariance(scoresList); stdev = statistics.stdev(scoresList); #Дальше можешь вывести полученные данные на экран или же записать в файл. #С этим, надеюсь, разберёшься сам.
Добавлено (24 Января 2019, 00:14) --------------------------------------------- Первые две строчки можешь удалить, они для работы кириллицы в Linux. И да, не забывай про важность табуляций в Python Можешь успеть спросить что-нибудь, пока я не ушёл)
Добавлено (24 Января 2019, 00:53) ---------------------------------------------
Код
from random import randint from statistics import mean, stdev, pvariance
# 52 deck of cards ranked 1-13 # shuffle the deck at game start # board of 10 spots # discard pile # rank: ace=low k=high # when placing card, every space to left is empty or lower rank # every space to right is empty or higher rank # loss = 6th discard # win = at least one card on every spot on board
lossCount = 0; winCount = 0;
#Список полученных результатов (очков): scoresList = list();
#Даём пользователю возможность ввести количество пасьянсов #(без каких-либо проверок: ожидаем, что пользователь не дурак и введёт число) solitaireCount = input("Введите количество пасьянсов: ");
for z in range(0, solitaireCount): # new deck deck = list(); # new discard pile discard = list(); # 4 of each card for i in range(1,5): for x in range(1,14): deck.append(x);
# shuffling the deck for z in range(0,51): w = randint(z,51) tempCard = deck[z]; deck[z] = deck[w]; deck[w] = tempCard;
#print deck; #print len(deck);
# Initializing the board board = [None]*10; # Automating card draws from the deck for i in range(0,51): #print board; card = deck.pop();
# Place card in it's corresponding spot if game isn't over yet if (None in board) and (len(discard)<6): if len(board)>=card: board[card-1] = card; else: discard.append(card);
# Loss conditions if len(discard)==6: lossCount +=1; print ("Поражение!");
# Win conditions if ((None in board) == False): winCount +=1; print ("Победа! :)");
#Записываем результат в список: score = 0; for curCard in board: if (None != curCard): score += curCard; scoresList.append(score);
#Записываем результаты в файл: print ("Записываем результаты в текстовый файл... \n"); with open("scores_out.txt", "w") as file: for line in scoresList: file.write(str(line) + "\n") file.close();
#Считываем результаты из файла в список: print ("Считываем результаты из текстового файла... \n"); scoresFromFile = []; with open("scores_out.txt", "r") as file: for line in file: scoresFromFile.append(line.strip()); file.close();
print ("Работаем со статистикой... \n"); mean = mean(scoresList); pvariance = pvariance(scoresList); stdev = stdev(scoresList);
#Записываем полученную статистику в файл: print ("Записываем полученную статистику в конец файла... \n"); with open("scores_out.txt", "a") as file: file.write("Mean = " + str(mean) + "\n"); file.write("Pvariance = " + str(pvariance) + "\n"); file.write("Stdev = " + str(stdev) + "\n"); file.close();
А вот и новый вариант с действующей статистикой (надеюсь, я всё сделал правильно ) и с записью/чтением файла. Пусть и без тех дополнительных данных. Парочка моментов: 1. Будет ругаться на кириллицу - замени все слова на русском (в том числе комменты) на английские. 2. По поводу многострадального statistics. Скачивай прямиком с гит-хаба, если у тебя ещё нет этого модуля. Переходишь сюда, открывается .py файл. Сохраняешь его (ПКМ -> "Сохранить как") прямо в папку со своим "проектом". Должен сохраниться как "statistics.py". Ну, вроде бы всё) Успехов тебе завтра!
Сообщение отредактировал DivES - Четверг, 24 Января 2019, 00:56
А вот и новый вариант с действующей статистикой (надеюсь, я всё сделал правильно ) и с записью/чтением файла. Пусть и без тех дополнительных данных. Парочка моментов: 1. Будет ругаться на кириллицу - замени все слова на русском (в том числе комменты) на английские. 2. По поводу многострадального statistics. Скачивай прямиком с гит-хаба, если у тебя ещё нет этого модуля. Переходишь сюда, открывается .py файл. Сохраняешь его (ПКМ -> "Сохранить как") прямо в папку со своим "проектом". Должен сохраниться как "statistics.py". Ну, вроде бы всё) Успехов тебе завтра!
В каком редакторе работали? ошибку выдает. Я так понял это связано с расположением. Когда передвигаю часть кода, ошибка пропадает, но начинается конфликт с нижней и так далее.
Сообщение отредактировал graniza - Четверг, 24 Января 2019, 02:00
graniza, в Geany, это обычный блокнот. Нужно чётко выставить расположение блоков с помощью табуляций, заменив ими (табуляциями) появившиеся после копирования пробелы. Сам столкнулся с этим, когда копировал код отсюда
Добавлено (24 Января 2019, 11:10) --------------------------------------------- drcrack, ошибка "unindent does not match any outer indentation level", проверяй
Irbis, блин, а ведь точно! Не обратил внимания на то что на форуме отступы съехали. Посмотрел, что синтаксис подсветился и отправил Сейчас должно быть правильно:
Код
from random import randint from statistics import mean, stdev, pvariance
# 52 deck of cards ranked 1-13 # shuffle the deck at game start # board of 10 spots # discard pile # rank: ace=low k=high # when placing card, every space to left is empty or lower rank # every space to right is empty or higher rank # loss = 6th discard # win = at least one card on every spot on board
lossCount = 0; winCount = 0;
#Список полученных результатов (очков): scoresList = list();
#Даём пользователю возможность ввести количество пасьянсов #(без каких-либо проверок: ожидаем, что пользователь не дурак и введёт число) solitaireCount = input("Введите количество пасьянсов: ");
for z in range(0, solitaireCount): # new deck deck = list(); # new discard pile discard = list(); # 4 of each card for i in range(1,5): for x in range(1,14): deck.append(x);
# shuffling the deck for z in range(0,51): w = randint(z,51) tempCard = deck[z]; deck[z] = deck[w]; deck[w] = tempCard;
#print deck; #print len(deck);
# Initializing the board board = [None]*10; # Automating card draws from the deck for i in range(0,51): #print board; card = deck.pop();
# Place card in it's corresponding spot if game isn't over yet if (None in board) and (len(discard)<6): if len(board)>=card: board[card-1] = card; else: discard.append(card);
# Loss conditions if len(discard)==6: lossCount +=1; print ("Поражение!");
# Win conditions if ((None in board) == False): winCount +=1; print ("Победа! :)");
#Записываем результат в список: score = 0; for curCard in board: if (None != curCard): score += curCard; scoresList.append(score);
#Записываем результаты в файл: print ("Записываем результаты в текстовый файл... \n"); with open("scores_out.txt", "w") as file: for line in scoresList: file.write(str(line) + "\n") file.close();
#Считываем результаты из файла в список: print ("Считываем результаты из текстового файла... \n"); scoresFromFile = []; with open("scores_out.txt", "r") as file: for line in file: scoresFromFile.append(line.strip()); file.close();
print ("Работаем со статистикой... \n"); mean = mean(scoresList); pvariance = pvariance(scoresList); stdev = stdev(scoresList);
#Записываем полученную статистику в файл: print ("Записываем полученную статистику в конец файла... \n"); with open("scores_out.txt", "a") as file: file.write("Mean = " + str(mean) + "\n"); file.write("Pvariance = " + str(pvariance) + "\n"); file.write("Stdev = " + str(stdev) + "\n"); file.close();
Сообщение отредактировал DivES - Четверг, 24 Января 2019, 11:47
Irbis, блин, а ведь точно! Не обратил внимания на то что на форуме отступы съехали. Посмотрел, что синтаксис подсветился и отправил Сейчас должно быть правильно:
Через PyCharm все идеально запустилось. Спасибо большое. А среднее число ходов можно найти через Average от discard и среднее число точек принятия решения через median ?