Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 18. Virtual Rätsel

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
07.03.2003, 01:04 Uhr
virtual
Sexiest Bit alive
(Operator)


Ausnahmsweise mal die Lösung der Aufgabe zuerst:

C++:
S9>3<E45Pl9?CDB51=n
S9>3<E45Pl9D5B1D?Bn
S9>3<E45Pl33DI@5n

9>DP
=19>XY
K
        CD4jj9CDB51=/9D5B1D?Bl381BnP9D5By>XCD4jj39>Yk

        CD4jj39>PnnPCD4jj>?C;9@GCk
        G89<5PXCD4jj39>Y
        K
                381BP3PmPZ9D5By>[[k
                96PX9C1C399X3YPVVPQ9C3>DB<X3YYP3PmPX3]WPW[dhYUifP[PWPWk
                CD4jj3?EDPllPX381BY3k
        M
M


Wer nämlich diese Buchstaben so übersetzt bekommt, daß dabei gültiger C++ Code rauskommt, hat die richtige Lösung gefunden:
In Anlehung an die ROT13 Codierung ist eine ROT48 Codierung zu programmieren:
Alle Zeichen, die einen ASCII Code zwischen 32 und 127 haben, sollen mit ROT48 behandelt werden, die übrigen sollen unverändert bleiben. ROT48 bedeutet: Von dem Zeichen wird 32 abgezogen, dann 48 aufaddiert, anschliessend modulo 96 gerechnet und schliesslich wieder eine 32 aufaddiert. EIne solche Verschlüsselung ist - genau wie ROT13 - selbstinvers: Aus dem Verschlüsselten Text läßt sich das Original mit exakt dem gleichen Verfahren wiederherstellen, wie aus dem Original der Verschlüsselte Text
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 07.03.2003 um 01:04 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.03.2003, 10:51 Uhr
~0xdeadbeef
Gast


Na toll. In C++

C++:
#include <fstream>
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
  if (argc != 3) {
    cerr << "Usage: " << argv[0] << " inputfile outputfile" << endl;
    return -1;
  }

  ifstream from(argv[1]);
  if (!from) {
    cerr << "Kann die Input-Datei nicht öffnen" << endl;
    return -1;
  }

  ofstream to(argv[2]);
  if(!to) {
    cerr << "Kann Ausgabedatei nicht öffnen" << endl;
  }

  unsigned char c;
  while(from.get((char) c)) {
    to.put(c <= 32 || c > 127 ? c : ((c + 16) % 96) + 32);
  }

  if (!from.eof() || !to) {
    cerr << "Merkwürdiger Fehler" << endl;
  }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.03.2003, 10:59 Uhr
~0xdeadbeef
Gast



C++:
#include <iostream>
#include <iterator>
#include <cctype>

int
main()
{
        std::istream_iterator<char> iterIn(std::cin);

        std::cin >> std::noskipws;
        while (std::cin)
        {
                char c = *iterIn++;
                if (isascii(c) && !iscntrl(c)) c = (c-' '+48)%96 + ' ';
                std::cout << (char)c;
        }
}


Dabei raus kommt dan der hier. Gut, deine Implementation ist schöner als meine. Aber meine ist dafür safe. Wart mal kurz, ich hab noch einen auf Lager...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.03.2003, 11:22 Uhr
~0xdeadbeef
Gast



C++:
#include <fstream>
#include <iostream>
#include <cctype>

using namespace std;

int main(int argc, char *argv[]) {
    try {
        if (argc != 3) throw "Usage: rot48 inputfile outputfile";

        ifstream from(argv[1]);
        ofstream to(argv[2]);

        if(!from) throw "Kann die Input-Datei nicht öffnen";
        if(!to)   throw "Kann Ausgabedatei nicht öffnen";

        while(!from.eof()) {
            char c;
            from.get(c);
            /*
             * Das hier basiert darauf, dass c ein signed char ist, also
             * nicht größer als 127 werden kann
             */

            to.put(c > 32 ? ((c+16)%96+32) : c);
        }

        if (!from.eof() || !to) throw "Merkwürdiger Fehler";
    } catch (char* error_string) {
        cerr << error_string << endl;
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.03.2003, 11:28 Uhr
~0xdeadbeef
Gast


So, jetzt aber. Hast mich ganz schön am Ehrgeiz gepackt:

C++:
#include <fstream>
#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
    try {
        if (argc != 3) throw "Usage: rot48 inputfile outputfile";

        ifstream from(argv[1]);
        if(!from) throw "Kann die Input-Datei nicht öffnen";
        ofstream to(argv[2]);
        if(!to)   throw "Kann Ausgabedatei nicht öffnen";

        while(!from.eof()) {
            char c;
            from.get(c);
            to.put(c > 32 ? ((c+16)%96+32) : c);
        }

        if (!from.eof() || !to) throw "Merkwürdiger Fehler";
    } catch (const char* error_string) {
        cerr << error_string << endl;
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.03.2003, 11:53 Uhr
~0xdeadbeef
Gast


Und in ANSI-C (wenn wir schon mal dabei sind)

C++:
#include <stdio.h>

int eprintf(const char* emsg) {
  printf(emsg);
  return -1;
}

int main(int argc, char *argv[]) {
  FILE *from, *to;
  char c;

  if(argc != 3)                     return eprintf("Usage: rot48 infile outfile\n");
  if(!(from = fopen(argv[1], "r"))) return eprintf("Kann Eingabedatei nicht öffnen\n");
  if(!(to   = fopen(argv[2], "w"))) return eprintf("Kann Ausgabedatei nicht öffnen\n");

  while((c = fgetc(from)) != EOF) fprintf(to, "%c", c>32 ? ((c+16)%96)+32 : c);

  fclose(from);
  fclose(to);

  return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.03.2003, 16:50 Uhr
virtual
Sexiest Bit alive
(Operator)


Hey beefie, da hast du dich aber ins Zeug gelegt! - Chic!
--
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
007
07.03.2003, 16:52 Uhr
virtual
Sexiest Bit alive
(Operator)


Oh - ich seh grade: die ANSI-C Lösung läßt ein Handle offen, wenn sich to nicht öffnen läßt. Aber was solls, MS DOS is wohl endgültig vorbei
--
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
008
07.03.2003, 17:00 Uhr
~0xdeadbeef
Gast


Hey, das Ding ist nicht auf Plattformunabhängigkeit getrimmt. Aber gut, du hast recht. Hier der patch:

Code:
14c14,17
<   if(!(to   = fopen(argv[2], "w"))) return eprintf("Kann Ausgabedatei nicht öffnen\n");
---
>   if(!(to   = fopen(argv[2], "w"))) {
>     fclose(from);
>     return eprintf("Kann Ausgabedatei nicht öffnen\n");
>   }

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.03.2003, 17:02 Uhr
~0xdeadbeef
Gast


Vielleicht bau ich bei Gelegenheit mal dasselbe in Brainfuck oder Intercal. Dann aber ohne Dateien, dafür müsste ich erst ne Spracherweiterung entwerfen. Wobei, wenn ichs mir recht überlege...
 
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: