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 01101010
y 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
! -> 255
que 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*2
yG
convierten a la base 16, invertido, y de vuelta convertida a la base 10, en dondeG
es el acumulador.Me perdí la frase sobre ignorar todo lo demás. Esto ha sido remediado. Gracias, Dennis.
fuente
-G-1
es más corto que~G
en Pyth? De alguna manera lo dudo.t_G
, en realidad , dónde_
está la negación y dóndet
está-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 resultar127
y no255
). Defina sua
comochar
o use la líneaa&=255
(y use%u
) para obtener el efecto correcto. También puedes acortar tu negacióna^255
a~a
.a>>4&15
También es más corto que tu(a&240)/16
.%u
lugar de%hhu
a/16|a*16
lugar dea/16|(a&15)*16
. Los pocos bits en la parte superior se eliminan por el&255
.a*257/16
es 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íax
un número de 32 bits.<
, se multiplicax
por 2 y toma el resultado mod 256.>
, realmente desplaza los bits dex
1 bit a la derecha.@
, pisosx/16
y agrega ax%16*16
.Gracias a @vihan por sugerir el uso de
reduce
para 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.Scanner
y la lecturaSystem.in
directamente. 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)
(public
palabra clave eliminada ), gracias a @bmarksGolfed 120 (!!!!!!!) caracteres girando todas esas largas
Integer
operaciones 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
a
locales dentro delmain
mé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 utilizarlomod
en 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 laswitch
declaración en muchas declaraciones ternarias, y también convirtiendo caracteres en ints, acortando los literales.Golfó 7 caracteres al eliminar innecesarios
&240
en el intercambio de mordisco ((a&240)>>4
aa>>4
y convertir(a&15)<<4
aa<<4&240
. Sin embargo, el último cambio solo arrojó un personaje.Golfed 1 Char mediante la eliminación innecesaria
=
ena /= 2
, porquea = a /= 2
es equivalente aa = a / 2
.Golfé 2 caracteres recurriendo
println
aprint
.Golfó 2 caracteres al eliminar accidental
a=
ena=255-a
(a=a=255-a
es equivalente aa=255-a
)Golfó 1 char convirtiéndose
a<<4&240
ena%16<<4
.Golfé 1 personaje agregando corchetes al exterior de la declaración ternaria y haciendo
%256
. De esa manera, no%16
es necesario en la parte de desplazamiento a la izquierda del intercambio de mordisco. Los corchetes agregan 2 caracteres y el%16
salva 3 caracteres.Golfed 3 caracteres cambiando
class
ainterface
y eliminarpublic
utilizando 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
Integer
embargo, voy a eliminar todos los métodos de clase.switch
golf tiempo. Loscase
/break
son 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)|c
lo mismo quea>>b|c
?Afeitado de un byte cambiando
n>>=1
an/=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
-1
lugar denil
cuando no hay coincidencia: el valor actual dea
se 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*2
lugar dea<<1
) ... pero la respuesta de @ daniero también muestra que si lo hace de esta manera,(a%16)<<4
puede 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-a
por-1-a
... o mejor, simplemente~a
. En total, estas sugerencias deberían ahorrarle 9 bytes.Haskell, 89 bytes
Ejemplo de uso:
f "!>>"
->63
fuente
Ó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
!<
da510
mientras debería ser254
Ceilán,
297290Formateado:
#f
y#f0
son números hexadecimales para los nibbles,.byte
convierte un número entero en un byte. Tengo suerte de que el.string
atributo 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.ReadLine
yConsole.Write
sin elSystem.
prefijo?byte
para 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 deif
declaraciones 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
pragma
se puede omitir el comando. Si la salida no necesita seguir estrictamente el formato, entoncesa*1
simplemente puede ser al finala
. Multiplicar el resultado por 1 solo garantiza que la salida no siga la salida interna para valores enteros. Elprint
comando 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 elINPUT
se 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