Problem mit einer Aufgabe

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Also, ich finde, du hast dich bis jetzt tapfer geschlagen! - Ist doch gar nicht so schlecht gelaufen.

Zum 1. Trompeter: Auch dieser sieht ja so ">" oder so "<" aus. Genauer gesagt: Am Anfang so "<" und nach dem ersten Kommando immer ">".

Eine Lösung des Problems, dass einerseits sich der 2. Trompeter umdrehen muss, wenn er so "<" aussieht, andererseits sich der 1. Trompeter aber nicht umdrehen darf, könntest du wie folgt lösen:
Zunächst ignorierst du, dass sich der 1. Trompeter nicht umdrehen darf und wendest das replace() einfach auf die ganze Kapelle an.
Die neu ausgerichtete Kapelle setzt dann neu zusammen aus dem 1. Trompeter, der brav nach rechts schaut, und der restliche Kapelle ab dem 2. Trompeter.

Zu deiner while-Schleife: Die Schleife wird so lange wiederholt, wie die angegebene Bedingung WAHR ist. Denk mal drüber nach ...
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

ja danke :)

also mit der while schleife habe ich es jetz, obwohl es ziemlich scheiße aussieht... vor allem mit "n2" war ne notlösung.. :D

Code: Alles auswählen

import random
n = int(raw_input("Trompeterzahl: ")) 

kapelle= 'l '
n=n-1
n2=n
a='> '
takt=0

liste=['< ','> ']


for n in range(n):
   t=liste[random.randint(0,1)]
   kapelle=kapelle+t

print kapelle

while (kapelle != 'l '+a*n2):
   kapelle=kapelle.replace("> < ","< > ")
   kapelle=kapelle.replace("l < ","l > ")
   print kapelle
   takt=takt+1
print takt, "Takte wurden gebraucht"

also wenn ich das bei dir richtig verstanden habe ungefähr so, dass ich in der schleife ersmal alles auf replace laufen lasse, dann den ersten trompeter richtig stelle und dann alles über den 2ten trompeter laufen lasse??? blicke da nicht so wirklich durch, wie du das meinst... und wie schaffe ich es denn das replace nur überm 2ten trompeter laufen lasse.. :-/
Jack Daniels
User
Beiträge: 30
Registriert: Freitag 1. Januar 2010, 11:38

Lass doch das mit dem ersten Trompeter markieren einfach weg, verwende ebenfalls ein einfaches '<' oder '>' für den und schreib dann

Code: Alles auswählen

kapelle = kapelle.replace("> < ","< > ")
kapelle[0] = '>'
, damit der erste immer richtig steht...
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

problem is ja, dass kapelle keine liste is.. :D
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

kapelle = ">" + kapelle[1:].replace("> < ","< > ")
Hiermit aber ;)
Jack Daniels
User
Beiträge: 30
Registriert: Freitag 1. Januar 2010, 11:38

Ich hab gedacht, dass man bei Strings auch solche Zuweisungen machen kann, aber ich habs grade ausprobiert, es geht nicht :D. Fänd ich cool, wenn dieses Feature mal noch realisiert wird.

Naja, dann halt Cofi's Lösung... ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Jack Daniels hat geschrieben:Ich hab gedacht, dass man bei Strings auch solche Zuweisungen machen kann, aber ich habs grade ausprobiert, es geht nicht :D.
Was für Zuweisungen meinst du? Und nein, Strings verändern geht nicht und das ist auch mit gutem Grund so.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ich hab's mal in Scala versucht -- ohne mit Zeichenketten und Ersetzen auf selbigen zu "schummeln":

http://paste.pocoo.org/show/180729/

Ist aber wohl ein bisschen, äh, nun ja, "javaesque" geworden. :-(
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich hab's mal in Assembler versucht: http://paste.pocoo.org/show/180770/.
TASM erzeugt daraus eine 314 Bytes große COM-Datei. Diese kann mit diesem Python-Script auch ohne Assembler erstellt werden.
Den meisten Platz hat fast die Routine zur Erzeugung einer Random-Zahl benötigt.
MfG
HWK
Jack Daniels
User
Beiträge: 30
Registriert: Freitag 1. Januar 2010, 11:38

Leonidas hat geschrieben:Was für Zuweisungen meinst du? Und nein, Strings verändern geht nicht und das ist auch mit gutem Grund so.
Ich meine Zuweisungen der Art

Code: Alles auswählen

kapelle[0] = ">"
,was ja einer Veränderung eines Strings entsprechen würde... Warum darf man keine Strings verändern? Ich fänd das praktisch...
BlackJack

@Jack Daniels: Dann könnte man Zeichenketten nicht mehr als Schlüssel in Dictionaries verwenden, und *das* wäre äusserst unpraktisch. Insbesondere weit CPython da intern ziemlich stark drauf setzt.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

cofi hat geschrieben:

Code: Alles auswählen

kapelle = ">" + kapelle[1:].replace("> < ","< > ")
Hiermit aber ;)
Wobei das aber der Problemstellung nicht gerecht wird und zu einer Endlosschleife führen kann ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Stephan1993 hat geschrieben:also wenn ich das bei dir richtig verstanden habe ungefähr so, dass ich in der schleife ersmal alles auf replace laufen lasse, dann den ersten trompeter richtig stelle und dann alles über den 2ten trompeter laufen lasse??? blicke da nicht so wirklich durch, wie du das meinst... und wie schaffe ich es denn das replace nur überm 2ten trompeter laufen lasse.. :-/
Sollst du ja nicht. Guckst du und liest du:
numerix hat geschrieben:Zunächst ignorierst du, dass sich der 1. Trompeter nicht umdrehen darf und wendest das replace() einfach auf die ganze Kapelle an.
Die neu ausgerichtete Kapelle setzt dann neu zusammen aus dem 1. Trompeter, der brav nach rechts schaut, und der restliche Kapelle ab dem 2. Trompeter.
Auch wenn es so wie gezeigt dein Problem nicht löst, findest du einen wichtigen Hinweis in der von cofi geposteten Code-Zeile.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Vielleicht wird es doch mal Zeit für eine Musterlösung. Ich hoffe mal, dass ich die Aufgabe einigermaßen getroffen habe:

Code: Alles auswählen

(lambda f,x:f(f,x))(lambda f,x:(print("".join(map("<>".__getitem__,x)),end=""),
len(set(x))>1and(input(),f(f,[1]+list(map(lambda y:y[1]!=(not y[0]<=y[1]<=y[2]),
zip(x,x[1:],x[2:]+[x[-1]])))))),[1]+[__import__("random").choice((0,1))for _ in
range(int(input("?"))-1)])
Das Leben ist wie ein Tennisball.
BlackJack

@EyDu: Ich dachte ja eigentlich immer dass es beim Code-Golf um eine möglichst kurze Lösung geht. Habe hier 122 Zeichen für Python 2.x zu bieten. :-)
lunar

Ich konnte der Versuchung einer Ocaml-Lösung nicht widerstehen …
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:@EyDu: Ich dachte ja eigentlich immer dass es beim Code-Golf um eine möglichst kurze Lösung geht. Habe hier 122 Zeichen für Python 2.x zu bieten. :-)
Mit Möglichkeit der Benutzereingabe und zeilenweiser Weiterschaltung per Tastendruck? - Damit käme ich runter bis auf 124 Bytes.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich war noch gar nicht auf Golf eingestellt. Mir ging es eigentlich um eine möglichste konfuse Umsetzung, die aber immer noch sinnvoll ist. Immerhin soll sie dem Fragesteller auch helfen ^^ Entpackt sieht es aus gar nicht mehr so schlimm aus:

Code: Alles auswählen

(lambda f, x: f(f, x))(
    lambda f, x: (
        print("".join(map("<>".__getitem__, x)), end=""),
        len(set(x))>1 and (
            input(),
            f(f, [1] + list(
                map(lambda y: y[1] != (not y[0]<=y[1]<=y[2]),
                    zip(x, x[1:], x[2:]+[x[-1]])))))),
    [1]+[__import__("random").choice((0,1)) for _ in range(int(input("?:"))-1)])
Vielleicht spiele ich nachher noch eine Runde mit. 122 hören sich aber schon gar nicht schlecht an.

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@Lunar: So in der Richtung hatte ich es dann auch schon mit Scala versucht und bin zu dem Schluss gekommen, dass ich die Sprache nicht mag. Man muss da dann dauernd den Typ von der Liste überall angeben, und das ist extrem nervig und hässlich.

@numerix: Nee, Mist. Dann hast Du mich geschlagen, mit Abfrage pro Zeile bin ich bei 130. Gibst Du auch ein '?' bei der "Frage" nach der Anzahl der Trompeter aus? Wenn nicht, könnte ich da noch einmal drei Zeichen sparen und käme fast an Dich ran. Wüsste aber nicht wo ich da noch mindestens ein Zeichen rausschlagen sollte.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:Gibst Du auch ein '?' bei der "Frage" nach der Anzahl der Trompeter aus?
Nein, war ohne Prompt. Mit "?" komme ich auf 127 Bytes.
Antworten