Seite 1 von 2

Re: strip, split - mehrere Argumente

Verfasst: Montag 19. Juli 2010, 17:13
von sma
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

Re: strip, split - mehrere Argumente

Verfasst: Dienstag 20. Juli 2010, 00:40
von Shaldy
Ä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 ;)

Re: strip, split - mehrere Argumente

Verfasst: Dienstag 20. Juli 2010, 00:59
von pillmuncher
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.

Re: strip, split - mehrere Argumente

Verfasst: Dienstag 20. Juli 2010, 08:27
von EyDu
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.

Re: strip, split - mehrere Argumente

Verfasst: Dienstag 20. Juli 2010, 09:23
von Shaldy
Schont gut, schon gut... ;)

Re: strip, split - mehrere Argumente

Verfasst: Dienstag 20. Juli 2010, 21:29
von Yuzuke
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?

Re: strip, split - mehrere Argumente

Verfasst: Dienstag 20. Juli 2010, 22:41
von EyDu
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

Re: strip, split - mehrere Argumente

Verfasst: Dienstag 20. Juli 2010, 23:13
von jbs
@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?

Re: strip, split - mehrere Argumente

Verfasst: Dienstag 20. Juli 2010, 23:18
von EyDu
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.

Re: strip, split - mehrere Argumente

Verfasst: Mittwoch 21. Juli 2010, 00:55
von pillmuncher
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.