Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Rechnen durch Text-ersetzung .....

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
23.05.2003, 11:44 Uhr
~Ente_Knusprig
Gast


Hi,

zuerst wird ein REPLACE-Interpreter benötigt der in der Lage ist Textersetzungen in vorgebener Syntax auszuführen.

.
.
(HALLO,HELLO)
(12, ZWÖLF)
.
.

Da heisst daß er bei Eingabe von "HALLO 12"

HALLO durch HELLO und 12 durch ZWÖLF ersetzen würde und

HELLO ZWÖLF

ausgeben würde.
Der Interpreter beschränkt sich also nur auf simple Textersetzung und ist somit trivial.


AUFGABE:

Schreibe ein REPLACE-Program das aus der Eingabe von

123+456=?

Die Lösung berechnet und diese hinten anhängt.

Es müsste nach Abarbeitung des Programms also

123+456=579

ausgegeben werden.

Die Zahlen sind auf 3 Stellen beschränkt.


mfg

Ente_Knusprig
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.05.2003, 11:50 Uhr
Ente_Knusprig



Hab' noch vergessen zu erwähnen, daß die Zahlen natürlich frei wählbar sind sich aber auf maximal 3 Stellen beschränken sollen (es dürfen aber weniger Stellen sein, aber mindestens eine)

Ohne diese Forderung wär das ja echt super einfach gewesen:

(123+456=?,123+456=579) :-)
--
Knusprig sein, das ist fein
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.05.2003, 12:17 Uhr
~0xdeadbeef
Gast


Semi-Thue oder Markov?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.05.2003, 12:56 Uhr
~Ente_Knusprig
Gast


Es geht da nicht im Detail um ein Semi-Thue oder Markov System.
Dieses Wissen ist also nicht notwendig.

Beispiel:

Eingabe ABCD

REPLACE-Prog (wird natürlich sequentiell abgearbeitet ist also nicht als Regel zu verstehen):

(A,B)
(B,D)
(C,D)
(D,A)


Hätte dann folgende Konvertierungen zur Folge:

BBCD
DDCD
DDDD
AAAA

Ein kleiner Tip:

Das "?" wird in der Ausgabe nicht benötigt. Es kann als Hilfszeichen zur Positionsanzeige genutzt werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.05.2003, 08:14 Uhr
Bruder Leif
dances with systems
(Operator)


Warum muß ich grad an Peking denken und hab Hunger? Gemeinheit! *lol*
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.05.2003, 16:34 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
sowas hatte ich mach irgendwo ... (ich glaube ich hatte da ein bsp für erpelchen)

*Searching ...*

*... Complete*

Ok ist ein MFC-Bsp gewesen,

in

m_strEingabe steht z.b 100*44+3, wenn man auf den button Berechnen gedrückt hat wurde dann folgendes ausgeführt:



C++:
int iErgebnis = 0;
  CString strZahl1 = "", strZahl2 = "";
  char cRechnung = '\0';
  bool bSwitch = 0;

  for(int x = 0; x < m_strEingabe.GetLength(); x++)
  {
    char cZeichen = m_strEingabe.GetAt(x);
    if( (cZeichen > 47) && (cZeichen < 58) ) // Wenn Zahl
    {
      if(!bSwitch)
        strZahl1 += cZeichen;
      else
        strZahl2 += cZeichen;
    }
    else // ansonsten sollte es ein Rechenzeichen sein, überprüfen!
    {
      if(cRechnung != '\0') // Das Erste Mal nichts berechnen, da nur eine Zahl zu Verfügung ...
      {
        switch(cRechnung)
        {
        case '*': { iErgebnis = ( atoi(strZahl1) * atoi(strZahl2) ); } break;
        case '/':
          {
            if(atoi(strZahl2)==0)
            {
              MessageBox("Fehler: Man kann nicht durch 0 teilen!","ERROR",MB_OK|MB_ICONSTOP);
              m_strAusgabe = "Math Error";
              UpdateData(FALSE);
              return;
            }
            iErgebnis = ( atoi(strZahl1) / atoi(strZahl2) );
          } break;
        case '+': { iErgebnis = ( atoi(strZahl1) + atoi(strZahl2) ); } break;
        case '-': { iErgebnis = ( atoi(strZahl1) - atoi(strZahl2) ); } break;
        }
        strZahl1.Format("%d",iErgebnis);
        strZahl2.Empty();
      }
      bSwitch = 1;
      cRechnung = cZeichen;
    }
  }
  if(cRechnung != '\0')
  {
    switch(cRechnung)
    {
    case '*': { iErgebnis = ( atoi(strZahl1) * atoi(strZahl2) ); } break;
    case '/':
      {
        if(atoi(strZahl2)==0)
        {
          MessageBox("Fehler: Man kann nicht durch 0 teilen!","ERROR",MB_OK|MB_ICONSTOP);
          m_strAusgabe = "Math Error";
          UpdateData(FALSE);
          return;
        }
        iErgebnis = ( atoi(strZahl1) / atoi(strZahl2) );
      } break;
    case '+': { iErgebnis = ( atoi(strZahl1) + atoi(strZahl2) ); } break;
    case '-': { iErgebnis = ( atoi(strZahl1) - atoi(strZahl2) ); } break;
    }
    m_strEingabe.Format("%s=%d",m_strEingabe,iErgebnis);
  }
  else
  {
    m_strEingabe.Format("%s=%s",m_strEingabe,m_strEingabe);
  }



In m_strEingabe steht dann auch das Ergebnis in der Form
100*44+3=443

Einhaltung von Rechenregeln (also Punkt vor Strich usw) ist nicht implementiert.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.05.2003, 02:48 Uhr
~Ente_Knusprig
Gast


Hi Flosoft,

..... sorry, da hab' ich die Aufgabe evtl. nicht klar und deutlich formuliert. Es geht nicht um das Parsen eines mathematischen Ausdrucks der dann berechnet wird. Die Kunst ist hierbei das NICHT gerechnet werden soll. Das Format ist ist vorgegeben und die Rechnung soll NUR (und ausschliesslich!) durch Textersetzung gelöst werden.
Vorgabe ist ja das die Programmiersprache "REPLACE" nur Textersetzung beherrscht und keinerlei mathematischen Operationen.

Ich finde es auf Grund dessen sehr interessant weil es nicht unbedingt auf detaillierte Kenntnisse einer Programmiersprache ankommt da die Vorgaben der "REPLACE"-Sprache ja sehr simpel sind (nur Textersetzung).
Kenntnisse sind nur notwendig für den Interpreter, der aber wahrhaftig keine Kunst ist und nur ein Test-Tool sein soll (Stringeingabe, Textfile (REPLACE Programm) einlesen, Texte ersetzen).

Da es auf die Syntax nicht ankommt kann die ja ruhig auch geändert werden.
Eigentlich würde ich mich ja schon mit der Grundidee zufrieden geben. :-)

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.05.2003, 14:33 Uhr
Ente_Knusprig



Nur mal als Anmerkung:

Das ist übrigens eine Aufgabe eines Informatik-Wettbewerbs von 1990 (vom Forschungszentrum für Informatik in Dagstuhl).
Teilnahme-Vorraussetzung war das man unter 21 ist und keine abgeschlossene Ausbildung im Inf-Bereich hat.

Ich denk mal daß ich Euch da ein wenig überschätzt habe :-)

Informatik ist doch prinzipiell nicht die Kunst mit den möglichst kryptischsten Mitteln einer Sprache ein triviales Problem mit möglichst wenig Zeilen zu lösen, oder???

Hier ist jetzt mal ein Problem das nicht unbedingt trivial ist, daß aber andererseits keinerlei mathematischen oder Programmierkenntnisse voraussetzt und sogar auf 'nem Zettel gelöst werden kann.

Das sollte doch von Euch zu lösen sein, oder???



Gruß

Die knusprige Ente..
--
Knusprig sein, das ist fein
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.05.2003, 15:45 Uhr
~0xdeadbeef
Gast


Die Aufgabe ist im Prinzip nicht weiter schwierig, aber ziemlich arbeitsaufwändig. Das ist generell das Problem an diesem Informatikwettbewerbsgeschichten - das Prinzip hast du nach 5 Minuten raus, aber an der Implementation sitzt man ein paar Stunden, weil es eine einzige Rumfummelei ist.
 
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: