strip, split - mehrere Argumente

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich weiß ja nicht, ob es wirklich ums Würfeln geht, aber 2008 hatte ich mal http://python-forum.de/viewtopic.php?p=114705 implementiert.

Stefan
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Ähhh, hab ich das Problem nicht verstanden oder habt ihr alle einfach nur Spaß an ellenlangem Code?

Code: Alles auswählen

import random

def Damage(wurfzahl, seitenzahl, zusatz):
         erg = 0
         for x in range(wurfzahl):
                  erg += random.randint(1, seitenzahl + 1) #kA ob das so richtig ist, jedenfalls soll eine Zahl "auf dem Würfel" gewählt werden...
         erg += zusatz

         return erg


def StringDamage(string):
         temp = string.split("W")

         if "+" in temp[1]:
                  temp2 = temp[1].split("+")
         else:
                  temp2 = temp[1].split("-")
         wurfzahl = int(temp[0])
         seitenzahl = int(temp2[0])
         zusatz = int(temp2[1])

         return Damage(wurfzahlm seitenzahl, zusatz)

if __name__ == "__main__":
         print Damage(3, 6, -4)
         print Damage(4, 18, 22)
         print StringDamage("3W12-9")
         print StringDamage("2W6+8")
Ungetestet ;)
Dies ist keine Signatur!
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Shaldy hat geschrieben:Ähhh, hab ich das Problem nicht verstanden oder habt ihr alle einfach nur Spaß an ellenlangem Code?
Deiner ist ca. 2/3 von meinem. Dafür hast du keine Fehlerbehandlung. Außerdem addierst du den Zusatz sogar wenn '-' davor steht. :wink:

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Shaldy hat geschrieben:Ähhh, hab ich das Problem nicht verstanden oder habt ihr alle einfach nur Spaß an ellenlangem Code?
Das selbe könnte man dich fragen ;-)

Code: Alles auswählen

import random
import re

def damage(wurfzahl, seitenzahl, zusatz):
    return zusatz + sum(random.randint(1, seitenzahl + 1)
                        for _ in range(wurfzahl))

def string_damage(s):
    wurfzahl, temp = s.split("W")
    seitenzahl, zusatz = re.split("[+-]", temp)
    
    return damage(*map(int, (wurfzahl, seitenzahl, zusatz)))
Die Fehler und schlechten Namen habe ich einfach mal belassen.
Das Leben ist wie ein Tennisball.
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Schont gut, schon gut... ;)
Dies ist keine Signatur!
Yuzuke
User
Beiträge: 10
Registriert: Dienstag 6. Juli 2010, 12:38

Danke für die vielen Antworten, aber spricht eigentlich was dagegen meine Lösung beizubehalten, da ich durch meinen Code wohl am besten durchblicke, oder spricht irgendwas dagegen, solange es funktioniert?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.
Yuzuke hat geschrieben:Danke für die vielen Antworten, aber spricht eigentlich was dagegen meine Lösung beizubehalten, da ich durch meinen Code wohl am besten durchblicke, oder spricht irgendwas dagegen, solange es funktioniert?
Das kommt ganz darauf an, ob du etwas lernen willst oder nicht ;-) Wenn man deine Lösung retten will, dann könnte man es so machen:

Code: Alles auswählen

if value.find("+") >= 0:
    modifier = "+"
elif String.find("-") >= 0:
    modifier = "-"
else:
    modifier = None
        
if modifier is not None:
    until = value.find(modifier)
    number = int(value[until+1:])
    value = value[:until]

until = value.find("W")
counter = int(value[:until])
dice = int(value[until+1:])

damage = sum(random.randint(1, dice) for _ in range(counter))

if modifier is not None:
    if modifier == "+":
        damage += number
    elif modifier == "-":
        damge -= number

return max(0, damage)
Und da ist bei weitem noch nicht alles zusammengefasst.

Und schau dir doch bitte mal PEP8 an. Wenn man eine Sprache verwendet - und besonders wenn man Hilfe von anderen in Anspruch nimmt - dann sollte man sich an gewisse Standards halten. Das macht es für beide Seiten einfacher.

Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

@EyDu: Ich bin gerade verwirrt. Habe ich etwas nicht mitbekommen?

Code: Alles auswählen

if value.find("+")  >= 0:
    modifier = "+"
elif String.find("-") >= 0:
    modifier = "-"
else:
    modifier = None
Warum nicht '+' in value?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

jbs hat geschrieben:Warum nicht '+' in value?
Das hat der Schlafmangel beschlossen. Es sollte natürlich in verwendet werden.

Oder man verwendet den Index anstatt ein zweites Mal zu suchen. Macht den Code aber nicht wirklich besser.
Das Leben ist wie ein Tennisball.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Yuzuke hat geschrieben:spricht irgendwas dagegen, solange es funktioniert?
Eine Lösung sollte das Problem widerspiegeln, das sie löst. Aus deinem Code wird erst nach längerem Überlegen deutlich, welche Strings akzeptiert und welche Ausgaben erzeugt werden. Bei mir steht schon ziemlich am Anfang ein regulärer Ausdruck, der deutlich macht, worum es geht.

Bei dir gibt es 6 if-Statements, bei mir nur ein einziges und das ist bloß zur Ausnahmebehandlung. Dadurch muss man beim Lesen nur in eine Richtung denken und nicht verschiedene Ablaufwege im Kopf behalten. Bei mir gibt es 7 Zuweisungen, bei dir 20. Du modifizierst deine Variablen, so dass sie zu unterschiedlichen Zeiten unterschiedliche Werte annehmen, ich dagegen weise meinen Variablen Werte zu, die dann gleich bleiben. In der Funktionalen und Logischen Programmierung nennt man das referentielle Transparenz. Das ist etwas gutes, weil man so dem zeitlichen Ablauf weniger Aufmerksamkeit schenken muss. Man muss sich nur überlegen, welche Daten wann zur Verfügung stehen müssen, und arrangiert die Zuweisungen entsprechend.

Wenn ich es mir recht überlege, habe ich ein Scheme-Programm geschrieben :wink:

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
Antworten