Làm phiên dịch 3var!


24

3var là một biến thể của cá chết sử dụng ba biến được gọi là A, B và R. A và B là các bộ tích lũy, trong khi R được sử dụng làm biến kết quả.

Trong thử thách này , bạn cần phải có một trình thông dịch cho phiên bản rút gọn của ngôn ngữ này.

Các lệnh bắt buộc:

i   Increments A
d   Decrements A
s   Squares A
p   Prints A
P   Prints the ASCII character of A
>   Sets A to R
a   Increments B
k   Decrements B
m   Squares B
o   Prints B
O   Prints the ASCII character of B
<   Sets B to R
+   Adds A and B, stores in R
-   Subtracts B from A, stores in R
*   Multiplies A and B, stores in R
/   Divides A by B, stores in R
w   Prints R
@   Resets A to 0
#   Resets B to 0
e   Resets R to 0

Mọi thứ khác (bao gồm cả khoảng trắng) đều bị bỏ qua.

Làm rõ

  • opnên xuất ra mà không có gì sau nó.
  • Phân chia là phân chia số nguyên.
  • Các số trên 255 và các số dưới 0 được hỗ trợ.
  • 'w' sẽ xuất ra một khoảng trắng hoặc một dòng mới sau R
  • Chia cho 0 dừng mà không có lỗi. (Không có đầu ra cho STDERR)
  • A, B và R ban đầu là 0

Quy tắc

  • Đây là nên câu trả lời ngắn nhất sẽ thắng.
  • Trong trường hợp hòa, câu trả lời cũ nhất sẽ thắng.
  • Tập tin sẽ được cung cấp thông qua các đối số dòng lệnh hoặc STDIN.
  • Bất kỳ ngôn ngữ được cho phép.
  • Eval được cho phép.

Các trường hợp thử nghiệm

Hello world! (lấy từ Esolang)

iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP

Đầu ra 20spooky22me:

iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO

Đầu ra 9P-1420 100 3Q-1 162 0:

iiispsdPkokmo/w<+w#aaaommO-w@ii*wew

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

# Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=63008,OVERRIDE_USER=45220;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


1
@ Sp3000 Nói về nó, gần đây tôi đã giúp sửa một lỗi vòng lặp lồng nhau trong trình thông dịch.
LegionMammal978

2
Làm rõ thêm cho những người quen thuộc với Deadfish: dddddpkết quả là -5 và iiiisspkết quả là 256 như bạn mong đợi, thay vì 0.
Sp3000

1
Trong trường hợp thử nghiệm Liều lượng rlàm gì? nó không có trong danh sách các lệnh hợp lệ của bạn
JimmyJazzx 5/11/2015

1
@JimmyJazzx Bản thử nghiệm hiện đã được chỉnh sửa, nhưng trong ngôn ngữ 3var đầy đủ, r đặt lại mọi thứ. Nó giống như @#e.
DJgamer98

1
Là A, B và R được khởi tạo thành 0 khi trình thông dịch bắt đầu?
Tony Enni

Câu trả lời:


7

CJam, 112

q{"+-*/dspP>@ikmoO<#awe"_@#\4<"X2 U|{TU :V;}P?"S/f*'T"( _*T cT;V;0)"2/f+":T;"f+_'Tf/'Uf*+"VS 0:V; "S/++=~}%Pa/0=

Dùng thử trực tuyến

Giải trình:

Chương trình xây dựng một mảng các đoạn mã sẽ được thực thi và thực thi đoạn tương ứng cho mỗi ký tự. Đối phó với phép chia bằng 0 khó khăn hơn, bởi vì CJam chưa có toán tử "ngắt". Thay vào đó, chương trình đẩy π làm điểm đánh dấu (vì không có số dấu phẩy động nào có thể xuất hiện theo cách khác) và cuối cùng, nó chỉ giữ đầu ra trước số π đầu tiên.
Ngoài ra, chương trình sử dụng các biến T, U và V thay vì A, B và R, bởi vì chúng được xác định trước bằng 0 trong CJam.

q            read the input
{…}%         transform each character
  "…"        push a string with all the 3var commands, in a convenient order
  _@         duplicate the string and bring the current character to the top
  #          find the index of the character in the string (or -1 if not found)
  \          swap with the other string copy
  4<         keep only the first 4 characters ("+-*/")
  "…"        push a string that will be used for implementing those operators
  S/         split by space into ["X2" "U|{TU" ":V;}P?"]
  f*         join with each of '+', '-', '*', '/' -> 4 strings
  'T         push the 'T' character
  "…"        push a string with implementations of commands involving A
  2/         split into pieces of length 2
  f+         prepend 'T' to each piece
  ":T;"f+    append ":T;"to each piece
  _          duplicate the array (containing full A-command implementations)
  'Tf/       split each piece by the 'T' character
  'Uf*       join each split piece using the 'U' character
              practically replacing 'T' with 'U'
              to obtain B-command implementations
  +          concatenate the 2 arrays
  "…"        push a string containing implementations for "w" and "e", 
              separated by space; the string also ends with a space
  S/         split by space, obtaining the implementations for "w" and "e"
              and an empty string, for handling unrecognized characters
  ++         concatenate with the A and B command and +-*/ implementations
  =          get the corresponding string implementing the current command
              if the character was not found, -1 will get the empty string (no-op)
  ~          execute it
Pa/          split the array of results by the π separator
0=           get the first piece (before the first π, if any)

Việc thực hiện lệnh thực tế (được xây dựng bởi chương trình):

+: X2+U|{TU+:V;}P?    if (1+2)|U != 0, set V=T+U, else push π
-: X2-U|{TU-:V;}P?    if (1-2)|U != 0, set V=T-U, else push π
*: X2*U|{TU*:V;}P?    if (1*2)|U != 0, set V=T*U, else push π
/: X2/U|{TU/:V;}P?    if (1/2)|U != 0, set V=T/U, else push π
d: T( :T;             set T=T-1
s: T_*:T;             set T=T*T
p: TT :T;             push T and set T=T (no-op)
P: TcT:T;             push T converted to character and set T=T (no-op)
>: T;V:T;             push and pop T (no-op) and set T=V
@: T;0:T;             push and pop T (no-op) and set T=0
i: T):T;              set T=T+1
k: U( :U;             set U=U-1
m: U_*:U;             set U=U*U
o: UU :U;             push U and set U=U (no-op)
O: UcU:U;             push U converted to character and set U=U (no-op)
<: U;V:U;             push and pop U (no-op) and set U=V
#: U;0:U;             push and pop U (no-op) and set U=0
a: U):U;              set U=U+1
w: VS                 push V and a space
e: 0:V;               set V=0
(default): (empty)    no-op

10

JavaScript (ES7) 208 213 223 237 241 311

Chỉnh sửa3 Sao chép lẫn nhau, tôi và Dendrobium đang sụp đổ cùng nhau.

Edit2 Sử dụng ECMAScript 7 để tiết kiệm chỉ cần 2 byte, liên kết với nhau xử lý của A và B

Chỉnh sửa Theo các thay đổi của các quy tắc.

Lưu ý, tôi đã thêm rlệnh không bắt buộc trong câu hỏi, chỉ để chạy ví dụ Hello world

V=p=>(o='',[for(c of'@#e'+p)eval('++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'.replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B').split`,`[k%13])],o)

// More readable
U=p=>(
  o='',
  [for(c of'@#e'+p)
   eval(
   '++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'
   .replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B')
   .split`,`[k%13])]
  ,o
)

// ES6, no array comprehension, 2 bytes more
W=p=>
  [...'@#e'+p].map(c=>
    eval(
    '++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'
    .replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B')
    .split`,`[k%13]),
    o=''
  )&&o

// Test
function test() 
{ 
  OUT.innerHTML = V(I.value) 
}

test()
textarea { width: 75%; height: 8em }
Test program <button onclick="test()">Run</button><br><textarea id=I>
iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP
</textarea><br>Output<pre id=OUT></pre>


Bạn có thể lưu 2 byte bằng cách xóa A=B=R=0,và đặt các biến đó bằng các hàm 3var thực tế trước khi xử lý chuỗi, như : [...'@#e'+p].
insertusernamehere

2
@insertusernamehere thx, tôi thích cái này
edc65

8

GNU Sed (với tùy chọn eval để đánh giá dcbiểu thức), 254

Deadfish ánh xạ khá độc đáo vào một tập hợp con dc. Vì vậy, chúng tôi sử dụng sed để thực hiện ánh xạ đó:

s/^/@#e/
s/\+/AB+r/g
s/-/AB-r/g
s/\*/AB*r/g
s|/|AB/r|g
s/a/B1+b/g
s/i/A1+a/g
s/d/A1-a/g
s/s/Ad*a/g
s/p/An/g
s/P/AP/g
s/>/Ra/g
s/k/B1-b/g
s/m/Bd*b/g
s/o/Bn/g
s/O/BP/g
s/</Rb/g
s/w/Rn/g
s/@/0a/g
s/#/0b/g
s/e/0r/g
s/[ABR]/l&/g
s/[abr]/s\u&/g
s/.*/dc -e'&'/e

8

Javascript ES6 ES7, 217 215 213 208 byte

f=s=>(O='',[for(c of'@#e'+s)eval('v=0,++v,--v,v*=v,O+=v,O+=String.fromCharCode(v),v=R,R=0,R=A+B,R=A-B,R=A*B,R=A/B|0,O+=R+" "'.replace(/v/g,'AB'[(x='@idspP>e+-*/w#akmoO<'.indexOf(c))/13|0]).split`,`[x%13])],O)

Bị đánh cắp

f=s=>(
    O='',                                                                   // initialize output to empty string
    [for(c of'@#e'+s)eval(                                                  // initialize A, B, and R, loop over all chars in input, eval returned function string
        'v=0,++v,--v,v*=v,O+=v,O+=String.fromCharCode(v),v=R,R=0,R=A+B,R=A-B,R=A*B,R=A/B|0,O+=R+" "' // operation list
            .replace(/v/g,'AB'[(x='@idspP>e+-*/w#akmoO<'.indexOf(c))/13|0]) // replace all instances of v with either A or B
            .split`,`[x%13])],                                              // split ops list, select corresponding function string
    O)                                                                      // return output string

1
+1 Không xa tôi, nhưng tốt hơn. Bây giờ tôi sẽ phải thử một cái gì đó khác biệt
edc65

1
Bạn có thể lưu 2 byte bằng cách xóa A=B=R=0,và đặt các biến đó bằng các hàm 3var thực tế trước khi xử lý chuỗi, như : for(c of '@#e'+s).
insertusernamehere

1
@insertusernamehere Aha, thật là thông minh, cảm ơn!
Dendrobium

Xem lại câu trả lời của bạn, tôi thấy rằng bạn không đưa ra một dòng mới cho lệnhw
edc65

@ edc65 Một trong những viên đạn làm rõ "'w' nên xuất ra một khoảng trắng hoặc dòng mới sau R"
Dendrobium

6

APL, 191

{0::→⋄A B R←0⋄{⍵∊G←'aikdms<>':⍎'AB'[1+2|G⍳⍵],'+-*∘'[M],'←','112R'[M←⌈2÷⍨G⍳⍵]⋄⍵∊G←'PpOo':⍞←⎕UCS⍣(2|G⍳⍵)⊢A B[⌈2÷⍨G⍳⍵]⋄⍵∊G←'+-*/':R∘←⌊A(⍎'+-×÷'[G⍳⍵])B⋄⍵∊G←'@#e':⍎'ABR'[G⍳⍵],'∘←0'⋄⍵='w':⍞←R}¨⍵}

Đây là một hàm lấy chương trình làm đối số, vd:

      ∆3var←{0::→⋄A B R←0⋄{⍵∊G←'aikdms<>':⍎'AB'[1+2|G⍳⍵],'+-*∘'[M],'←','112R'[M←⌈2÷⍨G⍳⍵]⋄⍵∊G←'PpOo':⍞←⎕UCS⍣(2|G⍳⍵)⊢A B[⌈2÷⍨G⍳⍵]⋄⍵∊G←'+-*/':R∘←⌊A(⍎'+-×÷'[G⍳⍵])B⋄⍵∊G←'@#e':⍎'ABR'[G⍳⍵],'∘←0'⋄⍵='w':⍞←R}¨⍵}
      ∆3var 'iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO'
20spooky22me

Nó có thể được sử dụng như một chức năng ẩn danh, tôi chỉ đặt tên cho nó rõ ràng.

Giải trình:

  • 0::→: nếu xảy ra lỗi (giả sử chia cho 0), tạm dừng mà không in thông báo lỗi
  • A B R←0: khởi tạo biến
  • {... }¨⍵: cho mỗi lệnh:

    • ⍵∊G←'aikdms<>': Nếu lệnh là một trong các loại var ← fn (var, x) , hãy tìm fnx thích hợp , thay thế chúng trong và sau đó đánh giá nó:
      • : đánh giá
      • 'AB'[1+2|G⍳⍵: ANếu vị trí của trong 'aikdms<>'là chẵn Bkhác.
      • '+-*∘'[M]: thêm, trừ, sức mạnh hoặc không có gì, tùy thuộc vào M(được xác định sau)
      • '←': chỉ định
      • '112R'[M←⌈2÷⍨G⍳⍵]: 1(để cộng và trừ), 2(cho sức mạnh) và R(không có gì, tức là nó chỉ đặt biến thành R), tùy thuộc vào Mviệc lệnh đó thuộc về cặp thứ nhất, thứ hai, thứ ba hay thứ tư.
    • ⍵∊G←'PpOo': đầu ra:
      • ⍞←: đầu ra
      • ⎕UCS⍣(2|G⍳⍵): ASCII (tốt, Unicode) hoặc số tùy thuộc vào lệnh ở vị trí lẻ hoặc chẵn trong PpOo,
      • ⊢A B[⌈2÷⍨G⍳⍵]: Ahoặc B, tùy thuộc vào lệnh ở nửa đầu hay nửa sau.
    • ⍵∊G←'+-*/: môn Toán:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: đặt thành Rkết quả của việc áp dụng toán tử đã cho cho AB.
    • ⍵∊G←'@#e': cài lại:

      • : đánh giá
      • 'ABR'[G⍳⍵]: chọn đúng biến
      • '∘←0': đặt thành không
    • ⍵='w':⍞←R: nếu lệnh là w, đầu ra R.


4

C, 253 241 byte

#define _ c--?c--?c--
k="id@s>ak#m<e+-*/wpoPO",*p;main(c,a,b,r){for(a=b=r=0;~c;c=getchar())c=strchr(k,c),c&&(c-=k,p=&a+c/5,*p=_?_?_?_?_?printf(c?c<3?"%d":"%c":"%d ",c?c%2?a:b:r):a/(b?b:exit()):a*b:a-b:a+b:0:r:b*b:0:b-1:b+1:r:a*a:0:a-1:a+1);}

Mã này sử dụng chuỗi id@s>ak#m<e+-*/wpoPOnhư một bảng lệnh. Chuỗi được sắp xếp theo đích của biểu thức tính toán. Nó chỉ xảy ra rằng có 5 lệnh cập nhật từng biến:

  • id@s> - cập nhật a
  • ak#m< - cập nhật b
  • e+-*/ - cập nhật r
  • wpoPO- cập nhật ... vị trí nhớ sau a, br. Tôi hy vọng nó không quá quan trọng :)

Vì vậy, sau khi định vị ký tự đầu vào trong chuỗi lệnh, chỉ mục của nó liên tục bị giảm và tùy thuộc vào thời điểm đạt đến 0, một biểu thức được chọn.

Nếu nó không đạt 0 sau 15 lần trừ, thì đó là một printfsố đối số được chọn đúng.

Ngoài ra, khi chia, nó tránh chia cho 0 bằng cách gọi exit().

Mã này phải được biên dịch mà không cần tối ưu hóa, bởi vì nó giả định rằng a, brđược đặt tại các địa chỉ liền kề trên ngăn xếp (không phải trong các thanh ghi CPU).

Ngoài ra, nó nên được biên dịch ở chế độ 32 bit, vì nó chuyển đổi các con trỏ thành số nguyên và ngược lại.


4

VBA, 484, 453 380 byte

Để chiến thắng lâu dài nhưng Một cách làm rất đơn giản, Không có gì lạ mắt chỉ là cũ Select Case

Thêm vào Bộ phận số nguyên và Xử lý lỗi Div 0 Đã xử lý nhiều byte
bị loại bỏ Xử lý lỗi vì có vẻ như xử lý lỗi thông thường dẫn đến cùng chức năng. Đã sửa lỗi Int Division để làm việc như mong đợi. Cũng ngắn hơn.

Function Y(x)
For Z=1 To Len(x)
w=Mid(x,Z,1)
Select Case w
Case"i":A=A+1
Case"d":A=A-1
Case"s":A=A^2
Case"p":Y=Y &A
Case"P":Y=Y &Chr(A)
Case">":A=R
Case"a":B=B+1
Case"k":B=B-1
Case"m":B=B^2
Case"o":Y=Y &B
Case"O":Y=Y &Chr(B)
Case"<":B=R
Case"+":R=A+B
Case"-":R=A-B
Case"*":R=A*B
Case"/":R=A\B
Case"w":Y=Y &R &vbCrLf
Case"@":A=0
Case"#":B=0
Case"e":R=0
End Select
Next
End Function

Cảm ơn Henrik Ilgen đã lưu 31 104 byte


2
Không hoàn toàn chắc chắn nếu công trình này trong VBA (nó trong VB6), nhưng bạn có thể tiết kiệm một bunch of byte bằng cách sử dụng DefInt A-Z, do đó bỏ qua sự cần thiết phải tuyên bố một cách rõ ràng A, BRnhư Integer: DefInt A-Z:Dim A, B, R. Nó cũng có thể hoạt động tốt khi chỉ gán chúng, mà không cần khai báo : A=0:B=0:R=0. Các tính toán nên làm việc trên các biến thể, quá.
Henrik Ilgen 6/11/2015

@HenrikIlgen cảm ơn rất nhiều, Quên về DefIntKhông phải thứ gì đó tôi sử dụng hàng ngày nhưng sẽ trở thành VBA chơi golf siêu hữu ích trong tương lai. Đáng buồn thay A=0sẽ làm cho nó hoạt động như một đôi từ các bài kiểm tra của tôi. Có để tạo iiiaa/wra một kết quả thập phân chứ không phải toàn bộ.
JimmyJazzx 6/11/2015

1
Hãy thử \ cho phép chia số nguyên;)
Henrik Ilgen

1
Bạn có thể ngưng tụ xuống 405 byte nếu bạn biến nó thành hàm và sử dụng giá trị trả về để "xây dựng" kết quả, giả sử bạn không phải thực sự in kết quả :)
Henrik Ilgen

3

PHP, 310 byte

Lần đầu tiên trong đời tôi sử dụng eval:

for($A=$B=$R=0;$c=$argv[1][$i++];)eval([i=>'++$A',d=>'--$A',s=>'$A*=$A',p=>'echo$A',P=>'echo chr($A)','>'=>'$A=$R',a=>'++$B',k=>'--$B',m=>'$B*=$B',o=>'echo$B',O=>'echo chr($B)','<'=>'$B=$R','+'=>'$R=$A+$B','-'=>'$R=$A-$B','*'=>'$R=$A*$B','/'=>'$R=$A/$B',w=>'echo$R','@'=>'$A=0','#'=>'$B=0',e=>'$R=0'][$c].';');

Lấy đầu vào dòng lệnh đầu tiên:

php 3var.php "iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO"

Đầu ra từ các ví dụ:

Chào thế giới!
20spooky22me


3

C, 357

Macros FTW!

(Tôi đang đùa ai - c sẽ không bao giờ thắng được cái này)

#define X(p,e) case p:e;break;
#define Y(p,a,b,c,d,e,f) X(a,p++)X(b,p--)X(c,p*=p)X(d,printf("%d",p))X(e,printf("%c",p%256))X(f,p=R)
A,B,R;main(int C,char**V){for(;*V[1];)switch(*V[1]++){Y(A,'i','d','s','p','P','>')Y(B,'a','k','m','o','O','<')X('+',R=A+B)X('-',R=A-B)X('*',R=A*B)X('/',R=A/(B?B:exit(0),1))X('w',printf("%d",R))X('@',A=0)X('#',B=0)X('e',R=0)}}

2

JavaScript (ES6), 293 262 byte

f=x=>(o="",a=b=r=0,p=String.fromCharCode,[...x].map(c=>{if(eval(`m={i_a++,d_a--,s_a*=a,p_o+=a,P_o+=p(a),">"_a=r,a_b++,k_b--,m_b*=b,o_o+=b,O_o+=p(b),"<"_b=r,"+"_r=a+b,"-"_r=a-b,"*"_r=a*b,"/"_r=a/b|0,w_o+=r,"@"_a=0,"#"_b=0,e_r=0}[c]`.replace(/_/g,":_=>")))m()}),o)

Sử dụng

f(`iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP`)

=> "Hello world!"

Giải trình

Có một vài chi tiết về ngôn ngữ mà tôi không chắc chắn (kích thước số nguyên, xử lý các ký tự không được nhận dạng, v.v.) nhưng giải pháp này dường như hoạt động đủ và bỏ qua các ký tự khoảng trắng như dòng mới trong trường hợp thử nghiệm.

f=x=>(
  o="",                           // o = output string
  a=b=r=0,
  p=String.fromCharCode,
  [...x].map(c=>{                 // iterate through each character
    if(                           // if used for NOP characters (whitespace)

      // Functions:
      eval(`m={
        i_a++,
        d_a--,
        s_a*=a,
        p_o+=a,
        P_o+=p(a),
        ">"_a=r,
        a_b++,
        k_b--,
        m_b*=b,
        o_o+=b,
        O_o+=p(b),
        "<"_b=r,
        "+"_r=a+b,
        "-"_r=a-b,
        "*"_r=a*b,
        "/"_r=a/b|0,
        w_o+=r,
        "@"_a=0,
        "#"_b=0,
        e_r=0
      }[c]`.replace(/_/g,":_=>")) // dynamically add common characters

    )m()                          // execute the function
  }),
  o                               // return the output string
)

1
Tôi nghĩ rằng bạn có thể lưu một vài byte bằng cách đặt từ điển trong một eval trong khi thay thế tất cả :$=>bằng $, sau đó thêm một thay thế cho chuỗi.
Conor O'Brien

2

Simplex v.0.8 , 211 byte

(Mã hóa UTF-8.)

h@u]u2ƒ§I]ƒ§M]ƒ§^O]ƒ§o]ƒ§s]ƒ§@]ƒ§Ah]ƒ§Sh]ƒ§Mh]ƒ§Vh]ƒ§&oh]ƒðI]ƒðM]ƒð^O]ƒðo]ƒðs]ƒð@]ƒðAh]ƒðSh]ƒðMh]ƒðVh]ƒð&oh]ƒ§z]ƒðz]ƒuz@]{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}

Giải trình

Vì đây là chương trình đơn giản dài nhất mà tôi đã viết từ trước đến nay, tôi thường sẽ giải thích cách thức hoạt động của chương trình này trong các gạch đầu dòng.

  • h@u] - định nghĩa macro 0. Macro này chỉ đơn giản ghi vào thanh ghi và làm cho lambda không trả về gì.
  • u2- đi đến dải trên và đặt byte hiện tại thành 2; điều này xác định tính thơm của lambdas được xác định.
  • ƒ- bắt đầu biểu hiện lambda; Sau khi hoàn thành ], sẽ đẩy chức năng lambda vào ngăn xếp lambda. Nó hoạt động bằng cách lấy các ô (arity) từ con trỏ vào dải cục bộ của nó và sau khi hoàn thành sẽ đặt dải cục bộ của nó thành các ô đã lấy, trừ khi byte hiện tại không được ghi. Con trỏ không bị ảnh hưởng. Macro 0 cho phép một hàm trả về mà không sửa đổi bất cứ thứ gì trong dải.
  • §- di chuyển đến ô viết đầu tiên trong dải hiện tại tức là A.
  • ð- di chuyển đến ô được viết cuối cùng trong dải hiện tại tức là B.
  • Giáo dục {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} lặp lại cho đến khi ngăn xếp đầu vào trống
    • "idspP>akmoO<+-*/w@#e" - các lệnh
    • Rly - đặt dải vào một tuple
    • G^u - chỉ mục của đầu vào trong bộ dữ liệu
    • ·- nạp byte hiện thứ vào người đánh giá lambda
    • uRL- đi đến dải giữ AB(viết AB nếu chúng không tồn tại)
    • - thực thi lambda (đây là đánh giá lambda)
    • - đặt lại dưới dải

phew Tôi ấn tượng. Nó dài cho Simplex, nhưng ngắn cho mọi thứ khác.;)


2

Chồn 0,11 , 222 byte

Tôi chắc chắn rằng điều này có thể được chơi gôn hơn nữa, nhưng nó rất vui. Ngoài ra, phiên dịch đầu tiên của Minkolang của ngôn ngữ khác!

>I3&000V$Vod?.45*[di1q=5&]x00wx1i2+kw
idspP>akmoO<+-*/w@#e
vr1+r
vr1-r
vr2;r
v0c1$((dl%"0"+$rl:d)$Ok
v0cO
vrx0cr
v1g1+1G
v1g1-1G
v1g2;1G
v1c1$((dl%"0"+$rl:d)$Ok
v1cO
v1gxd1G
vx$d+
vx$d-
vx$d*
vx$dd?.:
vdN
vrx0r
v1gx01G
vx0

Hãy thử nó ở đây.

Giải trình

>I3&000                    Initializes A, B, and R if they don't already exist.
V$V                        An idiom that ensures no time-travel.
od?.                       Reads in a character and halts if input is empty.
45*[di1q=5&]               Looks through the second row for a matching character.
            x00w           Jumps back to beginning if no match.
                x1i2+kw    Jumps to corresponding line upon match.

Phần còn lại của các dòng khá đơn giản, có lẽ ngoại trừ những người có 1$((dl%"0"+$rl:d)$Ok, đó là một thành ngữ in một số mà không có dấu cách. (Tôi chưa thực hiện chức năng chuyển đổi số này thành chuỗi, sẽ có 1Z.) Ồ, vâng, tất cả chúng đều có vngay từ đầu, đưa nó trở lại từ đầu.


2

GNU Sed (với tùy chọn eval để đánh giá biểu thức dc), 289

Lấy cảm hứng từ Digital Trauma, người buồn bã không nhận ra, rằng a) các ký tự bất hợp pháp cần được bỏ qua, b) dc cần toàn bộ chương trình được chuyển đổi trong một đối số và c) chia cho 0 phải chấm dứt chương trình mà không gặp lỗi.

Nếu tất cả các quy tắc này sẽ không áp dụng, giải pháp của tôi sẽ chỉ dài 235 byte;)

H
$!d
x
s/^/@#e/
s:[^-a><de/+i*k@w#opsmOP]::g
s:[e@#]:0&:g
s:[-*+/pPid]:Q&:g
s:[-kaoO*+/]:H&:g
s:[><w]:Z&:g
s:[diak]:1&:g
s:s:Q2^>:g
s:m:H2^<:g
s:[-+*/]:&e:g
s:[ia]:+&:g
s:[dk]:-&:g
y:Oop:Pnn:
s:w:n32P:g
s:[id>@]:sq:g
s:e:sz:g
s:[#<ka]:sh:g
s:[QHZ]:l\l&:g
s:/:d0=t/:g
s/.*/dc -e'[q]st&'/e

2

AWK, 311 309

func p(z,f,x){if(c~z)printf"%"f,x}BEGIN{FS=z}{for(i=0;++i<=NF;){c=$i;A=c~/i/?A+1:c~/d/?A-1:c~/s/?A*A:c~/@/?0:c~/>/?R:A;p("p","d",A);p("P","c",A);B=c~/a/?B+1:c~/k/?B-1:c~/m/?B*B:c~/#/?0:c~/</?R:B;p("o","d",B);p("O","c",B);R=c~/+/?A+B:c~/-/?A-B:c~/*/?A*B:c~/e/?0:R;if(c~"/")if(B)R=A/B;else exit;p("w","d ",R)}}

TIL ngoặc không cần thiết xung quanh printf. Đã lưu 2 byte!

Phiên bản Ungolfed để dễ đọc hơn:

func p(z,f,x) {
    if(c~z) printf "%"f,x
}

BEGIN {
    FS=z
}

{
    for(i=0;++i<=NF;){
        c=$i;
        A=c~/i/?A+1:c~/d/?A-1:c~/s/?A*A:c~/@/?0:c~/>/?R:A;
        p("p","d",A);
        p("P","c",A);
        B=c~/a/?B+1:c~/k/?B-1:c~/m/?B*B:c~/#/?0:c~/</?R:B;
        p("o","d",B);
        p("O","c",B);
        R=c~/+/?A+B:c~/-/?A-B:c~/*/?A*B:c~/e/?0:R;
        if(c~"/")if(B)R=A/B;else exit;
        p("w","d ",R)
    }
}

1

Con trăn 2, 272

import sys;a,b,r=0,0,0;exec';'.join(filter(None,map(dict(x.split(':')for x in"a:b+=1|@:a=0|#:b=0|/:r=a/b|d:a-=1|PXchr(a)|i:a+=1|-:r=a-b|k:b-=1|*:r=a*b|m:b*=b|oXb|pXa|s:a*=a|OXchr(b)|wXr|+:r=a+b|e:r=0|<:b=r|>:a=r".replace('X',':print ').split('|')).get,sys.stdin.read())))

Điều này không hoạt động. printBáo cáo của bạn bao gồm một dòng mới.
Griffin

1

Ruby, 199 byte

a=b=r=0
$<.read.chars{|c|eval %w{a+=1
a-=1
a*=a
$><<a
$><<a.chr
a=r
b+=1
b-=1
b*=b
$><<b
$><<b.chr
b=r
r=a+b
r=a-b
r=a*b
b==0&&exit||r=a/b
puts\ r
a=0
b=0
r=0
p}["idspP>akmoO<+-*/w@#e".index(c)||-1]}

5 byte có thể được lưu bằng cách xóa .readkhỏi dòng thứ hai nếu bạn có thể chấp nhận cảnh báo được in thành thiết bị lỗi chuẩn trên phiên bản mới hơn của Ruby.


1

Con trăn

import sys;P=sys.stdout.write;A=B=R=0;exec';'.join(filter(None,map(dict(zip('idspP>akmoO<+-*/w@#e','A+=1 A-=1 A**=2 P(`A`) P(chr(A)) A=R B+=1 B-=1 B**=2 P(`B`) P(chr(B)) B=R R=A+B R=A-B R=A*B R=A/B print(R) A=0 B=0 R=0'.split())).get,input())))

Bit muộn nhưng tôi muốn có một đi.


1

Prolog, 759 byte

Không phải là chương trình ngắn nhất, nhưng ít nhất nó có cấu trúc và có thể đọc được.

q(A,B,R,i,X,B,R):-X is A+1.
q(A,B,R,d,X,B,R):-X is A-1.
q(A,B,R,s,X,B,R):-X is A*A.
q(_,B,R,>,R,B,R).
q(A,B,R,a,A,X,R):-X is B+1.
q(A,B,R,k,A,X,R):-X is B-1.
q(A,B,R,m,A,X,R):-X is B*B.
q(A,_,R,<,A,R,R).
q(A,B,_,+,A,B,X):-X is A+B.
q(A,B,_,-,A,B,X):-X is A-B.
q(A,B,_,*,A,B,X):-X is A*B.
q(_,0,_,/,_,_,_):-!,1=2.
q(A,B,_,/,A,B,X):-B>0,X is A/B.
q(_,B,R,@,0,B,R).
q(A,_,R,#,A,0,R).
q(A,B,_,e,A,B,0).
q(A,B,R,p,A,B,R):-write(A).
q(A,B,R,'P',A,B,R):-A>0,format('~c',A).
q(A,B,R,'P',A,B,R):-write(A).
q(A,B,R,o,A,B,R):-write(B).
q(A,B,R,'O',A,B,R):-format('~c',B).
q(A,B,R,'O',A,B,R):-write(B).
q(A,B,R,w,A,B,R):-write(R),nl.
q(A,B,R,_,A,B,R).
f([],_,_,_).
f([H|T],A,B,R):-q(A,B,R,H,X,Y,Z),f(T,X,Y,Z),!.
p(X):-atom_chars(X,Y),f(Y,0,0,0).

Ví dụ đầu vào

p('iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO').

Dùng thử trực tuyến tại đây

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.