Зробіть 3вар-перекладач!


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повинен виводити без нічого після цього.
  • Ділення - це ціле ділення.
  • Підтримуються числа вище 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 Тестовий зразок тепер відредагований, але повною мовою 3var r все скидає. Це те саме, що @#e.
DJgamer98

1
Чи ініціюються A, B і R до 0 при запуску перекладача?
Тоні Енніс

Відповіді:


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 ще не має оператора "перерви". Натомість програма висуває π як маркер (оскільки жодне число з плаваючою точкою не може відображатися інакше), і в кінці вона зберігає лише вихід до першого π.
Також програма використовує змінні 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 Копіюючи один одного, я і Дендробіум руйнуються разом.

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
@insertusernamehere thx, я люблю цей
edc65

8

GNU Sed (з варіантом eval для оцінки dcвираження), 254

Морська рибка досить добре відображається до підмножини 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)

Безумовно

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,і установки цих змінних , використовуючи фактичний 3var функції перед обробкою рядки, як: for(c of '@#e'+s).
insertusernamehere

1
@insertusernamehere Ага, це досить розумно, спасибі!
Дендробіум

Переглядаючи свою відповідь, я бачу, що ви не w
виводите

@ 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якщо позиція в 'aikdms<>'рівній, Bінакше.
      • '+-*∘'[M]: додавання, віднімання, потужність чи нічого, залежно від M(визначено пізніше)
      • '←': призначити
      • '112R'[M←⌈2÷⍨G⍳⍵]: 1(для додавання і віднімання), 2(для потужності), і R(дарма, тобто вона просто встановлює змінну на R), залежно від того M, чи належить команда до першої, другої, третьої чи четвертої пари.
    • ⍵∊G←'PpOo': вихід:
      • ⍞←: вихід
      • ⎕UCS⍣(2|G⍳⍵): ASCII (ну Unicode) або число залежно від того, чи була команда непарною чи парною позицією в PpOo ,
      • ⊢A B[⌈2÷⍨G⍳⍵]: Aабо B, залежно від того, чи була команда в першій чи другій половині.
    • ⍵∊G←'+-*/: math:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: встановлено Rв результаті застосування даного оператора до Aта B.
    • ⍵∊G←'@#e': скинути:

      • : оцінити
      • 'ABR'[G⍳⍵]: виберіть правильну змінну
      • '∘←0': встановлено в нуль
    • ⍵='w':⍞←R: якщо команда є w, виведіть R.


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, вибирається вираз.

Якщо після 15 віднімання він не досягає 0, це а printf аргументи з правильно підібраними аргументами.

Також під час ділення він уникає поділу на 0 шляхом виклику exit().

Цей код повинен бути скомпільовано без оптимізації, оскільки він передбачає , що a, bі rрозташовані в суміжних адрес в стеці ( а не в регістрах процесора).

Крім того, він повинен бути складений у 32-бітному режимі, оскільки він перетворює покажчики на цілі числа та навпаки.


4

VBA, 484, 453 380 байт

Щоб довго виграти, але Супер простий спосіб робити речі, Нічого фантазії просто хороший старий Select Case

Додавання в Integer Division та Div 0 Поводження
з помилками з’їло багато байтів, видалених поводження з помилками, оскільки, здається, нормальна обробка помилок призводить до того ж функціоналу. Виправлений внутрішній відділ для роботи, як очікувалося. Був також коротшим.

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

Дякуємо Генріку Ільгену за збереження 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. Розрахунки повинні працювати і за варіантами.
Генрік Ільген

@HenrikIlgen спасибі багато, забув про DefIntне те, що я використовую щодня, але буде дуже корисним VBA для гольфу в майбутньому. На жаль A=0, я просто змушую це діяти як подвійний з моїх тестів. Там для виготовлення iiiaa/wдають десятковий результат, а не цілий.
JimmyJazzx

1
Спробуйте \ для цілого поділу;)
Генрік Ільген

1
Ви можете скоротити його до 405 байт, якщо ви зробите це функцією і використовуєте повернене значення для "побудови" результату, припускаючи, що вам не потрібно насправді друкувати результат :)
Генрік Ільген

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"

Виведіть із прикладів:

Привіт Світ!
20споокі22ме


3

С, 357

Макроси FTW!

(Кого я жартую - з цього ніколи не виграю)

#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; це визначає сутність лямбда, яку слід визначити.
  • ƒ- почати лямбда-експресію; після завершення] , натисне функцію лямбда до стеку лямбда. Він діє, приймаючи (аріті) клітинки від вказівника в його локальну смугу, і після завершення встановить свою локальну смугу для взятих комірок, якщо тільки поточний байт не буде записаний. Вказівник не впливає. Макрос 0 дозволяє повернути функцію, не змінюючи нічого в смужці.
  • § - переміщується до першої записаної комірки в поточній смузі, тобто A .
  • ð - переміщується до останньої записаної комірки в поточній смузі, тобто B .
  • {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} повторюйте, поки вхідний стек не буде порожнім
    • "idspP>akmoO<+-*/w@#e" - команди
    • Rly - вставте смужку в кортеж
    • G^u - індекс введення в кортеж
    • ·- завантаження поточного байта й в лямбда - оцінювач
    • uRL- переходить до стрип-холдингу Aі B(пише AіB , якщо вони не існують)
    • - виконує лямбда (це оцінювач лямбда)
    • - скидає нижче смужки

фе, я вражений. Це довго для Simplex, але коротко для всього іншого.;)


2

Мінколанг 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, який, на жаль, не усвідомив, що а) незаконні символи потрібно ігнорувати; б) dc потребує всю перетворену програму в одному аргументі; в) поділ на 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

Пітон 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

Пітона, 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').

Спробуйте його онлайн тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.