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

공백을 포함한 다른 모든 것은 무시됩니다.

설명

  • op뒤에 아무것도없이 출력해야합니다.
  • 나누기는 정수 나누기입니다.
  • 255보다 큰 숫자와 0보다 작은 숫자가 지원됩니다.
  • 'w'는 R 뒤에 공백이나 줄 바꿈을 출력해야합니다.
  • 0으로 나누면 오류없이 중지됩니다. (STDERR로 출력되지 않음)
  • A, B 및 R은 처음에 0입니다

규칙

  • 이것은 이므로 가장 짧은 대답이 이깁니다.
  • 동점 일 경우 가장 오래된 답이 이깁니다.
  • 파일은 명령 행 인수 또는 STDIN을 통해 제공됩니다.
  • 모든 언어가 허용됩니다.
  • 평가가 허용됩니다.

테스트 사례

Hello world! (에 솔랑에서 찍은)

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

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# 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결과는 iiiissp0이 아닌 -5이고 결과는 256이됩니다.
Sp3000

1
테스트 사례에서 어떤 복용량을 r합니까? 유효한 명령 목록에 포함되어 있지 않음
JimmyJazzx

1
@JimmyJazzx 이제 테스트 케이스가 편집되었지만 전체 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에는 아직 "break"연산자가 없기 때문에 0으로 나누기를 다루기가 더 어렵습니다. 대신 프로그램은 부동 소수점 숫자가 다르게 나타날 수 있으므로 π를 마커로 푸시하고 마지막에 첫 번째 π 이전의 출력 만 유지합니다.
또한 프로그램은 CJam에서 0으로 사전 초기화되기 때문에 A, B 및 R 대신 변수 T, U 및 V를 사용합니다.

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

자바 스크립트 (ES7) 208 213 223 237 241 311

Edit3 서로 복사하면 I와 Dendrobium이 함께 접 힙니다 .

Edit2 EcmaScript 7을 사용하여 2 바이트 만 저장하고 A와 B의 처리를 결합

편집 규칙 변경에 따라.

참고로, 이전 예제 Hello worldr 를 실행하기 위해 질문에 필요하지 않은 명령을 추가했습니다.

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>


다음 과 같이 문자열을 처리하기 전에 실제 3var 함수를 사용하여 해당 변수를 제거 하고 설정 하여 2 바이트절약 할 수 있습니다. A=B=R=0,[...'@#e'+p]
insertusername 여기

2
@insertusername 여기 thx, 나는 이것을 좋아한다
edc65

8

GNU Sed ( 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

자바 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)

언 골프

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
다음 과 같이 문자열을 처리하기 전에 실제 3var 함수를 사용하여 해당 변수를 제거 하고 설정 하여 2 바이트절약 할 수 있습니다. A=B=R=0,for(c of '@#e'+s)
insertusername 여기

1
@insertusername 여기 Aha, 정말 영리합니다.
Dendrobium

답변을 개정, 당신이 명령의 출력을 줄 바꿈하지 않는 것을 볼w
edc65

@ edc65 명확한 글 머리 기호 중 하나는 " 'w 다음에 공백이나 줄 바꿈을 출력해야합니다"
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::→: 오류가 발생하면 (예 : 0으로 나누기) 오류 메시지를 인쇄하지 않고 정지합니다
  • A B R←0: 변수 초기화
  • {... }¨⍵: 각 명령마다 :

    • ⍵∊G←'aikdms<>': 명령이 var ← fn (var, x) 유형 중 하나 인 경우 적절한 fnx를 찾아서 대체 한 다음 평가하십시오.
      • : 평가
      • 'AB'[1+2|G⍳⍵: in A의 위치 가 고르면 그렇지 않은 경우.'aikdms<>'B
      • '+-*∘'[M]:에 따라 더하기, 빼기, 힘 또는 아무것도 없음 M(나중에 정의 됨)
      • '←': 할당
      • '112R'[M←⌈2÷⍨G⍳⍵]:에 따라 1(더하기 및 빼기), 2(전원) 및 R(아무것도, 즉 변수를으로 설정 R) M명령이 첫 번째, 두 번째, 세 번째 또는 네 번째 쌍에 속하는지 여부 에 따라 다릅니다 .
    • ⍵∊G←'PpOo': 출력 :
      • ⍞←: 출력
      • ⎕UCS⍣(2|G⍳⍵):에서 명령이 홀수인지 짝수인지에 따라 ASCII (웰, 유니 코드) 또는 숫자 PpOo,
      • ⊢A B[⌈2÷⍨G⍳⍵]: A또는 B명령이 상반기에 있는지 여부에 따라
    • ⍵∊G←'+-*/: 수학 :
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: R주어진 연산자를 Aand 에 적용한 결과로 설정 됩니다 B.
    • ⍵∊G←'@#e': 다시 놓기:

      • : 평가
      • 'ABR'[G⍳⍵]: 올바른 변수를 선택하십시오
      • '∘←0': 0으로 설정
    • ⍵='w':⍞←R: 명령이 w출력되면 R.


4

C, 253241 바이트

#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, br. 나는 그것이 너무 중요하지 않기를 바랍니다 :)

따라서 명령 문자열에서 입력 문자를 찾은 후에는 색인이 반복적으로 감소하며 0에 도달하면 표현식이 선택됩니다.

15 뺄셈 후에 0에 도달하지 않으면 printf적절하게 선택된 인수가있는 것입니다.

또한 나누는 경우을 호출하여 0으로 나누는 것을 피 exit()합니다.

이 것을 가정하기 때문에 이러한 코드는 최적화하지 않고 컴파일되어야한다 a, b그리고 r(안 CPU 레지스터에서) 스택에 인접하는 어드레스에 위치한다.

또한 포인터를 정수로 변환하거나 그 반대로 포인터를 변환하기 때문에 32 비트 모드로 컴파일해야합니다.


4

VBA, 484, 453380 바이트

오랫동안이기는 것, 일을하는 매우 간단한 방법, Nothing Fancy는 오래되었습니다. Select Case

Integer Division 및 Div 0 오류 처리에 추가
일반적인 오류 처리 결과와 동일한 기능을하는 것처럼 많은 바이트를 제거하여 오류 처리를 제거했습니다. Int Division이 예상대로 작동하도록 수정했습니다. 더 짧았습니다.

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

저장하는 헨릭 Ilgen 덕분에 31 104 바이트


2
아니 완전히 확인하는 경우 VBA에서이 작품 (가 VB6에서 수행),하지만 당신은 사용하여 바이트의 무리를 절약 할 수있다 DefInt A-Z하여 명시 적으로 선언 할 필요가 생략, A, BR같은 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 바이트 로 압축 할 수 있습니다.
Henrik 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"

예제의 출력 :

안녕하세요 세상!
스푸키


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

자바 스크립트 (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
난 당신이 모두를 교체하는 동안 평가 후면 내에서 사전을 묶어 몇 바이트를 절약 할 수 있다고 생각 :$=>과 함께 $다음은 문자열을 교체 추가.
Conor O'Brien

2

심플 렉스 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를 ​​정의합니다.
  • ƒ-람다 표현 시작; 에 의해 완료되면 ]람다 함수를 람다 스택으로 푸시합니다. 포인터에서 로컬 스트립으로 (arity) 셀을 가져 와서 작동하며, 완료 후 현재 바이트를 쓰지 않는 한 로컬 스트립을 가져온 셀로 설정합니다. 포인터는 영향을받지 않습니다. 매크로 0을 사용하면 스트립에서 아무것도 수정하지 않고 함수를 반환 할 수 있습니다.
  • §-현재 스트립에서 첫 번째로 작성된 셀로 이동합니다 A.
  • ð-현재 스트립에서 마지막으로 쓰여진 셀로 이동합니다 B.
  • {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} 입력 스택이 비워 질 때까지 반복
    • "idspP>akmoO<+-*/w@#e" -명령
    • Rly -스트립을 튜플에 넣습니다.
    • G^u -튜플의 입력 인덱스
    • ·- 현재의 바이트로드 차를 람다로 평가
    • uRL-스트립 홀딩으로 이동 A하고 B(쓰기 AB존재하지 않는 경우)
    • -람다 실행 (람다 평가 자임)
    • -스트립 아래 재설정

감동입니다. 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 (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)}}

printf 주위에는 TIL 괄호가 필요하지 않았습니다. 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

파이썬 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]}

.read최신 버전의 Ruby에서 stderr에 인쇄되는 경고를 허용 할 경우 두 번째 줄에서 5 바이트를 절약 할 수 있습니다 .


1

파이썬, 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())))

조금 늦었지만 가보고 싶었습니다.


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.