Implementiere einen nutzlosen Interpreter

12

Ihre Aufgabe ist es, einen Dolmetscher für die Nutzlosen zu bauen Sprache :

Hier sind die funktionalen Anforderungen:

  • Alle beschriebenen Befehle sollten vom Interpreter akzeptiert werden.
  • NO., NOOPUnd INCLUDE-xxxgeehrt werden müssen.
  • DONTUSEME(n) Das Basisdatum muss für Testzwecke einfach konfigurierbar sein.
  • INCLUDE-xxxmuss in der Lage sein, jeden Befehl mit ungefähr gleicher Wahrscheinlichkeit zu generieren. Wenn es a erzeugt DONTUSEME(n), sollte er zufällig einen kleinen Wert für n auswählen.
  • DONTUSEME(n)Fenster sollten die NO.Anweisung überstehen. Tipp: Starten Sie für diese Fenster einen neuen Prozess.
  • BOOM!und KABOOM!muss etwas Schlimmes und Unheimliches tun und KABOOM!muss schlimmer sein als BOOM!. Dies darf jedoch nicht zu ernst genommen werden, damit es nicht destruktiv, übermäßig störend oder schwer zu widerrufen ist. Bitte, dies nicht tun, nicht , und nicht macht diese Anweisungen , um einen ausführen rm -rf \Befehl, eine Gabel Bombe ausführen, installiert Malware beschädigte Daten im Dateisystem oder Post an oder laden unangemessene Inhalte aus dem Internet oder jede anderen Sache eindeutig missbräuchlich.
  • TURINGVSALONZOsollte so laufen, als würde es tatsächlich das tun, was es tun sollte. Tipp: Entscheiden Sie nach dem Zufallsprinzip, ob es für eine zufällige sehr lange Zeit oder eine zufällige kurze Zeit oder für immer schlafen würde.
  • Alle anderen vordefinierten Anweisungen sollten etwas anderes tun als die oben genannten Anweisungen und sich voneinander unterscheiden, aber niemals etwas Schlimmeres als BOOM!oderKABOOM! . Was sie genau tun, liegt bei Ihnen, aber eine einfache Implementierung würde nur eine Fehlermeldung oder einen anderen Text ausgeben.
  • Sie sollten dem Benutzer eine einfache Möglichkeit bieten, das vom Interpreter auszuführende Programm bereitzustellen. Das Lesen von Klartext aus einer Datei oder aus stdinist in Ordnung. Das Lesen aus einer verschlüsselten Datei irgendwo im Internet ist nicht möglich.

Optional:

  • Wenn Sie möchten, können Sie einige neue Befehle erfinden, die jedoch denselben Regeln unterliegen sollten wie die anderen. Verwenden Sie dies nicht, um die Einschränkungen zu umgehen BOOM!und / KABOOM!oder zu besiegen DONTUSEME(n). Und wenn Sie neue Befehle erfinden, erklären Sie, was sie tun.
  • Sie sollten sich überlegen, was der Interpreter tun soll, wenn er Eingaben mit unbekannten Befehlen (oder sogar völlig unparsbarem Quatsch durch zufällige Bytes) empfängt.
  • Obwohl keine Anweisung den DONTUSEME(n)Befehl besiegen sollte , können Sie dafür einen Kill-Schalter hinzufügen. Nur nicht in der Sprache aussetzen.

Wir haben einige nicht funktionierende Anforderungen, um Missbrauch zu vermeiden:

  • Ihr Eintrag muss so vollständig und automatisch wie möglich sein. Dies bedeutet, dass es sich nicht einfach um eine Art Installationsprogramm oder ein eindeutig unvollständiges Programm handeln sollte. Auf diese Weise ist das Herunterladen und Verwenden von Bibliotheken wie jQuery oder Paketen von maven central in Ordnung, das Herunterladen von beliebigem Code und Paketen von Ihrem benutzerdefinierten Server jedoch nicht.
  • Ihr Eintrag sollte keinen Inhalt von dieser Seite oder von einem Spiegel oder einer Kopie dieser Seite erhalten, um eine Art Reflexion oder für einen anderen Zweck durchzuführen. Dies ist wichtig, um zu vermeiden, dass ein Programm versucht, die Antworten anderer Teilnehmer auf diese Frage zu lesen oder die Frage oder die Antworten auf irgendeine Weise zu stören.
  • Ihr Interpreter sollte unveränderlich sein und seine Eingabedatei nicht selbst modifizieren oder modifizieren. Es ist jedoch in Ordnung, eine mutierte Kopie des Interpreters oder der Eingabedatei zu erstellen, ohne das Original zu ändern.

Und schließlich, wenn man bedenkt, dass:

  • Es wird erwartet, dass die Programme in den Antworten ziemlich nutzlos sind, selbst wenn sie vollständig konform sind.
  • Die Sprache ist (absichtlich) sehr unterbestimmt, und die Antwortenden haben eine Menge Freiheiten zu nehmen und sind motiviert, sie zu nehmen.
  • Die Anforderungen und die möglichen Implementierungen haben viele subjektive Punkte;
  • Das Ziel dabei ist es, Spaß und Kreativität zu bekommen.

Dann ist dies ein , und die am besten bewertete Antwort, die den Regeln entspricht, gewinnt! Sie müssen also nicht Golf spielen oder Ihre Antwort verschleiern (aber Sie können dies tun, wenn Sie möchten). Stelle nur sicher, dass du etwas Originelles und Kreatives postest, um die Upvotes zu verdienen, dh bitte poste keine langweiligen Einträge.

Victor Stafusa
quelle
Du meinst "rm-rf"?
Simon Kuang

Antworten:

8

TI-BASIC

Es gibt eine Kill-Taste für DONTUSEME, können Sie herausfinden, welche es ist? :)

:Lbl 1
:Input Str1
:If Str1="NO."
:Pause
:If Str1="FAIL"
:Disp "OBSOLETE. WHAT A FAIL."
:If Str1="NOT"
:Disp "USING NOT IS HIGHLY DISCOURAGED!"
:If Str1="NEVER"
:get(Police,911)
:If Str1="IDK"
:Disp LLLundefined
:If Str1="BOOM!"
:Disp "rm -rf \"
:If Str1="KABOOM!"
:send(virus)
:If Str1="QWAOZAPWQFUOA"
:Disp "SKIPPING QWAO... UNIMPLEMENTED"
:If Str1="WUT?"
:dayOfWk(1)
:If Str1="WHERE?"
:Disp "NON-EXISTENT. SKIPPED."
:If Str1="HOW?"
:++
:If sub(Str1,1,9)="DONTUSEME"
:Then
:While 1
:sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(e)
:End
:End
:If Str1="ILLEGAL"
:Archive X
:If Str1="GODEXISTS"
:Disp "GOD EXISTS, PROVEN BY LAW."
:If Str1="WINDOWS"
:Disp "UNABLE TO OPEN START MENU!"
:If Str1="NOOP"
:Lbl 0
:If sub(Str1,1,8)="INCLUDE-"
:sub(Str1,9,length(Str1-8))
:If Str1=Ans
:Then
:If not(rand)
:Goto 0
:End
:If Str1="TURINGVSALONZO"
:Then
:"+"→Str0
:randInt(5,10)
:While Ans
:Ans-1
:If fpart(Ans,4)4=3
:Str0+"+"→Str0
:If fpart(Ans,4)4=2
:Str0+"-"→Str0
:If fpart(Ans,4)4=1
:Str0+">"→Str0
:If fpart(Ans,4)4=0
:Str0+"."→Str0
:End
:Disp "0"
:"?utm_campaign=0"
:End
:Goto 1
Timtech
quelle
2
Bedeutet das :Goto 1, dass dies BOOM!nur ein No-Op ist?
Victor Stafusa
1
@ VictorStafusa Ja. Nachdem ich es mir genauer überlegt hatte, änderte ich es in "rm -rf", weil du mir gesagt hast (nicht), dass ich es tun soll.
Timtech
Ich glaube nicht, dass Sie implementiert haben INCLUDE-.
Lirtosiast
9

HTML + Javascript + jQuery + jQuery-Benutzeroberfläche

Die Eingabe sollte im Textbereich erfolgen und wie jeder Befehl in einer Zeile formatiert sein. Die Befehle unterscheiden nicht zwischen Groß- und Kleinschreibung. Alle Befehle wurden vollständig implementiert. Ich hoffe es gefällt euch.

Sie können es unter http://jsfiddle.net/bCBfk/ ausprobieren.

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    <title>Useless interpreter</title>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <style type="text/css">
      textarea { height: auto; }
      .badshit { color: red; }
      .ui-dialog-titlebar-close { display: none; }
    </style>
    <script type="text/javascript">
      String.prototype.startsWith = function(x) {
        return this.substring(0, x.length) === x;
      };
      String.prototype.endsWith = function(x) {
        return this.substr(this.length - x.length, x.length) === x;
      };

      var npe = "<pre>java.lang.NullPointerException\n"
          + "       at org.esolangs.wiki.useless.memorymodel.ExistentObjectPool.findObject(ExistentObjectPool.java:684)\n"
          + "       at org.esolangs.wiki.useless.interpreter.WhereInstruction.visit(WhereInstruction.java:29)\n"
          + "       at org.esolangs.wiki.useless.interpreter.UselessProgram.run(UselessProgram.java:413)\n"
          + "       at org.esolangs.wiki.useless.interpreter.Main.main(Main.java:53)</pre>";

      var wut = navigator.userAgent + " - " + navigator.language + " - " + navigator.platform + " - Ii?".toLocaleUpperCase();

      var wut2 = "";
      for (var c = wut.length - 1; c >= 0; c--) {
          wut2 += wut.charAt(c);
      }

      var popupMasterMind;
      function killIt() {
        clearInterval(popupMasterMind);
        $(".dontuseme").remove();
        popupMasterMind = null;
      }

      function spawn() {
        var x = $("<div class='dontuseme' title=''><p></p></div>");
        $("body").append(x);
        x.dialog();
        var bw = $("body").innerWidth();
        var bh = $("body").innerHeight();
        if (bh < 500) bh = 500;
        var xw = x.width();
        var xh = x.height();
        x.parent().css({left: Math.random() * (bw - xw) + "px", top: Math.random() * (bh - xh) + "px"});
      }

      function dontuseme() {
        if (popupMasterMind) return;
        spawn();
        popupMasterMind = setInterval(spawn, 700);
      }

      var hasOutput = false;
      function clearOutput() {
        $("#output").empty();
        hasOutput = false;
        $("#cc").hide();
      }

      function out(a) {
        $("#output").append($(a));
        hasOutput = true;
      }

      function finish() {
        $("#running").hide();
        $("#bt").show();
        if (hasOutput) $("#cc").show();
      }

      var annoyingUser = false;
      function swap() {
        annoyingUser = true;
        $("#everything").toggle();
        setTimeout(swap, 800);
      }

      function randomString() {
        var r = "";
        var f = Math.floor(Math.random() * 12) + 8;
        for (var i = 0; i < f; i++) {
          r += "ABCDEFGHIJKLMNOPQRSTUVWXYZ.!?0123456789".charAt(Math.floor(Math.random() * 39));
        }
        return r;
      }

      var instructions;
      function includeInstruction(name) {
        name = name.toUpperCase();
        if (instructions[name]) return; // Do not add it twice or overwrite existing instructions.
        var array = [];
        for (var e in instructions) {
          array.push(e);
        }
        var rand = Math.floor(Math.random() * array.length);
        //alert(name + ": " + array[rand]);
        instructions[name] = instructions[array[rand]];
      }

      // DONTUSEME(n) are special cases handled elsewhere.
      instructions = {
        "FAIL": function() { out("<p class='badshit'>Warning: The &lt;blink&gt; tag is obsolete.</p>"); if (!annoyingUser) swap(); return "next"; },
        "NOT": function() { out("<p class='badshit'>Warning: The NOT instruction is discouraged because it breaks yor Useless program.</p>"); return "quit"; },
        "NEVER": function() { out("<pre>Wild MISSINGNO. appeared!</pre>"); return "next"; },
        "IDK": function() { out("<pre>" + {}.idk + "</pre>"); return "next"; },
        "BOOM!": function() { $("#everything").empty(); return "quit"; },
        "KABOOM!": function() { window.location = "http://answers.yahoo.com/question/index?qid=20110816062515AANqygl"; return "quit"; },
        "NO.": function() { finish(); return "quit"; },
        "QWAOZAPWQFUOA": function() { out("<p class='badshit'>Sorry, I could not understand <a href='https://www.google.com.br/#q=women+psychology+and+behaviour'>this</a>.</p>"); return "next"; },
        "WUT?": function() { out("<p>" + wut2 + "</p>"); return "next"; },
        "WHERE?": function() { out(npe); return "next"; },
        "HOW?": function() { out("<p class='badshit'>Regular expression parser failed for HTML. Cause: \"ZALGO\"</p>"); return "next"; },
        "ILLEGAL": function() { out("<pre>codegolfer is not in the sudoers file.  This incident will be reported</pre>"); return "next"; },
        "GODEXISTS": function() { out("<p>'GOD' spelled backwards is 'DOG'. A DOG is an animal that does not exists, and by backwarding this, we conclude that GOD exists and is not an animal.</p>"); return "next"; },
        "WINDOWS": function() { out("<p><img width='640' height='400' src='http://upload.wikimedia.org/wikipedia/commons/3/3b/Windows_9X_BSOD.png' alt='Sorry, this optional instruction was not implemented. Please, install the service pack.'></p>"); return "next"; },
        "NOOP": function() { return "next"; },
        "TURINGVSALONZO": function() {
          var r = Math.random() * 10;
          if (r < 2) return "next";
          if (r < 7) return "t" + (Math.random() * 14 + 1) * 1000;
          if (r < 9) return "t" + (Math.random() * 50 + 10) * 60 * 1000;
          return "quit";
        },
        "42": function() {
          out("<p>Calculating the answer of the life, the universe and everything.</p>");
          out("<p>Estimated time is 7.5 million years.</p>");
          out("<p>Don't you want to briefly take a coffe while you wait? It will not take long, I promise.</p>");
          return "quit";
        },

        // This is special, as it needs a (surprising) useless parameter, it can't be acessed directly without prior processing, this is why it is lowercase.
        "dontuseme": function() { dontuseme(); return "next"; },

        // This is special. If the INCLUDE-xxx generates a INCLUDE-yyy instruction, the yyy instruction will have an unknown random generated name.
        // Since yyy is random and unknown, it probably won't appear in the input source code, but implement it regardless.
        "include-random": function() { includeInstruction(randomString()); return "next"; }
      };

      function bad(line) {
        //alert(line);
        out("<p class='badshit'>Syntax error: </p>");
      }

      function beyondEnd() {
        out("<p class='badshit'>Unrecoverable error: Tried to execute code beyond the end or program.</p>");
      }

      function interpretInstruction(lines, idx) {
        if (idx >= lines.length) { beyondEnd(); return; }

        // The toUpperCase serves two purposes: Making the language case-insensitive and hiding private implementations as lowercase instructions.
        ins = lines[idx].trim().toUpperCase();

        var result;

        // Special handling for parsing DONTUSEME(n)
        if (ins.startsWith("DONTUSEME(") && ins.endsWith(")")) {
          try {
            parseInt(ins.substring("DONTUSEME(".length, ins.length - 1));
          } catch (e) {
            bad(ins);
            return;
          }
          ins = "dontuseme";

        // Special handling for INCLUDE-xxx
        } else if (ins.startsWith("INCLUDE-") && ins.length > 8) {
          var name = ins.substring(8);
          includeInstruction(name);
          ins = "NOOP"; // Already executed, follow-up as noop.
        }

        // Execute the instruction.
        var f = instructions[ins];
        if (!f) { bad(ins); return; }
        var result = f();

        // Move on.
        if (result === "quit") return;
        var toWait = result === "next" ? 0 : parseInt(result.substring(1));
        var ii = idx + 1;
        setTimeout(function() {
          interpretInstruction(lines, ii);
        }, toWait);
      }

      function startInterpreter() {
        $("#bt").hide();
        $("#cc").hide();
        $("#running").show();
        var src = $("#input").val();
        var lines = src.split('\n');
        interpretInstruction(lines, 0);
      }

      $(document).ready(function() {
        $("#bt").click(startInterpreter);
        $("#cc").click(clearOutput);
      });
    </script>
  </head>
  <body>
    <div id="everything">
      <p>Type here your program input:</p>
      <textarea id="input" style="width: 400px; height: 150px;"></textarea>
      <p>
        <button id="bt">Run the program</button>
        <span id="running" style="display: none;">Running the program...</span>
      </p>
      <p>Here is the program output:</p>
      <p id="output" class="useless"></p>
      <button id="cc" style="display: none;">Clear the output</button>
    </div>
  </body>
</html>

Es hat einen neuen Befehl:

Es ist der 42Befehl, der die Antwort des Lebens, des Universums und alles berechnet. Das einzige Manko ist, dass es 7,5 Millionen Jahre dauert, bis es fertig ist.

Andere Spoiler:

Dieser Eintrag hat mehrere Funktionen:

  • Sie werden den FAILBefehl wirklich hassen .
  • BOOM!wird Sie "Ausführungseinheit" vermasseln. Zumindest die Fenster aus DONTUSEME(n)können dies überstehen.
  • KABOOM! ist wirklich gefährlich für die Welt in mehrfacher Hinsicht.
  • DONTUSEME(n)öffnet immer unendlich viele nicht schließbare leere Fenster, eines alle 0,8 Sekunden. Aber es gibt einen versteckten Kill-Schalter.
  • DONTUSEME(n)überlebt NO., FAILund sogar BOOM!. Ich konnte es einfach nicht überleben lassenKABOOM! . Der Grund dafür ist, dass Popup-Fenster nicht funktionieren, da dies nicht das Ergebnis eines Klicks ist (und Popups, die auf andere Weise erstellt wurden, in allen gängigen Browsern lange verboten sind) und auch keine Iframes verwenden können, da die Richtlinien des gleichen Ursprungs verletzt wurden .
  • INCLUDE-xxx kann jede Anweisung erstellen, einschließlich DONTUSEME(n) oder eine andere INCLUDE-yyyAnweisung.
  • Wenn INCLUDE-xxx eine INCLUDE-yyyAnweisung generiert wird , wird der yyyName zufällig generiert. Wenn Sie den Namen des generierten Befehls mit einem Firebug oder ähnlichem abrufen, können Sie ihn verwenden.
  • Es behandelt fehlerhafte Syntax und unvollständige oder leere Eingaben.

Victor Stafusa
quelle