Wdrażanie niepotrzebnego tłumacza [zamknięty]

12

Twoim zadaniem jest zbudowanie tłumacza na bezużyteczny język:

Oto wymagania funkcjonalne:

  • Wszystkie opisane polecenia powinny zostać zaakceptowane przez tłumacza.
  • NO., NOOPI INCLUDE-xxxmusi być honorowane.
  • DONTUSEME(n) musi mieć datę bazową, aby można ją było łatwo skonfigurować do czegoś bardziej rozsądnego do celów testowych.
  • INCLUDE-xxxmusi być w stanie wygenerować dowolne polecenie z mniej więcej takim samym prawdopodobieństwem. Jeśli generuje a DONTUSEME(n), powinien losowo wybrać małą wartość dla n.
  • DONTUSEME(n)Windows powinien przetrwać NO.instrukcję. Wskazówka: spawn nowy proces dla tych okien.
  • BOOM!i KABOOM!musi zrobić coś złego i przerażającego, i KABOOM!musi być gorszy niż BOOM!. Ale nie należy tego traktować zbyt poważnie, więc nie powinno to być coś destrukcyjnego, nadmiernie zakłócającego lub trudnego do usunięcia. Proszę, nie, nie i nie zmuszaj tych instrukcji do uruchomienia rm -rf \polecenia, uruchomienia bomby widełkowej, zainstalowania złośliwego oprogramowania, uszkodzenia danych w systemie plików, publikowania lub pobierania nieodpowiednich treści z Internetu lub jakichkolwiek innych rzeczy wyraźnie obelżywych.
  • TURINGVSALONZOpowinien działać tak, jakby faktycznie robił to, co powinien. Wskazówka: niech losowo decyduje, czy będzie spał przez bardzo długi czas, czy przez krótki czas, czy na zawsze.
  • Wszystkie inne predefiniowane instrukcje powinny robić coś innego niż wyżej wymienione instrukcje i różnić się od siebie, ale nigdy nie mogą być gorsze niż BOOM!lub KABOOM!. To, co dokładnie robią, zależy od Ciebie, ale prosta implementacja po prostu wyświetli komunikat o błędzie lub inny tekst.
  • Należy zapewnić użytkownikowi łatwy sposób udostępnienia programu, który byłby uruchamiany przez tłumacza. tj. Czytanie zwykłego tekstu z pliku lub z stdinjest w porządku. Czytanie go z zaszyfrowanego pliku gdzieś w Internecie nie jest.

Opcjonalny:

  • Możesz wymyślić kilka nowych poleceń, jeśli chcesz, ale powinny one podlegać tym samym regułom, co inne. Nie używaj tego celu obejścia ograniczeń w BOOM!a KABOOM!lub pokonać DONTUSEME(n). A jeśli wymyślisz nowe polecenia, wyjaśnij, co oni robią.
  • Powinieneś pomyśleć o tym, co robi interpreter, jeśli odbiera dane wejściowe za pomocą nieznanych poleceń (lub nawet całkowicie niemożliwych do rozdzielenia losowych bajtów bełkot).
  • Chociaż żadna instrukcja nie powinna pokonać DONTUSEME(n)polecenia, możesz dodać dla niego przełącznik „zabicia”. Tylko nie ujawniaj tego w języku.

Mamy kilka niefunkcjonalnych wymagań, aby uniknąć nadużyć:

  • Twoje zgłoszenie musi być jak najbardziej kompletne i automatycznie przechowywane. Oznacza to, że nie powinien to być po prostu jakiś instalator lub wyraźnie niekompletny program. W ten sposób pobieranie i używanie bibliotek takich jak jQuery lub pakiety z maven central jest w porządku, ale pobieranie dowolnego kodu i pakietów z własnego serwera nie jest możliwe.
  • Wpis nie powinien zawierać żadnych treści z tej samej strony ani z kopii lustrzanej ani kopii tej strony w celu dokonania refleksji lub w jakimkolwiek innym celu. Jest to niezbędne, aby uniknąć sytuacji, w której program próbuje odczytać odpowiedzi innych uczestników na to pytanie lub w jakikolwiek sposób zakłócić pytanie lub odpowiedzi.
  • Twój interpreter powinien być niezmienny i nie może samodzielnie modyfikować ani modyfikować pliku wejściowego. Ale tworzenie zmutowanej kopii interpretera lub pliku wejściowego bez zmiany oryginału jest w porządku.

I wreszcie, biorąc pod uwagę, że:

  • Oczekuje się, że programy zawarte w odpowiedziach będą zupełnie bezużyteczne, nawet jeśli będą w pełni zgodne;
  • Język jest (celowo) bardzo nieokreślony, a osoby udzielające odpowiedzi mają wiele swobód do podjęcia i są zachęcane do korzystania z nich;
  • Wymagania i możliwe wdrożenia mają wiele subiektywnych punktów;
  • Celem tego jest po prostu trochę zabawy i kreatywności.

To i wygrywa najbardziej pozytywna odpowiedź w pełni zgodna z zasadami! Więc nie musisz grać w golfa ani zaciemniać swojej odpowiedzi (ale możesz to zrobić, jeśli chcesz). Pamiętaj tylko, aby opublikować coś oryginalnego i kreatywnego, aby zasłużyć na opinie, tzn. Nie publikuj kiepskich nudnych wpisów.

Victor Stafusa
źródło
Masz na myśli `rm -rf`?
Simon Kuang,

Odpowiedzi:

8

TI-BASIC

Istnieje przycisk zabicia DONTUSEME, czy możesz dowiedzieć się, który to jest? :)

: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
źródło
2
Czy to :Goto 1oznacza, że BOOM!jest to po prostu zakaz?
Victor Stafusa
1
@VictorStafusa Tak. Po zastanowieniu się nad tym, zmieniłem go na `rm -rf`, ponieważ powiedziałeś mi (nie) do.
Timtech,
Nie sądzę, że wdrożyłeś INCLUDE-.
lirtosiast
9

HTML + JavaScript + jQuery + jQuery UI

Dane wejściowe należy podać w polu tekstowym i sformatować jako każde polecenie w wierszu. W poleceniach nie jest rozróżniana wielkość liter. Wszystkie polecenia zostały w pełni zaimplementowane. Mam nadzieję, że ci się spodoba.

Możesz spróbować na 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>

Ma jedno nowe polecenie:

To 42polecenie oblicza odpowiedź na życie, wszechświat i wszystko. Jedynym dziwactwem jest to, że ukończenie zajmuje 7,5 miliona lat.

Inne spojlery:

Ten wpis ma kilka funkcji:

  • Naprawdę nienawidzisz tego FAILpolecenia.
  • BOOM!spieprzy ci „jednostkę wykonawczą”. Przynajmniej okna z DONTUSEME(n)są w stanie to przetrwać.
  • KABOOM! jest naprawdę niebezpieczny dla świata na kilka złych sposobów.
  • DONTUSEME(n)zawsze otwiera nieskończone, nie zamykane puste okna, jedno co 0,8 sekundy. Ale jest ukryty przełącznik zabijania.
  • DONTUSEME(n)przetrwa NO., FAILa nawet BOOM!. Po prostu nie mogłem tego zrobić KABOOM!. Powodem jest to, że wyskakujące okienka nie będą działać, ponieważ nie jest to wynikiem kliknięcia (a wyskakujące okienka utworzone w inny sposób są długo blokowane we wszystkich głównych przeglądarkach) i nie mogą również używać ramek iframe z powodu naruszenia zasad tego samego pochodzenia .
  • INCLUDE-xxxmoże tworzyć dowolne instrukcje, w tym DONTUSEME(n)lub inne INCLUDE-yyyinstrukcje.
  • Jeśli INCLUDE-xxxgeneruje INCLUDE-yyyinstrukcję, yyynazwa jest generowana losowo. Jeśli złapiesz nazwę wygenerowanego polecenia za pomocą firebuga lub czegoś podobnego, możesz go użyć.
  • Obsługuje zniekształconą składnię oraz niekompletne lub puste dane wejściowe.

Victor Stafusa
źródło