Python :: Aufgabe #199

5 Lösungen Lösungen öffentlich

Teufelskreis einer selbstbezüglichen Aussage

Anfänger - Python von hollst - 17.12.2018 um 18:46 Uhr
Die folgende Aussage sei gegeben als String:

"Dieser Satz hat vierzig Buchstaben sowie einen Punkt."


Die Aussage ist natürlich falsch, denn der Satz hat tatsächlich fünfundvierzig Buchstaben.

Ersetzen wir nun in der Aussage das Wort "vierzig" durch "fünfundvierzig" bleibt die Aussage aber trotzdem falsch,

denn der neue Satz hat zweiundfünfzig Buchstaben. Schöner Teufelskreis, oder?


Schreibe ein Programm mit dem überprüft wird, ob es überhaupt eine (ausgeschriebene) Zahl gibt, die oben zu einer wahren Aussage führt.

Viel Spaß!

Lösungen:

vote_ok
von ZRX88 (2770 Punkte) - 22.12.2018 um 22:31 Uhr
Quellcode ausblenden Python-Code
'''
Created on 22.12.2018

@author: robert
'''


satz_format = 'Dieser Satz hat %s Buchstaben sowie einen Punkt.'


zahlen = {}
zahlen['42'] = 'zweiundvierzig'
zahlen['43'] = 'dreiundvierzig'
zahlen['44'] = 'vierundvierzig'
zahlen['50'] = 'fuenfzig'
zahlen['30'] = 'dreisig'
zahlen['52'] = 'zweiundfuenfzig'
zahlen['53'] = 'dreiundfuenfzig'
zahlen['58'] = 'achtundfuenzig'
zahlen['61'] = 'einundsechzig'
zahlen['0'] = ''
zahlen['62'] = 'zweiundsechzig'
zahlen['63'] = 'dreiundsechzig'
zahlen['56'] = 'sechsundfuenfzig'
zahlen['59'] = 'neunundfuenfzig'

for key in zahlen.keys():
    if len(satz_format % zahlen[key]) == int(key):
        print(key + ' solves question ')
    else:
        print(key + ' does not solve the question')
        print(len(satz_format % zahlen[key]))
        


In das Dictonary könnte man analog nun alle weiteren Zahlen eintragen und prüfen.. :)
vote_ok
von scar77 (210 Punkte) - 30.12.2018 um 15:17 Uhr
Quellcode ausblenden Python-Code
satz = "Dieser Satz hat vierzig Buchstaben sowie einen Punkt."    

satz_liste = satz.split()

# Zahlwort löschen
del satz_liste[3]

    
zahlwoerter = {1:"ein", 2:"zwei", 3:"drei", 4:"vier", 5:"fünf", 6:"sechs", 7:"sieben", 8:"acht", 9:"neun",\
20:"zwanzig", 30:"dreißig", 40:"vierzig", 50:"fünfzig", 60:"sechzig", 70:"siebzig", 80:"achtzig", 90:"neunzig"}

# Funktion zur Ermittlung der Zahlwörter
def zahl_wort(i):

    if i % 10 == 0:
        zahlwort = zahlwoerter[i]
        return zahlwort
    else:
        zehner = i - (i % 10)
        zehner_wort = zahlwoerter[zehner]
        einer = i - zehner
        einer_wort = zahlwoerter[einer]
    
        zahlwort = einer_wort + "und" + zehner_wort
        return zahlwort

# Vergleich Satzlänge mit Zahl    
for i in range(38, 99):
    sum = 0
    
    satz_liste.insert(3, zahl_wort(i))
    
    for word in satz_liste:
        for letter in word:
            if letter.isalpha():
                sum += 1
       
    if sum == i:
        print(" ".join(satz_liste))
        print("\nAnzahl der Buchstaben: {}\n".format(sum))
    else:
        pass
    
    del satz_liste[3]
vote_ok
von jigga (4260 Punkte) - 09.01.2019 um 12:15 Uhr
Quellcode ausblenden Python-Code
wb = {"1":"ein", "2":"zwei", "3":"drei", "4":"vier", "5":"fünf", "6":"sechs", "7":"sieben", "8":"acht", "9":"neun", "10":"zehn", 
"11":"elf", "12":"zwölf", "13":"dreizehn", "14":"vierzehn", "15":"fünfzehn", "16":"sechszehn", "17":"siebzehn", "18":"achtzehn", "19":"neunzehn", 
"20":"zwanzig", "30":"dreißig", "40":"vierzig", "50":"fünfzig", "60":"sechszig", "70":"siebzig", "80":"achtzig", "90":"neunzig", "100":"hundert"}
s = "vierzig"
sn = 0
inp = "Dieser Satz hat " + s + " Buchstaben sowie einen Punkt."
print(inp)
while (len(inp.replace(' ','').replace('.','')) != sn):	
	sn = len(inp.replace(' ','').replace('.',''))
	
	if sn > 0 and sn <= 20:
		s = wb[sn]
	
	elif sn > 20 and sn < 100:
		if str(sn)[1] == "0":
			s = wb[str(sn)]
		else:
			s = wb[str(sn)[1]] + "und" + wb[str(sn)[0]+"0"]
	
	elif sn >= 100 and sn < 1000:
		if str(sn)[2] == "0":
			s = wb[str(sn)[0]] + "hundert" + wb[str(sn)[1:2]]
		else:
			s = wb[str(sn)[0]] + "hundert" + wb[str(sn)[1]] + "und" + wb[str(sn)[0]+"0"]
	
	inp = "Dieser Satz hat " + s + " Buchstaben sowie einen Punkt."
	print(inp)
vote_ok
von fmartin (20 Punkte) - 03.10.2019 um 14:38 Uhr
Quellcode ausblenden Python-Code
#!/usr/bin/python

textAnfang = 'Dieser Satz hat'
textEnde = 'Buchstaben sowie einen Punkt.' 
gefundeneSaetze = []

def zahl2wort(zahl):
    wort = ''
    zehnerWort = {1:'zehn', 2:'zwanzig', 3:'dreißig', 4:'vierzig',  5:'fünfzig', 
                                6:'sechzig', 7:'siebzig', 8:'achtzig', 9:'neunzig'}
    einserWort = {0:'', 1:'ein', 2:'zwei', 3:'drei', 4:'vier', 5:'fünf', 6:'sechs', 7:'sieben', 8:'acht', 9:'neun'}
    zehnerZahl,  einerZahl = divmod(zahl,  10)
    if zehnerZahl == 1:
        return einserWort[einerZahl]+zehnerWort[zehnerZahl]
    else:
        if einerZahl == 0:
            return zehnerWort[zehnerZahl]
        else:
            return einserWort[einerZahl]+'und'+zehnerWort[zehnerZahl]
    return wort

for i in range(13, 100):
    gesamtText = textAnfang+' '+zahl2wort(i)+' '+textEnde
    if len(gesamtText) - 7 == i: # 7 Leerzeichen !!
        gefundeneSaetze.append(gesamtText)
        
for satz in gefundeneSaetze:
    print(satz)

vote_ok
von Klaus (1960 Punkte) - 31.01.2020 um 16:03 Uhr
Quellcode ausblenden Python-Code
# Kleiner als 38 kann die Lösung wegen der fest vorgegebenen Buchstaben nicht sein
# Geprüft wird der Zahlenbereich zwischen 38 und 99

# Elemente zum Zusammensetzen der Zahlenbezeichnungen
translate_dict = {1: 'ein', 2: 'zwei', 3: 'drei', 4: 'vier', 5: 'fünf', 6: 'sechs', 7: 'sieben', 8: 'acht',
                  9: 'neun', 30: 'dreißig', 40: 'vierzig', 50: 'fünfzig', 60: 'sechszig', 70: 'siebzig',
                  80: 'achtzig', 90: 'neunzig'}

# Funktion zur Rückgabe der Zahlenbezeichnung
def translate_number(number):
    if number % 10 == 0:
        return translate_dict[number]
    else: 
        return f'{translate_dict[number%10]}und{translate_dict[number//10*10]}'
    
# Dictionary für den Zahlenbereich zwischen 38 und 99 wird aufgebaut
counter_dict = {}
for index in range (38, 100):
    counter_dict[index] = translate_number(index)

# Prüfung auf Basis des Dictionaries / Ausgabe korrekter Lösungen
for element in counter_dict:
    if element == len(f'diesersatzhat{counter_dict[element]}buchstabensowieeinenpunkt'):
        print(f'Richtige Lösung bei "{counter_dict[element]}"')