Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

NumberGuessing

NumberGuessing

Мнениеот Гост » 30 Окт 2021, 12:16

Help_me_please.png
Help_me_please.png (104.81 KiB) Прегледано 1050 пъти
Гост
 

Re: NumberGuessing

Мнениеот Гост » 31 Окт 2021, 09:07

Гост написа:
Help_me_please.png


Моля ви помогнете!
Гост
 

Re: NumberGuessing

Мнениеот ammornil » 31 Окт 2021, 11:48

Не е много удачно да учите програмиране като търсите готови решения.
Все пак, ето едно примерно решение в Python: решението може да се разшири с проверка за отрицателни стойности на входа, както и с подробно обяснение на правилата в началото на всеки нов цикъл (нова игра). Оставям това на Вас, ако желаете да опитате да подобрите кода. Освен това, отговорите са подвеждащи, защото звучат като инструкции, а не като констатации. По-удачно би било да се дадат като: Your number is smaller than mine вместо Smaller и Your number is larger than mine вместо Larger. Може би желаете да промените това също, като част от подобрението на кода на играта.
Успех.

п.с.
В заданието, показаните примери за Вход и Изход са разменени. Ние очакваме входът да е целочислен, а изходът да са отговорите на компютъра.

[tex][/tex]
Прикачени файлове
Screenshot 2021-10-31 094415.png
Screenshot 2021-10-31 094415.png (42.87 KiB) Прегледано 1019 пъти
[tex]\color{lightseagreen}\text{''Който никога не е правил грешка, никога не е опитвал нещо ново.''} \\
\hspace{21em}\text{(Алберт Айнщайн)}[/tex]
Аватар
ammornil
Математик
 
Мнения: 3767
Регистриран на: 25 Май 2010, 19:28
Местоположение: Великобритания
Рейтинг: 1779

Re: NumberGuessing

Мнениеот pal702004 » 31 Окт 2021, 13:37

ammornil, в заданието се иска програмата да "отгатва" намисленото от Ели число, а вие сте написал програма за Ели. За не повече от 10 опита, което е нормално, понеже $2^{10}=1024$
pal702004
Математик
 
Мнения: 1487
Регистриран на: 23 Сеп 2013, 19:47
Рейтинг: 1402

Re: NumberGuessing

Мнениеот ammornil » 31 Окт 2021, 16:03

pal702004 написа:ammornil, в заданието се иска програмата да "отгатва" намисленото от Ели число, а вие сте написал програма за Ели. За не повече от 10 опита, което е нормално, понеже $2^{10}=1024$


Броят на опитите може да бъде променен в кода.
Не мисля, че разбирам как програма ще отгатва число, което не е зададено никъде в електронна форма.
[tex]\color{lightseagreen}\text{''Който никога не е правил грешка, никога не е опитвал нещо ново.''} \\
\hspace{21em}\text{(Алберт Айнщайн)}[/tex]
Аватар
ammornil
Математик
 
Мнения: 3767
Регистриран на: 25 Май 2010, 19:28
Местоположение: Великобритания
Рейтинг: 1779

Re: NumberGuessing

Мнениеот pal702004 » 31 Окт 2021, 17:28

Не мисля, че разбирам как програма ще отгатва число, което не е зададено никъде в електронна форма.
Програмата извежда число и чака отговор "Correct","Larger" или "Smaller". При Correct, или след 10-ият опит - край.
pal702004
Математик
 
Мнения: 1487
Регистриран на: 23 Сеп 2013, 19:47
Рейтинг: 1402

Re: NumberGuessing

Мнениеот ammornil » 31 Окт 2021, 17:36

Аз не виждам условието така. Не се казва, че аз съм си намислил число и програмата трябва да генерира предположения. Казва се, че "Вие трябва да го познаете, като предполагате числа...".

Аз го разбирам като - "прогрмата е Ели, и аз трябва да позная числото от десет опита". Може би аз съм започнал да забравям българския. Авторът на главния пост може да ме поправи.

Забелязах, че съм пропуснал flush() инстрикцията.
[tex]\color{lightseagreen}\text{''Който никога не е правил грешка, никога не е опитвал нещо ново.''} \\
\hspace{21em}\text{(Алберт Айнщайн)}[/tex]
Аватар
ammornil
Математик
 
Мнения: 3767
Регистриран на: 25 Май 2010, 19:28
Местоположение: Великобритания
Рейтинг: 1779

Re: NumberGuessing

Мнениеот skadevil » 31 Окт 2021, 21:23

Ето едно C++ кодче :)

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
cout << "Welcome to the number guessing game! You have 10 tries :)\n";
int guess, answer, counter = 0;
answer = rand() % 1000 + 1; //[1;1000]
//cout << answer;

do
{
cout << "My guess is - ";
cin >> guess;
counter++;

if (counter == 10)
{
cout << "Game over! The answer was: " << answer;
return 0;
}
if (guess == answer)
cout << "Correct\n";
else if (guess > answer)
cout << "Larger\n";
else if (guess < answer)
cout << "Smaller\n";

} while (guess != answer);

return 0;
}
:-D
Аватар
skadevil
Фен на форума
 
Мнения: 198
Регистриран на: 07 Мар 2020, 10:49
Рейтинг: 60

Re: NumberGuessing

Мнениеот ammornil » 31 Окт 2021, 21:48

Корегиран код: Python
Код: Избери целия код
import random
choice = 'y'
while (choice == 'y'):
    choice = input('Do you wish to play a game (y/n): ')
    if (choice == 'n'):
        break
    else:
        counter = 0
        goal = random.randint(1,1000)
        while counter<10:
            try:
                print('Attempt ',counter+1,' of 10')
                yourGuess = int(input('Please guess a whole number between 1 and 1000: '))
            except Exception:
                print('Invalid input.')
                break
            if (yourGuess > 1000):
                print('Pay attention! Guessed number cannot be larger than 1000.')
                break
            if (yourGuess == goal):
                counter = 11
                print('Correct!')
                break
            elif (yourGuess < goal):
                print('Smaller.')
                counter+=1
            elif (yourGuess > goal):
                print('Larger')
                counter+=1
            else:
                print('Invalid input.')
                counter+=1
        if (counter == 10):
            print('Wrong Answer. Game over. The correct answer was ',goal)

[tex][/tex]
Прикачени файлове
Screenshot 2021-10-31 195007.png
Screenshot 2021-10-31 195007.png (40.96 KiB) Прегледано 995 пъти
[tex]\color{lightseagreen}\text{''Който никога не е правил грешка, никога не е опитвал нещо ново.''} \\
\hspace{21em}\text{(Алберт Айнщайн)}[/tex]
Аватар
ammornil
Математик
 
Мнения: 3767
Регистриран на: 25 Май 2010, 19:28
Местоположение: Великобритания
Рейтинг: 1779

Re: NumberGuessing

Мнениеот Гост » 31 Окт 2021, 22:30

Аз съм този, който пусна задачата. Пуснах я защото нямам никаква идея как да я реша?

Задачата е от тук:

https://action.informatika.bg/games/numberguessing
Гост
 

Re: NumberGuessing

Мнениеот ammornil » 31 Окт 2021, 23:04

Гост написа:Аз съм този, който пусна задачата. Пуснах я защото нямам никаква идея как да я реша?

Задачата е от тук:

https://action.informatika.bg/games/numberguessing


Благодаря. Предложените решения са за поставения проблем. Успех!
[tex]\color{lightseagreen}\text{''Който никога не е правил грешка, никога не е опитвал нещо ново.''} \\
\hspace{21em}\text{(Алберт Айнщайн)}[/tex]
Аватар
ammornil
Математик
 
Мнения: 3767
Регистриран на: 25 Май 2010, 19:28
Местоположение: Великобритания
Рейтинг: 1779

Re: NumberGuessing

Мнениеот pal702004 » 01 Ное 2021, 09:07

Глупости! ВИЕ трябва да отгатвате числото. Вие!
За целта трябва да си напишете програма, която да ви помогне за това. Като въвеждате отговорите на Ели (Correct и т.н). Няма никакво програмиране в това да се генерира случайно число, как не разбирате.
Програмата трябва да реализира т.нар. дихотомен метод (делене на интервала на половина). Примерно решение: Трябва да се поддържат 2 променливи (MinV и MaxV), между които е търсеното число.
Начални стойности: MinV:=0,MaxV:=1001
След това в цикъл докато (MaxV-MinV>1) или (има отговор Correct)
Choise:=(MinV+MaxV)\2 (целочислено делене на 2, предлага се средата на интервала)
Предлагаме Choise (тоест, първото ни предложение винаги е 500)
Ако отговора е Correct - ясно
Ако е Larger, MaxV:=Choise (интервала се съкращава от 0 до 500)
Ако е Smaller, MinV:=Choise (интервала се съкращава от 500 до 1001)
край на цикъла

Така отначало интервала е с големина 1000, Ако не се познае, след първия избор се съкращава до 499, след втория - 249, третия-124, четвъртия - 62,петия -31, шести - 15, седми - 7, осми -3, девети - 1. И най-много на десетия го познаваме.
pal702004
Математик
 
Мнения: 1487
Регистриран на: 23 Сеп 2013, 19:47
Рейтинг: 1402

Re: NumberGuessing

Мнениеот nick » 01 Ное 2021, 09:29

Виждам, че pal702004 е предложил своето решение. (Хехе изпревари ме) Аз ще пусна моето. Идеята е същата като на pal702004.

Код: Избери целия код
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int guess = 0, nachalo = 1, krai = 1000;
    string s = "Smaller.";

    while (1)
    {
        if (s == "Correct!")
        {
            break;
        }
        else
        {
            if (s == "Smaller.")
            {
                nachalo = guess + 1;
                guess = (krai + nachalo) / 2;
            }
            else
            {
                krai = guess - 1;
                guess = (krai + nachalo) / 2;
            }
        }

        cout << guess << flush << endl;
        cin >> s;
    }

    return 0;
}


*Поздрави на amornil, че става на 40.
Последна промяна nick на 01 Ное 2021, 09:46, променена общо 1 път
Не си въобразявайте, че математиката е трудна, неразбираема и отблъскваща за здравия разум. Тя просто е идеална реализация на здравия разум.
Аватар
nick
Нов
 
Мнения: 56
Регистриран на: 16 Авг 2021, 07:19
Рейтинг: 87

Re: NumberGuessing

Мнениеот nick » 01 Ное 2021, 09:31

pal702004 написа:Глупости! ВИЕ трябва да отгатвате числото. Вие!
За целта трябва да си напишете програма, която да ви помогне за това. Като въвеждате отговорите на Ели (Correct и т.н). Няма никакво програмиране в това да се генерира случайно число, как не разбирате.
Програмата трябва да реализира т.нар. дихотомен метод (делене на интервала на половина). Примерно решение: Трябва да се поддържат 2 променливи (MinV и MaxV), между които е търсеното число.
Начални стойности: MinV:=0,MaxV:=1001
След това в цикъл докато (MaxV-MinV>1) или (има отговор Correct)
Choise:=(MinV+MaxV)\2 (целочислено делене на 2, предлага се средата на интервала)
Предлагаме Choise (тоест, първото ни предложение винаги е 500)
Ако отговора е Correct - ясно
Ако е Larger, MaxV:=Choise (интервала се съкращава от 0 до 500)
Ако е Smaller, MinV:=Choise (интервала се съкращава от 500 до 1001)
край на цикъла

Така отначало интервала е с големина 1000, Ако не се познае, след първия избор се съкращава до 499, след втория - 249, третия-124, четвъртия - 62,петия -31, шести - 15, седми - 7, осми -3, девети - 1. И най-много на десетия го познаваме.


Този дихотомен метод. Прилича малко на двойчно търсене.
Не си въобразявайте, че математиката е трудна, неразбираема и отблъскваща за здравия разум. Тя просто е идеална реализация на здравия разум.
Аватар
nick
Нов
 
Мнения: 56
Регистриран на: 16 Авг 2021, 07:19
Рейтинг: 87

Re: NumberGuessing

Мнениеот pal702004 » 01 Ное 2021, 10:24

nick написа:Този дихотомен метод. Прилича малко на двойчно търсене.
Синоними са. Bisection method, interval halving method, the binary search method, the dichotomy method.
https://en.wikipedia.org/wiki/Bisection_method
pal702004
Математик
 
Мнения: 1487
Регистриран на: 23 Сеп 2013, 19:47
Рейтинг: 1402


Назад към C, C++



Кой е на линия

Регистрирани потребители: Google Adsense [Bot], Google [Bot]

Форум за математика(архив)