Kurzer Prozess: Size Contest bei SPOJ

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

Mittwoch 25. Februar 2009, 11:05

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

Mittwoch 25. Februar 2009, 11:14

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.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Mittwoch 25. Februar 2009, 11:28

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
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Mittwoch 25. Februar 2009, 11:43

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.
Benutzeravatar
Blade Runner
User
Beiträge: 21
Registriert: Montag 23. Februar 2009, 11:41

Donnerstag 26. Februar 2009, 15:24

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.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Donnerstag 26. Februar 2009, 15:55

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

Donnerstag 26. Februar 2009, 16:47

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:
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Donnerstag 26. Februar 2009, 16:52

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.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Donnerstag 26. Februar 2009, 16:55

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)
Benutzeravatar
Blade Runner
User
Beiträge: 21
Registriert: Montag 23. Februar 2009, 11:41

Donnerstag 26. Februar 2009, 17:34

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.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Donnerstag 26. Februar 2009, 17:53

Stimmt, guter Trick um das range abzukürzen. Darauf wär ich auch nie gekommen :D
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Donnerstag 26. Februar 2009, 18:10

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'))
cp != mv
bords0
User
Beiträge: 172
Registriert: Mittwoch 4. Juli 2007, 20:40

Donnerstag 26. Februar 2009, 20:40

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
bords0
User
Beiträge: 172
Registriert: Mittwoch 4. Juli 2007, 20:40

Donnerstag 26. Februar 2009, 22:14

OK, inzwischen ist klar, dass HerrHagen einen völlig anderen Ansatz hat als ich...
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Donnerstag 26. Februar 2009, 22:16

: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.
Antworten