En este desafío, vas a escribir un intérprete para un lenguaje simple que he inventado. El lenguaje se basa en un único acumulador A, que tiene exactamente un byte de longitud. Al comienzo de un programa, A = 0. Estas son las instrucciones de idiomas:
!: Inversión
Esta instrucción simplemente invierte cada bit del acumulador. Cada cero se convierte en uno y cada uno se convierte en cero. ¡Simple!
>: Desplazar a la derecha
Esta instrucción cambia cada bit en un lugar a la derecha. El bit más a la izquierda se convierte en un cero y el bit más a la derecha se descarta.
<: Desplazar a la izquierda
Esta instrucción cambia cada bit en A un lugar a la izquierda. El bit más a la derecha se convierte en cero y el bit más a la izquierda se descarta.
@: Intercambiar Nybbles
Esta instrucción intercambia los cuatro bits superiores de A con los cuatro bits inferiores. Por ejemplo, si A es 01101010y ejecutas @, A será 10100110:
____________________
| |
0110 1010 1010 0110
|_______|
¡Esas son todas las instrucciones! Simple, verdad?
Reglas
- Su programa debe aceptar la entrada una vez al principio. Esta será una línea de código. ¡Este no es un intérprete interactivo! Solo puede aceptar la entrada una vez y no tiene que volver al inicio una vez que se ha ejecutado esa línea.
- Su programa debe evaluar dicha entrada. Todos los personajes que no se mencionan anteriormente se ignoran.
- Su programa debería imprimir el valor final del acumulador, en decimal.
- Se aplican las reglas habituales para lenguajes de programación válidos.
- Las lagunas estándar no están permitidas.
- Este es el código de golf , el recuento de bytes más pequeño gana.
Aquí hay algunos pequeños programas para probar sus envíos. Antes de que la flecha sea el código, después es el resultado esperado:
!->255!>>->63!<@->239!nop!&6*!->255
¡Disfrutar!
fuente

! -> 255que debemos usar 8 bits por byte aquí? La pregunta no es explícita.Respuestas:
Pyth,
3635 bytesArnés de prueba
La representación interna del acumulador es un número entero. Este número entero es modificado por 256 en cada iteración, según se desee. Las operaciones realizadas son
-G-1,G/2,G*2yGconvierten a la base 16, invertido, y de vuelta convertida a la base 10, en dondeGes el acumulador.Me perdí la frase sobre ignorar todo lo demás. Esto ha sido remediado. Gracias, Dennis.
fuente
-G-1es más corto que~Gen Pyth? De alguna manera lo dudo.t_G, en realidad , dónde_está la negación y dóndetestá-1. En Pyth,~significa algo totalmente diferente.~(NO a nivel de bit)C, 96
Asumiendo entrada ASCII (o compatible):
Tidier
Básicamente es solo una colección de expresiones ternarias anidadas. Estoy incrementando el valor obtenido de
getchar()modo que un EOF (-1) resulte en un valor de cero y el programa salga.(enlace ideone)
fuente
!<>debería resultar127y no255). Defina suacomocharo use la líneaa&=255(y use%u) para obtener el efecto correcto. También puedes acortar tu negacióna^255a~a.a>>4&15También es más corto que tu(a&240)/16.%ulugar de%hhua/16|a*16lugar dea/16|(a&15)*16. Los pocos bits en la parte superior se eliminan por el&255.a*257/16es un byte más corto quea/16|a*16.Python 3, 133 bytes
Utiliza un diccionario para compensar la falta de sintaxis de mayúsculas y minúsculas en Python. Ver más aquí .
El acumulador es una cadena que se convierte en un número base 10 al final.
Ejemplo de E / S:
fuente
for i in sys.stdin::)Javascript (ES6),
809190 bytesCasi tan corto como puede ser. Define una función anónima que toma el programa como entrada.
!, tomasx XOR 255, ya que JS~consideraríaxun número de 32 bits.<, se multiplicaxpor 2 y toma el resultado mod 256.>, realmente desplaza los bits dex1 bit a la derecha.@, pisosx/16y agrega ax%16*16.Gracias a @vihan por sugerir el uso de
reducepara guardar un byte.fuente
<para guardar alrededor de 4 bytes. El uso de reducir también podría ahorrar algunos bytes<en lugar de==? Si es así, eso no funcionaría, ya que los caracteres no operativos realizarían incorrectamente una operación. Lo usé en mi solución anterior de 80 bytes.CJam, 37 bytes
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Java (8),
514483411366359239224229198194187186184182181180177 caracteres¡Guau, esto se ha jugado MUCHO! ¡Gracias a todos los que me dieron sugerencias! ¡Lo aprecio mucho!
Golfó 31 (!) Bytes optimizando el intercambio de mordisco con operaciones bit a bit en lugar de
Integer.???métodos largos .Golfé 72 (!!!!) caracteres al eliminar la cadena innecesaria creada para intercambiar mordiscos. ¿Mucho mejor que antes?
Golfé 45 (!!) caracteres eliminando el uso
java.util.Scannery la lecturaSystem.indirectamente. Tenga en cuenta que ahora que la expresión lambda se ha ido, ¡Java 8 ya no es necesario! ¡Simplemente Java 1 lo haría!Golfó 7 caracteres haciendo clase
(default)(publicpalabra clave eliminada ), gracias a @bmarksGolfed 120 (!!!!!!!) caracteres girando todas esas largas
Integeroperaciones de clase en el volteo de bits a255 - a. Ahora que es mucho más corto!Golfé 15 (!) Caracteres al convertir los turnos en multiplicación y división, quitando los corchetes de la declaración while y haciendo
alocales dentro delmainmétodo.Ungolfed 9 = (caracteres debido a un problema con el desplazamiento a la izquierda que no descarta el byte más a la izquierda. Por lo tanto, ahora sí
mod (256). El desplazamiento a la derecha hará que el número resultante sea un poco más corto que antes, por lo que no es necesario utilizarlomoden el desplazamiento a la derecha. Mi cosa de nibble-swap intercambiará los últimos 4 bits y el penúltimo nibble, yand (&)truncará todos los demás bits. Mi programa de inversión no causa ningún problema si el número original es menor que 256.Golfed
3135 caracteres gracias a @Geobits al convertir laswitchdeclaración en muchas declaraciones ternarias, y también convirtiendo caracteres en ints, acortando los literales.Golfó 7 caracteres al eliminar innecesarios
&240en el intercambio de mordisco ((a&240)>>4aa>>4y convertir(a&15)<<4aa<<4&240. Sin embargo, el último cambio solo arrojó un personaje.Golfed 1 Char mediante la eliminación innecesaria
=ena /= 2, porquea = a /= 2es equivalente aa = a / 2.Golfé 2 caracteres recurriendo
printlnaprint.Golfó 2 caracteres al eliminar accidental
a=ena=255-a(a=a=255-aes equivalente aa=255-a)Golfó 1 char convirtiéndose
a<<4&240ena%16<<4.Golfé 1 personaje agregando corchetes al exterior de la declaración ternaria y haciendo
%256. De esa manera, no%16es necesario en la parte de desplazamiento a la izquierda del intercambio de mordisco. Los corchetes agregan 2 caracteres y el%16salva 3 caracteres.Golfed 3 caracteres cambiando
classainterfacey eliminarpublicutilizando la función de método de interfaz estática de Java 8. Gracias a @TheNumberOne (sin comentarios, pero encuentre su respuesta en "Consejos para jugar al golf en Java"fuente
Integerembargo, voy a eliminar todos los métodos de clase.switchgolf tiempo. Loscase/breakson demasiado largos. Debería poder ahorrar un montón haciendo que todo sea ternario; algo así comoa=i=='!'?255-a:i==62?a/2:i=='<'?a*2%256:i=='@'?(a&240)>>4|(a&15)<<4:a;Óxido,
121115bytesEjecución de muestra:
Sin golf:
Sorprendentemente corto para Rust. Nada más realmente interesante aparte del hecho de que aprendí más reglas de precedencia hoy, ¿ quién sabía
(a>>b)|clo mismo quea>>b|c?Afeitado de un byte cambiando
n>>=1an/=2; sin embargo, no se puede hacer lo mismo con la multiplicación, porque el desbordamiento aritmético es un pánico (es decir, un bloqueo) en Rust.fuente
>>es una especie de división y|una especie de suma.HP 41C / CV / CX (? Bytes, 42 pasos)
Solo para risas, aquí está para la calculadora HP 41C / CV / CX. (Requiere el módulo Funciones ampliadas o un 41CX para la función ATOX). Lamentablemente, la calculadora no informa los tamaños de los programas en bytes.
¡Pon tu programa en el registro Alpha, lo cual es un poco complicado, ya que no hay forma de ingresar! o @ directamente desde el teclado (use XTOA con los códigos ASCII 33 y 64 respectivamente para agregarlos).
Los pasos 08 y 10 permiten ignorar códigos de operación inválidos; eliminarlos para guardar 2 pasos, pero el programa se bloqueará en la entrada no válida.
fuente
Python 2, 79 bytes
Me di cuenta de que he hecho algo muy similar a esto en Python anteriormente. Este es solo un puerto de mi respuesta Ruby , pero por cierto es la respuesta más corta de Python a partir de ahora: D
La diferencia con la versión de Ruby es que esta no ignora las instrucciones no válidas mientras itera sobre la entrada. En cambio, aprovecho el hecho de que Python tiende a regresar en
-1lugar denilcuando no hay coincidencia: el valor actual dease agrega al final de la matriz de resultados, de modo que todas las instrucciones no válidas se asignan al mismo valor sin cambios.fuente
Python 3,
1249493 bytes"!" es lo mismo que restar de 255.
"<" es lo mismo que multiplicar por 2. Pero el registro de 8 bits significa mod 256.
">" es lo mismo que la división de enteros por 2.
"@" significa cambiar los últimos 4 bits (
a%16) por 4 bits (*16) y agregando los primeros cuatro bits (a/16).EDITAR (leer copia descarada)
Vio la otra respuesta en python (por Beta decay). Utiliza una forma realmente efectiva de simular casos de cambio usando el diccionario. Usando eso podemos escribir
Gracias, Beta Decay.
fuente
256¿verdad? Entonces, ¿por qué no hacer eso al finala={"!":255-a,"<":a*2,">":a//2,"@":(a%16)<<4+a>>4}.get(i,a)%256? Esto inmediatamente le ahorra un byte (porque lo hará ena*2lugar dea<<1) ... pero la respuesta de @ daniero también muestra que si lo hace de esta manera,(a%16)<<4puede acortarse a soloa<<4, ya que cualquier bit 16 o mayor se eliminará una vez que multiplique en 16 y reducirlo mod 256. ¡Genial! Además, ahora puede reemplazar255-apor-1-a... o mejor, simplemente~a. En total, estas sugerencias deberían ahorrarle 9 bytes.Haskell, 89 bytes
Ejemplo de uso:
f "!>>"->63fuente
Óxido, 111 bytes
Más comentarios sobre la respuesta de @ Doorknob, pero no tengo ningún representante para los comentarios, ya que acabo de crear una cuenta.
Uno puede eliminar 10 bytes de su solución Rust con lo siguiente:
fuente
Python 3, 127 bytes
Editar: cortocircuito, gracias @Jakube
Edit2: arreglo, gracias @Anachor
fuente
!<da510mientras debería ser254Ceilán,
297290Formateado:
#fy#f0son números hexadecimales para los nibbles,.byteconvierte un número entero en un byte. Tengo suerte de que el.stringatributo Byte ya use la representación sin signo de un byte. Ceilán también presenta una declaración de cambio sin caída, y una cadena es una lista de caracteres, que se puede iterar.También traté de reducir los nombres de los métodos de desplazamiento largo utilizando una importación de alias, pero en realidad esto se vuelve 7 bytes más largo:
Formateado:
Esto podría ser útil si necesitamos esos métodos un poco más a menudo.
fuente
Rubí,
8173 bytesMucho más simple: ¡no evalúe! Para cada carácter válido en la entrada, evalúa cada instrucción y encuentra la instrucción apropiada a través del índice de
$&(el carácter actual en la entrada).fuente
STATA, 197 bytes
Sin golf
No funciona con el intérprete en línea y requiere el intérprete predeterminado no libre. Esto sería algo más fácil con las operaciones bit a bit reales, pero no creo que sean demasiado útiles para la mayoría de los usos comunes de STATA.
fuente
JavaScript, 104
Los operadores ternarios anidados se asignan a las instrucciones.
BITWISE AND se usa para restringir nuestro tipo de Número a un solo byte.
fuente
Julia,
117948673 bytesEsta es una función anónima que acepta una cadena y devuelve un entero. Para llamarlo, asígnelo a una variable.
Sin golf:
¡Ahorré 8 bytes gracias a Sp3000 y 13 gracias a Dennis!
fuente
JavaScript (ES6), 76
81Como una función sin nombre que devuelve el valor del acumulador
Este es un portafolio de las respuestas súper inteligentes de @daniero (que tienen muy pocos votos a favor)
Bonificación: puede pasar un valor inicial del acumulador. Si no se pasa, el valor inicial es 0 como específico.
Pruebe a ejecutar el fragmento a continuación en cualquier navegador EcmaScript 6 (lo probé en Firefox)
fuente
Cristal, 139 bytes
fuente
C # 193
fuente
using System;o algo así para accederConsole.ReadLineyConsole.Writesin elSystem.prefijo?bytepara cada operación, pero podría estar equivocado.Lua, 344 char
Inspirado por el uso de @Beta Decay de un acumulador de cadenas, ya que lua no tiene ningún tipo de byte. Probablemente podría jugar más golf usando menos funciones.
fuente
R, 194 bytes
sin golf
fuente
<-puede ser sustituido por=aquí, lo que reduce el código de 7 bytes. Además, es posible que pueda reemplazar la serie deifdeclaraciones por una llamada aswitch(como enA=switch(r,"!"=(A+1)%%2, ...))b=readline();A=rep(0,8);s=strsplit(b,"")[[1]];for(r in s)A=switch(r,"!"=(A+1)%%2,">"=c(0,A)[1:length(A)],"<"=c(A,0)[-1],"@"=c(A[5:8],A[1:4]),A);print(sum(A*(2^(7:0))))es 167 bytes.RPL, 170,5 bytes
La entrada debe ingresarse como una cadena en el nivel 1.
fuente
K, 57 bytes
Es un comienzo:
probado usando Kona:
Es posible que pueda hacerlo mejor en k5, pero es una serie compleja de compensaciones, por ejemplo, convertir binario a decimal es tan fácil como
2/, pero el comportamiento de?hace que sea más difícil manejar un caso predeterminado para la búsqueda de instrucciones.fuente
PHP, 189 bytes
No es que supere muchas respuestas, es solo para practicar
fuente
HPPPL ,
302294 bytesSin golf:
Esta respuesta asegura que el HP Prime utilice enteros de 8 bits sin signo, incluso si el modo está configurado en, por ejemplo, 64 bits por el usuario. Si la calculadora se configura manualmente para usar enteros decimales de 8 bits sin signo, entonces
pragmase puede omitir el comando. Si la salida no necesita seguir estrictamente el formato, entoncesa*1simplemente puede ser al finala. Multiplicar el resultado por 1 solo garantiza que la salida no siga la salida interna para valores enteros. Elprintcomando en la línea 4 también se puede omitir si no es necesario borrar el terminal antes de imprimir el resultado. Si se permite pasar el programa como un argumento de cadena, entonces elINPUTse puede omitir comando.Esta es la versión más corta con entrada y salida adecuada, sin el argumento pragma (si la calculadora está configurada en Uint8 por defecto:
243 bytes:
fuente
Perl 6,
9689 bytesVieja solución:
fuente
C #, 119 bytes
Intenté otras versiones, pero necesito más bytes:
fuente
Python 2.7.3, 104 bytes
Tener código en cadenas para evaluar se ve bastante sucio, pero funciona: D
Aquí está la salida (y la entrada en realidad ..)
Y sí, realmente se está ejecutando en un RaspberryPi :)
fuente