¡Haz un intérprete de 3var!


24

3var es una variante del pez muerto que usa tres variables llamadas A, B y R. A y B son acumuladores, mientras que R se usa como variable de resultado.

En este desafío de , debe hacer un intérprete para una versión simplificada de este lenguaje.

Comandos requeridos:

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

Todo lo demás (incluidos los espacios en blanco) se ignora.

Aclaraciones

  • oy pdebería salir sin nada después.
  • La división es una división entera.
  • Se admiten números superiores a 255 y números inferiores a 0.
  • 'w' debería generar un espacio o una nueva línea después de R
  • La división por 0 se detiene sin errores. (Sin salida a STDERR)
  • A, B y R son inicialmente 0

Reglas

  • Este es el por lo que gana la respuesta más corta.
  • En caso de empate, gana la respuesta más antigua.
  • El archivo se proporcionará a través de argumentos de línea de comando o STDIN.
  • Cualquier idioma está permitido.
  • Eval está permitido.

Casos de prueba

Hello world! (tomado de 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

Salidas 20spooky22me:

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

Salidas 9P-1420 100 3Q-1 162 0:

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

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

# [><>](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 Hablando de eso, recientemente ayudé a corregir un error de bucle anidado en el intérprete.
LegionMammal978

2
Aclaraciones adicionales para personas familiarizadas con Deadfish: dddddpresultados en -5 y iiiisspresultados en 256 como cabría esperar, en lugar de 0.
Sp3000

1
En el caso de prueba ¿Qué dosis rhacer? no está incluido en su lista de comandos válidos
JimmyJazzx

1
@JimmyJazzx El caso de prueba ahora está editado, pero en el lenguaje 3var completo se restablece todo. Es lo mismo que @#e.
DJgamer98

1
¿Se inicializan A, B y R a 0 cuando comienza el intérprete?
Tony Ennis

Respuestas:


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=

Pruébalo en línea

Explicación:

El programa crea una matriz de piezas de código para ejecutar, y ejecuta la pieza correspondiente para cada personaje. Tratar con la división por cero es más difícil, porque CJam aún no tiene un operador "break". En cambio, el programa empuja π como marcador (ya que de lo contrario no puede aparecer un número de coma flotante), y al final solo mantiene la salida antes del primer π.
Además, el programa usa las variables T, U y V en lugar de A, B y R, porque están preinicializadas con 0 en 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)

Las implementaciones de comandos reales (construidas por el programa):

+: 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 Copiándose entre sí, I y Dendrobium están colapsando juntos.

Edit2 Usando EcmaScript 7 para guardar solo 2 bytes, junto con el manejo de A y B

Editar Siguiendo los cambios de las reglas.

Tenga en cuenta que agregué el rcomando que no se requiere en la pregunta, solo para ejecutar el viejo ejemplo 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>


Se podría ahorrar 2 bytes mediante la eliminación A=B=R=0,y el establecimiento de las variables reales utilizando los 3var funciones antes de procesar la cadena, como: [...'@#e'+p].
insertusernamehere

2
@insertusernamehere thx, me encanta este
edc65

8

GNU Sed (con la opción eval para evaluar la dcexpresión), 254

Deadfish asigna bastante bien a un subconjunto de dc. Entonces usamos sed para hacer ese mapeo:

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 bytes

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)

Sin golf

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 No lejos de la mía, pero mejor. Ahora tendré que probar algo diferente
edc65

1
Se podría ahorrar 2 bytes mediante la eliminación A=B=R=0,y el establecimiento de las variables reales utilizando los 3var funciones antes de procesar la cadena, como: for(c of '@#e'+s).
insertusernamehere

1
@insertusernamehere Aha, eso es bastante inteligente, ¡gracias!
Dendrobium

Al revisar su respuesta, veo que no w
genera

@ edc65 Una de las viñetas de aclaración dice "'w' debería mostrar un espacio o una nueva línea después de 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}¨⍵}

Esta es una función que toma el programa como argumento, por ejemplo:

      ∆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

Se puede usar como una función anónima, solo le puse un nombre para mayor claridad.

Explicación:

  • 0::→: si se produce un error (por ejemplo, división por cero), pare sin imprimir el mensaje de error
  • A B R←0: inicializar variables
  • {... }¨⍵: para cada comando:

    • ⍵∊G←'aikdms<>': Si el comando es uno del tipo var ← fn (var, x) , encuentre el fn y x adecuado , sustitúyalos y luego evalúelo:
      • : evaluar
      • 'AB'[1+2|G⍳⍵: Asi la posición de in 'aikdms<>'es par, de lo Bcontrario.
      • '+-*∘'[M]: sumar, restar, poder o nada, dependiendo de M(definido más adelante)
      • '←': asignar
      • '112R'[M←⌈2÷⍨G⍳⍵]: 1(para sumar y restar), 2(para potencia) y R(para nada, es decir, solo establece la variable en R), dependiendo de Msi el comando pertenece al primer, segundo, tercer o cuarto par.
    • ⍵∊G←'PpOo': salida:
      • ⍞←: salida
      • ⎕UCS⍣(2|G⍳⍵): ASCII (bueno, Unicode) o número dependiendo de si el comando estaba en una posición impar o par PpOo,
      • ⊢A B[⌈2÷⍨G⍳⍵]: Ao B, dependiendo de si el comando estaba en la primera o segunda mitad.
    • ⍵∊G←'+-*/: matemáticas:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B: se establece Ren el resultado de aplicar el operador dado a Ay B.
    • ⍵∊G←'@#e': Reiniciar:

      • : evaluar
      • 'ABR'[G⍳⍵]: seleccione la variable correcta
      • '∘←0': puesto a cero
    • ⍵='w':⍞←R: si el comando es w, salida R.


4

C, 253 241 bytes

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

Este código usa la cadena id@s>ak#m<e+-*/wpoPOcomo una tabla de comandos. La cadena se organiza según el destino de la expresión calculada. Sucede que hay 5 comandos que actualizan cada una de las variables:

  • id@s> - actualización a
  • ak#m< - actualización b
  • e+-*/ - actualización r
  • wpoPO- actualizar ... la ubicación de la memoria después a, by r. Espero que no sea demasiado importante :)

Entonces, después de ubicar el carácter de entrada en la cadena de comandos, su índice se reduce repetidamente y, dependiendo de cuándo llega a 0, se elige una expresión.

Si no llega a 0 después de 15 restas, es un printfcon algunos argumentos correctamente elegidos.

Además, al dividir, evita la división por 0 llamando exit().

Este código debe compilarse sin optimizaciones, porque se supone que a, by restán situados en direcciones adyacentes en la pila (no en registros de la CPU).

Además, debe compilarse en modo de 32 bits, ya que convierte los punteros en enteros y viceversa.


4

VBA, 484, 453 380 Bytes

Anhelar ganar, pero una forma súper simple de hacer las cosas, Nothing Fancy, simplemente bueno. Select Case

Agregar en la División de enteros y Div 0 Manejo de errores Comió una gran cantidad de bytes
eliminados Manejo de errores, ya que parece que el manejo normal de errores da como resultado la misma funcionalidad. Se reparó la división Int para que funcione como se esperaba. También fue más corto.

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

Gracias a Henrik Ilgen para el ahorro de 31 104 bytes


2
No sabe con certeza si esto funciona en VBA (lo hace en Visual Basic 6), pero se puede ahorrar un montón de bytes utilizando DefInt A-Z, omitiendo así la necesidad de declarar de manera explícita A, By Rque Integer: DefInt A-Z:Dim A, B, R. Es así podría funcionar sólo asignarlos, sin declaración: A=0:B=0:R=0. Los cálculos también deberían funcionar en variantes.
Henrik Ilgen el

@HenrikIlgen muchas gracias, se olvidó de DefIntno algo que uso todos los días, pero será un VBA de golf súper útil en el futuro. Lamentablemente A=0, solo haré que actúe como un doble de mis pruebas. Allí para hacer iiiaa/wproducir un resultado decimal en lugar de un todo.
JimmyJazzx

1
Prueba \ para la división entera;)
Henrik Ilgen

1
Puede condensarlo a 405 bytes si lo convierte en una función y utiliza el valor de retorno para "construir" el resultado, suponiendo que no tenga que imprimir realmente el resultado :)
Henrik Ilgen

3

PHP, 310 bytes

Primera vez en mi vida usando 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].';');

Toma la primera entrada de línea de comando:

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

Salida de los ejemplos:

¡Hola Mundo!
20spooky22me


3

C, 357

Macros FTW!

(¿A quién estoy bromeando? C nunca ganará este)

#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 bytes

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)

Uso

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

Explicación

Hay algunos detalles del lenguaje sobre los que no estoy seguro (tamaños enteros, manejo de caracteres no reconocidos, etc.) pero esta solución parece funcionar suficientemente e ignora los espacios en blanco como las nuevas líneas en el caso de prueba.

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
Creo que podría guardar algunos bytes encerrando el diccionario dentro de una evaluación mientras reemplaza todo :$=>con $, luego agrega un reemplazo para la cadena.
Conor O'Brien

2

Simplex v.0.8 , 211 bytes

(UTF-8 codificado).

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

Explicación

Como este es el programa simplex más largo que he escrito hasta ahora, generalmente explicaré cómo funciona esto en viñetas.

  • h@u] - define la macro 0. Esta macro simplemente escribe en el registro y hace que una lambda no devuelva nada.
  • u2- va a la tira anterior y establece el byte actual en 2; Esto define la aridad de las lambdas a definir.
  • ƒ- comienza la expresión lambda; una vez completado por ], empujará la función lambda a la pila lambda. Actúa tomando celdas (arity) del puntero en su tira local y, una vez completado, establecerá su tira local en las celdas tomadas, a menos que el byte actual no esté escrito. El puntero no se ve afectado. La macro 0 permite que una función regrese sin modificar nada en la tira.
  • § - se mueve a la primera celda escrita en la tira actual, es decir A .
  • ð- se mueve a la última celda escrita en la tira actual, es decir B.
  • ... {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} repita hasta que la pila de entrada esté vacía
    • "idspP>akmoO<+-*/w@#e" - los comandos
    • Rly - poner la tira en una tupla
    • G^u - el índice de la entrada en la tupla
    • ·- cargar el byte actual th en el evaluador lambda
    • uRL- va a la tira Ay B(escribe Ay Bsi no existen)
    • - ejecuta lambda (este es el evaluador lambda)
    • - se restablece debajo de la tira

uf , estoy impresionado. Es largo para Simplex, pero corto para todo lo demás.;)


2

Minkolang 0.11 , 222 bytes

Estoy seguro de que esto se puede jugar más, pero fue divertido. ¡Además, primer intérprete de Minkolang de otro idioma!

>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

Pruébalo aquí

Explicación

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

El resto de las líneas son bastante simples, quizás con la excepción de aquellas con 1$((dl%"0"+$rl:d)$Ok, que es un modismo que imprime un número sin un espacio final. (Todavía no he implementado la funcionalidad convertir-este-número-a-una-cadena, que será 1Z). Oh, sí, todos tienen un val principio, lo que lo lleva de vuelta al principio.


2

GNU Sed (con la opción eval para evaluar la expresión dc), 289

Inspirado por Digital Trauma, que lamentablemente no se dio cuenta, que a) los caracteres ilegales deben ser ignorados, b) dc necesita todo el programa convertido en un argumento yc) la división por 0 debe terminar el programa sin error.

Si no se aplicaran todas estas reglas, mi solución solo tendría 235 bytes de longitud;)

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 paréntesis no fueron necesarios alrededor de printf. ¡2 bytes guardados!

Versión sin golf para una lectura más fácil:

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

Pitón 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())))

Esto no funciona Sus printdeclaraciones incluyen una nueva línea final.
Griffin

1

Rubí, 199 bytes

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]}

Se pueden guardar 5 bytes al eliminarlos .readde la segunda línea si puede tolerar que se imprima una advertencia en stderr en la versión más reciente de Ruby.


1

Pitón, 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())))

Un poco tarde pero quería intentarlo.


1

Prólogo, 759 bytes

No es el programa más corto, pero al menos es estructurado y legible.

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

Entrada de ejemplo

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

Pruébelo en línea aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.