Problem mit summen in tupeln

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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Montag 11. Juni 2007, 14:29

EyDu hat geschrieben:Willst du damit sagen, dass du optimierst, ohne zu prüfen ob die Optimierung auch schneller ist ;-) ?
Das muss man nicht prüfen, das kann man mit der Zeit riechen :D
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 11. Juni 2007, 16:23

Nein, das will ich nicht...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Montag 11. Juni 2007, 20:58

Hallo nochmal,
also vielen Dank, aber ihr habt euch so in eure Optimierung verstrickt dass ihr ganz übersehen habt dass keine der Möglichkeiten mein Problem löst... :)
Aber ihr habt sicher nichts dagegen wenn's noch ein bisschen komplizierter wird...
wenn mehr (1, 10) tupel auftauchen sollen auch entsprechend mehr Summen rauskommen.
Also damit meine ich, wenn die Liste am Anfang zB so aussieht:

Code: Alles auswählen

a = [(4,4),
       (1,10),
       (7,7),
       (10,10),
       (1,10)]
soll die Lösung so aussehen:

Code: Alles auswählen

[23, 32, 41]
Um das Prinzip nochmal zu verdeutlichen:

Code: Alles auswählen

[(1,10)]		      # ---> [1, 10]
[(1,10),(1,10)]		   # ---> [2, 11, 20]
[(1,10),(1,10),(1,10)]	# ---> [3, 12, 21, 30]
# etc.
Gruss,
Jo
BlackJack

Montag 11. Juni 2007, 22:00

Vielleicht liegt's an der Hitze, aber ich verstehe die Bildungsvorschrift nicht. :?:
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Dienstag 12. Juni 2007, 07:09

jo_hb hat geschrieben: Also damit meine ich, wenn die Liste am Anfang zB so aussieht:

Code: Alles auswählen

a = [(4,4),
       (1,10),
       (7,7),
       (10,10),
       (1,10)]
soll die Lösung so aussehen:

Code: Alles auswählen

[23, 32, 41]
Um das Prinzip nochmal zu verdeutlichen:

Code: Alles auswählen

[(1,10)]		      # ---> [1, 10]
[(1,10),(1,10)]		   # ---> [2, 11, 20]
[(1,10),(1,10),(1,10)]	# ---> [3, 12, 21, 30]
# etc.
:shock:
Moin,

ich hab die Vorschrift:

Code: Alles auswählen

[(1,10),(1,10)]		   # ---> (1,  10)
Durchgang 1: Erweitern     #  (1,   0, 10)
Durchgang 2: Plus (1, 0)   #   (2,   1, 10)
Durchgang 3: Plus (0, 10) #   (2, 11, 20)
Nur, warum das Tupel erweitert wird, ist mir aus Jos Erklärung nicht erkennbar. Denn wenn man nur einfach die Elemente einzeln addiert, dann ergäbe sich (1+1+10, 10+1+10) = (12, 21). Sieht ein wenig aus wie Binomische Formeln der Addition. :lol:
Wie auch immer, mit der obigen Regel sollte Jo das jetzt in einen Pythonausdruck bringen können.

Viel Spaß,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Dienstag 12. Juni 2007, 07:18

Im Prinzip soll jedesmal, wenn ein (1,10) tupel auftaucht die Summe, die man durch die addition der bisherigen Tupel erreicht hat aufgeteilt werden, nämlich in einmal bisherige_summe+1 und einmal bisherige_summe+10.
d.h. in diesem Fall

Code: Alles auswählen

a=[(1,10),(1,10)]
würde im ersten Schritt

Code: Alles auswählen

[2,11,11,20]
rauskommen, nur soll das Ergebniss keine doppel enthalten. Ich dachte man könnte das vielleicht auch irgendwie in einem schritt machen, also nicht erst berechnen und dann in einem zweiten Durchgang die doppelten rauskicken?
BlackJack

Dienstag 12. Juni 2007, 07:51

Und *darauf* hätte man aufgrund Deiner spärlichen Beschreibungen kommen sollen!? Das ist nicht Dein ernst, oder? :shock:

Wobei ich jetzt immer noch nicht sicher bin, ob ich's verstanden habe. Wer weiss was für obskure Bedingungen und Vorschriften Du noch nicht verraten hast.

Was ist eigentlich der Sinn dieser Übung?
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Dienstag 12. Juni 2007, 07:52

Hi Jo,

uns Leser scheint das Unverständnis zu einen. Die Vorschrift scheint doch nicht so logisch zu sein, wie ich oben andeutete. Scheinbar hast Du folgende Regel verwendet:
für n gleiche Tupel mit (x, y):
#(x*n, x*(n-1)+y, y*(n-2)+y*2, ..., x+y*(n-1), y*n)
=((n-a)*x + a*y) # für a = 0..n
Im Studium mussten wir so etwas ähnliches auch schon einmal rechnen. Aber nicht in Kombination mit den anderen Tupeln der Liste. Kannst Du uns ein praktisches Anwendungsbeispiel dafür nennen? Wie sieht z.B. die Lösung für folgende Listen aus:
[(1, 10), (4, 4), (4, 4), (1, 10)]
und
[(1, 10), (4, 4), (4, 4), (1, 10), (1, 10)]

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Dienstag 12. Juni 2007, 11:01

Also ich hab's verstanden oO...
[(1, 10), (4, 4), (4, 4), (1, 10)]
und
[(1, 10), (4, 4), (4, 4), (1, 10), (1, 10)]
Bei dem ersten würde

[10, 19, 28]

und beim zweiten

[11...

Oh Gott, im Kopf dauert das mir zu lang. Auf jedenfall sollen alle möglichen Summen errechnet werden oO Aber keine doppelten Werte!
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Dienstag 12. Juni 2007, 11:32

Also worum es dabei geht: tatsächlich um Blackjack! :)
Wo man nämlich Karten bekommt, also werte 2 bis 10, das dumme ist nur dass ein Ass wahlweise 1 oder 10 punkte wert ist, je nachdem was grad günstiger ist. Ich möchte allerdings nicht nur den jeweils niedrigsten oder höchsten Wert meiner Hand ausrechnen sondern alle, weil ich das dann wieder zusammenbringen will mit den Karten, die noch im Stapel sind, also noch kommen können.

Ergebnisse für die Beispiele weiter oben wären:

[(1, 10), (4, 4), (4, 4), (1, 10)]
-> [10, 19, 28]

und

[(1, 10), (4, 4), (4, 4), (1, 10), (1, 10)]
-> [11, 20, 29, 38]

Das mit den tupeln für alle Karten, also auch zB (4,4) liegt daran dass ich mir dachte es wäre dann irgendwie einfacher, wenn ass und andere Karten sozusagen im selben format / typ vorliegen, aber vielleicht geht's dann anders doch einfacher?

Danke jedenfalls schonmal für eure Hilfe,
Gruss,
Jo
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Dienstag 12. Juni 2007, 11:42

Blackjack hat geschrieben:Und *darauf* hätte man aufgrund Deiner spärlichen Beschreibungen kommen sollen!? Das ist nicht Dein ernst, oder?
Mal provokant gefragt: Warum hast du einen Lösungsansatz angeboten, ohne die Aufgabenstellung verstanden zu haben? ;)
BlackJack

Dienstag 12. Juni 2007, 12:02

Hui es geht um mich ;-)

Eine einfache, recht geradlinige Umsetzung könnte so aussehen:

Code: Alles auswählen

def add_card(values, card):
    result = [value + card for value in values]
    if card == 1:
        result += [value + 10 for value in values]
    return set(result)

def calculate_hand(cards):
    return sorted(reduce(add_card, cards, set([0])))


def main():
    print calculate_hand([1, 4, 4, 1, 1])
    print calculate_hand([1, 4, 4, 1])
@mawe: Ich dachte ja ich hätte die Aufgabenstellung verstanden und ich war auch nicht der einzige der sie so verstanden hat.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Dienstag 12. Juni 2007, 12:42

Hi Mawe,

die Frage ist, warum uns Jo ein bei weitem nicht hinreichend beschriebenes Zwischendingsda aus Problem und Lösungsansatz vorsetzt. Denn ich persönlich würde mich nicht auf Paare fixieren, nur weil ein Wert zwei Bedeutungen haben kann. Wie Du siehst kann man sich in einem komplizierten Ansatz verfangen, während man bei Kenntnis des eigentlichen Problems viel weiter außen hätte einfacher ansetzen können.

Und JETZT können wir über Optimierungen reden. Also, die Runde ist eröffnet! :lol:

EDIT: jetzt wo ich es nochmal lese, fällt es auch mir wie Schuppen aus den Haaren. Ich dachte es geht allgemein um mehrfach vorhandene Tupel...

Grüße,
der Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Dienstag 12. Juni 2007, 13:12

Naja warum kann ich dir schon sagen: Weil das eben die Stelle war an der ich festgesteckt bin, und dafür dann eine Lösung gesucht habe. Ich würde ja auch nicht kommen und sagen 'Windows ist Mist, ich möchte ein neues Betriebssystem schreiben, wie mach ich das denn', sondern erstmal anfangen und dann, mit einer Teillösung in der Tasche, für Teilprobleme nachfragen.

Gut, wenn dann die Teillösung auch schon krumm ist ist das ne andere Geschichte. Trotzdem würde ich sagen dass eine Beschreibung wie 'wenn tupel (1,10) mehrfach auftauchen sollen auch entsprechend mehr Lösungen rauskommen' soo missverständlich nun auch wieder nicht ist - wenn man den Satz liest, wüsste ich nicht wie man den sonst verstehen sollte, vielleicht dass die Summen die rauskommen dann höher sind? Wohl kaum. Wenn man ihn, den Satz, aber gar nicht versteht, sollte man tatsächlich nachfragen und ihn nicht einfach ignorieren.

Naja, jetzt aber auch gut. Ich werd beim nächsten Mal mehr drauf achten wirklich eindeutig zu schreiben. Und danke euch trotzdem nochmal für eure Hilfe! :)

Gruss,
Jo
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Dienstag 12. Juni 2007, 13:34

Michael Schneider hat geschrieben:Und JETZT können wir über Optimierungen reden. Also, die Runde ist eröffnet! :lol:
Fällt mir nix ein, aber ich hätte einen Einzeiler:

Code: Alles auswählen

calculate_hand=lambda c:sorted(set(reduce(lambda s,c:[v+c for v in s]+(c==1and[v+10for v in s]or[]),c,[0])))
:D
TUFKAB – the user formerly known as blackbird
Antworten