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

numerix hat geschrieben:
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:
da is mit ein paar ifs, fors, oder was weiss ich die eine zeile schon weg.
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

helduel hat geschrieben: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
Ja, das stimmt. Aber bei SPOJ wird Python 2.5 eingesetzt ...
(Meine kürzeste Fassung käme mit Python 3.0 auf 69 Bytes.)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

name hat geschrieben:
numerix hat geschrieben:
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:
da is mit ein paar ifs, fors, oder was weiss ich die eine zeile schon weg.
Tut mir leid, vielleicht bin ich gerade etwas begriffsstutzig, aber ich verstehe immer noch nicht, ob du meinst, dass Python im Falle des Zeilenzählens nicht gut weggekäme (so meine Vermutung) oder etwas anderes.

Falls du das meinst: Es gibt doch elegante Konstrukte wie z.B. LCs oder mächtige Funktionen, mit denen man auf einen Rutsch in einer Zeile ohne Semikolon eine Menge machen kann.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

numerix hat geschrieben:Es gibt doch elegante Konstrukte wie z.B. LCs oder mächtige Funktionen, mit denen man auf einen Rutsch in einer Zeile ohne Semikolon eine Menge machen kann.
Genau das meinte zumindest ich. Vielleicht kann Python seine Stärken nicht in der konkreten Aufgabe ausspielen aber doch wohl in so einigen anderen Fällen.

Die Kritik, dass möglichst kurzer Code != optimaler Code ist, ist natürlich berechtigt, hier aber - so finde ich - irrelevant. Man kann den Leuten doch auch mal ihren Spass mit solchen Wettbewerben lassen.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Die berücksichtigt noch nicht die garstigen Zeilenenden, die weg müssen.
Wo wird sowas bei der Aufgabenstellung erwähnt?
(Und welchen Einfluß hat es überhaupt? Hinten muss doch nicht aufgefüllt werden und Ausgegeben werden sollen die doch auch nicht).
Außerdem teste ich gerade nur unter Windows "\r\n"-Zeilenenden sind da die Regel.
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:

numerix hat geschrieben:
name hat geschrieben:Weil es keine { und } hat sind so wenig Zeilen wie moeglich noch bloedsinniger...
Das verstehe ich nicht.

Code: Alles auswählen

if [foo]:
    do something
    do something else
geht schwer mit einer zeile.
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann löst man das Problem eben anders. :roll:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Faszinierend auch, meine echte Einzeiler Lösung ist auch die langsamste auf der ersten Seite =D

Sind diese ganzen funktionalen Sachen so langsam? ._. Ich find die total toll.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

name hat geschrieben:

Code: Alles auswählen

if [foo]:
    do something
    do something else
geht schwer mit einer zeile.

Code: Alles auswählen

if foo: do_something()
:)

Mal im Ernst: Worauf willst du mit solchen Argumenten hinaus? Es bestreitet niemand, dass gewisse Konstrukte sich auch bei Python über mehrere Zeilen erstrecken, trotzdem kann man IMHO zurecht behaupten, dass in sehr vielen Fällen weniger Zeilen in Python nötig sind als in anderen Sprachen, um bestimmte Probleme zu lösen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BlackVivi hat geschrieben:Sind diese ganzen funktionalen Sachen so langsam? ._. Ich find die total toll.
In Python schon. Du könntest ja Haskell nehmen ;)
Antworten