Me gusta jugar golf dc
, pero a veces estoy frustrado porque dc
no tiene operaciones bit a bit.
Desafío
Proporcionar cuatro funciones con nombre que implementan el equivalente de las operaciones c bit a bit &
, |
, ~
y ^
(bitwise AND, OR, NOT y XOR). Cada función tomará dos operandos ( ~
toma solo uno) que son al menos enteros sin signo de 32 bits. Cada función devolverá un entero sin signo del mismo ancho de bits que los operandos.
Restricción
Solo puede usar operaciones compatibles con dc
. Estos son:
+
-
*
/
Suma, resta, multiplicación y división aritmética~
módulo (o divmod si su idioma lo admite)^
exponenciación|
exponenciación modularv
raíz cuadrada>
>=
==
!=
<=
<
operadores estándar de igualdad / desigualdad>>
<<
operadores de desplazamiento de bits.dc
no tiene estos, pero dado que se implementan trivialmente en términos de división / multiplicación por potencias de 2, entonces permitiré estos.
Las estructuras de control en dc
mi se pueden construir torpemente usando macros (recursivas) y operaciones de (in) igualdad. Puede usar cualquier estructura de control incorporada que tenga su idioma.
También puede usar operadores lógicos &&
||
!
, aunque estos no estén disponibles directamente en dc
.
Usted no debe utilizar los operadores bit a bit &
, |
, ~
y ^
o las funciones que implementan trivialmente ellos.
Además, no debe utilizar operadores o funciones integrados de conversión de cadenas de base.
También considere proporcionar un programa de prueba o un fragmento de compilador en línea (no incluido en el puntaje de golf) para ayudar a verificar su respuesta.
fuente
Respuestas:
C, 134
El preprocesador C es bastante divertido de abusar. Básicamente esta macro define las 3 funciones,
a
,o
, yx
, porand
,or
yxor
respectivamente. La única diferencia en el algoritmo para estas operaciones es el criterio para establecer el bit en el resultado.not
Es la funciónn
.Programa de prueba (lleva mucho tiempo, no pasé ningún tiempo optimizándolo en absoluto, pero prueba todos los casos de prueba posibles, además de los relacionados con MAX_INT):
fuente
ised 76 bytes
ised tampoco tiene operaciones bit a bit, generalmente molestas, pero ahora bienvenidas, porque realmente necesitamos implementarlas.
Las funciones se almacenarán en ranuras de memoria numeradas (sin nombres detallados).
Conversión ay desde binario:
NO podría ser,
@1{:$6::{1-$5::x}:}
pero obviamente es más fácil restar:O:
Y:
XOR:
Esto nos llevaría a 156 bytes (con líneas nuevas y punto y coma). Un código de prueba simplemente sería (NOT, OR, AND, XOR en sucesión, encontrado bajo los nombres $ 1, $ 2, $ 3, $ 4):
Pero, por supuesto, OR y NOT son todo lo que realmente necesitamos y las cosas se pueden simplificar:
Eso es 109 caracteres. Cuando se saltan las líneas nuevas y los puntos y comas, y con un poco más de golf, tenemos 76 caracteres:
fuente
Nim
(537)(490)Nim Compiler 0.10.2
He estado buscando una razón para aprender nim, así que aquí vamos.
Para el golf de código, he aprovechado parámetros variables y retornos implícitos. Los parámetros variables, según la documentación, son menos eficientes en la pila. Personalmente, encuentro que los retornos implícitos son más difíciles de leer y probablemente solo los usaría en procedimientos triviales.
En cuanto a los algoritmos, son lo suficientemente simples. Para todas las operaciones, excepto NOT, comparamos cada bit y los comparamos manualmente con nuestra tabla de verdad esperada. Establezca cada bit según sea necesario en nuestra variable de salida. En Nim, el resultado es el valor de retorno implícito.
No estaba seguro de si se nos permitía usar OR y AND integrados para afirmar dos condiciones booleanas, por lo que el procedimiento notZero se puso en su lugar.Todavía estoy buscando un mejor método ...
Aquí está la versión no aplastada más el arnés de prueba completo para ejecutar en su propia máquina.
Si solo desea ejecutar un par de entradas, aquí está el caso de prueba lite .
fuente
CJam, 71 bytes
Explicación
Banco de pruebas
Este código prueba ejecuciones de cada una de mis funciones my and or or not y xor 100 veces con entradas sin signo distribuidas uniformemente de 64 bits y compara el resultado con el producido por el operador incorporado. Debido al uso gratuito del operador eval, es bastante lento y puede tomar hasta aproximadamente un minuto con el intérprete en línea. Pero si todo va bien, la ejecución debería terminar sin salida, porque se imprimen las discrepancias encontradas.
fuente
JavaScript
294267Pude reducir algunos bytes más con las sugerencias de @ AlexA. y @ kennytm.
Funciones:
ejemplo:
salida:
fuente
for
y reemplazarlofunction B(n,m,t)
conB=(n,m,t)=>
. Del mismo modo para las otras funciones.4*(1<<30)
para 4294967296 y-1>>>0
para 4294967295.. ¿Esvar
realmente necesario aquí? ③ podrías escribir en(n,m)=>B(n,m,'a')
lugar de(n,m)=>{return B(n,m,'a')}