Implémenter un interprète inutile [fermé]


12

Votre tâche consiste à construire un interprète vers la langue inutile :

Voici les exigences fonctionnelles:

  • Toutes les commandes décrites doivent être acceptées par l'interpréteur.
  • NO., NOOPEt INCLUDE-xxxdoit être honoré.
  • DONTUSEME(n) doit avoir sa date de base pour être facilement configurable à quelque chose de plus raisonnable à des fins de test.
  • INCLUDE-xxxdoit être capable de générer n'importe quelle commande avec une probabilité à peu près égale. S'il génère un DONTUSEME(n), il devrait choisir au hasard une petite valeur pour n.
  • DONTUSEME(n)les fenêtres devraient survivre à l' NO.instruction. Astuce: lancez un nouveau processus pour ces fenêtres.
  • BOOM!et KABOOM!doit faire quelque chose de mal et d'effrayant, et KABOOM!doit être pire que BOOM!. Mais cela ne doit pas être pris trop au sérieux, donc ce ne devrait pas être quelque chose de destructeur, de trop perturbateur ou difficile à défaire. S'il vous plaît, ne faites pas, ne faites pas et ne faites pas ces instructions exécuter une rm -rf \commande, lancer une bombe fourchette, installer des logiciels malveillants, corrompre des données dans le système de fichiers, ou publier ou télécharger du contenu inapproprié sur Internet, ou toute autre chose clairement abusive.
  • TURINGVSALONZOdevrait fonctionner comme s’il faisait en fait ce qu’il devrait faire. Astuce: faites-le décider au hasard s'il dormira pendant une très longue période aléatoire, ou une courte période aléatoire, ou pour toujours.
  • Toutes les autres instructions prédéfinies doivent faire autre chose que les instructions susmentionnées et différentes les unes des autres, mais jamais quelque chose de pire que BOOM!ou KABOOM!. Ce qu'ils font exactement dépend de vous, mais une implémentation simple produirait simplement un message d'erreur ou un autre texte.
  • Vous devez fournir à l'utilisateur un moyen simple de fournir le programme qui serait exécuté par l'interpréteur. c'est-à-dire que lire du texte en clair à partir d'un fichier ou de stdinest correct. Le lire à partir d'un fichier crypté quelque part sur Internet ne l'est pas.

Optionnel:

  • Vous pouvez inventer de nouvelles commandes si vous le souhaitez, mais elles devraient être soumises aux mêmes règles que les autres. Ne l'utilisez pas pour contourner les restrictions dans BOOM!et KABOOM!ou pour vaincre DONTUSEME(n). Et si vous inventez de nouvelles commandes, expliquez ce qu'elles font.
  • Vous devriez penser à ce que fait l'interpréteur s'il reçoit une entrée avec des commandes inconnues (ou même un charabia aléatoire complètement insaisissable).
  • Bien qu'aucune instruction ne doive vaincre la DONTUSEME(n)commande, vous pouvez lui ajouter un kill switch. N'exposez pas cela dans la langue.

Nous avons quelques exigences non fonctionnelles pour éviter les abus:

  • Votre inscription doit être aussi complète et contenue automatiquement que possible. Cela signifie qu'il ne doit pas s'agir simplement d'une sorte d'installation ou d'un programme clairement incomplet. De cette façon, le téléchargement et l'utilisation de bibliothèques comme jQuery ou de packages à partir de maven central est correct, mais le téléchargement de code arbitraire et de packages à partir de votre serveur personnalisé ne l'est pas.
  • Votre entrée ne devrait pas obtenir de contenu de cette même page ou d'un miroir ou d'une copie de cette page afin de faire une sorte de réflexion ou à toute autre fin. Ceci est essentiel pour éviter certains programmes qui essaient de lire les réponses des autres participants à cette question ou tentent de perturber la question ou les réponses de quelque manière que ce soit.
  • Votre interprète doit être immuable et ne pas auto-modifier ou modifier son fichier d'entrée. Mais, créer une copie mutante de l'interpréteur ou du fichier d'entrée sans altérer l'original est correct.

Et enfin, considérant que:

  • Les programmes dans les réponses devraient être assez inutiles même s'ils sont entièrement conformes;
  • La langue est (exprès) très peu spécifiée, et les répondeurs ont beaucoup de libertés à prendre et sont incités à les prendre;
  • Les exigences et les implémentations possibles ont beaucoup de points subjectifs;
  • L'objectif avec cela est juste de s'amuser et de créer.

Ensuite, c'est un , et la réponse la plus positive entièrement conforme aux règles l'emporte! Donc, vous n'avez pas besoin de jouer au golf ou de masquer votre réponse (mais vous pouvez le faire si vous le souhaitez). Assurez-vous simplement de publier quelque chose d'original et de créatif pour mériter les votes positifs, c'est-à-dire s'il vous plaît ne postez pas d'entrées ennuyeuses boiteuses.


Vous voulez dire «rm -rf»?
Simon Kuang

Réponses:


8

TI-BASIC

Il y a un bouton kill pour DONTUSEME, pouvez-vous déterminer lequel il s'agit? :)

: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

2
Est-ce à :Goto 1dire que BOOM!c'est juste un no-op?
Victor Stafusa

1
@VictorStafusa Ouais. Après y avoir réfléchi un peu plus, je l'ai changé en «rm -rf» parce que vous me l'avez dit (pas).
Timtech

Je ne pense pas que vous ayez mis en œuvre INCLUDE-.
lirtosiast

9

HTML + Javascript + jQuery + jQuery UI

L'entrée doit être donnée dans la zone de texte et doit être formatée comme chaque commande d'une ligne. Les commandes ne sont pas sensibles à la casse. Toutes les commandes ont été entièrement implémentées. J'espère que vous apprécierez.

Vous pouvez l'essayer sur http://jsfiddle.net/bCBfk/

<!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>

Il a une nouvelle commande:

C'est la 42commande qui calcule la réponse de la vie, de l'univers et de tout. La seule bizarrerie est qu'il faut 7,5 millions d'années pour terminer.

Autres spoilers:

Cette entrée a plusieurs fonctionnalités:

  • Vous détesterez vraiment la FAILcommande.
  • BOOM!va vous bousiller "unité d'exécution". Au moins, les fenêtres DONTUSEME(n)peuvent survivre à cela.
  • KABOOM! est vraiment dangereux pour le monde de plusieurs façons.
  • DONTUSEME(n)ouvre toujours des fenêtres vides infinies non fermables, une toutes les 0,8 secondes. Mais il y a un kill switch caché.
  • DONTUSEME(n)survit NO., FAILet même BOOM!. Je ne pouvais tout simplement pas le faire survivre KABOOM!. La raison en est que les fenêtres contextuelles ne fonctionneront pas car ce n'est pas le résultat d'un clic (et les fenêtres contextuelles créées par d'autres moyens sont interdites depuis longtemps dans tous les principaux navigateurs), et ne pouvaient pas utiliser les iframes également en raison d'une violation de la politique de même origine .
  • INCLUDE-xxxpeut créer n'importe quelle instruction, y compris DONTUSEME(n)ou une autre INCLUDE-yyyinstruction.
  • Si INCLUDE-xxxne génère une INCLUDE-yyyinstruction, le yyynom est généré au hasard. Si vous saisissez le nom de la commande générée avec firebug ou quelque chose de similaire, vous pouvez l'utiliser.
  • Il gère une syntaxe mal formée et une entrée incomplète ou vide.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.