Este es un CMC (mini desafío de chat) que publiqué en nuestra sala de chat, The Ninteenth Byte , hace un poco.
El reto
Dado un entero positivo x
, dependiendo de los últimos 2 bits de x
, haga lo siguiente:
x & 3 == 0: 0
x & 3 == 1: x + x
x & 3 == 2: x * x
x & 3 == 3: x ^ x (exponentiation)
De entrada y salida
Single Integer -> Single Integer
Se permite una nueva línea final en la salida. No se permite ningún otro espacio en blanco.
Casos de prueba
input output
1 2
2 4
3 27
4 0
5 10
6 36
7 823543
8 0
9 18
10 100
11 285311670611
12 0
Este es un desafío de código de golf , por lo que gana el código más corto.
0
caso, serx + 2
, viendo que los otros sonx * 2
,x ^ 2
yx ^^ 2
(tetración)? : Px ^ x
) 32 bits ya no es suficiente para el caso de prueba11
, y 64 bits no es suficiente para el caso de prueba19
.Respuestas:
Jalea , 8 bytes
Pruébalo en línea!
Cómo funciona
En primer lugar, observe que
x&3
es equivalente ax%4
, donde%
es módulo. Entonces, dado que Jelly usa la indexación modular (a[n] == a[n+len(a)]
), entonces ni siquiera necesitamos ocuparnos de eso.Luego:
x%4==0
, devuelvex_x
(resta) (por consistencia);x%4==1
, vuelvex+x
;x%4==2
, retornox×x
(multiplicación);x%4==3
, retornox*x
(exponenciación)Tenga en cuenta que Jelly utiliza la indexación 1, por lo que la resta
"_"
se mueve al final.fuente
wc --bytes
).Python , 30 bytes
Pruébalo en línea!
fuente
CJam , 12 bytes
Pruébalo en línea!
Explicación
Ejecuta una de las siguientes operaciones dependiendo del
x
valor del mod 4 (mod 4 es equivalente a AND 3).fuente
Mathematica 25 Bytes
Guardado 4 Bytes gracias a @MartinEnder
fuente
Pyth, 8 bytes
Interprete
fuente
v
lugar de.v
..v
que no podía accederQ
... Aparentemente me superaron en Pyth. +1 para tiv
que tiene alcance local,.v
solo evalúa una expresión."0y*^
podría ser"-+*^
.Rubí , 26 bytes
Pruébalo en línea!
fuente
PHP, 37 bytes
Versión en línea
PHP, 47 bytes
Versión en línea
Funciones de BC Math
fuente
Haskell,
2827 bytesPruébalo en línea!
Editar: Gracias a @ Ørjan Johansen por 1 byte.
fuente
cycle
.JavaScript, 24 bytes
Pruébalo en línea!
fuente
C, 63 o 62 bytes
-1 byte si se permiten macros, suponiendo
x
que no sea una expresión como3+5
(ya que eso estropearía la precedencia):fuente
cast to incomplete array type "int[]" is not allowed
Compiler dijoerror C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
; ¡ADEMÁS! ¿Dónde está int f (int x)? el código es en realidad al menos 8 bytes más largo; también es muy lento e ineficiente, ya que evalúa todo - no lo repita IRL)(int[])
sintaxis para esta situación. 2)f(x)
es perfectamente legal C89. No especifiqué el estándar. 3) Se trata del tamaño del código, no de la eficiencia. Y 4) Si va a ser condescendiente, al menos use un compilador real y / o verifique sus hechos.Java 7, 75 bytes
Aunque es válido según las reglas,
long
es de 64 bits, por lo que falla en los casos de prueba de exponenciación de19^19
y superiores. Para arreglar eso podemos usar unBigDecimal
enfoque:148146 bytesExplicación (del enfoque BigDecimal):
Código de prueba:
Pruébalo aquí
Salida:
fuente
Ensamblador x86, sintaxis Intel, 192 bytes
El ejemplo pretende la velocidad de trabajo más rápida. Is es un programa o parte del programa, que utiliza la convención de llamada rápida. Asume una variable de entrada
x
en el registroeax
y devuelve el resultado también eneax
. La idea básica es mantenerse alejado del uso de saltos condicionales, como en algunos ejemplos aquí. Además, no es evaluar todo (como en el ejemplo de C con matrices) sino utilizar una matriz de punteros para functons y hacer saltos incondicionales más rápidos (jmp / call) como un análogo optimizado de "cambio de lenguaje C () - mayúsculas y minúsculas". Esta técnica también podría ser útil en tipos de autómatas finitos, como emuladores de procesadores, ejecutores, etc.Upd: para x64 use "r" en los nombres de registro, en lugar de "e" (por ejemplo, en
rax
lugar deeax
, enrcx
lugar deecx
). El tamaño no se cambiará y utilizará palabras sin signo de 64 bits.fuente
C #, 39 bytes
Explicación
Observa eso:
(xx, x + x, x * x, x ^ x) == (0, 2, x, x ^ (x-1)) * x
La solución crea una matriz, la indexa y luego multiplica el resultado por
x
:Versiones alternativas:
(39B, toda la multiplicación realizada en la matriz,
x%4
reemplazax&3
)(39B, igual que la respuesta de @ MetaColon pero
x%2*2*x
reemplazandox*x%4<1?0:2
)fuente
En realidad , 12 bytes
Pruébalo en línea!
Explicación:
fuente
05AB1E , 10 bytes
Utiliza la codificación 05AB1E . Pruébalo en línea!
fuente
J , 14 bytes
Pruébalo en línea!
fuente
(4&|{-,+,*,^)~
funciona bien pero es el mismo número de bytes debido a los parens, aunque es un poco más obvio lo que hace.Oasis , 25 bytes
Pruébalo en línea!
Cómo funciona
Tenga en cuenta que
x&3
es equivalente ax%4
, donde%
es módulo.Oasis es un lenguaje basado en la pila donde cada personaje es un comando.
fuente
Cubix , 29 bytes
Pruébalo en línea!
La explicación se agregará pronto ...
fuente
C #, 42 bytes
En realidad, es C # normal, pero como no puede ejecutarlo como un programa completo y tiene que escribirlo en el interactivo, creo que puede llamarlo C # interactivo .
Explicacion :
No puedo decir si es la variante más corta, se agradece cualquier sugerencia.
fuente
x
no está definido. Eso hace que sea un fragmento, no un programa completo.x
" significa que recibex
un método de entrada estándar (es decir, función o programa).PHP, 36 bytes
fuente
dc, 27
Nunca he tenido la oportunidad de usar matrices en cc antes:
Pruébalo en línea .
fuente
Groovy, 26 bytes
Pruébalo en línea!
fuente
C, 115 bytes
El ejemplo es una función
int f(int x)
Pretende una velocidad de trabajo más rápida, ya que evita que la CPU use saltos condicionales. Y esta es solo la forma correcta de optimización de velocidad para esta tarea. Además, intenta no evaluar todo, como en el ejemplo de la matriz C,
return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
sino utilizar sabiamente una variedad de punteros a las funciones, para hacer saltos incondicionales mucho más rápidos (jmp / call) con una aritmética de direcciones mucho más rápida, como una versión optimizada de " switch () - case .. ". Esta técnica también podría ser útil en varios tipos de autómatas finitos, como emuladores de procesador, ejecutores, analizadores de flujo de comandos, etc., donde la velocidad es importante y el códigoswitch(x%4) case(0):... case(1):...
no es adecuado porque produce múltiples instrucciones cmp / jnz; y estas son operaciones costosas para la CPUEl programa de prueba más simple y corto (en condiciones predeterminadas) para el caso será el siguiente:
Agregará solo 12 bytes de carga útil y totalizará nuestro tamaño a 127 bytes;
Pero es mejor que le digas al enlazador que use la
f
función como punto de entrada, en lugar demain
. Esa es la forma, si nuestro objetivo es obtener el binario de trabajo más rápido posible para esta tarea desde el código más corto ;-) Esto sucede porque la biblioteca C agrega código de inicio / apagado adicional antes de llamar a su función main ().El código se compila en MSVS Community 2015 sin ningún truco y problema y produce resultados correctos. No lo he probado con gcc, pero estoy seguro de que funcionará bien también.
fuente
R,
4742 bytesAplica la función
-
,+
,*
, o^
basado en el módulo dex
ax
yx
.-
es lo único (algo) inteligente, yax-x
que siempre es 0.R, 33 bytes
El mismo método que usan otras personas. Aunque es más corto, no me gusta tanto.
fuente
Pyth , 12 bytes
Pruébalo en línea!
Cómo funciona
En primer lugar, observe que
x&3
es equivalente ax%4
, donde%
es módulo. Entonces, dado que Pyth usa la indexación modular (a[n] == a[n+len(a)]
), entonces ni siquiera necesitamos ocuparnos de eso.Luego:
x%4==0
, devuelvex-x
(por consistencia);x%4==1
, vuelvex+x
;x%4==2
, vuelvex*x
;x%4==3
, vuelvex^x
.Más información sobre la notación polaca: Wikipedia (lástima si estás en Turquía).
fuente
Japt , 13 bytes
Pruébalo en línea!
Esto usa el mismo método que las otras respuestas de evaluación, excepto que el programa
-U
simplemente niegaU
, por lo que usamos^
(XOR bit a bit) en su lugar.fuente
Vim, 50 bytes
Aquí,
^V
representa aCtrl+V
,^R
representaCtrl-R
y^[
representa laesc
claveFunciona construyendo primero la expresión y luego dejando
bc
evaluarla. Espera la entrada en la primera línea en un búfer vacío.Explicación:
fuente
^V
lo escribo solo pega lo que tengo en mi portapapeles, en lugar del número ...D
lugar ded$
Pyth, 9 bytes
Banco de pruebas
Aquí no pasa nada, solo calcule los cuatro valores y seleccione uno con indexación modular.
fuente
Lote, 135 bytes
Esperaba crear la exponenciación construyendo y evaluando una cadena del formulario
[0+...+0, 2+...+2, x+...+x, x*...*x]
dependiendo de los dos últimos bits,x
pero desafortunadamente el código para seleccionar la operación tardó demasiado en expresarse porque no podía usarlo*
comofor
parámetro, pero estaba al menos capaz de usar algunos trucos de caída para eliminar algunos bytes.fuente
Retina , 87 bytes
Pruébalo en línea! (El enlace incluye un conjunto de pruebas).
Explicación: Las dos primeras líneas convierten la entrada en unaria y la duplican (así que ahora la tenemos
x;x
). Las siguientes dos líneas buscan unax&3
de o0
o1
y cambianx;x
ax;0
ox;2
apropiadamente. Las siguientes dos líneas buscanx&3==3
y cambianx;x
ax;x;x;...;x;1;x
(x
x
s). Esto significa que tenemos o bienx;0
,x;2
,x;x
, ox;...;x
y queda por todo lo que se multiplican juntos y volver a convertir decimal. (El código de multiplicación se basa en eso en la wiki de Retina, pero se modificó para manejar la multiplicación por cero).fuente