Buat juru bahasa 3var!


24

3var adalah varian ikan mati yang menggunakan tiga variabel yang disebut A, B dan R. A dan B adalah akumulator, sedangkan R digunakan sebagai variabel hasil.

Dalam tantangan , Anda perlu membuat juru bahasa untuk versi bahasa ini.

Perintah yang Diperlukan:

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

Segala sesuatu yang lain (termasuk ruang putih) diabaikan.

Klarifikasi

  • odan pharus menghasilkan tanpa apa pun setelahnya.
  • Divisi adalah divisi bilangan bulat.
  • Angka di atas 255 dan angka di bawah 0 didukung.
  • 'w' harus menampilkan spasi atau baris baru setelah R
  • Pembagian dengan 0 berhenti tanpa kesalahan. (Tidak ada output ke STDERR)
  • A, B dan R awalnya 0

Aturan

  • Ini adalah sehingga jawaban terpendek menang.
  • Dalam hal seri, jawaban tertua menang.
  • File akan disediakan melalui argumen baris perintah atau STDIN.
  • Bahasa apa pun diizinkan.
  • Eval diizinkan.

Uji Kasus

Hello world! (diambil dari Esolangs)

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

Output 20spooky22me:

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

Output 9P-1420 100 3Q-1 162 0:

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

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](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 Omong-omong, saya baru-baru ini membantu memperbaiki bug loop bersarang di interpreter.
LegionMammal978

2
Klarifikasi tambahan untuk orang-orang yang mengenal Deadfish: dddddpmenghasilkan -5 dan iiiisspmenghasilkan 256 seperti yang Anda harapkan, bukan 0.
Sp3000

1
Dalam tes Kasus Dosis apa yang rdilakukan? itu tidak termasuk dalam daftar perintah yang valid
JimmyJazzx

1
@JimmyJazzx Testcase sekarang sudah diedit, tetapi dalam bahasa 3var penuh r me-reset segalanya. Itu sama dengan @#e.
DJgamer98

1
Apakah A, B, dan R diinisialisasi ke 0 ketika penerjemah mulai?
Tony Ennis

Jawaban:


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=

Cobalah online

Penjelasan:

Program ini membangun sebuah array potongan-potongan kode untuk dieksekusi, dan mengeksekusi potongan yang sesuai untuk setiap karakter. Menangani pembagian dengan nol lebih sulit, karena CJam belum memiliki operator "istirahat". Sebagai gantinya, program mendorong marker sebagai penanda (karena tidak ada angka floating point yang dapat muncul sebaliknya), dan pada akhirnya hanya menyimpan output sebelum yang pertama π.
Juga, program ini menggunakan variabel T, U dan V, bukannya A, B dan R, karena mereka diinisialisasi dengan 0 di 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)

Implementasi perintah aktual (dibangun oleh program):

+: 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

Sunting3 Menyalin satu sama lain, saya dan Dendrobium runtuh bersama.

Edit2 Menggunakan EcmaScript 7 untuk menyimpan hanya 2 byte, bergabung bersama-sama menangani A dan B

Edit Mengikuti perubahan aturan.

Catatan, saya menambahkan rperintah yang tidak diperlukan dalam pertanyaan, hanya untuk menjalankan contoh lama 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>


Anda bisa menyimpan 2 bytes dengan menghapus A=B=R=0,dan menetapkan variabel yang menggunakan aktual 3var fungsi sebelum memproses string, seperti: [...'@#e'+p].
masukkan nama pengguna di sini

2
@insertusernamehere thx, Saya suka yang ini
edc65

8

GNU Sed (dengan opsi eval untuk mengevaluasi dcekspresi), 254

Deadfish memetakan dengan cukup baik ke subset dari dc. Jadi kami menggunakan sed untuk melakukan pemetaan itu:

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)

Tidak disatukan

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 Tidak jauh dari milik saya, tetapi lebih baik. Sekarang saya harus mencoba sesuatu yang berbeda
edc65

1
Anda bisa menyimpan 2 bytes dengan menghapus A=B=R=0,dan menetapkan variabel yang menggunakan aktual 3var fungsi sebelum memproses string, seperti: for(c of '@#e'+s).
masukkan nama pengguna di sini

1
@insertusernamehere Aha, itu cukup pintar, terima kasih!
Dendrobium

Merevisi jawaban Anda, saya melihat bahwa Anda tidak menampilkan baris baru untuk perintahw
edc65

@ edc65 Salah satu peluru klarifikasi menyatakan "'w' harus menampilkan spasi atau baris baru setelah 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}¨⍵}

Ini adalah fungsi yang menganggap program sebagai argumen, misalnya:

      ∆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

Ini dapat digunakan sebagai fungsi anonim, saya hanya memberinya nama untuk kejelasan.

Penjelasan:

  • 0::→: jika kesalahan terjadi (katakanlah, pembagian dengan nol), berhentilah tanpa mencetak pesan kesalahan
  • A B R←0: menginisialisasi variabel
  • {... }¨⍵: untuk setiap perintah:

    • ⍵∊G←'aikdms<>': Jika perintah adalah salah satu dari tipe var ← fn (var, x) , cari fn dan x yang tepat , gantikan dengan dan kemudian evaluasi:
      • : evaluasi
      • 'AB'[1+2|G⍳⍵: Ajika posisi dalam 'aikdms<>'genap, Bsebaliknya.
      • '+-*∘'[M]: tambahkan, kurangi, daya, atau tidak sama sekali, tergantung pada M(ditentukan kemudian)
      • '←': tetapkan
      • '112R'[M←⌈2÷⍨G⍳⍵]: 1(untuk menambah dan mengurangi), 2(untuk daya), dan R(untuk tidak ada, yaitu hanya mengatur variabel untuk R), tergantung pada M, yang merupakan apakah perintah itu milik pasangan pertama, kedua, ketiga atau keempat.
    • ⍵∊G←'PpOo': output:
      • ⍞←: output
      • ⎕UCS⍣(2|G⍳⍵): ASCII (well, Unicode) atau angka tergantung pada apakah perintah berada pada posisi ganjil atau genap dalam PpOo,
      • ⊢A B[⌈2÷⍨G⍳⍵]: Aatau B, tergantung pada apakah perintah itu di babak pertama atau kedua.
    • ⍵∊G←'+-*/: matematika:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: diatur Rke hasil menerapkan operator yang diberikan ke Adan B.
    • ⍵∊G←'@#e': atur ulang:

      • : evaluasi
      • 'ABR'[G⍳⍵]: pilih variabel yang tepat
      • '∘←0': diatur ke nol
    • ⍵='w':⍞←R: jika perintahnya adalah w, output 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);}

Kode ini menggunakan string id@s>ak#m<e+-*/wpoPOsebagai tabel perintah. String diatur sesuai dengan tujuan ekspresi yang dihitung. Kebetulan ada 5 perintah yang memperbarui masing-masing variabel:

  • id@s> - perbarui a
  • ak#m< - perbarui b
  • e+-*/ - perbarui r
  • wpoPO- perbarui ... lokasi memori setelah a, bdan r. Semoga tidak terlalu penting :)

Jadi setelah menemukan karakter input dalam string perintah, indeksnya berulang kali menurun, dan tergantung pada saat mencapai 0, ekspresi dipilih.

Jika tidak mencapai 0 setelah 15 pengurangan, itu printfdengan beberapa argumen yang dipilih dengan benar.

Juga, ketika membaginya, ia menghindari pembagian dengan 0 dengan memanggil exit().

Kode ini harus dikompilasi tanpa optimasi, karena mengasumsikan itu a, bdan rterletak di alamat yang berdekatan pada stack (bukan di register CPU).

Juga, itu harus dikompilasi dalam mode 32-bit, karena itu mengkonversi pointer ke integer dan sebaliknya.


4

VBA, 484, 453 380 Bytes

Untuk lama menang, tetapi cara super sederhana untuk melakukan sesuatu, tidak ada yang mewah hanya baik tua Select Case

Menambahkan Divisi Integer dan Div 0 Penanganan Kesalahan Makan Banyak Bytes
Removed Error Handling karena tampaknya penanganan kesalahan yang normal menghasilkan fungsi yang sama. Memperbaiki Divisi Int agar berfungsi seperti yang diharapkan. Juga lebih pendek.

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

Terima kasih kepada Henrik Ilgen karena telah menghemat 31 104 byte


2
Tidak sepenuhnya yakin apakah ini bekerja di VBA (halnya di VB6), tapi Anda bisa menghemat banyak byte dengan menggunakan DefInt A-Z, sehingga menghilangkan kebutuhan untuk secara eksplisit menyatakan A, Bdan Rsebagai Integer: DefInt A-Z:Dim A, B, R. Ini mungkin juga bekerja untuk hanya menetapkan mereka, tanpa deklarasi: A=0:B=0:R=0. Perhitungannya juga harus bekerja pada varian.
Henrik Ilgen 6-15

@ HenrikIlgen terima kasih banyak, Lupa tentang DefIntBukan Sesuatu yang saya gunakan setiap hari tetapi akan menjadi golf VBA yang sangat berguna di masa depan. Sedih A=0hanya akan membuatnya bertindak seperti dobel dari tes saya. Di sana untuk membuat iiiaa/wmenghasilkan hasil desimal daripada keseluruhan.
JimmyJazzx

1
Coba \ untuk pembagian integer;)
Henrik Ilgen

1
Anda dapat memadatkannya menjadi 405 byte jika Anda membuatnya menjadi fungsi dan menggunakan nilai balik untuk "membangun" hasilnya, dengan asumsi Anda tidak harus benar-benar mencetak hasilnya :)
Henrik Ilgen

3

PHP, 310 byte

Pertama kali dalam hidup saya menggunakan 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].';');

Mengambil input baris perintah pertama:

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

Keluaran dari contoh:

Halo Dunia!
20spooky22me


3

C, 357

Makro FTW!

(Siapa aku bercanda - c tidak akan pernah memenangkan yang satu ini)

#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)

Pemakaian

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!"

Penjelasan

Ada beberapa detail dari bahasa yang saya tidak yakin tentang (ukuran integer, menangani karakter yang tidak dikenal, dll) tetapi solusi ini tampaknya bekerja dengan cukup dan mengabaikan karakter spasi seperti baris baru dalam kasus uji.

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
Saya pikir Anda bisa menyimpan beberapa byte dengan melampirkan kamus di dalam suatu eval sementara mengganti semua :$=>dengan $, lalu menambahkan ganti untuk string.
Conor O'Brien

2

Simplex v.0.8 , 211 byte

(UTF-8 disandikan.)

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øÏ}

Penjelasan

Karena ini adalah program simpleks terpanjang yang saya tulis sejauh ini, saya umumnya akan menjelaskan bagaimana ini bekerja dalam poin-poin.

  • h@u] - mendefinisikan makro 0. Makro ini hanya menulis ke register dan membuat lambda mengembalikan apa-apa.
  • u2- pergi ke strip di atas dan menetapkan byte saat ini menjadi 2; ini mendefinisikan arity dari lambda yang harus didefinisikan.
  • ƒ- mulai ekspresi lambda; setelah selesai ], akan mendorong fungsi lambda ke tumpukan lambda. Kerjanya dengan mengambil (arity) sel dari pointer ke strip lokalnya, dan, setelah selesai, akan mengatur strip lokalnya ke sel yang diambil, kecuali byte saat ini tidak tertulis. Pointer tidak terpengaruh. Makro 0 memungkinkan fungsi untuk kembali tanpa mengubah apa pun di strip.
  • §- Pindah ke sel tertulis pertama dalam jalur saat ini yaitu A.
  • ð- Pindah ke sel tertulis terakhir dalam jalur saat ini yaitu B.
  • ... {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} ulangi sampai tumpukan input kosong
    • "idspP>akmoO<+-*/w@#e" - perintahnya
    • Rly - Masukkan strip ke dalam tuple
    • G^u - indeks input dalam tuple
    • ·- memuat byte saat th ke evaluator lambda
    • uRL- Pergi ke strip memegang Adan B(menulis Adan Bjika mereka tidak ada)
    • - mengeksekusi lambda (ini adalah evaluator lambda)
    • - me-reset di bawah strip

Fiuh saya terkesan. Ini panjang untuk Simplex, tetapi singkat untuk yang lainnya.;)


2

Minkolang 0,11 , 222 byte

Saya yakin ini bisa bermain golf lebih jauh, tapi itu menyenangkan. Juga, penerjemah Minkolang pertama dari bahasa lain!

>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

Coba di sini.

Penjelasan

>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.

Sisa dari garis cukup sederhana, mungkin dengan pengecualian dari mereka yang 1$((dl%"0"+$rl:d)$Ok, yang merupakan idiom yang mencetak angka tanpa spasi tambahan. (Saya belum mengimplementasikan fungsi convert-this-number-to-a-string, yang akan menjadi 1Z.) Oh, ya, mereka semua memiliki vdi awal, yang membawanya kembali ke awal.


2

GNU Sed (dengan opsi eval untuk mengevaluasi ekspresi dc), 289

Terinspirasi oleh Digital Trauma yang sayangnya gagal untuk menyadari, bahwa a) karakter ilegal perlu diabaikan, b) dc membutuhkan seluruh program yang dikonversi dalam satu argumen dan c) pembagian dengan 0 harus menghentikan program tanpa kesalahan.

Jika semua aturan ini tidak berlaku, solusi saya hanya sepanjang 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)}}

Tanda kurung TIL tidak diperlukan di sekitar printf. 2 byte disimpan!

Versi ungolfed untuk membaca lebih mudah:

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

Python 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())))

Ini tidak bekerja printPernyataan Anda termasuk baris baru yang tertinggal.
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 dapat disimpan dengan menghapus .readdari baris kedua jika Anda dapat mentolerir peringatan yang dicetak untuk stderr pada versi Ruby yang lebih baru.


1

Python, 244

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())))

Agak terlambat tetapi saya ingin mencobanya.


1

Prolog, 759 byte

Bukan program terpendek, tapi setidaknya itu terstruktur dan mudah dibaca.

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).

Contoh input

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

Cobalah online di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.