Thực hiện một trình thông dịch vô dụng [đóng]


12

Nhiệm vụ của bạn là xây dựng một trình thông dịch sang ngôn ngữ Vô dụng :

Dưới đây là các yêu cầu chức năng:

  • Tất cả các lệnh được mô tả nên được chấp nhận bởi trình thông dịch.
  • NO., NOOPINCLUDE-xxxphải được tôn vinh.
  • DONTUSEME(n) phải có ngày cơ sở của nó để có thể dễ dàng cấu hình để một cái gì đó hợp lý hơn cho mục đích thử nghiệm.
  • INCLUDE-xxxphải có khả năng tạo bất kỳ lệnh nào với xác suất gần bằng nhau. Nếu nó tạo ra a DONTUSEME(n), anh ta nên chọn ngẫu nhiên một giá trị nhỏ cho n.
  • DONTUSEME(n)cửa sổ nên tồn tại NO.hướng dẫn. Mẹo: sinh ra một quy trình mới cho các cửa sổ đó.
  • BOOM!KABOOM!phải làm điều gì đó xấu và đáng sợ, và KABOOM!phải tồi tệ hơn BOOM!. Nhưng điều này không được thực hiện quá nghiêm trọng, vì vậy nó không nên là một thứ gì đó phá hoại, gây rối quá mức hoặc khó có thể hoàn tác. Xin vui lòng, không, không , và đừng làm cho các hướng dẫn chạy một rm -rf \lệnh, chạy một quả bom ngã ba, cài đặt phần mềm độc hại, làm hỏng dữ liệu trong hệ thống tập tin, hoặc đường bưu điện hoặc tải nội dung không phù hợp từ internet, hoặc bất cứ điều gì khác rõ ràng lạm dụng.
  • TURINGVSALONZOnên chạy như thể nó thực sự đang làm những gì nó nên làm. Mẹo: Làm cho nó quyết định ngẫu nhiên nếu nó sẽ ngủ trong một thời gian rất dài ngẫu nhiên, hoặc một thời gian ngắn ngẫu nhiên, hoặc mãi mãi.
  • Tất cả các hướng dẫn được xác định trước khác nên làm một cái gì đó khác với các hướng dẫn đã nói ở trên và khác với các hướng dẫn khác, nhưng không bao giờ có gì tệ hơn BOOM!hoặcKABOOM! . Những gì họ làm chính xác là tùy thuộc vào bạn, nhưng việc thực hiện đơn giản sẽ chỉ xuất ra một thông báo lỗi hoặc một số văn bản khác.
  • Bạn nên cung cấp một cách dễ dàng cho người dùng để cung cấp chương trình do trình thông dịch điều hành. tức là đọc bản rõ từ một tập tin hoặc từ stdinlà ok. Đọc nó từ một tập tin được mã hóa ở đâu đó trên internet thì không.

Không bắt buộc:

  • Bạn có thể phát minh ra một số lệnh mới nếu bạn muốn, nhưng chúng phải tuân theo các quy tắc giống như các quy tắc khác. Không sử dụng điều này để tránh các hạn chế trong BOOM!KABOOM!hoặc để đánh bại DONTUSEME(n). Và nếu bạn phát minh ra các lệnh mới, hãy giải thích những gì họ làm.
  • Bạn nên suy nghĩ về những gì trình thông dịch làm nếu nó nhận được đầu vào với các lệnh không xác định (hoặc thậm chí hoàn toàn không thể phát âm được các byte ngẫu nhiên).
  • Mặc dù không có lệnh nào đánh bại DONTUSEME(n)lệnh, bạn có thể thêm một khóa chuyển đổi cho nó. Đừng phơi bày điều đó bằng ngôn ngữ.

Chúng tôi có một vài yêu cầu phi chức năng để tránh lạm dụng:

  • Mục nhập của bạn phải đầy đủ và tự động càng tốt. Điều này có nghĩa là nó không chỉ đơn giản là một số loại trình cài đặt hoặc chương trình không hoàn chỉnh rõ ràng. Bằng cách này, tải xuống và sử dụng các thư viện như jQuery hoặc các gói từ maven trung tâm là được, nhưng tải xuống các mã và gói tùy ý từ máy chủ tùy chỉnh của bạn thì không.
  • Mục nhập của bạn không nên lấy bất kỳ nội dung nào từ chính trang này hoặc từ một số gương hoặc bản sao của trang này để thực hiện một số phản ánh hoặc cho bất kỳ mục đích nào khác. Điều này là cần thiết để tránh một số chương trình cố gắng đọc câu trả lời của những người tham gia khác cho câu hỏi này hoặc cố gắng phá vỡ câu hỏi hoặc câu trả lời bằng bất kỳ cách nào.
  • Thông dịch viên của bạn nên bất biến và không tự sửa đổi hoặc sửa đổi tệp đầu vào của nó. Nhưng, tạo một bản sao đột biến của trình thông dịch hoặc của tệp đầu vào mà không thay đổi bản gốc là ok.

Và cuối cùng, xem xét rằng:

  • Các chương trình trong câu trả lời dự kiến ​​sẽ khá vô dụng ngay cả khi hoàn toàn phù hợp;
  • Ngôn ngữ (về mục đích) rất không được xác định rõ, và người trả lời có rất nhiều quyền tự do để thực hiện và được khuyến khích để thực hiện chúng;
  • Các yêu cầu và việc thực hiện có thể có rất nhiều điểm chủ quan;
  • Mục tiêu với điều này là để có được một số niềm vui và sáng tạo.

Sau đó, đây là một câu trả lời được đánh giá cao nhất hoàn toàn phù hợp với các quy tắc chiến thắng! Vì vậy, bạn không cần phải chơi gôn hoặc làm xáo trộn câu trả lời của bạn (nhưng bạn có thể làm điều đó nếu bạn muốn). Chỉ cần chắc chắn để đăng một cái gì đó nguyên bản và sáng tạo để xứng đáng với những người ủng hộ, tức là xin vui lòng không đăng các mục nhàm chán.


Ý bạn là `rm -rf`?
Simon Kuang

Câu trả lời:


8

TI-CƠ BẢN

Có một nút kill DONTUSEME, bạn có thể tìm ra nó là cái nào không? :)

: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
Điều đó :Goto 1có nghĩa là đó BOOM!chỉ là một no-op?
Victor Stafusa

1
@VictorStafusa Vâng. Sau khi xem xét thêm, tôi đổi nó thành `rm -rf` vì bạn đã nói với tôi (không) thành.
TimTech

Tôi không nghĩ bạn đã thực hiện INCLUDE-.
lirtosiast

9

Giao diện người dùng HTML + Javascript + jQuery + jQuery

Đầu vào phải được đưa ra trong vùng văn bản và phải được định dạng theo từng lệnh trong một dòng. Các lệnh không phân biệt chữ hoa chữ thường. Tất cả các lệnh đã được thực hiện đầy đủ. Tôi mong là bạn thích.

Bạn có thể dùng thử tại 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>

Nó có một lệnh mới:

Đó là 42mệnh lệnh tính toán câu trả lời của cuộc sống, vũ trụ và mọi thứ. Điều khó hiểu duy nhất là phải mất 7,5 triệu năm để hoàn thành.

Các spoilers khác:

Mục này có một số tính năng:

  • Bạn sẽ thực sự ghét FAILlệnh.
  • BOOM!sẽ làm hỏng bạn "đơn vị thực hiện". Ít nhất các cửa sổ từ DONTUSEME(n)có thể tồn tại này.
  • KABOOM! là thực sự nguy hiểm cho thế giới theo một số cách xấu.
  • DONTUSEME(n)luôn mở các cửa sổ trống vô hạn không thể nhìn thấy, mỗi cửa sổ 0,8 giây. Nhưng có một công tắc giết ẩn.
  • DONTUSEME(n)sống sót NO., FAILvà thậm chí BOOM!. Tôi chỉ không thể làm cho nó tồn tại KABOOM!mặc dù. Lý do là các cửa sổ bật lên sẽ không hoạt động vì đây không phải là kết quả của một lần nhấp (và cửa sổ bật lên được tạo bằng các cách khác đã bị cấm từ lâu trong tất cả các trình duyệt chính) và cũng không thể sử dụng iframe vì vi phạm chính sách cùng nguồn gốc .
  • INCLUDE-xxxcó thể tạo bất kỳ hướng dẫn, bao gồm DONTUSEME(n)hoặc INCLUDE-yyyhướng dẫn khác .
  • Nếu INCLUDE-xxxkhông tạo ra một INCLUDE-yyylệnh,yyy tên được tạo ngẫu nhiên. Nếu bạn lấy tên của lệnh được tạo bằng fireorms hoặc một cái gì đó tương tự, bạn có thể sử dụng nó.
  • Nó xử lý cú pháp không đúng và đầu vào không đầy đủ hoặc trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.