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

Samstag 21. Februar 2009, 19:29

numerix hat geschrieben:@bords0: Deinen Trick verstehe ich nicht ...
Inzwischen habe ich festgestellt, dass Python ja auch negative Zahlen mit %4 in den Bereich von 0-3 abbildet - prima, dann ist es schnuppe, wie viele Operanden es gibt, und man kann bei 0 anfangen.

Der "Trick" war ja nur, N+=(4-p)%4 durch N+=p%4 zu ersetzen, indem man p runterzählt statt hoch.
bords0
User
Beiträge: 172
Registriert: Mittwoch 4. Juli 2007, 20:40

Samstag 21. Februar 2009, 19:33

BlackJack hat geschrieben:@numerix: Hab' Dich eingeholt. :-)
Eine kleine Frage: iterierst du über die Zeichen von raw_input(), oder machst du es anders? (Meine Experimente mit re.split waren entmutigend...)
BlackJack

Samstag 21. Februar 2009, 20:22

Ein ganz banales ``for c in raw_input():``.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Sonntag 22. Februar 2009, 12:45

Mal Offtopic:
https://www.spoj.pl/problems/KAMIL/
Da gibt's Pythonlösungen mit der Länge 53, ich hab aber keine Ahnung, wie man das schaffen könnte.
Meine 75 lange Version:

Code: Alles auswählen

for i in range(10):
  print 2**sum([1 for x in raw_input() if x in 'TDLF'])
Wo könnte man hier noch Zeichen einsparen? Irgendeinen Trick muss es ja geben :) Oder muss man die Sache ganz anders angehn? Regex wäre zB kürzer aber das `import re` ist dann auch wieder 9 Zeichen lang.
Wenn mir jetzt jemand eine Lösung präsentiert oder mir einen entscheidenden Tipp gibt, werd ich das auch nicht als meine eigene Lösung dort absenden, mich interessiert's nach einer halben Stunde ausprobieren alternativer Lösungen einfach mal. Naja bzw. wie Numerix schon sagte, kann man ja abwägen wie hoch der Anteil desjenigen ist, der die Vorlage/Idee geliefert hat und wie hoch der Eigenanteil ist ;)
BlackJack

Sonntag 22. Februar 2009, 13:12

Also die ganz offensichtlichen überflüssigen Zeichen wären erst einmal ein Leerzeichen am Anfang von Zeile 2 und die eckigen Klammern in der Summe. In Python 2.5 gibt's schon Generator-Ausdrücke.

Das nächste Einsparungspotential ist die literale 1 und das ``if``. Man kann nämlich mit Wahrheitswerten rechnen. Die erben von `int` und `True` hat den Wert 1 und `False` den Wert 0.

Damit wären wir bei:

Code: Alles auswählen

for i in range(10):
 print 2**sum(x in 'TDLF' for x in raw_input())
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Sonntag 22. Februar 2009, 14:00

Hm, stimmt, das Leerzeichen und die Klammern sind eigentlich schon fast zu offensichtlich :)
Das mit den Wahrheitswerten war mir zwar bewusst, aber auf die Idee, mir das hier zunutze zu machen, bin ich nicht gekommen.
Aber auf 53 kommt man damit immer noch nicht oder? :o Da würde mir jetzt echt nichts mehr einfallen aber vielleicht ist das ja auch von Grund auf der falsche Ansatz.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Sonntag 22. Februar 2009, 14:07

Geil... Codegolf im dt. Python-Forum und ich sehs erst jetzt... :cry:
BlackJack

Sonntag 22. Februar 2009, 14:23

@Nocta: Also ich bin jetzt mit diesem Ansatz runter auf 59 Bytes. Wo ich da noch 6 Bytes rausquetschen soll, sehe ich nicht. :-(

Also muss es wohl noch einen anderen Ansatz geben.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Sonntag 22. Februar 2009, 14:34

@nocta: Ich bin mit deinem Ansatz bei 56. Da geht noch was...

EDIT: Korrigiere: 55
EDIT2: 54, hmm ein Zeichen fählt noch... :?:
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Sonntag 22. Februar 2009, 14:59

HerrHagen hat geschrieben:Geil... Codegolf im dt. Python-Forum und ich sehs erst jetzt... :cry:
Ich wollt mal fragen, was daran eigentlich so traurig ist. Ich meine, man lernt in jedem Fall was dazu.
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Sonntag 22. Februar 2009, 15:01

Mal was andres:
Wie lang würdet ihr denn durchschnittlich an sowas sitzen, ohne Absprache im Forum?
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Sonntag 22. Februar 2009, 15:08

Ich wollt mal fragen, was daran eigentlich so traurig ist. Ich meine, man lernt in jedem Fall was dazu.
Traurig ist, dass ich es erst jetzt gesehen hab! Ich mag Code-Golf. Wenn ich es nicht mögen würde, hätte ich mich wohl kaum mit 54 Zeichen beteiligt...
Zuletzt geändert von HerrHagen am Sonntag 22. Februar 2009, 21:54, insgesamt 1-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 22. Februar 2009, 15:37

Craven hat geschrieben:Wie lang würdet ihr denn durchschnittlich an sowas sitzen, ohne Absprache im Forum?
Die Absprache macht es doch erst spaßig. Hacker-Community-Denken eben :)

Andererseits, ich beteilige mich gar nicht am Codegolf.. da spiele ich lieber mit anderen, ebenso unnützen Sachen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Sonntag 22. Februar 2009, 15:37

Sooo, nun habe ich auch eine 54 Byte-Lösung.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Sonntag 22. Februar 2009, 15:48

Ich hab vielleicht noch nicht lang genug mit Python rumgespielt um intuitiv irgendwelche 10byte kürzere Lösungen zu finden.
Wie kommt ihr mit meinem Ansatz noch weiter runter? Ihr könnt mir ja mal einen Tipp geben wenn ihr nicht bereit seid, eure Lösungen zu veröffentlichen :)
Irgendwie steh ich auf Wettbewerbe in denen ich schlecht bin :lol:
Antworten