News:

Afflatus-Arts.com - Forum
Willkommen Gast. Bitte einloggen oder registrieren  



Du bist hier: Index > Scripting & Coding Section > Coding / Script Battles > Thema : #5.1 Taschenrechner
1


Baumansicht | Freund benachrichtigen | Drucken  

 #5.1 Taschenrechner (20 Antworten, Gelesen 568 mal)

RValue
Gruppe: Moderator
Beitragsgruppe: Working Newbie
Beiträge: 88
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
Das hier ist der erste Teil einer Reihe von Contests; man sollte diesen hier erfolgreich bestritten haben damit man sich an die anderen wagen kann.

Ziel dieses Teils: Ein Taschenrechner mit Punkt-vor-Strich, also Operatorprioritäten und Klammernsetzung. Potenzen sollten auch enthalten sein. Also so etwas:
3*(5+3^2)-12
soll eingelesen werden. Ausgabe sollte dann 30 sein. (^ ist Potenz.)
Aber vorsicht bei der Potenz: die ist rechtsassoziativ, heisst:
2^2^2^2 = 2^(2^(2^2)) und nicht ((2^2)^2)^2.

Kriterium bei diesem Contest ist eine möglichst niedrige Laufzeitkomplexität. Auf deutsch: Wenn die Eingabe doppelt so lang ist, und euer Programm annähernd doppelt so lange braucht, ist es besser als ein Programm, das annähernd 4 mal so lange braucht. Ersteres wäre linear, zweiteres quadratisch.
Wir wollen nicht absolut die Zeit messen, damit ein PHPler gegen einen C-Programmierer überhaupt eine Chance hat.
Wenn 2 die selbe Laufzeitkomplexität haben, zählt die Lesbarkeit des Programms.

Falsche Eingaben kommen übrigens nicht vor, also müsst ihr nicht auf Korrektheit überprüfen, einfach nur lesen und auswerten.

Als Hilfe für die Implementierung: http://en.wikipedia.org/wiki/Recursive_descent_parser

Abgabetermin ist in genau 2 Wochen. Also am 10.4. um 16:30 Uhr bei mir per PN abliefern.


Bearbeitet von RValue : 27. März 2010, 16:25 Uhr

-----------------------
Meta C++ (blog)
IP: --    nach oben


#5.1 Taschenrechner

Buster
Gruppe: Community- & Projekt Leiter
Beitragsgruppe: Elite Member
Beiträge: 460
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none

the one and only
bin dabei ;)

-----------------------
--- Sig im Umbau ---
IP: --    nach oben


#5.1 Taschenrechner

SourceR
Gruppe: Entwicklungsteam
Beitragsgruppe: Working Member
Beiträge: 125
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
könntest du denn wenigstens die Zeichen nennen, die eine Mathematische Funktion beinhalten.
z.b.:
Grundrechenarten:
+: Addieren (Plus)
-: Subtrahieren (Minus) und Negatives Vorzeichen
*: Multiplizieren (Mal nehmen)
/: Dividieren (Teilen)
,: Nachkommabereich beginnen
.: Nachkommabereich beginnen (US/EN-Schreibweise)

Erweiterte Arithmetische Funktionen:
^: hast du ja schon gesagt; Potenzieren (Hoch nehmen)
_: würde ich als Radizieren nutzen (Wurzelziehen)
%: entweder als Modulo (Rest einer Teilung) oder Prozent (n*0,01)
': Modulo, wenn % als Prozent genutzt werden soll

lx: Logarithmus von x (x durch zahl ersetzen)
ln: Natürlicher Logarithmus (= lE)
sin: Sinus
cos: Kosinus
asin: Arkussinus
acos: Arkuskosinus
tan: Tangens
cot: Kotangens
atan: Arkustangens
abs: Absolutwert (>=0 keine Änderung des Vorzeichens, <0 x*-1)

Des weiteren würde ich auch ein paar Konstanten mit einbringen:
PI: Zahl Pi (etwa 3,14159)
E: Eulersche Zahl (etwa 2,718, wird für ln gebraucht)
Eine Liste von Konstanten, die es so gibt:
http://de.wikipedia.org/wiki/Mathematische_Konstante

(und was euch noch so einfällt)

-----------------------
User Posted Image
IP: --    nach oben


#5.1 Taschenrechner

RValue
Gruppe: Moderator
Beitragsgruppe: Working Newbie
Beiträge: 88
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
Grundrechenarten + Potenz, mehr nicht. Und '.' als Komma. Konstanten und Funktionen kommt in 5.2.


Bearbeitet von RValue : 1. April 2010, 16:28 Uhr

-----------------------
Meta C++ (blog)
IP: --    nach oben


#5.1 Taschenrechner

c1b1
Gruppe: Entwicklungsteam
Beitragsgruppe: Working Member
Beiträge: 106
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none

Wenn du glaubst, du hättest die Dinge unter Kontrolle, fährst du nicht schnell genug.
Ich check das mit der Potenz nicht
was muss denn bei den folgenden Termen jeweils rauskommen:
2^2^2^2
2^(2^(2^2))
(((2^2)^2)^2


Bearbeitet von c1b1 : 1. April 2010, 20:51 Uhr

-----------------------
Userscripte
User Posted Image
This is who I am and this what I like, GC, Sum and Blink and MxPx rocking my room -- Simple Plan
IP: --    nach oben


#5.1 Taschenrechner

RValue
Gruppe: Moderator
Beitragsgruppe: Working Newbie
Beiträge: 88
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
2^2^2^2 = 2^(2^(2^2)) = 65536
((2^2)^2)^2 = 256


-----------------------
Meta C++ (blog)
IP: --    nach oben


#5.1 Taschenrechner

c1b1
Gruppe: Entwicklungsteam
Beitragsgruppe: Working Member
Beiträge: 106
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none

Wenn du glaubst, du hättest die Dinge unter Kontrolle, fährst du nicht schnell genug.
Quote From : RValue  2. April 2010, 08:41 Uhr
2^2^2^2 = 2^(2^(2^2)) = 65536
((2^2)^2)^2 = 256
okay das habe ich unbewusst schon so gemacht.


-----------------------
Userscripte
User Posted Image
This is who I am and this what I like, GC, Sum and Blink and MxPx rocking my room -- Simple Plan
IP: --    nach oben


#5.1 Taschenrechner

RValue
Gruppe: Moderator
Beitragsgruppe: Working Newbie
Beiträge: 88
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
Danke für die Einsendung c1b1, leider wars die Einzige. Auswertung kann man sich da ja praktisch sparen... :|
Damit hat c1b1 auch gewonnen, da ist c1b1s Code zu finden: http://np.gfx-dose.de/2319/na/
Also gratz ;)

-----------------------
Meta C++ (blog)
IP: --    nach oben


#5.1 Taschenrechner

Buster
Gruppe: Community- & Projekt Leiter
Beitragsgruppe: Elite Member
Beiträge: 460
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none

the one and only
wollte ja eig auch noch was machen, aber war zu faul mir die ganzen string funktionen raus zu googeln :D

-----------------------
--- Sig im Umbau ---
IP: --    nach oben


#5.1 Taschenrechner

c1b1
Gruppe: Entwicklungsteam
Beitragsgruppe: Working Member
Beiträge: 106
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none

Wenn du glaubst, du hättest die Dinge unter Kontrolle, fährst du nicht schnell genug.
Also ich habe gerade schnell über meinen Code geschaut und ich glaube ich habe keine einzige Stringfunktion gebraucht ;)

-----------------------
Userscripte
User Posted Image
This is who I am and this what I like, GC, Sum and Blink and MxPx rocking my room -- Simple Plan
IP: --    nach oben


#5.1 Taschenrechner

SourceR
Gruppe: Entwicklungsteam
Beitragsgruppe: Working Member
Beiträge: 125
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
Scheiße, jetzt habe ich mich die ganze Nacht mit rum geschlagen, und noch nicht mal bei der Hälfte meiner Planung angekommen :D
Ich werde das Ding jedoch noch Fertigstellen;
währe echt zu schade, wenn die ganze Arbeit für lau gewesen währe^^
Hatte die letzten Wochen etwas zu viel um die Ohren, daher erst gestern Nachmittag anfangen können.
(Ich mach auch JS und XHTML1.1, jedoch als jQuery-Plugin, kann also schon jetzt sagen, das c1's auf jeden Fall beim starten schneller sein wird^^)

-----------------------
User Posted Image
IP: --    nach oben


#5.1 Taschenrechner

c1b1
Gruppe: Entwicklungsteam
Beitragsgruppe: Working Member
Beiträge: 106
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none

Wenn du glaubst, du hättest die Dinge unter Kontrolle, fährst du nicht schnell genug.
Aber wahrscheinlich wird deines in der Ausführung schneller sein :P

Also bei mir verdoppeln sich die Ausführungszeiten mit Länge des Codes:

http://c1b1se.pytalhost.de/homepage/scripts/taschenrechner.html

-----------------------
Userscripte
User Posted Image
This is who I am and this what I like, GC, Sum and Blink and MxPx rocking my room -- Simple Plan
IP: --    nach oben


#5.1 Taschenrechner

RValue
Gruppe: Moderator
Beitragsgruppe: Working Newbie
Beiträge: 88
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
http://np.gfx-dose.de/2323/na/ das wäre übrigens meine Lösung. Der string wird genau einmal durchlaufen und dann ist das Ergebnis da, also optimale Laufzeit. Ist relativ einfach aufgebaut:
Die oberste Ebene ist ne Summe. Eine Summe besteht aus vielen Produkten die mit + oder - aneinandergereiht sind. Ein Produkt besteht aus vielen Potenzen die mit * oder / aneinandergereiht sind. Ein Potenz besteht aus einem Term und evtl. einem ^ gefolgt von noch einer Potenz. Ein Term besteht entweder aus einem + und einem Term, einem - und einem Term, einer Summe die in Klammern steht oder einer Zahl.
Mehr braucht man gar nicht :)

P.S.: Wenn ein nicht-C++ler den Code liest, peek() gibt das aktuelle Zeichen zurück, pop() schiebt den Lesezeiger eins weiter und get() gibt das aktuelle Zeichen zurück und schiebt den Lesezeiger eins weiter.

-----------------------
Meta C++ (blog)
IP: --    nach oben


#5.1 Taschenrechner

SourceR
Gruppe: Entwicklungsteam
Beitragsgruppe: Working Member
Beiträge: 125
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
so, hat nu aber lang genug gedauert :P
Habe eben mein Ergebnis hochgeladen:
http://forum.afflatus-arts.com/calc/
(Momentan nur auf FF getestet)
Ich kann mir ned helfen, aber entweder ich bin zu gut oder zu schlecht:
mein kleines Benchmark zeigt mir entweder an, das die Berechnung in 0ms oder in 1ms erledigt wurde, kann aber irgendwas ned stimmen, da egal wie lang die Rechnung wird, das Ergebnis fast immer in der selben Geschwindigkeit ausgeführt wird (Oder FF is einfach nur zu schnell auf meinen 2*3GHz^^, jedoch werden nur effektiv 800MHz auf einem Kern genutzt)
Wenn jemand helfen kann, bitte mal Schreiben.

-----------------------
User Posted Image
IP: --    nach oben


#5.1 Taschenrechner

Uniqu3.
Gruppe: V.I.P. Member
Beitragsgruppe: Working Member
Beiträge: 210
Status:
sotw wins:0 wotm wins:0 wallyotm wins:0 cotm wins:0 otherbattle wins:0
GFX Class: none
Da istn kleiner Fehler drin, wenn ich ne Klammer setzen möchte direkt am Anfang, dann bleibt die 0 da stehen. ;)
Gefällt mir garnicht. :D


-----------------------
Give it up, we just don’t care.
            Put your hands up in the air!
IP: --    nach oben


«      »

Baumansicht | Freund benachrichtigen | Drucken  

1


Springe nach :


Benutzer, die dieses Thema betrachten
1 Gäste, 0 Benutzer.


Alle Zeiten sind GMT +1. Heute ist der 4. September 2010, 06:51 Uhr.

  Powered By AEF 1.1 © 2007-2009 Electron Inc. and Afflatus-Arts

Impressum