Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » C-golf Loch 6

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.06.2003, 17:08 Uhr
~0xdeadbeef
Gast


Moin,

Schreibt ein Programm, dass den Namen einer Datei von der Konsole einliest, und dann den Inhalt der Datei ausgibt. Wie immer - der kürzeste gewinnt. Par ist 70 Zeichen, ich bin inzwischen bei 62.

Auf Sicherheit wird kein Wert gelegt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.06.2003, 18:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi beefy,
was hälst du hiervon? 61

C++:
main(char c,char**a){ifstream f(a[1]);while(f>>c)putchar(c);}



oder hiervon 58

C++:
main(char c,char**a){ifstream f(a[1]);while(f>>c)cout<<c;}



wenn man char's in main weglassen könnte würde man ja noch was sparen aber das frisst mein compiler nicht

Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 15.06.2003 um 19:08 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.06.2003, 19:27 Uhr
~0xdeadbeef
Gast


Nope, zum einen vergisst du den Namespace, zum anderen die includes. Das müsste so aussehen:

C++:
#include <iostream>
#include <fstream>
main(char c, char **a){std::ifstream f(a[i]);while(f>>c)std::cout<<c;}


Das mit den Headern ist auch der Grund dafür, dass ich immer in C89 golfe, und nicht in C99

Gut, hier ist meine Lösung, 60 Zeichen und ein newline:

C++:
main(c,b,f){for(f=open(gets(b),0);read(f,&c,1);putchar(c));}


Das ist allerdings ziemlich quick, und vor allem verdammt dirty...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.06.2003, 19:35 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


so ähnlich wie du hatte ich das auch erst nur das mein compiler halt das mit dem main so nicht gefressen hat, und da dachte ich die einzigste möglichkeit dem beizukommen ist nicht fopen sondern ifstream
man das ist eine sch**sse mit dem compiler da kann ich ja gar nicht richtig mitgolfen, naja egal die wesentlichen sachen gehen ja

wieso muss ich aufeinmal die includes mit einbringen du hast doch auch nicht "stdio.h" mit angegeben versteh ich nicht

Erklär mir mal bitte die regeln ich glaub ich hab die noch nicht so ganz gepeilt

Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.06.2003, 19:40 Uhr
virtual
Sexiest Bit alive
(Operator)


@beefy
Du solltest mal klare Regeln aufstellen, denn zB sind weder open noch read irgendwelche ANSI Funktionen, sondern "nur" POSIX. Dh Deine Lösung ist keine C89 Lösung.

Desweiteren finde ich Lösungen, die ganz klare Programmierfehler enthalten, wie Deine letzte, keine gültigen Lösungen, weil sie nur zufällig funktionieren.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.06.2003, 19:53 Uhr
~0xdeadbeef
Gast


@Heiko: In C89 sind einige Funktionsprototypen schon von Haus aus bekannt.

@virtual: Was meinst du mit Programmierfehler? wenn du das gets(b) meinst, b zeigt in meine page, ich hab also keine SIGSEGVs zu erwarten.

Was das Regelwerk angeht - seh ich ein. Ich überleg mir da mal einen, und werd mich wahrscheinlich am IOCCC orientieren. Bis dahin - können wir als Übergangslösung festlegen, dass es mit dem neuesten gcc kompilierbar sein muss? Das ist der einzige Compiler, der mir gerade einfällt, der auf so ziemlich allen Plattformen vorhanden ist, und außerdem ist der ziemlich streng geworden. Allerdings liegt dann natürlich POSIX zugrunde. RFC - ich bin für Vorschläge dankbar, als Organisationstalent tauge ich nicht sonderlich viel...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.06.2003, 20:12 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das heisst dann also wenn ich einen funktionsprototypen benutze der nicht aus c89 ist zählt der include hinzu.
Ok und woher weiss ich ob das ein funktionsprototypen ist der in c89 enthalten ist oder nicht? hast du da ne liste?

Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.06.2003, 21:27 Uhr
virtual
Sexiest Bit alive
(Operator)


In C89 gilt eine ganz einfache Regel: Bei gänzlich unbekannte Funktionen wird angenommen, daß sie ein int zurückliefern. Ein C89 konforme implementation darf - aber muß nicht zwingend - ohne enstprechende Includes kenntnis vom Rückgabewert einer Standardfunktion haben. Beefy benutzt den gcc. Der kannt die Deklarationen auch ohne Includes, jedenfalls einige. Andere Compiler kennen sie nicht. Deshalb ist die Verwendung von gets ohne include nicht konform, weil sich hier auf ein Implementationsdetail des Compilers verlassen wird. Klar, der Standard (egal welcher) verlangt, daß gets ein char* zurück geben soll. Aber der Standard in C89 sagt ziemlich klar: Wenn eine Funktion verwendet wird, deren Deklaration zum zeitpunkt ihrer ersten Benutzung nicht bekannt war, wird angenommen, daß sie ein int zurückgibt.

Was den Programmierfehler angeht, der liegt doch klar auf der Hand:

C++:
main(c,b,f){for(f=open(gets(b),0);read(f,&c,1);putchar(c));}


1. In einem UNIX Environment gibt es tatsächlich einen dritten Parameter zu main. War niemals standardisiert, aber aus Kompatibilitätgrunden wird er immer mitgeliefert (mit "immer" meine ich UNIX). Tja. Wenn Du Dein programm nun auf einem System laufen läßt welches das nicht macht, dann schreibt Dein open ggf. an eine Stelle, die es garnicht gibt.
2. Wie meist üblich, würde ich solche Programme wie oben ohne weitere Vorkehrungen einfach so starten:

Code:
./a.out


Jedenfalls habe ich noch keine anderen Parameter übergeben und es scheint auch nicht gefordert. Gemaäß C89 zeigt damit b (dessen typ ja eigentlich ein char** ist) auf einen Speicherbereich der Größe sizeof(void*)*2, auf einer 32 Bitmaschine also ein Speicherbereich mit 8 bytes. Dh wenn Du eine Zeile mit gets einliest, die länger als 8 Bytes ist, wird gnadenlos im Speicher rumgeschrieben, in Speicher der Dir nicht gehört. Ich weiß nicht, was Du mit Page meinst. Kein ANSI Standard macht angaben über das Speichermodell. POXIS auch nicht. argv (oder b) könnte in einem Speicherbereich liegen, der Knapp am Nirvana liegt.

Ich finde Die rästel ganz lustig, ja. Aber ich finde nicht, daß sie in irgendeiner Form was mit Standards von C zu tun haben. Eine faires Regelwerk wäre meiner Meinung nach:
1. Zähle die Includes nicht mit
2. Orientiere dich dafür an einem aktuellen Standard (also ISO C++/C99).
Denn alles andere ist Schnee von gestern.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: