Komme bei einem kleinen Konsolenprogramm in Python nicht weiter. Kann mir jemand dabei helfen?

3 Antworten

Ok.

Du weißt, es ist im Intervall [0, 100].

Nun nimmst Du eine willkürliche Grenze, z. B. 35, fügst sie in die Liste ein und sortierst die Liste.

Danach steht in Deiner Liste also [0, 35, 100].

Dann fragst Du den User, ob die Zahl größer oder kleiner als 35 ist.

Wenn er sagt "kleiner", soll Dein Intervall anschließend [0, 35] sein. Also musst Du das letzte Element der Liste löschen.

Wenn er sagt "größer", soll Dein Intervall anschließend [35, 100] sein. Also musst Du das erste Element der Liste löschen.

Der Ansatz ist ok, Du hast allerdings einen Tippfehler in Deinem Code.

aks = input("Ist es die Zahl {0}? (</>/=)".format(random_num))

Dadurch wird eine neue Variable deklariert, anstatt den Wert der bestehenden zu ändern.

Ich würde es allerdings ohnehin anders implementieren.

import time
from random import randint

trys = 0
liste = [1, 100]

print("Herzlich Willkommen bei 'Computer erraet Zahl'")
print("Denken Sie sich nun bitte eine Zahl von 1 bis 100 aus. Der Computer wird dann versuchen die Zahl zu erraten.")

while True:
random_num = randint(liste[0], liste[-1])
liste.append(random_num)
liste.sort()
ask = input("Ist es die Zahl {0}? (</>/=)".format(random_num))
trys += 1

if ask == ">":
#del liste[0] # funktioniert auch, benoetigt aber mehr versuche
liste = [liste[1] + 1, liste[2]] # benoetigt weniger versuche
elif ask == "<":
#del liste[-1] # funktioniert auch, benoetigt aber mehr versuche
liste = [liste[0], liste[1] - 1] # benoetigt weniger versuche
elif ask == "=":
print("Herzlichen Glueckwunsch. Ich habe die Zahl in {0} Versuchen erraten.".format(trys))
break

Ist meiner Meinung nach viel verständlicher, wenn jeweils nur an einer Stelle Nutzereingaben geholt und/oder neue Zufallszahlen gezogen werden.

Das mit dem aks anstatt ask war auch das eigentliche Problem, denn irgendwann ist es mit den Wertebereichen total durcheinander geworden. Danke schon mal dafür :D.

Sehe jetzt auch gerade, dass deine Methode viel übersichtlicher und effizienter und schneller ist.

Kannst du mir vielleicht noch einmal diesen einen Schritt erklären?

liste = [liste[1] + 1, liste[2]]
1
@Niction

liste[1] ist immer die Zahl, nach der gefragt wurde.

Das untere Teilintervall geht von liste[0] bis liste[1].

Der obere Teilintervall geht von liste[1] bis liste[2].

Aber: Der User hat ja bereits preisgegeben, dass die Zahl, nach der er gefragt wurde, also liste[1], nicht die gesuchte Zahl ist.

Das heißt, wenn der User sagt "kleiner", dann müssen wir als obere Grenze des Suchintervalls nicht die Zahl nehmen, nach der wir gefragt haben, sondern die Zahl minus eins, denn wir wissen ja bereits, dass die gesuchte Zahl echt kleiner (anstatt kleiner gleich) der Zahl ist, nach der gefragt wurde. Das heißt, wir können die Obergrenze des Intervalls eins niedriger setzen, also geht das neue Intervall nicht von liste[0] bis liste[1], sondern von liste[0] bis liste[1] - 1, denn die Zahl liste[1] haben wir ja als Kandidaten bereits ausgeschlossen.

Genauso, wenn der User sagt "größer", dann müssen wir als untere Grenze des Suchintervalls nicht nicht die Zahl nehmen, nach der wir gefragt haben, denn von der wissen wir ja bereits, dass sie es nicht ist. Die gesuchte Zahl ist echt größer, als die Zahl liste[1], also ist die liste[1] + 1 eine bessere Untergrenze für das Suchintervall.

1

Der such Algorithmus ist naja.      

Zahl zwischen 0-100 suchen geht am besten mit einem Binary search.    

Also 0-100 Computer fragt 50. User sagt größer. Computer sagt 75. User sagt kleiner. Computer sagt 63. User sagt größer. Computer sagt 69. User größer...Colputer sagt 72. User sagt größer. Computer 74. jetzt kann die Zahl nur noch 73 oder 74 sein. Also...User sagt größer kleiner Computer hat dir Zahl ;) 

Naja eigentlich ist es ja so ziemlich das wie ich es gemacht habe. Ich habe leider auch noch nicht sehr viel Ahnung.

Ich habe ja zu Anfang eine Liste mit den Werten 1 und 100 erstellt. Wenn der Computer nach der Zahl 50 fragt, löscht er den 0ten Eintrag und somit ist die neue Zahl, nach der der Computer fragt zwischen random_num und 100. Wenn der User dann kleiner sagt, dann sollte die Suche durch das löschen des -1ten Eintrags automatisch danach zwischen diesen beiden neuen wertebreichen fragen. Hast du eine Idee wie ich dies besser machen könnte?

1
@Niction

Ganz einfach, statt ...

random_num = randint(liste[0], liste[-1])

... machst Du ...

num = int(math.floor(0.5 * (liste[0] + liste[-1])))

(Und dann alle Vorkommen von random_num durch num ersetzen. Random ist die Zahl ja dann nicht mehr. ;-) )

Zusätzlich musst Du zu Beginn Deines Codes folgendes einfügen.

import math


1
@NoHumanBeing

Die Methode ist interessant :D. Kannte ich vorher noch nicht.

Mache zwar eine schulische Ausbildung, aber so weit sind wir dann auch noch nicht gekommen :D.

Danke euch auf jeden Fall :).

1

Das nennt sich binarysearch binäre Suche.  
    
Google das mal. Das ist ein sehr interessanter Algorithmus.  
Gibt aber noch viele andere Algorithmen wo es sich lohnt sie anzuschauen.

1

Du hast an einer stelle anstatt "ask" "aks" geschrieben. Das ist schonmal ein riesen Fehler.

Zudem ist das System total ineffizient.

Am effizientesten wäre es, die Grenze nicht zufällig wählen, sondern als math.Floor(0.5 * (lower + upper)).

Dann führt man effektiv eine binäre Suche durch.

1
@NoHumanBeing

Jo danke dir, habe das jetzt mal mithilfe von einem anderen User hier darauf angewendet :D.

1

Wie kann ich ein Programm in Adobe Brackets ausführen?

Adobe Brackets ist ja dieser Open-Source Code Editor. Ich habe bis jetzt immer nur HTML und CSS verwendet. Dort sah ich mir immer meine Website direkt im Browser an. Nun möchte ich aber auch mit Python programmieren. Ein Programm, welches mit Python erstellt wurde, muss aber auch ausgegeben/ausgeführt werden, jedoch weiß ich nicht wie. Hab in Brackets, keine Funktion gefunden, ein solches Programm auszuführen.

Vielleicht könntet ihr mir weiterhelfen.

Falls es noch jemanden interessiert, das hier ist mein Programm (Hab grade erst mit Python angefangen, drum ist es noch so ein Anfängerprogramm:

Vornahme = input("Vornahme: ")

Nachnahme = input("Nachnahme: ")

Domain = input("Wunschdomain: ")

TopLevelDomain = input("Wunsch-Top-Level-Domain: ")

print("E-Mail Generator")

print()

print(Vornahme)

print(Nachnahme)

print(Wunschdomain)

print(TopLevelDomain)

print(Vornahme, ".", Nachnahme, "@", Wunschdomain, ".", TopLevelDomain)

...zur Frage

Mache seit 2 Tagen Python. Ist dieser Quelltext dafür ok?

from random import randint

input = raw_input("Gebe Glueckszahl ein und bekomme diese:")
x = 'glueckszahl'
y = 'Rick'

if input == x:
  print(randint(0, 100))
elif input == y:
  print("Cherry verliebt sich in eine Alienfrau mit drei Bruesten!")
else:
  print("Falsche Eingabe")

print("Dieser Text wird immer angezeigt :P")
...zur Frage

Was ist das Problem mit folgendem Python Code?

dashier = int(input("Hier Zahl eingeben: "))

summe = dashier + 7

print(summe)

if summe = 14: print("ich habs geschafft") else: print("it didnt work")

...zur Frage

Python input() Funktion funktioniert nicht?

Hallo allerseits. Ich habe mich mal ein Wenig mit Python beschäftigt und versucht "Schere Stein Papier" zu Programmieren. Im folgenden Script verliert man zwar immer (Wenn es funktionieren würde...) aber noch ist das beabsichtigt.

while "true":
    print("Rock (r), Paper (p) or Scissors (s)? (x to exit)")
    ropasc = input(":")
    if ropasc=="r":
        print("I chose Paper!")
        print("I won!")
        print()
        print()
    elif ropasc=="p":
        print("I chose Scissors")
        print("I won!")
        print()
        print()
    elif ropasc=="s":
        print("I chose Rock!")
        print("I won!")
        print()
        print()
    elif ropasc=="x":
        break
    else:
        print("I didn't understand this.")
print("Bye!")

Wenn ich es jedoch ausführe kommt zuerst der output aber sobald ich etwas eingebe und enter drücke komm folgende Fehlermeldung (ich habe r eingegeben):

Traceback (most recent call last):
  File "rps.py", line 3, in <module>
    ropasc = input(":")
  File "<string>", line 1, in <module>
NameError: name 'r' is not defined
...zur Frage

Python 3 Alle Teiler einer Zahl ausgeben?

Hallo liebe Community!

Leider habe ich wieder einmal eine kleine Blockade. Ich komme bei folgendem Code nicht weiter. zahl = 1 i = (zahl + 1) wert = (int(input("Geben Sie eine Ganzzahl ein: ")))

while(zahl != wert): if (zahl * 10 / i % 10 == 0): print("Alle Teiler von " + str(wert) + " sind:",i) zahl = zahl +1

Ist dieser Fehlerhaft? Und was muss ich ändern damit er richtig funktioniert. PS. Ich will das das Programm alle Teiler einer vom Benutzer eingegebenen Zahl ausgibt.

Danke im Vorraus Kireznieh

...zur Frage

Type Error in Python?

Guten Tag,

beschäftige mich gerade mit Python und habe ein Problem bei dem ich im Internet keine Antwort finden könnte.

Folgende Fehlermeldung kommt. Traceback (most recent call last): File "C:/Program Files/Python35/Würfel Zähler.py", line 12, in x = random.randint(1,b) File "C:\Program Files\Python35\lib\random.py", line 218, in randint return self.randrange(a, b+1) TypeError: Can't convert 'int' object to str implicitly

Leider habe ich keine Ahnung wie ich das ändern soll. Das ist der ausschnitt Wo ja der Fehler liegen muss:

a = 0
b = 0
x = 0
import random
print ("Welcher Würfel (6,12,24)?")
a = input()
print ("Sie wählten einen ",a," seitigen Würfel")
print ("Anzahl der Würfe")
b = input()
print ("Sie wollen ",b," würfe benutzen")
i = 0
while 1:
     x = random.randint(1,b)
...zur Frage

Was möchtest Du wissen?