আওোবোরাস হ'ল আমি এই সপ্তাহে ডিজাইন করেছি e স্পিনের জন্য সময় নিতে!
i.1+!57*(\m1(M\1).96>.@32*-.80=\.78=3*\.66=3*\.82=5*\81=9*++++\2*1\-*+
)L!4*(4Sn1(
একক-চর কমান্ড 1 -এর প্রতিটি লাইন একটি ওরোরোবোরাস সাপকে উপস্থাপন করে, যেখানে মৃত্যুদন্ড কার্যকর হয় মাথা (শুরু) থেকে লেজ (শেষ) পর্যন্ত এবং মাথার দিকে ফিরে আসে। (
এবং )
কমান্ডগুলি আপনাকে লেজ অংশ খাওয়া অথবা এটি ওয়াক তোলা যাক, এইভাবে পরিবর্তন কি কমান্ড মৃত্যুদন্ড কার্যকর করা হয়। যদি নির্দেশ নির্দেশকটি সর্বদা গ্রাস করা হয় তবে সাপটি মারা যায় (সম্পাদন বন্ধ করে)। একটি ওওোবরোস প্রোগ্রামে সমান্তরালভাবে নির্বাহ করা এক বা একাধিক সাপ থাকে। প্রতিটি সাপের নিজস্ব স্ট্যাক থাকে এবং একটি ভাগ করা স্ট্যাকও থাকে।
1 একটি ব্যতিক্রম, যা অনেক 2D ভাষার ভাষা থেকে আওোবরোসকে পৃথক করে: বহু অঙ্কের সংখ্যাগুলি গণিত না করে বা প্রথমে 0 টি ধাক্কা না দিয়ে সোজাভাবে লেখা যেতে পারে।
সাপ ঘ
প্রথম সাপ একটি অক্ষর ( i
) পড়ে এবং এটি -1 / ইওএফ ( .1+!
) কিনা তা পরীক্ষা করে । যদি তা হয় তবে এটি তার বেশিরভাগ লেজ খায়, M
(এবং 57*(
) সমেত ।
সাপ তারপরে স্ট্যাক ( \
) এর উপরে থাকা ট্যালি দিয়ে অক্ষর কোডটি অদলবদল করে , ভাগটিকে ভাগ করা স্ট্যাক ( m
) এ নিয়ে যায় এবং অন্য একটি অক্ষর ( 1(
) গিলে ফেলে । যদি এটি ইতিমধ্যে একটি গুচ্ছ গ্রাস করে ফেলেছিল, এর অর্থ এটি (
বর্তমানে আইপি চালু আছে এবং মারা যায় sw অন্যথায়, মৃত্যুদন্ডটি সাপ 1 এর স্ট্যাকের দিকে ট্যালিটি ফিরিয়ে নিয়ে যায়, এটিকে চর কোডের সাথে অদলবদল করে এবং পূর্বে গিলে ফেলেছিল এমন চরিত্রটিকে পুনর্গঠন করে M\1)
।
এরপরে আমরা অঙ্কের জন্য উপযুক্ত স্কোর তৈরি করতে গণিত এবং স্ট্যাক অপারেশনগুলি ব্যবহার করি। .96>
এটি ছোট হাতের নাগরিক কিনা তা পরীক্ষা করে; পরবর্তীকালে 32*-
বড়হাতে রূপান্তরিত হয়। তারপর থেকে দীর্ঘ প্রসারিত .80=
করতে 81=9*++++
মানচিত্রগুলি P
-> 1
, N
-> 3
, ইত্যাদি অবশেষে, \2*1\-*
স্কোর যদি অক্ষর ছোটহাতের অক্ষরে ছিল negates, এবং +
পুঙ্খানুপুঙ্খ হিসাব থেকে এটি যোগ করা হয়েছে। সাপটি তখন লুপ করে অন্য একটি চরিত্র পড়ে।
সাপ ঘ
দ্বিতীয় সাপটি একটি রেজিগ্রেট অপারেশন ( )
) দিয়ে শুরু হয় , যা প্রথমবারের মতো কিছুই করে না (যেহেতু কিছুই এখনও গ্রাস করা হয়নি, এবং খালি স্ট্যাকটি পপিংয়ের পরেও 0
)। এরপরে, এটি ভাগ করা স্ট্যাকের দৈর্ঘ্যটিকে নিজের স্ট্যাকের দিকে ঠেলে দেয় এবং যৌক্তিকভাবে ( L!
) উপেক্ষা করে । 1
স্ট্যাকটি খালি থাকলে এটি দেয় 0
otherwise সাপটি 4 দ্বারা বহুগুণ হয় এবং এটি অনেকগুলি অক্ষর ( 4*(
) খায় ।
যদি ভাগ করা স্ট্যাকটি খালি থাকে তবে এর অর্থ সাপটি এখন শেষ হওয়ার আগেই শেষ হয় S
। এটি ধাক্কা দেয় 4
এবং ফিরে ফিরে আসে )
, যেখানে এটি কেবল গিলে ফেলা অক্ষরগুলিকে পুনর্গঠন করে এবং আবার শুরু হয়।
যদি ভাগ করা স্ট্যাকের কোনও মান থাকে তবে কোনও অক্ষর গ্রাস করা হয় না এবং কার্যকর হয় না। সাপ ভাগ করা স্ট্যাকের দিকে স্যুইচ করে এবং সেখানে নম্বরটি আউটপুট করে Sn
; তারপরে এটি তার শেষ চরিত্রটি গ্রাস করে এবং মারা যায় ( 1(
)।
সিংক্রোনাইজ
দুটি সাপকে অবশ্যই সাবধানে সিঙ্ক্রোনাইজ করতে হবে যাতে ইনপুটটির শেষ না হওয়া অবধি সাপ 2 পরীক্ষা করে নিলে ভাগ করা স্ট্যাকের কোনও মূল্য কখনও না থাকে। সাপ 1 ভাগের স্ট্যাকের জন্য প্রতিটি লুপের মধ্য দিয়ে পাসের জন্য সংক্ষেপে একটি মান রাখে। সুতরাং, সাপ 2 এর L
কমান্ড কখনই সাপ 1 m
এবং M
কমান্ডের মধ্যে কার্যকর করা উচিত নয় Fort ভাগ্যক্রমে, সাপগুলি খুব ভালভাবে লাইন করে। গুরুতরভাবে, সর্প 1 এর লুপের দৈর্ঘ্য (70 টি নির্দেশ) সাপের 2 এর লুপের একাধিক (7 টি নির্দেশ), সুতরাং দু'টি কখনই সমন্বয় থেকে বেরিয়ে আসবে না:
i.1+!57*(\m1(M\1).96>.@32*-.80=\.78=3*\.66=3*\.82=5*\81=9*++++\2*1\-*+
)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5
|__|
Danger zone
যদি সংখ্যাগুলি এতটা নিখুঁতভাবে কাজ করে না, তবে আমি প্রয়োজন অনুযায়ী সারিবদ্ধ করার জন্য আমি একটি বা উভয় সাপকে স্পেস দিয়ে প্যাড করব।
এই সমস্ত খুব ভাল, কিন্তু আমি এটি কর্মে দেখতে চাই!
স্ট্যাক স্নিপেটের মাধ্যমে উপরের প্রোগ্রামটি এখানে। এমনকি প্রতি সেকেন্ডে 1000 ক্রিয়াকলাপে, নমুনা ইনপুটটির উত্তরটি ছুঁতে 10 সেকেন্ড সময় লাগে - তবে এটি সেখানে যায়!
// Define Stack class
function Stack() {
this.stack = [];
this.length = 0;
}
Stack.prototype.push = function(item) {
this.stack.push(item);
this.length++;
}
Stack.prototype.pop = function() {
var result = 0;
if (this.length > 0) {
result = this.stack.pop();
this.length--;
}
return result;
}
Stack.prototype.top = function() {
var result = 0;
if (this.length > 0) {
result = this.stack[this.length - 1];
}
return result;
}
Stack.prototype.toString = function() {
return "" + this.stack;
}
// Define Snake class
function Snake(code) {
this.code = code;
this.length = this.code.length;
this.ip = 0;
this.ownStack = new Stack();
this.currStack = this.ownStack;
this.alive = true;
this.wait = 0;
this.partialString = this.partialNumber = null;
}
Snake.prototype.step = function() {
if (!this.alive) {
return null;
}
if (this.wait > 0) {
this.wait--;
return null;
}
var instruction = this.code.charAt(this.ip);
var output = null;
if (this.partialString !== null) {
// We're in the middle of a double-quoted string
if (instruction == '"') {
// Close the string and push its character codes in reverse order
for (var i = this.partialString.length - 1; i >= 0; i--) {
this.currStack.push(this.partialString.charCodeAt(i));
}
this.partialString = null;
} else {
this.partialString += instruction;
}
} else if (instruction == '"') {
this.partialString = "";
} else if ("0" <= instruction && instruction <= "9") {
if (this.partialNumber !== null) {
this.partialNumber = this.partialNumber + instruction; // NB: concatenation!
} else {
this.partialNumber = instruction;
}
next = this.code.charAt((this.ip + 1) % this.length);
if (next < "0" || "9" < next) {
// Next instruction is non-numeric, so end number and push it
this.currStack.push(+this.partialNumber);
this.partialNumber = null;
}
} else if ("a" <= instruction && instruction <= "f") {
// a-f push numbers 10 through 15
var value = instruction.charCodeAt(0) - 87;
this.currStack.push(value);
} else if (instruction == "$") {
// Toggle the current stack
if (this.currStack === this.ownStack) {
this.currStack = this.program.sharedStack;
} else {
this.currStack = this.ownStack;
}
} else if (instruction == "s") {
this.currStack = this.ownStack;
} else if (instruction == "S") {
this.currStack = this.program.sharedStack;
} else if (instruction == "l") {
this.currStack.push(this.ownStack.length);
} else if (instruction == "L") {
this.currStack.push(this.program.sharedStack.length);
} else if (instruction == ".") {
var item = this.currStack.pop();
this.currStack.push(item);
this.currStack.push(item);
} else if (instruction == "m") {
var item = this.ownStack.pop();
this.program.sharedStack.push(item);
} else if (instruction == "M") {
var item = this.program.sharedStack.pop();
this.ownStack.push(item);
} else if (instruction == "y") {
var item = this.ownStack.top();
this.program.sharedStack.push(item);
} else if (instruction == "Y") {
var item = this.program.sharedStack.top();
this.ownStack.push(item);
} else if (instruction == "\\") {
var top = this.currStack.pop();
var next = this.currStack.pop()
this.currStack.push(top);
this.currStack.push(next);
} else if (instruction == "@") {
var c = this.currStack.pop();
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(c);
this.currStack.push(a);
this.currStack.push(b);
} else if (instruction == ";") {
this.currStack.pop();
} else if (instruction == "+") {
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(a + b);
} else if (instruction == "-") {
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(a - b);
} else if (instruction == "*") {
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(a * b);
} else if (instruction == "/") {
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(a / b);
} else if (instruction == "%") {
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(a % b);
} else if (instruction == "_") {
this.currStack.push(-this.currStack.pop());
} else if (instruction == "I") {
var value = this.currStack.pop();
if (value < 0) {
this.currStack.push(Math.ceil(value));
} else {
this.currStack.push(Math.floor(value));
}
} else if (instruction == ">") {
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(+(a > b));
} else if (instruction == "<") {
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(+(a < b));
} else if (instruction == "=") {
var b = this.currStack.pop();
var a = this.currStack.pop();
this.currStack.push(+(a == b));
} else if (instruction == "!") {
this.currStack.push(+!this.currStack.pop());
} else if (instruction == "?") {
this.currStack.push(Math.random());
} else if (instruction == "n") {
output = "" + this.currStack.pop();
} else if (instruction == "o") {
output = String.fromCharCode(this.currStack.pop());
} else if (instruction == "r") {
var input = this.program.io.getNumber();
this.currStack.push(input);
} else if (instruction == "i") {
var input = this.program.io.getChar();
this.currStack.push(input);
} else if (instruction == "(") {
this.length -= Math.floor(this.currStack.pop());
this.length = Math.max(this.length, 0);
} else if (instruction == ")") {
this.length += Math.floor(this.currStack.pop());
this.length = Math.min(this.length, this.code.length);
} else if (instruction == "w") {
this.wait = this.currStack.pop();
}
// Any instruction not covered by the above cases is ignored
if (this.ip >= this.length) {
// We've swallowed the IP, so this snake dies
this.alive = false;
this.program.snakesLiving--;
} else {
// Increment IP and loop if appropriate
this.ip = (this.ip + 1) % this.length;
}
return output;
}
// Define Program class
function Program(source, speed, io) {
this.sharedStack = new Stack();
this.snakes = source.split(/\r?\n/).map(function(snakeCode) {
var snake = new Snake(snakeCode);
snake.program = this;
snake.sharedStack = this.sharedStack;
return snake;
}.bind(this));
this.snakesLiving = this.snakes.length;
this.io = io;
this.speed = speed || 10;
this.halting = false;
}
Program.prototype.run = function() {
if (this.snakesLiving) {
this.step();
this.timeout = window.setTimeout(this.run.bind(this), 1000 / this.speed);
}
}
Program.prototype.step = function() {
for (var s = 0; s < this.snakes.length; s++) {
var output = this.snakes[s].step();
if (output) {
this.io.print(output);
}
}
}
Program.prototype.halt = function() {
window.clearTimeout(this.timeout);
}
var ioFunctions = {
print: function(item) {
var stdout = document.getElementById('stdout');
stdout.value += "" + item;
},
getChar: function() {
if (inputData) {
var inputChar = inputData[0];
inputData = inputData.slice(1);
return inputChar.charCodeAt(0);
} else {
return -1;
}
},
getNumber: function() {
while (inputData && (inputData[0] < "0" || "9" < inputData[0])) {
inputData = inputData.slice(1);
}
if (inputData) {
var inputNumber = inputData.match(/\d+/)[0];
inputData = inputData.slice(inputNumber.length);
return +inputNumber;
} else {
return -1;
}
}
};
var program = null;
var inputData = null;
function resetProgram() {
var stdout = document.getElementById('stdout');
stdout.value = null;
if (program !== null) {
program.halt();
}
program = null;
inputData = null;
}
function initProgram() {
var source = document.getElementById('source'),
stepsPerSecond = document.getElementById('steps-per-second'),
stdin = document.getElementById('stdin');
program = new Program(source.value, +stepsPerSecond.innerHTML, ioFunctions);
inputData = stdin.value;
}
function runBtnClick() {
if (program === null || program.snakesLiving == 0) {
resetProgram();
initProgram();
} else {
program.halt();
var stepsPerSecond = document.getElementById('steps-per-second');
program.speed = +stepsPerSecond.innerHTML;
}
program.run();
}
function stepBtnClick() {
if (program === null) {
initProgram();
} else {
program.halt();
}
program.step();
}
.container {
width: 100%;
}
.so-box {
font-family: 'Helvetica Neue', Arial, sans-serif;
font-weight: bold;
color: #fff;
text-align: center;
padding: .3em .7em;
font-size: 1em;
line-height: 1.1;
border: 1px solid #c47b07;
-webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3), 0 2px 0 rgba(255, 255, 255, 0.15) inset;
text-shadow: 0 0 2px rgba(0, 0, 0, 0.5);
background: #f88912;
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3), 0 2px 0 rgba(255, 255, 255, 0.15) inset;
}
.control {
display: inline-block;
border-radius: 6px;
float: left;
margin-right: 25px;
cursor: pointer;
}
.option {
padding: 10px 20px;
margin-right: 25px;
float: left;
}
h1 {
text-align: center;
font-family: Georgia, 'Times New Roman', serif;
}
a {
text-decoration: none;
}
input,
textarea {
box-sizing: border-box;
}
textarea {
display: block;
white-space: pre;
overflow: auto;
height: 40px;
width: 100%;
max-width: 100%;
min-height: 25px;
}
span[contenteditable] {
padding: 2px 6px;
background: #cc7801;
color: #fff;
}
#stdout-container,
#stdin-container {
height: auto;
padding: 6px 0;
}
#reset {
float: right;
}
#source-display-wrapper {
display: none;
width: 100%;
height: 100%;
overflow: auto;
border: 1px solid black;
box-sizing: border-box;
}
#source-display {
font-family: monospace;
white-space: pre;
padding: 2px;
}
.activeToken {
background: #f88912;
}
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
display: inline-block;
}
* html .clearfix {
height: 1%;
}
.clearfix {
display: block;
}
<!--
Designed and written 2015 by D. Loscutoff
Much of the HTML and CSS was taken from this Befunge interpreter by Ingo Bürk: http://codegolf.stackexchange.com/a/40331/16766
-->
<div class="container">
<textarea id="source" placeholder="Enter your program here" wrap="off">i.1+!57*(\m1(M\1).96>.@32*-.80=\.78=3*\.66=3*\.82=5*\81=9*++++\2*1\-*+
)L!4*(4Sn1(</textarea>
<div id="source-display-wrapper">
<div id="source-display"></div>
</div>
</div>
<div id="stdin-container" class="container">
<textarea id="stdin" placeholder="Input" wrap="off">5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8</textarea>
</div>
<div id="controls-container" class="container clearfix">
<input type="button" id="run" class="control so-box" value="Run" onclick="runBtnClick()" />
<input type="button" id="pause" class="control so-box" value="Pause" onclick="program.halt()" />
<input type="button" id="step" class="control so-box" value="Step" onclick="stepBtnClick()" />
<input type="button" id="reset" class="control so-box" value="Reset" onclick="resetProgram()" />
</div>
<div id="stdout-container" class="container">
<textarea id="stdout" placeholder="Output" wrap="off" readonly></textarea>
</div>
<div id="options-container" class="container">
<div class="option so-box">Steps per Second: <span id="steps-per-second" contenteditable>1000</span>
</div>
</div>