Seite 7 von 7

Verfasst: Mittwoch 25. Februar 2009, 11:05
von numerix
BlackJack hat geschrieben:@Nocta: Nochmal die Aufgabe durchlesen, insbesondere die "komischen" Rahmenbedingungen.

Ich hab's noch nicht ausprobiert, aber ich denke ich könnte auf ca. 40 Bytes kommen, und wenn numerix wieder mal so ähnlich denkt wie ich, wüsste ich wahrscheinlich wo er noch drei Bytes "einsparen" kann. :-)
Danke, das baut auf :cry:

Ich kann mich allerdings für die algorithmisch etwas(!) anspruchsvolleren Probleme von SPOJ eher erwärmen. Ich denke ich werde nochmal einen neuen Thread hier zu einem ausgewählten Problem eröffnen - dieser hier ist doch arg lang geworden.

Verfasst: Mittwoch 25. Februar 2009, 11:14
von numerix
Nocta hat geschrieben:@BlackJack: Naja okay, aber ich weiß nicht, wie man das in Python einsetzen könnte. In Perl kann man's anscheinend so übertreiben, dass dann nur 6 Byte gezählt werden.
Was den SIZECON-Wettbewerb angeht, so ist der aller Wahrscheinlichkeit nach ohnehin kaputt, weil hier geschummelt wurde, was das Zeug hält. Im SPOJ-Forum kann man dazu einiges lesen. Irgendwo findet man die Information, dass die auszugebende Zahl 5 Bytes lang ist (meine ich) - da kannst du dir dann ausrechnen, wie man eine 6 Bytes Lösung schaffen kann. Außerdem wurde mit darstellbaren Zeichen gearbeitet, die nicht gezählt werden usw.

Mag auch spannend sein, aber ich habe bei der Beschäftigung mit den "richtigen" SPOJ-Problemen und meinen Python-Lösungen weit mehr gelernt als beim Code-Golf.

Vielleicht wäre das auch ein Ansatzpunkt für dich. Ich vermute, dass man bei algorithmisch etwas anspruchsvolleren Sachen auch eher mal einen Tipp geben kann, ohne gleich den ganzen Code posten zu müssen.

Verfasst: Mittwoch 25. Februar 2009, 11:28
von HerrHagen
Mag auch spannend sein, aber ich habe bei der Beschäftigung mit den "richtigen" SPOJ-Problemen und meinen Python-Lösungen weit mehr gelernt als beim Code-Golf.
@numerix: Das ist ja grad das geniale an diesem Rätsel. Es ist auch algorithmisch anspruchsvoll. Das findet man allerdings erst raus, wenn man den richtigen Ansatz hat. Ich bin kein großer Perl-Kenner, aber nachdem ich meine Lösung kenne, bin ich mir sicher das auch die besten Perl Lösungen (genau wie die beste Python-Lösung) die Aufgabe für jeden Input korekt lösen können und sich an die Regeln halten. Wenn du willst schick ich dir mal meine Lösung per PM. Du wirst überascht sein :wink: ....

MFG HerrHagen

Verfasst: Mittwoch 25. Februar 2009, 11:43
von hendrikS
Ich denke, ich werde mir demnächst auch mal bei SPOJ ein Problem aussuchen, bei dem es um Zeit und nicht um Codegrösse geht.
Der Faktor Zeit wird leider heute scheinbar von vielen Entwicklern ignoriert. Hauptsache es geht irgendwie. Schade eigentlich.

Hinsichtlich Golfing finde ich das Original etwas besser da die Problem einfach klarer spezifiziert sind. Es gibt auch kaum Möglichkeiten zu manipulieren, da die Inputdaten in den meisten Fällen zufällig sind. Allerdings sind die Testfälle auch nicht immer perfekt, wie beispielsweise bei der Primfaktorzerlegung.

Verfasst: Donnerstag 26. Februar 2009, 15:24
von Blade Runner

Code: Alles auswählen

print sum(x for x in[input()for x in range(input())]if x>0)
Das ist bisher meine beste und vorallem am besten funktionierende Lösung. Da die nicht besonders toll ist, kann ich die schon posten, glaub ich.
Ich hab mit exec experimentiert, aber das hat zu nichts geführt.

Verfasst: Donnerstag 26. Februar 2009, 15:55
von HerrHagen
Das geht leicht noch kleiner:

Code: Alles auswählen

i=input
print sum(x for x in[i()for x in" "i()]if x>0)
Aber wie gesagt,... die richtige Lösung hat einen ganz anderen Ansatz und der ist ein wenig kniffliger.

MFG HerrHagen

Verfasst: Donnerstag 26. Februar 2009, 16:47
von numerix
HerrHagen hat geschrieben:@numerix: Das ist ja grad das geniale an diesem Rätsel. Es ist auch algorithmisch anspruchsvoll. Das findet man allerdings erst raus, wenn man den richtigen Ansatz hat. Ich bin kein großer Perl-Kenner, aber nachdem ich meine Lösung kenne, bin ich mir sicher das auch die besten Perl Lösungen (genau wie die beste Python-Lösung) die Aufgabe für jeden Input korekt lösen können und sich an die Regeln halten. Wenn du willst schick ich dir mal meine Lösung per PM.
Habe dein großzügiges Angebot gerade erst entdeckt! Vielen Dank! Ich werde noch ein wenig mit eigenen Ideen schwanger gehen und dann bei missglückter Geburt gerne darauf zurückkommen. :wink:

Verfasst: Donnerstag 26. Februar 2009, 16:52
von Nocta
HerrHagen hat geschrieben:Das geht leicht noch kleiner:

Code: Alles auswählen

i=input
print sum(x for x in[i()for x in" "i()]if x>0)
Genau die Lösung von Blade Runner hatte ich auch, da hab ich auch schon geguckt, ob's kürzer ist, input durch eine Variable zu ersetzen. Es ist nur ein Zeichen kürzer (ich hab glaube gedacht, es wäre gleich lang und diese Möglichkeit außer Acht gelassen)

Code: Alles auswählen

i=input
print sum(x for x in [i() for x in range(i())] if x>0)
müsste es imo heißen, das range() durch " " zu ersetzen klappt doch nich ernsthaft, oder?
Naja, wenigstens hab ich jetzt ne 50 byte Lösung, anstatt einer 51 byte Lösung :) Schöne Zahl um endgültig aufzuhören.

Verfasst: Donnerstag 26. Februar 2009, 16:55
von HerrHagen
das range() durch " " zu ersetzen klappt doch nich ernsthaft, oder?
Hab das * vergessen. So gehts:

Code: Alles auswählen

i=input
print sum(x for x in[i()for x in" "*i()]if x>0)

Verfasst: Donnerstag 26. Februar 2009, 17:34
von Blade Runner
HerrHagen hat geschrieben:

Code: Alles auswählen

i=input
print sum(x for x in[i()for x in" "*i()]if x>0)
Stimmt, darauf bin ich nicht gekommen. Ich wollte erstmal eine Basis haben, die ich dann evtl. noch verkleinern kann. Aber ich wüßte im Moment keinen anderen Ansatz.

Verfasst: Donnerstag 26. Februar 2009, 17:53
von Nocta
Stimmt, guter Trick um das range abzukürzen. Darauf wär ich auch nie gekommen :D

Verfasst: Donnerstag 26. Februar 2009, 18:10
von Costi
was bei laengeren programmen helfen koennte:

Code: Alles auswählen

import zlib
exec(zlib.decompress('x\x9c\xcb\xb4\xcd\xcc+(-\xe1*(\xca\xcc+Q(.\xcd\xd5\xa8PH\xcb/R\xa8P\xc8\xcc\x8b\xce\xd4\xd0\x84\xb1\x95\x14\x94\xb4\x80\xdc\xd8\xcc4\x85\n;\x03M\x00\x15[\x11\xa7'))

Verfasst: Donnerstag 26. Februar 2009, 20:40
von bords0
HerrHagen hat geschrieben:Aber wie gesagt,... die richtige Lösung hat einen ganz anderen Ansatz und der ist ein wenig kniffliger.
Hm, mein Ansatz ist anders, das ist schon mal gut. Aber ein Zeichen mehr brauch ich eben immer noch :-(
Ich wüsste ja schon gern, ob mein Ansatz richtig ist - wer besser ist als ich, kann gerne meinen Code per PM haben...

(Und was Uoti Urpala wohl damals gemacht? 29 sind unfassbar!)

Außerdem habe ich mich noch an Kamil, Nop und Carl versucht, habs aber nirgends ganz nach vorne geschafft. :K

Verfasst: Donnerstag 26. Februar 2009, 22:14
von bords0
OK, inzwischen ist klar, dass HerrHagen einen völlig anderen Ansatz hat als ich...

Verfasst: Donnerstag 26. Februar 2009, 22:16
von HerrHagen
:D :D :D :D :D :D
Ich hab grad die Lösung von bords0 gesehen und festegestellt das sie komplett anders als meine ist. Das ist wirklich eine lustige Aufgabe. Die vorderen Plätze haben alle unterschiedliche Lösungen. So was gibts selten beim Code-Golf.

Verfasst: Donnerstag 26. Februar 2009, 22:43
von Blade Runner
HerrHagen hat geschrieben::D :D :D :D :D :D
Ich hab grad die Lösung von bords0 gesehen und festegestellt das sie komplett anders als meine ist. Das ist wirklich eine lustige Aufgabe. Die vorderen Plätze haben alle unterschiedliche Lösungen. So was gibts selten beim Code-Golf.
Das bestätigt Tim Toady. :P