Seite 2 von 7
Verfasst: Freitag 20. Februar 2009, 16:18
von numerix
name hat geschrieben:Man loest ein nicht-existentes Problem
Naja, das geht jetzt ins Philosophische über: Ab wann gilt ein Problem als "existent"? Wenn es ein Kunden-Projekt ist, das Geld einbringt?
Man denke nur mal an die zahlreichen Programmieraufgaben, die man zu lösen hat oder lösen will oder was auch immer, um eine Programmiersprache zu lernen. Da werden zuerst künstlich Probleme geschaffen, nur um sehen, ob man sie lösen kann. Sind die "nicht-existent"?
Und dieser Size-Contest ist zumindest so, dass man sich zunächst mit einem Problem auseinandersetzen muss (auch wenn es sehr überschaubar ist), dann einen Algorithmus entwickeln muss und dann überlegen kann, wie man den möglichst kurz bekommt.
Auch für Programmieranfänger ist diese konkrete Problemstellung nicht ungeeignet, weil man - zumindest, wenn die Lösungen dann offengelegt werden, was bei SPOJ an sich nicht so ist, aber hier im Forum ja anders gehandhabt werden kann - an einem solch kleinen Beispiel sehen kann, auf welche unterschiedlichen Weisen sich ein Problem lösen lässt.
Die Auseinandersetzung mit den verschiedenen Lösungen bringt in aller Regel auch einen Erkenntnisgewinn.
Wenn ich mal die beiden bisher geposteten funktionsfähigen Lösungen und meine eigene (noch nicht gepostete) Lösung nehme, dann ist jede in ihrem Ansatz völlig unterschiedlich. Und das finde ich spannend.
Verfasst: Freitag 20. Februar 2009, 16:26
von name
numerix hat geschrieben:Und dieser Size-Contest ist zumindest so, dass man sich zunächst mit einem Problem auseinandersetzen muss (auch wenn es sehr überschaubar ist), dann einen Algorithmus entwickeln muss und dann überlegen kann, wie man den möglichst kurz bekommt.
Hmm, entwickelt man da wirklich einen Algorithmus oder nimmt man nicht eher den der die Sprache anbietet der am wenigsten Zeichen braucht?
numerix hat geschrieben:Auch für Programmieranfänger ist diese konkrete Problemstellung nicht ungeeignet, weil man - zumindest, wenn die Lösungen dann offengelegt werden, was bei SPOJ an sich nicht so ist, aber hier im Forum ja anders gehandhabt werden kann - an einem solch kleinen Beispiel sehen kann, auf welche unterschiedlichen Weisen sich ein Problem lösen lässt.
Man kriegt dadurch leider sehr viele suboptimale Loesungen praesentiert, wo man als Anfaenger wieder nicht weiss dass und warum sie das sind.
Verfasst: Freitag 20. Februar 2009, 16:26
von kbr
numerix hat geschrieben:Dein Algorithmus ist fehlerhaft. Ergebnis für obige testcases:
3
8
15
7
Natürlich habe ich die Testcases vor dem posten auf das Script losgelassen und bei mir kommt
2
5
12
6
heraus.
Verfasst: Freitag 20. Februar 2009, 16:33
von snafu
kbr hat geschrieben:Hier mein Ansatz (84 Zeichen):
Code: Alles auswählen
import sys
N=p=0
for c in sys.argv[1]:
if c<'a' and p:N+=4-p;p=0
p=(p+1)%4
print N
Da habe ich aber was anderes raus:
Code: Alles auswählen
>>> len("""import sys
... N=p=0
... for c in sys.argv[1]:
... if c<'a' and p:N+=4-p;p=0
... p=(p+1)%4
... print N""")
90
Verfasst: Freitag 20. Februar 2009, 16:38
von b.esser-wisser
Code: Alles auswählen
n=p=0
for c in raw_input()[1:]:
if c.islower():
p+=1
else:
n+=3-p%4
p=0
print n
... meine kürzeste "konventionelle" Version.
Und ich stimme denen zu, die keinen Sinn darin sehen, das kürzest-mögliche Programm zu schreiben. Pythonprogramme erreichen doch meistens automatisch ein Längen/Lesbarkeits-Optimum
gruß Jörg
ps.: Zählen Leerzeichen/Tab's eigentlich mit?
falls ja:
Code: Alles auswählen
n=p=0
for c in raw_input()[1:]:
if c.islower():p+=1
else:n+=3-p%4;p=0
print n
-> 79
Verfasst: Freitag 20. Februar 2009, 16:42
von name
b.esser-wisser hat geschrieben:
Und ich stimme denen zu, die keinen Sinn darin sehen, das kürzest-mögliche Programm zu schreiben. Pythonprogramme erreichen doch meistens automatisch ein Längen/Lesbarkeits-Optimum
Juhu, Verstaerkung!

Verfasst: Freitag 20. Februar 2009, 16:43
von numerix
b.esser-wisser hat geschrieben:ps.: Zählen Leerzeichen/Tab's eigentlich mit?
Bei diesem size-contest: ja.
Es wird einfach die Gesamtzahl an Bytes gezählt, also das, was man als Dateigröße erhält, wenn man das Skript in eine Datei schreibt.
@kbr: Dein Programm berücksichtigt nicht die speziellen Zeilenenden (siehe das erste Posting im Thread).
name hat geschrieben:Man kriegt dadurch leider sehr viele suboptimale Loesungen praesentiert, wo man als Anfaenger wieder nicht weiss dass und warum sie das sind.
Mag sein. Aber dafür gibt es dann ja die Könner hier im Forum, die einen darauf hinweisen.

Verfasst: Freitag 20. Februar 2009, 16:43
von wuf
Hallo kbr
Da wir PEP-8 vernachlässigen könnten wir doch auch noch beim einrücken einige Zeichen einsparen:
Code: Alles auswählen
N=p=0
for c in raw_input():
if c<'a' and p:N+=4-p;p=0
p=(p+1)%4
print N
Sind total 69 Zeichen
Gruss wuf

Verfasst: Freitag 20. Februar 2009, 16:45
von name
numerix hat geschrieben:Dann ja die Könner hier im Forum, die einen darauf hinweisen.

Naja, das ist ja nicht wirklich Sinn der Sache. Ich finde Code-Golfing fuer Anfaenger einfach total ungeeignet. Falsche Loesungen lernen und dann von andren drauf hingewiesen werden is glaub ich keine paedagogisch hochwertige Lernmethode.
Verfasst: Freitag 20. Februar 2009, 17:16
von numerix
wuf hat geschrieben:Hallo kbr
Da wir PEP-8 vernachlässigen könnten wir doch auch noch beim einrücken einige Zeichen einsparen:
Code: Alles auswählen
N=p=0
for c in raw_input():
if c<'a' and p:N+=4-p;p=0
p=(p+1)%4
print N
Sind total 69 Zeichen
Gruss wuf

Es sind 73 Bytes und mit der SPOJ-Original-Eingabe läuft es immer noch nicht ..
Verfasst: Freitag 20. Februar 2009, 17:22
von kbr
numerix hat geschrieben:@kbr: Dein Programm berücksichtigt nicht die speziellen Zeilenenden (siehe das erste Posting im Thread).
Hallo numerix,
ich sehe keine speziellen Zeilenenden, weder in der Beschreibung bei SPOJ bezüglich des Inputs noch in den Daten die raw_input() selber liefert. Bei
kommt ganz unspektakulär
heraus. Also nichts, was am Ende irgendwo stört.
@wuf: das ist exakt meine raw_input() Variante (bei mir mit Tabulatoren

).
Klaus
Verfasst: Freitag 20. Februar 2009, 17:27
von numerix
kbr hat geschrieben:ich sehe keine speziellen Zeilenenden, weder in der Beschreibung bei SPOJ bezüglich des Inputs noch in den Daten die raw_input() selber liefert.
Dann sende es doch bei SPOJ mal ein ...
Verfasst: Freitag 20. Februar 2009, 17:29
von snafu
Für Python könnte ich mir höchstens Wettbewerbe vorstellen, wo man möglichst wenig Zeilen benutzen soll. Ich glaube, da kann die Sprache eher ihre Stärken ausspielen.
(Ich bitte, von möglichen Semikolon-Witzen abzusehen...)
Verfasst: Freitag 20. Februar 2009, 17:44
von kbr
numerix hat geschrieben:kbr hat geschrieben:ich sehe keine speziellen Zeilenenden, weder in der Beschreibung bei SPOJ bezüglich des Inputs noch in den Daten die raw_input() selber liefert.
Dann sende es doch bei SPOJ mal ein ...
Eigentlich ist es mir auch egal. Von mir aus dann eben
oder irgendsowas.
Interessanter finde ich zu sehen, welche Lösungsvorschläge andere posten.
Verfasst: Freitag 20. Februar 2009, 17:57
von numerix
kbr hat geschrieben:Eigentlich ist es mir auch egal. Von mir aus dann eben
oder irgendsowas.
Als finaler Code ergäbe sich dann, wenn man noch das Leerzeichen hinter "a" entfernt:
Code: Alles auswählen
n=p=0
for c in raw_input()[:-1]:
if c<'a'and p:n+=4-p;p=0
p=(p+1)%4
print n
Das läuft jetzt korrekt mit 77 Bytes.
kbr hat geschrieben:Interessanter finde ich zu sehen, welche Lösungsvorschläge andere posten.
Ich warte mal noch ein wenig ab und dann stelle ich alle funktionsfähigen geposteten Lösungen nochmal zusammen.
Verfasst: Freitag 20. Februar 2009, 18:01
von numerix
snafu hat geschrieben:Für Python könnte ich mir höchstens Wettbewerbe vorstellen, wo man möglichst wenig Zeilen benutzen soll. Ich glaube, da kann die Sprache eher ihre Stärken ausspielen.
(Ich bitte, von möglichen Semikolon-Witzen abzusehen...)
Dann wäre der "echte Einzeiler" von BlackVivi der Matchwinner ...

Verfasst: Freitag 20. Februar 2009, 18:16
von numerix
b.esser-wisser hat geschrieben:Code: Alles auswählen
n=p=0
for c in raw_input()[1:-1]:
if c.islower():p+=1
else:n+=3-p%4;p=0
print n
... meine kürzeste "konventionelle" Version.
Die berücksichtigt noch nicht die garstigen Zeilenenden, die weg müssen. Macht man aus dem [1:] ein [1:-1] ergeben sich 81 Bytes für eine SPOJ-lauffähige Fassung.
Allerdings lässt sich auf dieser Grundlage durch einen kleinen Eingriff eine 74-Byte-Fassung erzeugen:
Code: Alles auswählen
n=p=0
for c in raw_input()[1:-1]:
if"Z"<c:p+=1
else:n+=3-p%4;p=0
print n
Verfasst: Freitag 20. Februar 2009, 18:23
von name
snafu hat geschrieben:Für Python könnte ich mir höchstens Wettbewerbe vorstellen, wo man möglichst wenig Zeilen benutzen soll. Ich glaube, da kann die Sprache eher ihre Stärken ausspielen.
(Ich bitte, von möglichen Semikolon-Witzen abzusehen...)
Weil es keine { und } hat sind so wenig Zeilen wie moeglich noch bloedsinniger...
Verfasst: Freitag 20. Februar 2009, 18:33
von numerix
name hat geschrieben:Weil es keine { und } hat sind so wenig Zeilen wie moeglich noch bloedsinniger...
Das verstehe ich nicht.
Edit: Außerdem gibt es doch { und } in Python ...

Verfasst: Freitag 20. Februar 2009, 18:33
von helduel
Moin,
nimmt man Python 3, dann sind es 71 Zeichen:
Code: Alles auswählen
n=p=0
for c in input()[1:-1]:
if"Z"<c:p+=1
else:n+=3-p%4;p=0
print(n)
Gruß,
Manuel