Zrób tłumacza 3var!

24

3var jest odmianą martwych ryb, która wykorzystuje trzy zmienne zwane A, B i R. A i B to akumulatory, natomiast R jest zmienną wynikową.

W tym wyzwaniu musisz stworzyć tłumacza dla uproszczonej wersji tego języka.

Wymagane polecenia:

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

Cała reszta (w tym białe znaki) jest ignorowana.

Wyjaśnienia

  • oi ppowinien po tym wyjść bez niczego.
  • Podział to podział na liczby całkowite.
  • Obsługiwane są liczby powyżej 255 i liczby poniżej 0.
  • „w” powinno wypisywać spację lub znak nowej linii po R
  • Dzielenie przez 0 zatrzymuje się bez błędów. (Brak danych wyjściowych do STDERR)
  • A, B i R mają początkowo wartość 0

Zasady

  • To jest więc wygrywa najkrótsza odpowiedź.
  • W przypadku remisu wygrywa najstarsza odpowiedź.
  • Plik zostanie dostarczony za pomocą argumentów wiersza poleceń lub STDIN.
  • Dowolny język jest dozwolony.
  • Ewaluacja jest dozwolona.

Przypadki testowe

Hello world! (pochodzi z 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

Wyjścia 20spooky22me:

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

Wyjścia 9P-1420 100 3Q-1 162 0:

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

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

# [><>](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>

DJgamer98
źródło
1
@ Sp3000 Mówiąc o tym, ostatnio pomogłem naprawić błąd zagnieżdżonej pętli w tłumaczu.
LegionMammal978,
2
Dodatkowe wyjaśnienia dla osób zaznajomionych z Deadfish: dddddpdaje wynik -5 i iiiissp256 jak można się spodziewać, zamiast 0.
Sp3000
1
W przypadku testowym Jaka dawka działa r? nie ma go na liście prawidłowych poleceń
JimmyJazzx
1
@JimmyJazzx Zestaw testowy jest teraz edytowany, ale w pełnym języku 3var r resetuje wszystko. To jest tak samo jak @#e.
DJgamer98,
1
Czy A, B i R są inicjowane na 0 po uruchomieniu interpretera?
Tony Ennis,

Odpowiedzi:

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=

Wypróbuj online

Wyjaśnienie:

Program buduje tablicę fragmentów kodu do wykonania i wykonuje odpowiedni fragment dla każdego znaku. Radzenie sobie z dzieleniem przez zero jest trudniejsze, ponieważ CJam nie ma jeszcze operatora „break”. Zamiast tego program naciska π jako znacznik (ponieważ inaczej liczba zmiennoprzecinkowa nie może pojawić się inaczej), a na końcu zachowuje tylko dane wyjściowe przed pierwszym π.
Ponadto program używa zmiennych T, U i V zamiast A, B i R, ponieważ są one wstępnie zainicjowane z 0 w 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)

Rzeczywiste implementacje poleceń (zbudowane przez program):

+: X2+U|{TU+:V;}P?    if (1+2)|U != 0, set V=T+U, else push π
-: X2-U|{TU-:V;}P?    if (1-2)|U != 0, set V=T-U, else push π
*: X2*U|{TU*:V;}P?    if (1*2)|U != 0, set V=T*U, else push π
/: X2/U|{TU/:V;}P?    if (1/2)|U != 0, set V=T/U, else push π
d: T( :T;             set T=T-1
s: T_*:T;             set T=T*T
p: TT :T;             push T and set T=T (no-op)
P: TcT:T;             push T converted to character and set T=T (no-op)
>: T;V:T;             push and pop T (no-op) and set T=V
@: T;0:T;             push and pop T (no-op) and set T=0
i: T):T;              set T=T+1
k: U( :U;             set U=U-1
m: U_*:U;             set U=U*U
o: UU :U;             push U and set U=U (no-op)
O: UcU:U;             push U converted to character and set U=U (no-op)
<: U;V:U;             push and pop U (no-op) and set U=V
#: U;0:U;             push and pop U (no-op) and set U=0
a: U):U;              set U=U+1
w: VS                 push V and a space
e: 0:V;               set V=0
(default): (empty)    no-op
aditsu
źródło
10

JavaScript (ES7) 208 213 223 237 241 311

Edycja3 Kopiując się , ja i Dendrobium zwijają się razem.

Edit2 Korzystanie ECMAScript 7, aby zapisać tylko 2 bajty, połączone manipulacyjny A i B

Edytuj Po zmianach zasad.

Uwaga: dodałem rpolecenie, które nie jest wymagane w pytaniu, aby uruchomić stary przykład 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>

edc65
źródło
Można zapisać 2 bajty poprzez usunięcie A=B=R=0,i ustawienie tych zmiennych przy użyciu rzeczywistych 3var funkcje przed przetworzeniem ciąg, takich jak: [...'@#e'+p].
inserttusernamehere
2
@insertusernamehere thx, I love this one
edc65
8

GNU Sed (z opcją eval do oceny dcwyrażenia), 254

Deadfish mapuje całkiem ładnie na podzbiór dc. Więc używamy sed do wykonania tego mapowania:

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
Cyfrowa trauma
źródło
8

JavaScript ES6 ES7, 217 215 213 208 bajtów

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)

Bez golfa

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
Dendrobium
źródło
1
+1 Niedaleko mojego, ale lepiej. Teraz będę musiał spróbować czegoś innego
edc65,
1
Można zapisać 2 bajty poprzez usunięcie A=B=R=0,i ustawienie tych zmiennych przy użyciu rzeczywistych 3var funkcje przed przetworzeniem ciąg, takich jak: for(c of '@#e'+s).
inserttusernamehere
1
@insertusernamehere Aha, to całkiem sprytne, dzięki!
Dendrobium
Przeglądając twoją odpowiedź, widzę, że nie w
wypisujesz
@ edc65 Jeden z punktorów wyjaśniających stwierdza, że ​​„w” powinien wypisać spację lub znak nowej linii po 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}¨⍵}

Jest to funkcja, która przyjmuje program jako argument, np .:

      ∆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

Można go użyć jako funkcji anonimowej, właśnie nadałem mu nazwę dla przejrzystości.

Wyjaśnienie:

  • 0::→: jeśli wystąpi błąd (powiedzmy, dzielenie przez zero), zatrzymaj się bez drukowania komunikatu o błędzie
  • A B R←0: inicjowanie zmiennych
  • {... }¨⍵: dla każdego polecenia:

    • ⍵∊G←'aikdms<>': Jeśli polecenie jest typu var ← fn (var, x) , znajdź właściwe fn i x , zamień je na, a następnie oceń:
      • : oceń
      • 'AB'[1+2|G⍳⍵: Ajeśli pozycja in 'aikdms<>'jest parzysta, w Bprzeciwnym razie.
      • '+-*∘'[M]: dodawanie, odejmowanie, moc lub nic, w zależności od M(zdefiniowane później)
      • '←': przypisać
      • '112R'[M←⌈2÷⍨G⍳⍵]: 1(do dodawania i odejmowania), 2(dla mocy) i R(dla niczego, tzn. po prostu ustawia zmienną na R), w zależności od tego M, czy polecenie należy do pierwszej, drugiej, trzeciej lub czwartej pary.
    • ⍵∊G←'PpOo': wyjście:
      • ⍞←: wyjście
      • ⎕UCS⍣(2|G⍳⍵): ASCII (cóż, Unicode) lub liczba w zależności od tego, czy polecenie było na parze nieparzystej czy parzystej PpOo,
      • ⊢A B[⌈2÷⍨G⍳⍵]: Alub B, w zależności od tego, czy polecenie było w pierwszej czy drugiej połowie.
    • ⍵∊G←'+-*/: matematyka:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: ustawiany Rna wynik zastosowania danego operatora do Ai B.
    • ⍵∊G←'@#e': nastawić:

      • : oceń
      • 'ABR'[G⍳⍵]: wybierz odpowiednią zmienną
      • '∘←0„: ustawiony na zero
    • ⍵='w':⍞←R: jeśli polecenie jest w, wyjście R.

marinus
źródło
4

C, 253 241 bajtów

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

Ten kod wykorzystuje ciąg znaków id@s>ak#m<e+-*/wpoPOjako tabelę poleceń. Ciąg jest ułożony zgodnie z miejscem docelowym obliczonego wyrażenia. Tak się składa, że ​​5 poleceń aktualizuje każdą ze zmiennych:

  • id@s> - aktualizacja a
  • ak#m< - aktualizacja b
  • e+-*/ - aktualizacja r
  • wpoPO- zaktualizuj ... lokalizację pamięci po a, bi r. Mam nadzieję, że to nie jest zbyt ważne :)

Więc po zlokalizowaniu znaku wejściowego w ciągu poleceń, jego indeks jest wielokrotnie zmniejszany, aw zależności od tego, kiedy osiągnie 0, wybierane jest wyrażenie.

Jeśli nie osiągnie 0 po 15 odejmowaniach, jest to printfz odpowiednio dobranymi argumentami.

Ponadto podczas dzielenia unika dzielenia przez 0 przez wywołanie exit().

To kod powinien być zestawiane bez optymalizacji, gdyż zakłada się, że a, bi rznajdują się w sąsiadujących adresów na stos (nie rejestrów CPU).

Ponadto należy go skompilować w trybie 32-bitowym, ponieważ konwertuje wskaźniki na liczby całkowite i odwrotnie.

anatolig
źródło
4

VBA, 484, 453 380 bajtów

Zbyt długo, aby wygrać, ale bardzo prosty sposób na robienie rzeczy, nic Fancy po prostu dobre stare Select Case

Dodawanie podziału liczb całkowitych i obsługi błędów Div 0 Zjadłem wiele bajtów
Usunięto obsługę błędów, ponieważ wydaje się, że normalna obsługa błędów daje tę samą funkcjonalność. Naprawiono Int Division działający zgodnie z oczekiwaniami. Był także krótszy.

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

Podziękowania dla Henrika Ilgena za oszczędność 31 104 bajtów

JimmyJazzx
źródło
2
Nie do końca pewien, czy to działa w VBA (robi w VB6), ale można zaoszczędzić kilka bajtów za pomocą DefInt A-Z, pomijając w ten sposób potrzebę wyraźnie oświadczając A, Bi Rtak Integer: DefInt A-Z:Dim A, B, R. To równie dobrze może pracować tylko przypisać je, bez deklaracji: A=0:B=0:R=0. Obliczenia również powinny działać na wariantach.
Henrik Ilgen,
@HenrikIlgen bardzo dziękuję, zapomniałem o DefIntczymś, czego używam na co dzień, ale w przyszłości będę bardzo przydatny w grze w golfa. Niestety A=0, po prostu sprawi, że będzie działał jak podwójny wynik z moich testów. Tam wytwarzanie iiiaa/wdaje wynik dziesiętny, a nie całość.
JimmyJazzx
1
Spróbuj \ do dzielenia liczb całkowitych;)
Henrik Ilgen
1
Możesz go skondensować do 405 bajtów, jeśli uczynisz go funkcją i użyjesz wartości zwracanej do „zbudowania” wyniku, zakładając, że nie musisz tak naprawdę drukować wyniku :)
Henrik Ilgen
3

PHP, 310 bajtów

Pierwszy raz w życiu za pomocą 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].';');

Pobiera dane z pierwszego wiersza poleceń:

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

Dane wyjściowe z przykładów:

Witaj świecie!
20spooky22me

wstawić nazwę tutaj
źródło
3

C 357

Makra FTW!

(Żartuję - c nigdy tego nie wygra)

#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)}}
Cyfrowa trauma
źródło
2

JavaScript (ES6), 293 262 bajtów

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)

Stosowanie

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

Wyjaśnienie

Jest kilka szczegółów dotyczących języka, którego nie jestem pewien (rozmiary całkowite, obsługa nierozpoznanych znaków itp.), Ale to rozwiązanie wydaje się działać wystarczająco dobrze i ignoruje białe znaki, takie jak znaki nowej linii w przypadku testowym.

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
)
użytkownik 81655
źródło
1
Myślę, że można zaoszczędzić kilka bajtów załączając słownika w ciągu eval jednocześnie zastępując wszystko :$=>z $, a następnie dodanie wymienić na sznurku.
Conor O'Brien
2

Simplex v.0.8 , 211 bajtów

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

Wyjaśnienie

Ponieważ jest to najdłuższy program simpleksowy, jaki do tej pory napisałem, ogólnie wyjaśnię, jak to działa w punktorach.

  • h@u] - definiuje makro 0. To makro po prostu zapisuje do rejestru i sprawia, że ​​lambda nic nie zwraca.
  • u2- przechodzi do powyższego paska i ustawia bieżący bajt na 2; określa to arianię lambdów, które należy zdefiniować.
  • ƒ- rozpocząć wyrażanie lambda; po zakończeniu ]przesunie funkcję lambda na stos lambda. Działa, pobierając (arity) komórki ze wskaźnika do paska lokalnego, a po zakończeniu ustawia pasek lokalny do pobranych komórek, chyba że bieżący bajt nie zostanie zapisany. Nie ma to wpływu na wskaźnik. Makro 0 pozwala na powrót funkcji bez modyfikowania czegokolwiek na pasku.
  • §- przechodzi do pierwszej zapisanej komórki w bieżącym pasku, tj A.
  • ð- przechodzi do ostatniej zapisanej komórki w bieżącym pasku, tj B.
  • {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} powtarzaj, aż stos wejściowy będzie pusty
    • "idspP>akmoO<+-*/w@#e" - polecenia
    • Rly - włóż pasek w krotkę
    • G^u - indeks danych wejściowych w krotce
    • ·- załaduj aktualny bajt th do analizatora lambda
    • uRL- idzie do paska gospodarstwa Ai B(pisze Ai Bjeśli nie istnieją)
    • - wykonuje lambda (jest to ewaluator lambda)
    • - resetuje się poniżej paska

uff , jestem pod wrażeniem. Długo jest na Simplex, ale skrót od wszystkiego innego.;)

Conor O'Brien
źródło
2

Minkolang 0.11 , 222 bajty

Jestem pewien, że można dalej grać w golfa, ale było fajnie. Również pierwszy tłumacz Minkolang w innym języku!

>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

Wypróbuj tutaj.

Wyjaśnienie

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

Pozostałe wiersze są dość proste, być może z wyjątkiem tych 1$((dl%"0"+$rl:d)$Ok, które są idiomem, który wypisuje liczbę bez spacji końcowej. (Nie wdrożyłem jeszcze funkcji konwersji tego numeru na ciąg znaków, która będzie 1Z.) Och, tak, wszystkie mają vna początku, co zabiera je z powrotem na początek.

El'endia Starman
źródło
2

GNU Sed (z opcją eval do oceny ekspresji DC), 289

Zainspirowany Digital Trauma, który niestety nie zdał sobie sprawy, że a) nielegalne znaki należy zignorować, b) dc potrzebuje całego przekonwertowanego programu w jednym argumencie, c) dzielenie przez 0 musi zakończyć program bez błędu.

Gdyby wszystkie te reguły nie miały zastosowania, moje rozwiązanie miałoby tylko 235 bajtów długości;)

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
Bodo Thiesen
źródło
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)}}

Nawias TIL nie był potrzebny wokół printf. 2 bajty zapisane!

Wersja bez golfa dla łatwiejszego czytania:

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)
    }
}
LeFauve
źródło
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())))
dieter
źródło
To nie działa Twoje printwyciągi zawierają znak nowej linii.
Griffin,
1

Ruby, 199 bajtów

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 bajtów można zapisać, usuwając .readz drugiej linii, jeśli tolerujesz drukowanie ostrzeżenia na stderr na nowszej wersji Ruby.

daniero
źródło
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())))

Trochę późno, ale chciałem spróbować.

Nowicjusz
źródło
1

Prolog, 759 bajtów

Nie jest to najkrótszy program, ale przynajmniej jest uporządkowany i czytelny.

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

Przykładowe dane wejściowe

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

Wypróbuj online tutaj

Emigna
źródło