ทำล่าม 3var!


24

3varเป็นตัวแปรของเดดฟิชซึ่งใช้สามตัวแปรที่เรียกว่า A, B และ R A และ B คือแอคคูมูเลเตอร์ในขณะที่ R ใช้เป็นตัวแปรผลลัพธ์

ในนี้ท้าทายนี้คุณต้องสร้างล่ามให้กับภาษานี้

คำสั่งที่จำเป็น:

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

ทุกอย่างอื่น (รวมถึงช่องว่าง) จะถูกละเว้น

ชี้แจง

  • oและpควรส่งออกโดยไม่มีอะไรหลังจากนั้น
  • Division คือการหารจำนวนเต็ม
  • รองรับตัวเลขที่มากกว่า 255 และต่ำกว่า 0 ได้
  • 'w' ควรส่งออกช่องว่างหรือขึ้นบรรทัดใหม่หลังจาก R
  • หารด้วย 0 หยุดทำงานโดยไม่มีข้อผิดพลาด (ไม่มีเอาต์พุตไปยัง STDERR)
  • A, B และ R เป็นค่าเริ่มต้น 0

กฎระเบียบ

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดชนะ
  • ในกรณีที่เสมอกันคำตอบที่เก่าที่สุดชนะ
  • ไฟล์จะถูกจัดเตรียมผ่านอาร์กิวเมนต์บรรทัดคำสั่งหรือ STDIN
  • ภาษาใดก็ได้ที่ได้รับอนุญาต
  • อนุญาตให้ทำการ Eval ได้

กรณีทดสอบ

Hello world! (นำมาจาก 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

เอาท์พุท20spooky22me:

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

เอาท์พุท9P-1420 100 3Q-1 162 0:

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

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](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 เมื่อพูดถึงมันฉันเพิ่งช่วยแก้ไขบั๊กวนซ้อนในล่าม
LegionMammal978

2
คำชี้แจงเพิ่มเติมสำหรับคนที่คุ้นเคยกับ Deadfish: dddddpผลลัพธ์ใน -5 และiiiisspผลลัพธ์เป็น 256 ตามที่คุณคาดหวังมากกว่า 0
Sp3000

1
ในการทดสอบกรณีrทำยาอะไร? มันไม่รวมอยู่ในรายการคำสั่งที่ใช้ได้
JimmyJazzx

1
@JimmyJazzx ตอนนี้มีการแก้ไข testcase แต่ในภาษา 3var เต็ม r รีเซ็ตทุกอย่าง @#eมันเป็นเช่นเดียวกับ
DJgamer98

1
A, B และ R ถูกเตรียมใช้งานเป็น 0 เมื่อล่ามเริ่มต้นหรือไม่
Tony Ennis

คำตอบ:


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=

ลองออนไลน์

คำอธิบาย:

โปรแกรมสร้างอาร์เรย์ของชิ้นส่วนของรหัสที่จะดำเนินการและดำเนินการชิ้นส่วนที่เกี่ยวข้องสำหรับตัวละครแต่ละตัว การจัดการกับการหารด้วยศูนย์นั้นยากกว่าเนื่องจาก CJam ยังไม่มีตัวดำเนินการ "หยุด" แต่โปรแกรมจะผลักπเป็นตัวทำเครื่องหมาย (เนื่องจากไม่มีหมายเลขจุดลอยตัวที่สามารถปรากฏเป็นอย่างอื่น) และในตอนท้ายมันจะเก็บเฉพาะเอาท์พุทก่อนที่ first แรก
นอกจากนี้โปรแกรมใช้ตัวแปร T, U และ V แทน A, B และ R เพราะมันถูกกำหนดค่าเริ่มต้นด้วย 0 ใน 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)

การใช้งานคำสั่งจริง (สร้างโดยโปรแกรม):

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

Edit3 การคัดลอกซึ่งกันและกันฉันและ Dendrobium กำลังยุบตัวลง

Edit2ใช้ EcmaScript 7 เพื่อบันทึกเพียง 2 ไบต์รวมการจัดการ A และ B เข้าด้วยกัน

แก้ไขการติดตามการเปลี่ยนแปลงของกฎ

หมายเหตุฉันเพิ่มrคำสั่งที่ไม่จำเป็นในคำถามเพียงเพื่อเรียกใช้ตัวอย่าง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>


คุณสามารถบันทึก 2 ไบต์โดยการลบA=B=R=0,และการตั้งค่าตัวแปรที่ใช้จริง3var[...'@#e'+p]ฟังก์ชั่นการประมวลผลก่อนสตริงเช่น:
แทรกที่นี่

2
@insertusername ที่นี่ขอบคุณฉันรักสิ่งนี้
edc65

8

GNU Sed (พร้อมตัวเลือก eval เพื่อประเมินdcการแสดงออก), 254

Deadfish dcแผนที่ธรรมไว้อย่างสวยงามเพื่อเซตของ ดังนั้นเราจึงใช้ sed เพื่อทำแผนที่:

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 ไบต์

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)

Ungolfed

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 ไม่ไกลจากของฉัน แต่ดีกว่า ตอนนี้ฉันจะต้องลองทำสิ่งที่แตกต่าง
edc65

1
คุณสามารถบันทึก 2 ไบต์โดยการลบA=B=R=0,และการตั้งค่าตัวแปรที่ใช้จริง3varfor(c of '@#e'+s)ฟังก์ชั่นการประมวลผลก่อนสตริงเช่น:
แทรกที่นี่

1
@insertusernamehere Aha, นั่นเป็นคนฉลาดทีเดียวขอบคุณ!
Dendrobium

การปรับปรุงคำตอบของคุณฉันเห็นว่าคุณไม่ได้ขึ้นบรรทัดใหม่สำหรับคำสั่งw
edc65

@ edc65 หนึ่งในสัญลักษณ์แสดงหัวข้อย่อยชี้แจงสถานะ "" w "ควรส่งช่องว่างหรือขึ้นบรรทัดใหม่หลังจาก 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}¨⍵}

นี่คือฟังก์ชั่นที่ใช้โปรแกรมเป็นอาร์กิวเมนต์เช่น:

      ∆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

มันสามารถใช้เป็นฟังก์ชั่นที่ไม่ระบุชื่อฉันเพิ่งตั้งชื่อเพื่อความชัดเจน

คำอธิบาย:

  • 0::→: หากมีข้อผิดพลาดเกิดขึ้น (กล่าวคือหารด้วยศูนย์) ให้หยุดโดยไม่พิมพ์ข้อความผิดพลาด
  • A B R←0: เริ่มต้นตัวแปร
  • {... }¨⍵: สำหรับแต่ละคำสั่ง:

    • ⍵∊G←'aikdms<>': หากคำสั่งเป็นหนึ่งในประเภทvar ← fn (var, x) , หาค่าfnและxที่เหมาะสม, แทนที่คำสั่งนั้นแล้วประเมินค่า:
      • : ประเมินผล
      • 'AB'[1+2|G⍳⍵: Aถ้าตำแหน่งของin 'aikdms<>'เป็นเลขคู่Bมิฉะนั้น
      • '+-*∘'[M]: เพิ่มลบกำลังไฟหรืออะไรก็ได้ขึ้นอยู่กับM(กำหนดไว้ในภายหลัง)
      • '←': มอบหมาย
      • '112R'[M←⌈2÷⍨G⍳⍵]: 1(สำหรับการบวกและลบ), 2(สำหรับกำลัง) และR(สำหรับอะไรเลยนั่นคือเพียงแค่ตั้งค่าตัวแปรเป็นR) ขึ้นอยู่กับMว่าคำสั่งนั้นเป็นคู่แรกคู่ที่สองสามหรือสี่
    • ⍵∊G←'PpOo': เอาท์พุท:
      • ⍞←: เอาท์พุท
      • ⎕UCS⍣(2|G⍳⍵): ASCII (well, Unicode) หรือตัวเลขขึ้นอยู่กับว่าคำสั่งนั้นอยู่ในตำแหน่งคี่หรือคู่ PpOo ,
      • ⊢A B[⌈2÷⍨G⍳⍵]: AหรือBขึ้นอยู่กับว่าคำสั่งนั้นอยู่ในครึ่งแรกหรือครึ่งหลัง
    • ⍵∊G←'+-*/: คณิตศาสตร์:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: ตั้งRเพื่อผลของการใช้ประกอบการที่ได้รับไปและAB
    • ⍵∊G←'@#e': รีเซ็ต:

      • : ประเมินผล
      • 'ABR'[G⍳⍵]: เลือกตัวแปรที่เหมาะสม
      • '∘←0': ตั้งค่าเป็นศูนย์
    • ⍵='w':⍞←Rถ้าคำสั่งคือเอาท์พุทwR


4

C, 253 241 ไบต์

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

รหัสนี้ใช้สตริงid@s>ak#m<e+-*/wpoPOเป็นตารางคำสั่ง สตริงถูกจัดเรียงตามปลายทางของนิพจน์ที่คำนวณได้ มันเกิดขึ้นเมื่อมี 5 คำสั่งที่อัพเดตตัวแปรแต่ละตัว:

  • id@s> - อัปเดต a
  • ak#m< - อัปเดต b
  • e+-*/ - อัปเดต r
  • wpoPO- อัปเดต ... สถานที่ตั้งหน่วยความจำหลังa, และb rฉันหวังว่ามันจะไม่สำคัญเกินไป :)

ดังนั้นหลังจากค้นหาอักขระอินพุตในสตริงของคำสั่งดัชนีของมันจะลดลงซ้ำ ๆ และขึ้นอยู่กับว่าเมื่อถึง 0 จะเลือกนิพจน์

หากไม่ถึง 0 หลังจาก 15 การลบมันเป็นprintfข้อโต้แย้งที่เลือกอย่างเหมาะสม

นอกจากนี้เมื่อหารจะหลีกเลี่ยงการหารด้วย 0 ด้วยการโทร exit()โดยการเรียก

รหัสนี้ควรได้รับการรวบรวมโดยไม่ต้องเพิ่มประสิทธิภาพเพราะอนุมานว่าa, bและrตั้งอยู่ในบริเวณที่อยู่ติดกันในกอง (ไม่ได้อยู่ในการลงทะเบียน CPU)

นอกจากนี้ควรรวบรวมในโหมด 32 บิตเนื่องจากแปลงพอยน์เตอร์เป็นจำนวนเต็มและกลับกัน


4

VBA, 484, 453 380 ไบต์

ถึงจะชนะได้นาน แต่เป็นวิธีที่ง่ายที่สุดในการทำสิ่งต่าง ๆ ไม่มีสิ่งใดดีพอแก่ตัว Select Case

การเพิ่มการจัดการข้อผิดพลาด Diver Division และ Div 0 กินจำนวนมากของการ
จัดการข้อผิดพลาด Byte ดูเหมือนว่าข้อผิดพลาดปกติการจัดการผลลัพธ์ในการทำงานเดียวกัน แก้ไขส่วน Int ให้ทำงานตามที่คาดไว้ ก็ยังสั้นกว่า

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

ขอบคุณ Henrik Ilgen สำหรับการบันทึก31 104 ไบต์


2
ไม่ได้ทั้งหมดว่าถ้างานนี้ใน VBA (มันจะอยู่ใน VB6) แต่คุณสามารถบันทึกพวงของไบต์โดยใช้DefInt A-Zจึงถนัดจำเป็นที่จะต้องประกาศอย่างชัดเจนว่าA, BและRเป็น:Integer เป็นอย่างดีอาจจะทำงานเพียงแค่กำหนดให้โดยไม่ต้องประกาศ:DefInt A-Z:Dim A, B, R A=0:B=0:R=0การคำนวณ ควรใช้กับตัวแปรได้เช่นกัน
Henrik Ilgen

@HenrikIlgen ขอบคุณมากลืมDefIntสิ่งที่ฉันใช้ทุกวัน แต่จะเป็น VBA ที่มีประโยชน์มากในอนาคต น่าเศร้าที่A=0จะทำให้มันทำตัวเหมือนเป็นสองเท่าจากการทดสอบของฉัน ที่นั่นสำหรับการiiiaa/wสร้างผลลัพธ์ทศนิยมแทนที่จะเป็นทั้งหมด
JimmyJazzx

1
ลอง \ สำหรับการหารจำนวนเต็ม;)
Henrik Ilgen

1
คุณสามารถย่อให้เหลือ405 ไบต์หากคุณทำให้เป็นฟังก์ชันและใช้ค่าส่งคืนเพื่อ "สร้าง" ผลลัพธ์โดยสมมติว่าคุณไม่จำเป็นต้องพิมพ์ผลลัพธ์จริง :)
เฮนริก Ilgen

3

PHP, 310 ไบต์

ครั้งแรกในชีวิตของฉันโดยใช้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].';');

รับอินพุตบรรทัดคำสั่งแรก:

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

ผลลัพธ์จากตัวอย่าง:

สวัสดีชาวโลก!
20spooky22me


3

C, 357

มาโคร FTW!

(ฉันเป็นใครล้อเล่น - c จะไม่ชนะคนนี้)

#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 ไบต์

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)

การใช้

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

คำอธิบาย

มีรายละเอียดบางส่วนของภาษาที่ฉันไม่แน่ใจเกี่ยวกับ (ขนาดจำนวนเต็มการจัดการอักขระที่ไม่รู้จัก ฯลฯ ) แต่วิธีนี้ดูเหมือนว่าจะทำงานได้อย่างเพียงพอและไม่สนใจอักขระช่องว่างเช่นบรรทัดใหม่ในกรณีทดสอบ

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
ฉันคิดว่าคุณสามารถบันทึกไม่กี่ไบต์โดยใส่พจนานุกรมไว้ใน eval ในขณะที่แทนที่ทั้งหมด:$=>ด้วย$จากนั้นเพิ่มการแทนที่สำหรับสตริง
Conor O'Brien

2

Simplex v.0.8 , 211 ไบต์

(เข้ารหัส 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øÏ}

คำอธิบาย

เนื่องจากนี่เป็นโปรแกรมซิมเพล็กซ์ที่ยาวที่สุดที่ฉันเขียนจนถึงตอนนี้ฉันมักจะอธิบายว่ามันทำงานอย่างไรในหัวข้อย่อย

  • h@u] - นิยามมาโคร 0 มาโครนี้เขียนลงทะเบียนและทำให้แลมบ์ดาคืนค่าอะไร
  • u2- ไปที่แถบด้านบนและตั้งค่าไบต์ปัจจุบันเป็น 2 สิ่งนี้กำหนด arity ของ lambdas ที่จะกำหนด
  • ƒ- เริ่มต้นการแสดงออกแลมบ์ดา; เมื่อเสร็จสิ้นโดย]จะส่งฟังก์ชัน lambda ไปยัง lambda stack มันทำหน้าที่โดยการเอาเซลล์ (arity) จากตัวชี้ไปยังแถบภายในของมันและหลังจากเสร็จสิ้นจะตั้งแถบท้องถิ่นของมันไปยังเซลล์ที่นำมาเว้นแต่ไบต์ปัจจุบันจะไม่ได้เขียน ตัวชี้ไม่ได้รับผลกระทบ มาโคร 0 อนุญาตให้ฟังก์ชันส่งคืนโดยไม่ต้องแก้ไขอะไรในแถบ
  • §- Aย้ายไปยังเซลล์เขียนครั้งแรกในแถบเช่นปัจจุบัน
  • ð - ย้ายไปยังเซลล์ที่เขียนล่าสุดในแถบปัจจุบันเช่น Bย้ายไปยังเซลล์ที่เขียนสุดท้ายในแถบเช่นปัจจุบัน
  • ... {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} ทำซ้ำจนกระทั่งสแต็คอินพุตว่างเปล่า
    • "idspP>akmoO<+-*/w@#e" - คำสั่ง
    • Rly - ใส่แถบลงใน tuple
    • G^u - ดัชนีของอินพุตใน tuple
    • ·- โหลดไบต์ที่thปัจจุบันลงในแลมบ์ดาผู้ประเมิน
    • uRL- ไปที่การถือครองแถบAและB(เขียนAและBหากพวกเขาไม่อยู่)
    • - ประมวลแลมบ์ดา (นี่คือผู้ประเมินแลมบ์ดา)
    • - รีเซ็ตแถบด้านล่าง

ว้าฉันประทับใจ มันยาวสำหรับ Simplex แต่สั้นสำหรับทุกอย่าง;)


2

Minkolang 0.11 , 222 ไบต์

ฉันแน่ใจว่านี้สามารถเล่นกอล์ฟต่อไปได้ แต่มันสนุก นอกจากนี้ยังมีล่าม Minkolang คนแรกของภาษาอื่น!

>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

ลองที่นี่

คำอธิบาย

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

ส่วนที่เหลือของบรรทัดนั้นค่อนข้างเรียบง่ายบางทีอาจเป็นข้อยกเว้นของบรรทัดที่มี1$((dl%"0"+$rl:d)$Okซึ่งเป็นสำนวนที่พิมพ์ตัวเลขโดยไม่มีช่องว่างท้าย (ฉันยังไม่ได้ใช้ฟังก์ชั่นการแปลงหมายเลขนี้เป็นจำนวนสตริงซึ่งจะเป็น1Z) โอ้ใช่พวกเขาทั้งหมดมีvจุดเริ่มต้นซึ่งนำกลับไปสู่จุดเริ่มต้น


2

GNU Sed (พร้อมตัวเลือก eval เพื่อประเมินค่านิพจน์ dc), 289

แรงบันดาลใจจาก Digital Trauma ผู้เศร้าใจที่ไม่รู้ว่า a) ตัวอักษรผิดกฎหมายต้องถูกละเว้น b) dc ต้องการโปรแกรมที่ถูกแปลงทั้งหมดในหนึ่งอาร์กิวเมนต์และ c) การหารด้วย 0 ต้องยกเลิกโปรแกรมโดยไม่มีข้อผิดพลาด

หากกฎเหล่านี้ใช้ไม่ได้ผลการแก้ไขของฉันจะมีความยาว 235 ไบต์เท่านั้น)

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 ไม่จำเป็นต้องใช้รอบ printf บันทึก 2 ไบต์!

เวอร์ชันที่ไม่ดีสำหรับการอ่านที่ง่ายขึ้น:

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

มันใช้งานไม่ได้ ใบแจ้งยอดของคุณprintรวมถึงการขึ้นบรรทัดใหม่
กริฟ

1

ทับทิม, 199 ไบต์

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 ไบต์โดยการลบออก.readจากบรรทัดที่สองหากคุณสามารถทนต่อคำเตือนที่ถูกพิมพ์ไปยัง stderr บน Ruby เวอร์ชันใหม่



1

ภาษาโปรล็อก 759 ไบต์

ไม่ใช่โปรแกรมที่สั้นที่สุด แต่อย่างน้อยมันก็มีโครงสร้างและอ่านง่าย

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

ตัวอย่างอินพุต

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

ลองออนไลน์ได้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.