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

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.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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 :lol:

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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 :lol:
Juhu, Verstaerkung! :P
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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. :wink:
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Zuletzt geändert von wuf am Freitag 20. Februar 2009, 16:53, insgesamt 1-mal geändert.
Take it easy Mates!
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

numerix hat geschrieben:Dann ja die Könner hier im Forum, die einen darauf hinweisen. :wink:
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.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 :wink:
Es sind 73 Bytes und mit der SPOJ-Original-Eingabe läuft es immer noch nicht ..
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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

Code: Alles auswählen

n = raw_input()
print len(n), n
print n[:-1]
kommt ganz unspektakulär

Code: Alles auswählen

MacPro:~ klaus$ python nop2.py
abcde
5 abcde
abcd
heraus. Also nichts, was am Ende irgendwo stört.

@wuf: das ist exakt meine raw_input() Variante (bei mir mit Tabulatoren :) ).

Klaus
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...)
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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

Code: Alles auswählen

n = raw_input()[:-1]
oder irgendsowas.

Interessanter finde ich zu sehen, welche Lösungsvorschläge andere posten.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

kbr hat geschrieben:Eigentlich ist es mir auch egal. Von mir aus dann eben

Code: Alles auswählen

n = raw_input()[:-1]
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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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

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
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

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...
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ... :lol:
Zuletzt geändert von numerix am Freitag 20. Februar 2009, 18:33, insgesamt 1-mal geändert.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
Antworten