Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności: PyStok #39, 20 marca 18:00, Białystok: AI w diagnostyce obrazowej i metaklasy
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: zadanie z książki szukanie liczb  (Przeczytany 6165 razy)
« : 19:09 20/02/17 »
Roldan Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 8


Witam.
Zacząłem uczyć się języka pythona przez co też rozwiązuje zadania z książki, której pobieram naukę.
Treść zadania brzmi:
Cytuj
Tym razem trudniejsze wyzwanie. Napisz pseudokod do programu, w którym gracz i komputer zamienią się rolami w grze z odgadywaniem liczby. To znaczy gracz wybiera losowo liczbę z przedziału od 1 do 100, a komputer ma ją odgadnąć. Zanim rozpoczniesz tworzenie algorytmu, pomyśl, w jaki sposób sam byś zgadywał. Jeśli wszystko się uda, spróbuj napisać kod gry.

A o to mój kod programu:
Cytuj
#Zgaduj zgadula v2
#Zamiana ról - tym razem to komputer ma na celu odgadnąć liczbę wprowadzoną
#przez użytkownika


import random
print("\t\tWitaj 'Kumplu'!")
print("Jestem magicznym komputerem i odgadnę liczbę o jakiej pomyślałeś z zakresu od 1 do 100.")
y = int(input("\nProszę pomyśl o jakiejś liczbie(zapisz liczbę w pamięci): "))
x = random.randint(1,100)
z = random.randint(1,10)
próba = 1

while x != y:
    if x > y:
        print(x)
        print("Wybrałem za dużą liczbę")
        x-=z
    else:
        print(x)
        print("Wybrałem za małą liczbę")
        x+=z
    y = int(input("\nProszę wprowadź jeszcze raz swoją liczbę: "))
    próba += 1

if x == y:
    print("\n\nPomyślałeś o liczbie", x, "udało mi się odgadnąć ją w", próba, "próbach")
   
input("\n\nAby zakończyć pracę programu naciśnij enter!")

Niby program działa, ale źle. Kiedy wprowadzę liczbę parzystą, komputer zacznie odliczanie w liczbach parzystych i będzie dodawał albo odejmował tę samą liczbę parzystą aż dojdzie do właściwej wybranej przeze mnie liczby to samo z odejmowanie. Jeżeli nie natrafi na wybraną przeze mnie liczbę to będzie w kółko odejmował i dodawał np. jeżeli wybiorę 54 a komputer od 80 zacznie odliczanie w dół aż dojdzie do 55 i odejmie więcej niż 1 to później zacznie dodawać liczbę, która da mu z powrotem 55 i tak w kółko. Mógłby mnie ktoś naprowadzić co powinienem zrobić? Pozdrawiam.


\\program działa tylko wtedy jeżeli usunę z instrukcji if print(x), wtedy zgaduje liczbę. Jeżeli print(x) jest częścią instrukcji wtedy zaczyna się zapętlać i nie odgaduje liczby.


\\zmieniłem całkowicie kod teraz działa jak należy tylko długo mu to zajmuje.

Cytuj
#Zgaduj zgadula v2
#Zamiana ról - tym razem to komputer ma na celu odgadnąć liczbę wprowadzoną
#przez użytkownika


import random
print("\t\tWitaj 'Kumplu'!")
print("Jestem magicznym komputerem i odgadnę liczbę o jakiej pomyślałeś z zakresu od 1 do 100.")
y = int(input("\nProszę pomyśl o jakiejś liczbie(zapisz liczbę w pamięci): "))
x = random.randint(1,100)
z = random.randint(1,10)
próba = 1
nie = 0
tak = 0

while x != y:
    x = random.randint(1,100)
    print("Czy o liczbę", x, "ci chodziło?")
    input("Tak/nie: ")

    if nie:
        print("Czy liczbę", x, " ci chodziło?")
    elif tak:
        print("\n\nPomyślałeś o liczbie", x, "udało mi się odgadnąć ją w", próba, "próbach")
       

        y = int(input("\nProszę wprowadź jeszcze raz swoją liczbę: "))
        próba += 1

   
input("\n\nAby zakończyć pracę programu naciśnij enter!")

Da się coś jeszcze z tym udoskonalić?

\\W zasadzie to nie działa dobrze, bo jeśli wpiszę tak chociaż nie odgadł to go oszukam etc. Da się coś z tym zrobić?

\\Dodałem coś takiego

Cytuj
if nie:
        x = random.randint(1,100)
        print("Czy o tę", x, "liczbę ci chodziło?")
        próba += 1
    elif tak and x != y:
        print("Jesteś oszustem. To nie jest twoja liczba!!")
        print("format c: ...:")
        break
Da się łączyć warunki? Bo ze słowem and nic się nie dzieje, po wpisaniu tak pyta dalej o liczbę, a gdy and zamienię na & po wpisaniu nie wyświetla print z instrukcji elif i kończy program.  :-/

\\Kod wygląda teraz tak po wszystkich modyfikacjach:

Kod
#Zgaduj zgadula v2
#Zamiana ról - tym razem to komputer ma na celu odgadnąć liczbę wprowadzoną
#przez użytkownika
 
import random
print("\t\tWitaj 'Kumplu'!")
print("Jestem magicznym komputerem i odgadnę liczbę o jakiej pomyślałeś z zakresu od 1 do 100.")
y = int(input("\nProszę pomyśl o jakiejś liczbie(zapisz liczbę w pamięci): "))
x = random.randint(1,100)
nie = 0
tak = 0
 
while x != y:
   x = random.randint(1,100)
   print("Czy o liczbę", x, " ci chodziło?")
   input("Tak/nie: ")
   if x == y:
       print("Twoja liczba to", x, "3maj się")
 
   elif nie:
       x = random.randint(1,100)
   elif tak and x != y:
       print("Jesteś oszustem. To nie jest twoja liczba!!")
       print("format c: ...:")
       break
 
 
 
input("\n\nAby zakończyć pracę programu naciśnij enter!")
 
Zapisane
« Odpowiedz #1 : 22:11 20/02/17 »
sig Offline
Professional Python User

Zobacz profil
***

Reputacja: 88
Wiadomości: 423


Takie "zgadywanie" robi się przez wyszukiwanie binarne, wygoogluj je bo jest przydatne przy wyszukiwaniu informacji w posortowanych tablicach (i pewnie dlatego w książce jest takie zadanie). maksymalna ilość pytań dla takiego algorytmu to algorytm o podstawie 2 z zakresu liczb, czyli np dla 100 "zgadnie" najpóźniej w 7 próbie, a dla miliona w 20.
Zapisane
« Odpowiedz #2 : 10:40 21/02/17 »
Roldan Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 8


Czy da się połączyć w jakiś sposób tę instrukcję, żeby oba warunki zostały spełnione?
Kod
  elif tak and x != y:
       print("Jesteś oszustem. To nie jest twoja liczba!!")
       print("format c: ...:")
       break

\\ Zapisałem to inaczej

Kod
#Zgaduj zgadula v2 
#Zamiana ról - tym razem to komputer ma na celu odgadnąć liczbę wprowadzoną
#przez użytkownika
#__Roldan__
 
import random
print("\t\tWitaj 'Kumplu'!")
print("Jestem magicznym komputerem i odgadnę liczbę o jakiej pomyślałeś z zakresu od 1 do 100.")
y = int(input("\nProszę pomyśl o jakiejś liczbie(zapisz liczbę w pamięci): "))
x = random.randint(1,100)
 
 
while x != y:
   x = random.randint(1,100)
   if x == y:
       print("Twoja liczba to", x, "3maj się")
       break
   print("Czy miałeś na myśli liczbę", x,"?")
 
   odpowiedź = input("tak/nie: ")
   if odpowiedź == "tak":
       print("Jesteś oszustem. To nie jest twoja liczba!!")
       print("format c: ...:")
       break
 
 
 
 
input("\n\nAby zakończyć pracę programu naciśnij enter!")

siq tak wiem, że takie zgadywanie wykorzystuje wyszukiwanie bierne, lecz jest to mój dopiero drugi dzień nauki i nie jestem w stanie tego zaimplementować w kodzie. A to zadanie jest z początku książki 3 rozdział pętla while i warunki if, else, elif. Coś tam mi wyszło. Najważniejsze, że działa, szuka liczb i nie da się go oszukać. Chichot Pozdrawiam.
Zapisane
« Odpowiedz #3 : 12:10 21/02/17 »
sig Offline
Professional Python User

Zobacz profil
***

Reputacja: 88
Wiadomości: 423


Starczy while oraz if, oto mój kod. Dałem funkcję (def) żeby łatwiej go było "przemielić" na gotowych danych
Kod
import random
 
 
def zgaduj(liczba, odilu, doilu):
polowa = int((odilu + doilu) / 2)
licznik = 1
while polowa != liczba:
print("próba nr", licznik, "to będzie między", odilu, "a", doilu)
print("zgaduję", polowa)
if polowa > liczba:
print(" za dużo")
doilu = polowa
if polowa < liczba:
print("za mało")
odilu = polowa + 1
polowa = int((odilu + doilu) / 2)
licznik += 1
print("wiem, to będzie", polowa, "zajeło mi to", licznik, "prób")
return
 
 
zgaduj(random.randint(1, 100), 0, 100)
 
Kod dla pythona3, wersja 2 może rzucać błędami że względu na "ogonki" w print-ach
Zapisane
« Odpowiedz #4 : 13:24 21/02/17 »
Roldan Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 8


Później spróbuję zaimportować twój moduł do swojego kodu i zobaczę co mi z tego wyjdzie, a jeśli nie to przejdę do następnego rozdziału książki i może będzie jakieś objaśnienie jak powinien być ten program napisany. I tak jestem zadowolony z tego co stworzyłem.  Duży uśmiech
Zapisane
« Odpowiedz #5 : 15:31 22/02/17 »
Roldan Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 8


Poszedłem na skróty.   Spoko
Kod
# -*- coding: utf-8 -*-
#Zgaduj zgadula v2.4
#Zamiana ról - tym razem to komputer ma na celu odgadnąć liczbę wprowadzoną
#przez użytkownika
 
import random
print("\t\tWitaj 'Kumplu'!")
print("Jestem magicznym komputerem i odgadnę liczbę o jakiej pomyślałeś z zakresu od 1 do 100.")
y = int(input("\nProszę pomyśl o jakiejś liczbie(zapisz liczbę w pamięci): "))
x = random.randint(1,100)
 
 
while x != y:
   x = random.randint(1,100)
   print("Zgaduję...")
   print("Czy to twoja liczba:", x, "?")
   if x == y:
       print("Twoja liczba to", x, "3maj się")
 
   odpowiedź = input("tak/nie: ")
   if odpowiedź == "tak":
       print("Liczba", x, "nie jest twoją liczbą. Oszust!")
       print("format c: ...")
       break
 
   if odpowiedź == "nie":
       print("Zgaduję...")
   if x > y:
       for i in range(x, y, -1):
           print(i-1, end=" ")
 
 
 
   elif x < y:
       for i in range(x, y, 1):
           print(i+1, end=" ")
   break
 
print("\nTwoja liczba to", y,"!!!")
 
 
 
 
 
input("\n\nAby zakończyć pracę programu naciśnij enter!")
Zapisane
« Odpowiedz #6 : 20:36 24/02/17 »
Roldan Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 8


Patrzcie co wymyśliłem.  Chichot

Kod
# -*- coding: utf-8 -*-
#zgadka jeszcze raz
#komputer ma za zadanie odgadnąć liczbę o jakiej pomyślał użytkownik
 
import random
print("\tWitaj moim zadaniem jest odgadnięcie liczby o jakiej pomyślałeś")
liczba = int(input("Proszę wprowadź swoją liczbę: "))
 
x = 0
z = 0
k = 0
while x != liczba or z != liczba or k != liczba:
   print("Zgaduję...")
   x = random.randint(0, 100)
   if x == liczba:
       print("Twoja liczba to:", x)
       break
 
   elif x > liczba:
       print("Zgaduje...")
       z = random.randint(liczba, x-1)
       if z == liczba:
           print("Twoja liczba to:", z)
           break
       elif z != liczba:
           print(z)
           wybór = input("Czy to twoja liczba? Wpisz tak lub nie:")
           if wybór == "nie":
               z = random.randint(liczba, x-1)
               if z == liczba:
                   print("Twoja liczba to:", z)
 
           else:
               print("Jesteś oszustem. To nie jest twoja liczba! Gra zostaje zakończona!")
               break
 
   elif x < liczba :
       print("Zgaduję...")
       k = random.randint(x+1, liczba)
       if k == liczba:
           print("Twoja liczba to:", k)
           break
       elif k != liczba:
           print(k)
           wybór = input("Czy to twoja liczba? Wpisz tak lub nie:")
           if wybór == "nie":
               k = random.randint(x+1, liczba)
               if k == liczba:
                   print("Twoja liczba to:", k)
 
           else:
               print("Jesteś oszustem. To nie jest twoja liczba! Gra zostaje zakończona!")
               break
 
 
input("\n\nAby zakończyć program, naciśnij klawisz Enter!")

A przy okazji to mój dzisiejszy twór do oceny.  Chichot Takie małe projekty ale motywują do dalszej nauki. Hehe
Kod
# -*- coding: utf-8 -*-
#Drzewko Geneologiczne v1.
#Program prezentuje drzewo geneologiczne rodziny.
 
 
print("""
 
                   'Rodzinne drzewko geneologiczne'
                                                        .
                                             .         ;  
                .              .              ;%     ;;  
                  ,           ,                :;%  %;  
                   :         ;                   :;%;'     .,  
          ,.        %;     %;            ;        %;'    ,;
            ;       ;%;  %%;        ,     %;    ;%;    ,%'
             %;       %;%;      ,  ;       %;  ;%;   ,%;'
              ;%;      %;        ;%;        % ;%;  ,%;'
               `%;.     ;%;     %;'         `;%%;.%;'
                `:;%.    ;%%. %@;        %; ;@%;%'
                   `:%;.  :;bd%;          %;@%;'
                     `@%:.  :;%.         ;@@%;'  
                       `@%.  `;@%.      ;@@%;        
                         `@%%. `@%%    ;@@%;        
                           ;@%. :@%%  %@@%;      
                             %@bd%%%bd%%:;    
                               #@%%%%%:;;
                               %@@%%%::;
                               %@@@%(o);  . '        
                               %@@@o%;:(.,'        
                           `.. %@@@o%::;        
                              `)@@@o%::;        
                               %@@(o)::;        
                              .%@@@@%::;        
                              ;%@@@@%::;.          
                             ;%@@@@%%:;;;.
                         ...;%@@@@@%%:;;;;,..
           "
"")
 
print(input("\nAby przejść do edycji drzewka naciśnij klawisz Enter!"))
 
drzewko = {}
wybór = None
while wybór != "0":
 
   print("""
 
         0 - zakończ program
         1 - dodaj osoby
         2 - wymień parę ojciec/syn
         3 - usuń osoby
         4 - Sprawdź drzewko
         "
"")
 
 
   wybór = input("Wybierasz: ")
 
   if wybór == "0":
       print("Edycja drzewka została zakończona")
 
   elif wybór == "1":
       syn = input("Podaj imię i nazwisko syna, którego chcesz dopisać do listy: ")
       if syn not in drzewko:
           ojciec = input("\nPodaj imię i nazwisko ojca: ")
           drzewko[syn] = ojciec
           print(syn, "został dodany.\n")
       else:
           print(syn, "już jest na liście.")
   elif wybór == "2":
       syn = input("Podaj imię i nazwisko syna: ")
       if syn in drzewko:
           ojciec = input("\nWprowadź nowe imię i naziwsko ojca: ")
           drzewko[syn] = ojciec
           print("Parametry", syn, "oraz", ojciec, "zostały zaaktualizowane\n")
       else:
           print(syn, "nie znajduje się na liście.")
   elif wybór == "3":
       syn = input("Podaj imię i nazwisko syna, który ma zostać usunięty z listy: ")
       if syn in drzewko:
           del drzewko[syn]
       else:
           print(syn, "nie znajduje się na liście.")
   elif wybór == "4":
       nazwisko = input("Podaj imię i nazwisko osoby, aby sprawdzić kto jest jego ojcem: ")
       if nazwisko in drzewko:
           print("Ojcem", nazwisko, "jest",drzewko[nazwisko], ".")
       else:
           print("Tej osoby nie ma na liście.")
       nazwisko = input("Podaj imię i nazwisko oosoby, aby sprawdzić kto jest jego dziadkiem: ")
       if nazwisko not in drzewko:
           print("Niestety nie ma tej osoby na liście")
       else:
           dziadek = drzewko[nazwisko]
           print("Dziadkiem", nazwisko, "jest", drzewko.get( dziadek, ".\nDrzewko zawiera zbyt mało informacji aby wyświetlić wynik. Proszę uzupełnij dane."))
 
 
input("\n\nAby zakończyć program naciśnij klawisz Enter!")

Chętnie się dowiem od was co mogłem zrobić inaczej, żeby lepiej działały.
Zapisane
« Odpowiedz #7 : 07:43 25/01/19 »
mrozik Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 1


Cześć!

Wiem, że odkopuję stary temat, ale jeszcze inaczej interpretuję zadanie - komputer ma znaleźć liczbę, na którą wpadnie użytkownik, jednak niekoniecznie musi ją znać.

Kod
import random
 
print("Cześć!")
print("Dziś to ja, Komputer, będę zgadywał Twoją liczbę z zakresu 1-100.")
print("Jeżeli podana przeze mnie liczba jest większa, wpisz '>'.")
print("Jeżeli podana przeze mnie liczba jest mniejsza, wpisz '<'.")
print("Jeżeli zgadłem, wpisz '='.")
 
a = random.randint(1, 100)
odpowiedz = ' '
licznik = 1
 
while odpowiedz != '=':
   print("\nObstawiam, że ta liczba to", a)
   odpowiedz = input("Dobrze zgaduję? ")
   if odpowiedz == '<':
       a = random.randint(1,a)
   elif odpowiedz == '>':
       a = random.randint(a,100)
   elif odpowiedz == "=":
       break
   else:
       print("Grasz nieczysto.")
 
   licznik += 1
 
print("\nHurra! Udało mi się znaleźć odpowiedź za ", licznik, "razem! Dzięki za grę.")
 
input("\n\nAby zakończyć działanie programu wciśnij Enter.")
 
Zapisane
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2019 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot