Benutzer:Arbiedz/Projekte/Ausbaustufenrechner

aus FreewarWiki, der Referenz für Freewar
Zur Navigation springen Zur Suche springen

Ein kleiner Javascript-Rechner, der Kosten und Zeiten der ersten n Ausbaustufen eines Gebäudes so formatiert ausgibt, dass die Ausgabe in einen fwwiki-Artikel eingefügt werden kann.

Benutzung: Auf Bearbeiten drücken, Kopieren des Quelltextes ab einschließlich des <html> bis einschließlich </html> in einen Editor, lokal speichern als HTML-Datei, mit Browser aufrufen, Basiswerte eingeben und dann berechnen lassen.
Oder hier online verwenden.

Korrekturen, Ergänzungen und Kommentare sind willkommen.

<html>
<head>
<title>Ausbaustufenberechnung</title>
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
<script type="text/javascript">
<!--

var Version = 3;
var Versiondate = "03. April 2009";


function Ausbaukosten(Stufe, Stufe1Kosten, ExpFaktor, ExpBasis) {
/* integer-Rückgabe der Ausbaukosten von *Stufe*-1 zu *Stufe* */
  if (Stufe == 1) return Stufe1Kosten;

  // return Math.floor(10*Math.pow(1.33, Stufe-1));
  return Math.floor(ExpFaktor * Math.pow(ExpBasis, Stufe-1));
}


function Tausenderpunkt(Ganzzahl) {
/* string-Rückgabe *Ganzzahl* mit Tausenderpunkten */
var ergebnis = "";
var GanzzahlStr = String(Ganzzahl);
var Dezimalstellenanzahl = GanzzahlStr.length;
var AnzahlTausenderpunkte = Math.floor((Dezimalstellenanzahl-1) / 3);
var i;
  for (i=1; i <= AnzahlTausenderpunkte; i++)
    ergebnis='.' + GanzzahlStr.substring(Dezimalstellenanzahl-3*i, Dezimalstellenanzahl-3*(i-1)) + ergebnis;

  return GanzzahlStr.substring(0, Dezimalstellenanzahl - AnzahlTausenderpunkte * 3) + ergebnis;
}


function FormatPretty(Kommazahl) {
var KommazahlStr = String(Kommazahl);
var i=KommazahlStr.indexOf(".");

  if (i>=0) {
    KommazahlStr=KommazahlStr.substring(0,i) + ',' + KommazahlStr.substring(i+1,i+2);

    }
    else { KommazahlStr=KommazahlStr+',0' };
  return KommazahlStr;
}



function PluralSingular(Zahlwert, Nomen, Pluralpostfix) {
/* falls Zahlwert=1, wird *Nomen* unverändert zurückgegeben, ansonsten der Pluralpostfix angehängt */
  if (Zahlwert==1) { return Nomen; } else { return Nomen + Pluralpostfix };
}




function SecToHumanreadabletime(sec) {
/* String-Rückgabe der Sekundenangabe *sec* im Format "t Tage h Stunden m Minuten s Sekunden"
   führende Einheiten mit Nullen werden weggelassen */

  function FormattedToken(Value, Nomen, Pluralpostfix) {
    return String(Value) + " " + PluralSingular(Value, Nomen, Pluralpostfix);
  }


var ergebnis = "";
var f;
var n;
  // ganze Tage:
  f = sec/60/60/24;
  n = Math.floor(f);
  if (f >= 1) {
    ergebnis = FormattedToken(n, "Tag", "e") + " ";
  }
  sec = sec - n*24*60*60;
  // ganze Stunden:
  f=sec/60/60;
  n = Math.floor(f);
  if (f >= 1 || ergebnis != "") {
    ergebnis = ergebnis + FormattedToken(n, "Stunde", "n") + " ";
  }
  sec = sec - Math.floor(f)*60*60;
  // ganze Minuten:
  f=sec/60;
  n = Math.floor(f);
  if (f >= 1 || ergebnis != "") {
    ergebnis = ergebnis + FormattedToken(n, "Minute", "n") + " ";
  }
  sec = sec - n * 60;

  return ergebnis + FormattedToken(sec, "Sekunde", "n");
}



function SubstVars(FormatStr, Stufe, KostenStufe, KostenGesamt, AusbaudauerMin, WartezeitSec) {
SubstStrs = new Array("S", "KE", "KG", "A", "WH", "WS", "UD");
var FindIndex = 0;
var SubstStr = "";

  for (var i = 0; i < SubstStrs.length; ++i)
    while ((FindIndex = FormatStr.indexOf("$(" + SubstStrs[i] + ")")) >= 0) {
      switch (SubstStrs[i]) {
        case "S":
          SubstStr = Stufe;
          break;
        case "KE":
          SubstStr = Tausenderpunkt(KostenStufe);
          break;
        case "KG":
          SubstStr = Tausenderpunkt(KostenGesamt);
          break;
        case "A":
          SubstStr = Tausenderpunkt(AusbaudauerMin);
          break;
        case "WH":
          SubstStr = SecToHumanreadabletime(WartezeitSec);
          break;
        case "WS":
          SubstStr = Tausenderpunkt(WartezeitSec);
          break;
        case "UD":
          SubstStr = FormatPretty(Math.round(1/WartezeitSec*60*60*24*10)/10);
          break;

      }
      FormatStr = FormatStr.substr(0, FindIndex) + SubstStr + FormatStr.substr(FindIndex + SubstStrs[i].length + 3);
    };
  return FormatStr;
}


function main() {
var AusbaukostenSumme = 0;
var Kosten = 0;
var Wartezeit = 0;

  document.Formular.Ausgabe.value = document.Formular.Pretext.value;
  for (var Stufe = 1; Stufe <= parseInt(document.Formular.Endstufe.value); Stufe++) {
    Kosten = Ausbaukosten(Stufe, parseInt(document.Formular.Anfangskosten.value), eval(document.Formular.ExpKostenFaktor.value), eval(document.Formular.ExpKostenBasis.value));
    Wartezeit = Math.floor(eval(document.Formular.ExpZeitFaktor.value) * Math.pow(eval(document.Formular.ExpZeitBasis.value), Stufe))
    AusbaukostenSumme += Kosten;

    document.Formular.Ausgabe.value += SubstVars(document.Formular.Formatstring.value, Stufe, Kosten, AusbaukostenSumme, 100 * (Stufe -1), Wartezeit) + "\n";
  }
  document.Formular.Ausgabe.value += document.Formular.Posttext.value;
}
//-->
</script>
</head>

<body>
Berechnung der Ausbaustufen (mit Voreinstellung für das <em>Haus der Portale</em>) mit entsprechender Formatierung zum Einfügen in die Artikelbearbeitung.<br>
<script type="text/javascript">
<!--
  document.write("Version " + Version + " vom " + Versiondate + ".");
//-->
</script>



<form name="Formular" action="">
  <fieldset>
    <legend>Kosten <i>K</i></legend>
    K<sub>(S)</sub> = F<sub>k</sub> · B<sub>k</sub><sup>S</sup> <i>(K=Kosten, S=Stufe, F<sub>k</sub>=Faktor Kostenfunktion, B<sub>k</sub>=Basis Kostenfunktion)</i><br>
    Anfangskosten K<sub>0</sub>: <input name="Anfangskosten" type="text" size="5" maxlength="5" value="200">
    Faktor F<sub>k</sub>: <input name="ExpKostenFaktor" type="text" size="15" maxlength="55" value="10">
    Basis B<sub>k</sub>: <input name="ExpKostenBasis" type="text" size="15" maxlength="55" value="1.33">

  </fieldset>
  <fieldset>
    <legend>Wartezeit <i>W</i> zwischen zwei Anwendungen</legend>
    W<sub>(S)</sub> = F<sub>w</sub> · B<sub>w</sub><sup>S</sup> <i>(W=Wartezeit, S=Stufe, F<sub>w</sub>=Faktor Wartezeitfunktion, B<sub>w</sub>=Basis Wartezeitfunktion)</i><br>
    Faktor F<sub>w</sub>: <input name="ExpZeitFaktor" type="text" size="15" maxlength="55" value="2592000">
    Basis B<sub>w</sub>: <input name="ExpZeitBasis" type="text" size="15" maxlength="55" value="1/1.30">
  </fieldset>
  <fieldset>
    <legend>Ausgabe</legend>
    führender Text:<br>
    <textarea cols="140" rows="3" name="Pretext">
{| class='wikitable'
!Stufe
!Ausbaukosten
diese Stufe
!Ausbaukosten
gesamt
!Minuten
für Ausbau
!Zeit zwischen zwei Anwendungen
!Anwendungen/Tag
</textarea><br>
    Formatstring:<br>
    <textarea cols="140" rows="5" name="Formatstring">
|-
|align="right"|$(S)||align="right"|$(KE)||align="right"|$(KG)||align="right"|$(A)||align="center"|$(WH)||align="right"|$(UD)</textarea><br>
    Folgende Variablen werden substituiert:
    <table border>
      <tr><th>Notation</th><th>Inhalt</th></tr>
      <tr><td>$(S)</td> <td>Stufe</td></tr>
      <tr><td>$(KE)</td><td>Ausbaukosten für diese Stufe</td></tr>
      <tr><td>$(KG)</td><td>Ausbaukosten bis zu diese Stufe (Gesamt-Ausbaukosten)</td></tr>
      <tr><td>$(A)</td> <td>Ausbaudauer für diese Stufe</td></tr>
      <tr><td>$(WH)</td><td>Wartezeit zwischen zwei Anwendungen im Format <em>T Tag(e) H Stunde(n) M Minute(n) S Sekunde(n)</em> Es wird jeweils die passende Plural- oder Singularform verwendet.</td></tr>
      <tr><td>$(WS)</td><td>Wartezeit zwischen zwei Anwendungen im Format <em>Sekunden</em></td></tr>
      <tr><td>$(UD)</td><td>Anwendungen/Tag</td></tr>
    </table>
    abschließender Text:<br>
    <textarea cols="140" rows="3" name="Posttext">|----
|}</textarea>
  </fieldset>

  Berechne bis Stufe: <input name="Endstufe" type="text" size="5" maxlength="5" value="50">


  <input type="button" value="Ausrechnen" onclick="main()">


  <textarea cols="140" rows="15" name="Ausgabe">
  </textarea>
</form>
Bekannte/vermutete (?) Werte:
<table border>
  <tr>
    <th></th>
    <th>K<sub>0</sub></th>
    <th>F<sub>k</sub></th>
    <th>B<sub>k</sub></th>
    <th>F<sub>w</sub></th>
    <th>B<sub>w</sub></th>
  </tr>
  <tr>
    <th>Haus der Portale</th>
    <td align="right">200</td>
    <td align="right">10</td>
    <td align="right">1.33</td>
    <td align="right">2592000</td>
    <td align="right">1/1.30 ≈ 0.7692</td>
  </tr>
  <tr>
    <th>Türme von Loranien</th>
    <td align="right">200</td>
    <td align="right">1.8</td>
    <td align="right">1.33</td>
    <td align="right">5184000</td>
    <td align="right">1/1.25 = 0.80 (?)</td>
  </tr>
  <tr>
    <th>Fischzucht</th>
    <td align="right">200</td>
    <td align="right">10</td>
    <td align="right">1.25</td>
    <td align="right">2591991 (?)</td>
    <td align="right">1/1.19 ≈ 0.8403 (?)</td>
  </tr>
  <tr>
    <th>Baru-Getreide</th>
    <td align="right">200</td>
    <td align="right">10</td>
    <td align="right">1.05</td>
    <td align="right">15 Tage = 1.296.000s</td>
    <td align="right">1/1.04</td>
  </tr>
  <tr>
    <th>Sumpfgas</th>
    <td align="right">200</td>
    <td align="right">10</td>
    <td align="right">1.27</td>
    <td align="right">2592000 (?)</td>
    <td align="right">1/1.2 ≈ 0.8333 (?)</td>
  </tr>
  <tr>
    <th>Ölturm</th>
    <td align="right">100</td>
    <td align="right">10</td>
    <td align="right">1.38</td>
    <td align="right">2592000 (?)</td>
    <td align="right">1/1.2 ≈ 0.8333 (?)</td>
  </tr>

</table>


</body>
</html>