Використовуйте марний перекладач [закрито]


12

Ваше завдання - створити перекладача для непотрібної мови:

Ось функціональні вимоги:

  • Усі описані команди повинні бути прийняті перекладачем.
  • NO., NOOPі його INCLUDE-xxxтреба шанувати.
  • DONTUSEME(n) повинна мати свою базову дату, щоб її легко було налаштувати на щось більш розумне для цілей тестування.
  • INCLUDE-xxxповинні бути здатні генерувати будь-яку команду з приблизно однаковою ймовірністю. Якщо він генерує a DONTUSEME(n), він повинен випадковим чином вибрати невелике значення для n.
  • DONTUSEME(n)windows повинен пережити NO.інструкцію. Порада: породіть новий процес для цих вікон.
  • BOOM!і KABOOM!треба робити щось погане і страшне, і KABOOM!повинно бути гірше, ніж BOOM!. Але це не слід сприймати занадто серйозно, тому воно не повинно бути чимось руйнівним, надмірно руйнівним або важко відмінити. Будь ласка, не робіть, не робіть і не змушуйте цих інструкцій виконувати rm -rf \команду, запускайте форк-бомбу, встановлюйте зловмисне програмне забезпечення, пошкоджуючи дані у файловій системі або публікуйте чи завантажуйте невідповідний вміст з Інтернету чи будь-яку іншу річ, явно образливу.
  • TURINGVSALONZOповинен бігати так, ніби він насправді робив те, що повинен робити. Порада: Зробіть випадковим чином вирішити, чи буде він спати випадково дуже довго, або випадково короткий час, або назавжди.
  • Усі інші заздалегідь задані інструкції повинні робити щось інше, ніж вищезазначені інструкції, і відрізнятися одне від одного, але ніколи не гірше BOOM!або KABOOM!. Те, що вони точно роблять, залежить від вас, але проста реалізація просто виведе повідомлення про помилку чи інший текст.
  • Ви повинні надати простий спосіб користувачеві надати програму, якою керував би перекладач. тобто читання простого тексту з файлу або з stdin- це нормально. Читання його із зашифрованого файлу десь в Інтернеті не є.

Необов’язково:

  • Ви можете придумати кілька нових команд, якщо хочете, але вони повинні дотримуватися тих же правил, що і інші. Не використовуйте це, щоб обійти обмеження BOOM!та KABOOM!перемогти DONTUSEME(n). А якщо ви вигадуєте нові команди, поясніть, що вони роблять.
  • Вам слід подумати про те, що робить перекладач, якщо він отримує вхід з невідомими командами (або навіть зовсім нерозбірливими випадковими байтами, що хитаються).
  • Хоча жодна інструкція не повинна перемогти DONTUSEME(n)команду, ви можете додати для неї перемикач kill. Просто не розкривайте це мовою.

У нас є кілька нефункціональних вимог, щоб уникнути зловживань:

  • Ваш запис повинен бути максимально повним та автоматичним. Це означає, що це не повинен бути просто якийсь інсталятор або явно неповна програма. Таким чином, завантаження та використання таких бібліотек, як jQuery або пакети з Maven central - це нормально, але завантаження довільного коду та пакетів з вашого власного сервера - це не так.
  • Ваш запис не повинен отримувати жодного вмісту з цієї самої сторінки або з якогось дзеркала або копії цієї сторінки, щоб зробити якесь відображення або для будь-яких інших цілей. Це важливо, щоб уникнути певної програми, яка намагається прочитати відповіді інших учасників на це питання або намагатися будь-яким чином порушити питання або відповіді.
  • Ваш перекладач повинен бути незмінним, а не самостійно змінювати або змінювати вхідний файл. Але створити мутантну копію інтерпретатора або вхідного файлу без зміни оригіналу нормально.

І нарешті, враховуючи це:

  • Програми у відповідях очікуються досить марними, навіть якщо повністю відповідають;
  • Мова (цілеспрямовано) дуже не визначена, і у тих, хто відповідає, є багато свобод, які вони можуть взяти, і їх стимулюють прийняти;
  • Вимоги та можливі реалізації мають багато суб'єктивних моментів;
  • Завданням цього є лише отримати задоволення та творчість.

Тоді це на , і виграє найвідповідальніша відповідь, повністю відповідна правилам! Отже, вам не потрібно займатися гольфом або придушувати свою відповідь (але ви можете це зробити, якщо хочете). Просто не забудьте опублікувати щось оригінальне та креативне, щоб заслужити оновлення, тобто, будь ласка, не публікуйте кульгавих нудних записів.


Ви маєте на увазі `rm -rf`?
Саймон Куанг

Відповіді:


8

ТІ-ОСНОВНІ

Існує кнопка вбивства для DONTUSEME, чи можете ви зрозуміти, яка вона? :)

: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
Це :Goto 1означає, що BOOM!це просто неоперація?
Віктор Стафуса

1
@VictorStafusa Так. Розглянувши це ще раз, я змінив його на `rm -rf ', тому що ви мені сказали (не).
Timtech

Я не думаю, що ти реалізував INCLUDE-.
lirtosiast

9

HTML + Javascript + jQuery + jQuery UI

Введення має бути подано у текстовій області та має бути відформатоване як кожна команда у рядку. Команди не відрізняються від регістру. Усі команди були повністю виконані. Я сподіваюся, що вам сподобається.

Ви можете спробувати його на 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>

У ньому є одна нова команда:

Саме 42команда обчислює відповідь життя, Всесвіту та всього. Єдина химерність - це те, що на її закінчення потрібно 7,5 мільйонів років.

Інші спойлери:

Цей запис має кілька функцій:

  • Ви дійсно будете ненавидіти FAILкоманду.
  • BOOM!викрутить вас "виконавчий блок". Принаймні, вікна з DONTUSEME(n)них здатні пережити це.
  • KABOOM! є справді небезпечним для світу кількома поганими способами.
  • DONTUSEME(n)завжди відкриває нескінченні порожні вікна, по одному на 0,8 секунди. Але є прихований вимикач вбивства.
  • DONTUSEME(n)виживає NO., FAILі навіть BOOM!. Я просто не міг змусити його вижити KABOOM!. Причина полягає в тому, що спливаючі вікна не працюватимуть, оскільки це не є результатом натискання (а спливаючі вікна, створені іншими способами, давно заборонені у всіх основних браузерах), і вони не можуть використовувати і iframe через порушення політики того самого походження .
  • INCLUDE-xxxможе створити будь-яку інструкцію, включаючи DONTUSEME(n)або іншу INCLUDE-yyy.
  • Якщо INCLUDE-xxxдійсно генерує INCLUDE-yyyінструкцію, yyyім'я генерується навмання. Якщо ви захопите ім’я згенерованої команди за допомогою firebug або чогось подібного, ви можете використовувати його.
  • Він обробляє неправильно сформований синтаксис та неповний чи порожній ввід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.