Tarea
Dado un entero positivo n
, la salida n+1
si n
es impar y la salida n-1
si n
es par.
Entrada
Un entero positivo. Puede suponer que el número entero está dentro de la capacidad de manejo del lenguaje.
Salida
Un entero positivo, especificado anteriormente.
Casos de prueba
input output
1 2
2 1
3 4
4 3
5 6
6 5
7 8
8 7
313 314
314 313
Tanteo
Este es el código de golf , por lo que la respuesta más corta en bytes gana.
Se aplican lagunas estándar .
Respuestas:
C, 20 bytes
Pruébalo en línea .
fuente
Apilar gatos , 3 + 3 (
-n
) = 6 bytesPruébalo en línea!
Necesita que la
-n
bandera funcione con entradas y salidas numéricas.Explicación
Stack Cats generalmente está lejos de ser competitivo, debido a su conjunto limitado de comandos (todos los cuales son inyecciones, y la mayoría de ellos son involuciones) y porque cada programa necesita tener simetría espejo. Sin embargo, una de las involuciones es alternar el bit menos significativo de un número, y podemos compensar el valor con la negación unaria que también existe. Afortunadamente, eso nos da un programa simétrico, por lo que no debemos preocuparnos por nada más:
La entrada y la salida están implícitas al principio y al final del programa, porque tomar entrada y producir salida no es una operación reversible, por lo que no pueden ser comandos.
fuente
perl -nle 'stuff'
es de 2 caracteres másperl -e 'stuff'
, para que cuente para 2 personajes más ". Entonces(space)-n
son 3 bytes más que sin la bandera.-e "code"
y luego insertar banderas adicionales antes dee
, por ejemplo-pe "code"
. Entonces la-p
bandera es solo un byte. Sin embargo, Stack Cats no tiene ese-e
argumento, por lo que siempre debe agregar<sp>-n
el comando completo al comando y, por lo tanto, son tres bytes.Asamblea x86, 9 bytes (para entrada competitiva)
Todos los que intentan este desafío en lenguajes de alto nivel se están perdiendo la verdadera diversión de manipular bits sin procesar. Hay tantas variaciones sutiles en las formas de hacer esto, es una locura, y es muy divertido pensar en ello. Aquí hay algunas soluciones que ideé en lenguaje ensamblador x86 de 32 bits.
Me disculpo de antemano porque esta no es la típica respuesta de código de golf. Voy a divagar mucho sobre el proceso de pensamiento de la optimización iterativa (para el tamaño). Espero que sea interesante y educativo para un público más amplio, pero si eres del tipo TL; DR, no me ofenderé si saltas hasta el final.
La solución obvia y eficiente es probar si el valor es par o impar (lo que se puede hacer de manera eficiente mirando el bit menos significativo), y luego seleccionar entre n + 1 o n − 1 en consecuencia. Suponiendo que la entrada se pasa como un parámetro en el
ECX
registro, y el resultado se devuelve en elEAX
registro, obtenemos la siguiente función:(13 bytes)
Pero para propósitos de código de golf, esas
LEA
instrucciones no son excelentes, ya que toman 3 bytes para codificar. UnDEC
comentario simple deECX
sería mucho más corto (solo un byte), pero esto afecta a las banderas, por lo que debemos ser un poco inteligentes en la forma en que organizamos el código. Podemos hacer el decremento primera , y la prueba de par / impar segundos , pero luego tenemos que invertir el resultado de la prueba de par / impar.Además, podemos cambiar la instrucción de movimiento condicional a una bifurcación, lo que puede hacer que el código se ejecute más lentamente (dependiendo de cuán predecible sea la bifurcación; si la entrada alterna inconsistentemente entre pares e impares, una bifurcación será más lenta; si hay un patrón, será más rápido), lo que nos ahorrará otro byte.
De hecho, con esta revisión, toda la operación se puede realizar en el lugar, utilizando solo un único registro. Esto es genial si está incorporando este código en alguna parte (y es probable que lo sea, ya que es muy corto).
(en línea: 7 bytes; como una función: 10 bytes)
Pero, ¿y si quisieras que fuera una función? Ninguna convención de llamada estándar utiliza el mismo registro para pasar parámetros que para el valor de retorno, por lo que deberá agregar una
MOV
instrucción de registro-registro al principio o al final de la función. Esto prácticamente no tiene costo en velocidad, pero agrega 2 bytes. (LaRET
instrucción también agrega un byte, y hay una sobrecarga introducida por la necesidad de realizar y regresar de una llamada de función, lo que significa que este es un ejemplo en el que la alineación produce un beneficio de velocidad y tamaño, en lugar de ser simplemente una velocidad clásica -por-espacio de compensación.) En total, escrito como una función, este código se hincha a 10 bytes.¿Qué más podemos hacer en 10 bytes? Si nos preocupamos por el rendimiento (al menos, el rendimiento predecible ), sería bueno deshacerse de esa rama. Aquí hay una solución de ramificación de bits sin ramas que tiene el mismo tamaño en bytes. La premisa básica es simple: usamos un XOR bit a bit para voltear el último bit, convirtiendo un valor impar en uno par, y viceversa. Pero hay un inconveniente: para las entradas impares, que nos da n-1 , mientras que para las entradas pares, nos da n + 1 , exactamente opuesto a lo que queremos. Entonces, para arreglar eso, realizamos la operación en un valor negativo, volteando el signo de manera efectiva.
(en línea: 7 bytes; como una función: 10 bytes)
Bastante hábil; Es difícil ver cómo se puede mejorar. Sin embargo, una cosa me llama la atención: esas dos
NEG
instrucciones de 2 bytes . Francamente, dos bytes parecen un byte demasiado para codificar una simple negación, pero ese es el conjunto de instrucciones con el que tenemos que trabajar. ¿Hay alguna solución? ¡Seguro! Si tenemosXOR
-2, podemos reemplazar la segundaNEG
acción con unINC
comentario:(en línea: 6 bytes; como función: 9 bytes)
¡Otra de las rarezas del conjunto de instrucciones x86 es la
LEA
instrucción multipropósito , que puede hacer un movimiento de registro-registro, una adición de registro-registro, compensación por una constante y escalar todo en una sola instrucción!(10 bytes)
La
AND
instrucción es como laTEST
instrucción que usamos anteriormente, ya que ambos hacen un AND a nivel de bit y establecen indicadores en consecuencia, pero enAND
realidad actualizan el operando de destino. LaLEA
instrucción luego escala esto en 2, agrega el valor de entrada original y disminuye en 1. Si el valor de entrada era impar, esto resta 1 (2 × 0 - 1 = −1) de él; si el valor de entrada fue par, esto le agrega 1 (2 × 1 - 1 = 1).Esta es una forma muy rápida y eficiente de escribir el código, ya que gran parte de la ejecución se puede hacer en el front-end, pero no nos compra mucho en forma de bytes, ya que se necesitan muchos para codificar un complejo
LEA
instrucción. Esta versión tampoco funciona tan bien para fines de alineación, ya que requiere que el valor de entrada original se conserve como entrada de laLEA
instrucción. Entonces, con este último intento de optimización, hemos retrocedido, sugiriendo que podría ser el momento de detenerse.Por lo tanto, para la entrada competitiva final, tenemos una función de 9 bytes que toma el valor de entrada en el
ECX
registro (una convención de llamada basada en un registro semi-estándar en x86 de 32 bits), y devuelve el resultado en elEAX
registro (como con todas las convenciones de llamadas x86):Listo para armar con MASM; llamar desde C como:
fuente
dec eax; xor eax, 1; inc eax
funcionaría y ahorraría un byte más?Jalea , 3 bytes
Pruébalo en línea!
Pseudocódigo:
abs((-1)**n - n)
fuente
-1
.Python3,
2018 bytesBastante simple. Primero calculamos n-1 y decidimos si agregarle 2 o no.
Si n es par -> n mod 2 será 0, por lo tanto agregaremos 2 * 0 a n-1 , dando como resultado n-1 .
Si n es impar -> n mod 2 será 1, por lo tanto agregaremos 2 * 1 a n-1 , resultando en n + 1 .
Prefiero una explicación que hice con MS Paint y un touchpad portátil ...
fuente
Python, 16 bytes
Pruébalo en línea!
fuente
"x+-012~|&^()*/%"
.-(1^-x)
.MATL , 7 bytes
Esto evita cualquier operación aritmética. Pruébalo en línea!
Explicación
Considere la entrada
4
como un ejemplo.fuente
Braingolf v0.1 ,
1110 bytesPruébalo en línea! (El segundo argumento es el código Braingolf, el tercer argumento es la entrada)
Salvó un byte gracias a Neil
Primera respuesta de Braingolf en competencia: D
Explicación:
Braingolf v0.2 , 9 bytes [no competidor]
Pruébalo en línea! (El segundo argumento es el código Braingolf, el tercer argumento es la entrada)
Ver arriba para explicación. La única diferencia está en Braingolf v0.2, el comportamiento predeterminado de los operadores diádicos y la función del
,
modificador se invierten, lo que significa que las 2 comas en la respuesta v0.1 ya no son necesarias.Sin embargo, v0.2 se lanzó después del desafío, por lo que este no compite
fuente
.1<2,%?+:-
lo que creo que hace?-
para que realice la operación de la manera correcta, en cuyo caso aún tendría la misma longitud que mi respuesta<
que girara1
debajo de la entrada, para que ya estuviera en el lugar correcto.-
pila se ve así: los[n,1]
operadores de braingolf se invierten, por lo que funcionaría1 - n
, lo que daría como resultado-(n-1)
, si el resultado deseado es simplementen-1
Cubix ,
109 bytesPruébalo en línea
Explicación
Versión neta
Los caracteres ejecutados son
fuente
Python, 68 bytes
En el espíritu de un enfoque único. El siguiente gráfico muestra la función (con puntos morados que representan los primeros 10 casos). En teoría, debería ser posible construir una solución para esta pregunta basada en la mayoría de las funciones periódicas (¿todas?) (Por ejemplo, sin, tan, sec). De hecho, sustituir cos por sec en el código tal como debería funcionar.
fuente
PHP, 15 bytes
fuente
;
es necesario, y he intentado usar un.php
archivo y también hacer eco directamente en php (php7 cli.) Cada vez que me dicen que$argn
es una variable indefinida.F
bandera y una tubería:echo 42 | php -F script.php
.Javascript,
1712 bytesOtro enfoque, 10 bytes
robados de la respuesta C (sssshhh)fuente
x=>x-(-1)**x
|0
? Parece que ambas soluciones deberían convertir automáticamente las cadenas a números. (Para la primera solución, si desea evitar decimales, use<input type=number>
.)JavaScript (ES6),
14131210 bytesIntentalo
Original, 12 bytes
fuente
Python, 20 bytes
n%2or-1
devolverá 1 si es impar, pero si es par,n%2
es "falso" (0), por lo que devuelve -1. Luego simplemente agregamos eso an
.Solución anterior, 23 bytes
n%2
calcula el resto cuandon
se divide entre 2. Si es par, esto devuelve 0 y el elemento 0 en esta lista esn-1
. Si es impar, esto devuelve 1, y el elemento 1 en esta lista esn+1
.fuente
lambda n:[n-1,n+1][n%2]
Retina , 21 bytes
Pruébalo en línea! ¡Mi primera respuesta de Retina con dos líneas nuevas! Explicación: Las dos primeras líneas se convierten de decimal a unario. Las líneas tercera y cuarta restan dos de los números pares. La última línea se convierte de nuevo a decimal, pero también agrega uno.
fuente
05AB1E , 4 bytes
Pruébalo en línea!
fuente
Èi>ë<
es muy bonita;_;
.Cubix , 11 bytes
Pruébalo en línea!
Explicación
Versión neta:
Los caracteres se ejecutan en el siguiente orden:
fuente
Brain-Flak , 36 bytes
Pruébalo en línea!
Personalmente estoy muy contento con esta respuesta porque es mucho más corta de lo que consideraría un método tradicional para resolver este problema.
Explicación
El primer bit de código
convierte la pila de solo
n
aLuego, mientras la parte superior de la pila no es cero, la disminuimos y volteamos el signo del número debajo de ella
Luego eliminamos el cero y sumamos los dos números restantes
fuente
Mathematica,
2219 bytes¡Guardado 3 bytes gracias a Greg Martin!
Respuesta anterior, 22 bytes
Explicación (para la respuesta anterior)
Mathematica tiene la buena característica de que operaciones como la aritmética se enhebran automáticamente en las listas.
En este caso, tomamos
Mod[#,2]
cuál devolverá 0 o 1, pero necesitamos agregar 1 porque las listas de Mathematica están indexadas en 1. Si es par , esto sale a 1, por lo que#-1
se devuelve. Si es extraño , sale 2, por lo que#+1
se devuelve.fuente
[[0]]
capacidad:#-1[-1][[#~Mod~2]]&
.Sabio , 8 bytes
Pruébalo en línea!
Explicación
Si esto fuera al revés (disminuir si es impar, aumentar si es par), sería bastante fácil hacer esto.
Simplemente voltearíamos el último bit.
La solución aquí es que volteamos el último bit mientras somos negativos. Los números negativos son 1 fuera de la negación de los números,
~
por lo que esto crea un desplazamiento para resolver el problema.Así que solo sacamos el programa y lo envolvemos
-
.fuente
Java 8,
1610 bytesJava 7,
3428 bytesPuertos aburridos de la sorprendente respuesta C de @feersum .
Pruébalo aquí.
Viejas respuestas:
Java 8, 16 bytes
Java 7, 34 bytes
Explicación (de la antigua respuesta de Java 7):
Pruébalo aquí
La respuesta anterior es una variante más corta de
int c(int n){return n%2<1?n-1:n+1;}
deshacerse del espacio.fuente
Japt , 6 bytes
Pruébalo en línea!
fuente
Python, 20 bytes
fuente
Befunge 93 , 18 bytes
Todavía no he terminado de jugar esto (espero).
fuente
kv
(ojv
si es estrictamente 1 o 0) en lugar de#v_
. Además, si está utilizando Pruébelo en línea (y lo recomiendo), puede finalizar el programa con otro&
(aunque tomará 60 segundos), por lo que puede deshacerse de él@
en la primera línea si lo usa. Aquí está la lista completa de comandos para Befunge-98 , aunque es posible que no todos se implementen correctamente en TIO, como&
finalizar el programa en lugar de invertirlo en EOF.Rubí, 12 bytes.
fuente
R, 17 bytes
donde
n=scan()
toma el valor del dígito.fuente
-(-1)^n
lugar de hacerlo,+(-1)^n
ya que tenemos que volvern-1
sin
es parCasio-Basic, 27 bytes
26 bytes para la función, +1 para ingresar
n
en el cuadro de parámetros.fuente
C, 29 bytes
fuente
Jalea , 4 bytes
Pruébalo en línea!
fuente
Lote, 20 bytes
Redescubierto independientemente el algoritmo de @ feersum, ¡honesto!
fuente