Сделайте 3var переводчика!


24

3var - это вариант deadfish, который использует три переменные, называемые 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.
  • Разрешен любой язык.
  • Эвал разрешен.

Тестовые случаи

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

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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в iiiisspрезультате вы получите -5 и получите 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 еще нет оператора "break". Вместо этого программа выдвигает π как маркер (так как иначе число с плавающей запятой не может появиться), и в конце она сохраняет только выходные данные перед первым π.
Кроме того, программа использует переменные 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].
insertusername здесь

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

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если положение in '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, выбирается выражение.

Если оно не достигает 0 после 15 вычитаний, это printfс некоторыми правильно выбранными аргументами.

Кроме того, при делении он избегает деления на 0 путем вызова exit().

Этот код должен быть скомпилирован без оптимизации, поскольку он предполагает , что a, bи rрасположены в смежных адресов в стеке ( а не в регистрах процессора).

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


4

VBA, 484, 453 380 байт

Чтобы долго, чтобы выиграть, но Супер Простой способ делать вещи, Ничего Не Причудливый просто старый добрый Select Case

Добавление обработки целочисленного деления и ошибки 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

Спасибо Хенрику Ильгену за сохранение 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"

Вывод из примеров:

Привет, мир!
20spooky22me


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, заменив все :$=>на $, а затем добавив замену для строки.
Конор О'Брайен

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

фу, я впечатлен. Это длинно для Симплекса, но коротко для всего остального.;)


2

Минколанг 0,11 , 222 байта

Я уверен, что это может быть дальше, но это было весело. Также первый переводчик Минколанга на другой язык!

>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

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

Немного поздно, но я хотел пойти.


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.