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 código de golf , 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
o
yp
deberí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 código de golf, 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 N
está 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>
fuente
dddddp
resultados en -5 yiiiissp
resultados en 256 como cabría esperar, en lugar de 0.r
hacer? no está incluido en su lista de comandos válidos@#e
.Respuestas:
CJam, 112
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.
Las implementaciones de comandos reales (construidas por el programa):
fuente
JavaScript (ES7) 208
213 223 237 241 311Edit3 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é elr
comando que no se requiere en la pregunta, solo para ejecutar el viejo ejemplo Hello worldfuente
A=B=R=0,
y el establecimiento de las variables reales utilizando los 3var funciones antes de procesar la cadena, como:[...'@#e'+p]
.GNU Sed (con la opción eval para evaluar la
dc
expresión), 254Deadfish asigna bastante bien a un subconjunto de
dc
. Entonces usamos sed para hacer ese mapeo:fuente
Javascript
ES6ES7,217215213208 bytesSin golf
fuente
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)
.w
APL, 191
Esta es una función que toma el programa como argumento, por ejemplo:
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 errorA 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⍳⍵
:A
si la posición de⍵
in'aikdms<>'
es par, de loB
contrario.'+-*∘'[M]
: sumar, restar, poder o nada, dependiendo deM
(definido más adelante)'←'
: asignar'112R'[M←⌈2÷⍨G⍳⍵]
:1
(para sumar y restar),2
(para potencia) yR
(para nada, es decir, solo establece la variable enR
), dependiendo deM
si 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 parPpOo
,⊢A B[⌈2÷⍨G⍳⍵]
:A
oB
, dependiendo de si el comando estaba en la primera o segunda mitad.⍵∊G←'+-*/
: matemáticas:R∘←⌊A(⍎'+-×÷'[G⍳⍵])B
: se estableceR
en el resultado de aplicar el operador dado aA
yB
.⍵∊G←'@#e':
Reiniciar:⍎
: evaluar'ABR'[G⍳⍵]
: seleccione la variable correcta'∘←0
': puesto a cero⍵='w':⍞←R
: si el comando esw
, salidaR
.fuente
C,
253241 bytesEste código usa la cadena
id@s>ak#m<e+-*/wpoPO
como 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óna
ak#m<
- actualizaciónb
e+-*/
- actualizaciónr
wpoPO
- actualizar ... la ubicación de la memoria despuésa
,b
yr
. 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
printf
con 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
,b
yr
está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.
fuente
VBA,
484, 453380 BytesAnhelar 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 byteseliminados 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.
fuente
DefInt A-Z
, omitiendo así la necesidad de declarar de manera explícitaA
,B
yR
queInteger
: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.DefInt
no algo que uso todos los días, pero será un VBA de golf súper útil en el futuro. LamentablementeA=0
, solo haré que actúe como un doble de mis pruebas. Allí para haceriiiaa/w
producir un resultado decimal en lugar de un todo.PHP, 310 bytes
Primera vez en mi vida usando
:eval
Toma la primera entrada de línea de comando:
Salida de los ejemplos:
fuente
C, 357
Macros FTW!
(¿A quién estoy bromeando? C nunca ganará este)
fuente
JavaScript (ES6),
293262 bytesUso
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.
fuente
:$=>
con$
, luego agrega un reemplazo para la cadena.Simplex v.0.8 , 211 bytes
(UTF-8 codificado).
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 decirA
.ð
- se mueve a la última celda escrita en la tira actual, es decirB
.{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
{...Ï}
repita hasta que la pila de entrada esté vacía"idspP>akmoO<+-*/w@#e"
- los comandosRly
- poner la tira en una tuplaG^u
- el índice de la entrada en la tupla·
- cargar el byte actual th en el evaluador lambdauRL
- va a la tiraA
yB
(escribeA
yB
si no existen)†
- ejecuta lambda (este es el evaluador lambda)vø
- se restablece debajo de la tirauf , estoy impresionado. Es largo para Simplex, pero corto para todo lo demás.
;)
fuente
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!
Pruébalo aquí
Explicación
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 unv
al principio, lo que lo lleva de vuelta al principio.fuente
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;)
fuente
AWK,
311309TIL paréntesis no fueron necesarios alrededor de printf. ¡2 bytes guardados!
Versión sin golf para una lectura más fácil:
fuente
Pitón 2, 272
fuente
print
declaraciones incluyen una nueva línea final.Rubí, 199 bytes
Se pueden guardar 5 bytes al eliminarlos
.read
de la segunda línea si puede tolerar que se imprima una advertencia en stderr en la versión más reciente de Ruby.fuente
Pitón, 244
Un poco tarde pero quería intentarlo.
fuente
Prólogo, 759 bytes
No es el programa más corto, pero al menos es estructurado y legible.
Entrada de ejemplo
Pruébelo en línea aquí
fuente