Weiß jemand wie man in drei Zeilen ein Programm in Python programmiert, was in 7 Versuchen eine Zahl errät?

3 Antworten

low, high = 1, 100
for _ in range(7):
    guess = (low + high) // 2
    print(f"Ich rate: {guess}")
    feedback = input("Ist das (k)orrekt, zu (h)och oder zu (n)iedrig? ").lower()
    if feedback == 'k':
        print("Ich habe deine Zahl erraten!")
        break
    elif feedback == 'h':
        high = guess - 1
    elif feedback == 'n':
        low = guess + 1
else:
    print("Ich konnte die Zahl nicht in 7 Versuchen erraten.")

Komprimiert:

a,b=1,100
for _ in range(7):c=(a+b)//2;print(c);r=input();[exit() for _ in[0] if r=='k'];a,b=[c+1,b]if r=='n'else[a,c-1]if r=='h'else[a,b]

Beschreibe mal genauer, wie du dir das vorstellst. Beispielsweise mit einem Beispiel, wie die Eingabe bzw. Ausgabe aussehen soll. Ich verstehe nämlich anhand deiner Beschreibung noch nicht, was das Programm machen soll.

Denn... Wenn du die Zahl eingibst, kennt das Programm die Zahl doch. Da braucht das Programm doch nicht raten.

Ich will ein Programm in Python programmierern, was eine Zahl in 7 Versuchen eine eingebene Zahl errät.

Kings007 
Beitragsersteller
 22.09.2024, 19:18

Ich meine wo das Programm immer eine Fragen stellt zur Zahl und dann am Ende mir die Zahl ausgibt

mihisu  22.09.2024, 20:21
@Kings007

Also sowas in der Art...?

print("Denke Sie sich eine natürliche Zahl kleiner als 128.")
print("Ich werde die Zahl nach 7 Versuchen (Fragen) nennen.")
a, b = 0, 128
for n in range(1, 8):
    c = (a + b)//2
    while True:
        r = input(f"{n}. Versuch: Ist die Zahl kleiner als {c}? [y/n]: ").lower()
        if r in ['y', 'yes', 'j', 'ja', '1']:
            b = c
            break
        elif r in ['n', 'no', 'nein', '0']:
            a = c
            break
        else:
            print("Ihre Eingabe wurde nicht erkannt.")
            continue
print(f"Die von Ihnen gedachte Zahl ist: {a}")

Beispiel-Durchlauf für die gedachte Zahl 36...

Denke Sie sich eine natürliche Zahl kleiner als 128.
Ich werde die Zahl nach 7 Versuchen (Fragen) nennen.
1. Versuch: Ist die Zahl kleiner als 64? [y/n]: y
2. Versuch: Ist die Zahl kleiner als 32? [y/n]: n
3. Versuch: Ist die Zahl kleiner als 48? [y/n]: y
4. Versuch: Ist die Zahl kleiner als 40? [y/n]: y
5. Versuch: Ist die Zahl kleiner als 36? [y/n]: y
6. Versuch: Ist die Zahl kleiner als 34? [y/n]: n
7. Versuch: Ist die Zahl kleiner als 35? [y/n]: n
Die von Ihnen gedachte Zahl ist: 35

Es sollte möglich sein, das auch in 3 Zeilen zu programmieren. Das wären dann aber recht lange Zeilen, und es wird sehr unübersichtlich. Glaub mir, das möchtest du nicht in 3 Zeilen haben.

mihisu  22.09.2024, 20:26
@mihisu

Kommentar:

# Nach jedem Schritt hat man zwei Zahlen a, b, wobei a <= g < b
# mit der gedachten Zahl g gilt.
# Es sind 128 gedachte Zahlen möglich.
# In jedem der Versuch-Schritte wird der Suchbereich halbiert.
# Wegen 128 = 2**7 ist die Suche nach 7 Schritten beendet,
# da nur noch eine Zahl im Suchbereich verbleibt.

Drei Zahlen Code? Von was träumst du denn :D

Hier ein Code der das ausführt was du nach meinem Verständnis suchst. Lass es mal laufen und gib mir Feedback ob es das war was du gesucht hast.

def rate_zahl():

  print("Denke dir eine Zahl zwischen 1 und 100 aus. Ich werde sie in maximal 7 Versuchen erraten!")

   

  niedrig = 1

  hoch = 100

  versuche = 0

  while versuche < 7:

    versuche += 1

    rateversuch = (niedrig + hoch) // 2

    print(f"Versuch {versuche}: Ist es {rateversuch}?")

    antwort = input("Antwort (zu klein / zu groß / richtig): ").lower()

    if antwort == "richtig":

      print(f"Juhu! Ich habe die Zahl in {versuche} Versuchen erraten.")

      break

    elif antwort == "zu klein":

      niedrig = rateversuch + 1

    elif antwort == "zu groß":

      hoch = rateversuch - 1

    else:

      print("Ungültige Antwort. Bitte antworte mit 'zu klein', 'zu groß' oder 'richtig'.")

   

  if versuche == 7 and antwort != "richtig":

    print("Oh nein! Ich konnte die Zahl in 7 Versuchen nicht erraten.")

# Starte das Spiel

rate_zahl()