Este es un desafío trivial con muchas soluciones triviales. Sin embargo, también hay algunas soluciones no triviales. A los votantes: Lea la primera oración de esta meta publicación antes de votar a favor de las funciones integradas.
Stewie Griffin
8
Esto probablemente podría usar una tabla de clasificación.
Martin Ender
2
@MrLister vota de la forma que quieras, pero realmente debes buscar la creatividad en lugar de la longitud del código.
FlipTack
3
@FlipTack Oh, pensé que era codegolf.
Sr. Lister
3
@MrLister ese es el criterio ganador objetivo. pero, ¿realmente se necesita más esfuerzo para escribir suna señal incorporada, o utilizar algunos cambios de bits / matemáticas inteligentes para resolverlo? Echa un vistazo a esta meta publicación
Reemplaza un dígito que no es cero y todo lo que sigue con él 1. Esto deja un potencial líder -intacto y cambia todos los números excepto a 0sí mismo a un valor absoluto 1.
¿Funciona con notación científica de números enteros (como 0.42e2)?
Egor Skriptunoff
@EgorSkriptunoff No, pero eso no es un requisito.
Martin Ender
9
@EgorSkriptunoff tampoco admite números romanos. A menos que el desafío mencione explícitamente un cierto formato no estándar que debe ser compatible, la suposición general es que está bien tratar con un formato único que sea natural en el idioma que elija.
Martin Ender
3
@EgorSkriptunoff Retina no tiene ningún concepto de números. Es un lenguaje puramente basado en cadenas.
Martin Ender
42
C (GCC), 24 23 22 18 bytes
¡Gracias a @aross y @Steadybox por guardar un byte!
f(n){n=!!n|n>>31;}
No se garantiza que funcione en todos los sistemas o compiladores, funciona en TIO .
@betseg Eso se debe a que los votos a favor de los integradores ahora están mal vistos.
Erik the Outgolfer
44
Ahorrando 1 byte con estoreturn n>>16|!!n;
aross
55
@GB El tamaño de int es probablemente 2 (16, x86) o 4 (32, x86_64), pero recuerde, todo lo que se necesita es una arquitectura en la que sea válida. Esto no es Stack Overlflow, la portabilidad no es importante.
gato
2
f(n){n=n>>31|!!n;}también funciona Pero esto es solo una peculiaridad del compilador, no una función de lenguaje.
GB
2
Las peculiaridades del compilador @GB son perfectamente válidas, siempre que pueda demostrarse que existe un compilador en el que funciona la peculiaridad. Afortunadamente, gcc tiene la peculiaridad.
Mego
34
Mathematica, 4 bytes
Clip
¿Qué tal no usar el incorporado Signy aún anotar 4 bytes? ;)
Clipcon un solo argumento recorta (o sujeta) el valor de entrada entre -1y 1. Como las entradas solo serán enteras, esto es lo mismo que usar Sign.
La forma en que funciona este código es que determina el signo alternando sumando y restando números más grandes, y viendo cuál fue el último que funcionó. Dado cualquier número entero distinto de cero, primero reste 1, luego sume 2, luego reste 3, etc. y eventualmente llegará a 0. Mantenga un registro de su estado alternando sumando y restando 2 a un valor que comience en 0. Para ejemplo:
Cuando haya terminado, reste 1 de su estado y obtendrá el signo, positivo o negativo. Si el número original es 0, no se moleste en hacer nada de esto y simplemente imprima 0.
Explicación detallada:
oom ;Read an integer into [0]
MOO ;Loop while [0] is non-empty
moOmoOmoOmoOMoOMoOmOomOomOo ; Decrement [4] twice
MoOMMMmoOMMM ; Increment [1], then copy [1] to [2]
MOO ; Loop while [2] is non-empty
MOomOomOoMOomoOmoO ; Decrement [0] and [2]
moo ; End loop now that [2] is empty
mOomOoMMMmoOmoOmoOMMM ; Navigate to [0], and copy to [3]
MOO ; Perform the next steps only if [3] is non-zero
OOOmoOMOoMOomOomOomOoMoOMMMmoOMMM ; Clear [3], increment [4] twice, increment [1], and copy it to [2]
MOO ; Loop while [2] is non-empty
MOomOomOoMoOmoOmoO ; Decrement [2] and increment [0]
moo ; End loop now that [2] is empty
moO ; Navigate back to [3]
moo ; End the condition
mOomOomOo ; Navigate back to [0]
moo ;End loop once [0] is empty.
moO ;Navigate to [1]. If [1] is 0, then input was 0. Otherwise, [4] contains (sign of [0] + 1)
MOO ;Perform the next steps only if [1] is non-zero
moOmoOmoOMOoMMMOOO ; Navigate to [4], copy it to the register, and clear [4].
moo ;End condition
MMMOOM ;If the register contains something (which is true iff the condition ran), paste it and print it. Otherwise, no-op and print 0.
Todavía estoy experimentando con el golf (te sorprenderá descubrir que jugar al golf en COW es bastante difícil), por lo que esto puede reducirse unos pocos bytes más en el futuro.
Este código está envuelto en la siguiente red de cubos:
( W
0 ^
I ? > O 2 @ . .
. . . . . . . .
. .
. .
Luego, el código se ejecuta con la IP (puntero de instrucción) comenzando en I, hacia el este. Iingresa un entero con signo de STDIN, empujándolo a la pila.
El siguiente comando es ?, que cambia la dirección de la IP según el signo del elemento superior. Si la entrada es 0, sigue moviéndose en la misma dirección, ejecutando el siguiente código:
>- Apunte la IP hacia el este. (Sin operaciones ya que ya vamos hacia el este).
O - Salida del elemento superior como un entero.
2- Empuja 2 a la pila. Esto es prácticamente un no-op, porque ...
@ - Termina el programa.
Si la entrada es negativa, la IP gira a la izquierda en ?; Como se trata de un cubo, la IP se mueve hacia 0la segunda fila, en dirección este. 0empuja un 0 literal, luego se ejecuta este código:
^ - Apunte la IP al norte.
W - "Sidestep" el IP un punto a la izquierda.
( - Disminuir el elemento superior.
El TOS es ahora -1, y la IP se envuelve alrededor del cubo a través de un montón de no-ops .hasta que golpea el >. Esto ejecuta el mismo código de salida mencionado anteriormente, la salida -1.
Si la entrada es positiva, sucede lo mismo que con las entradas negativas, con una excepción: la IP gira a la derecha en lugar de a la izquierda en el ?, y se envuelve alrededor del cubo hacia el 2, que empuja un literal 2. Esto luego se reduce a 1 y enviado a la salida.
¡La animación del flujo del programa es muy bonita!
Luis Mendo
Buen lenguaje ¿Podría ser más corto? 4 controles de flujo parecen mucho. En el recuento de operaciones, puede tener 8 bytes introduciendo otro?, Pero ahora usa la mitad inferior del cubo: ..1nI? ..> O @ .........?
BlackShift
Seis es posible si ignoramos las salidas después de la primera: / I? NO1 Por cierto, esto solo funciona porque devuelvo -1 en el intérprete en línea en lugar de 0 según la especificación.
BlackShift
@BlackShift ¡Gracias por su interés! Me gustan sus sugerencias, pero no estoy seguro de cómo mejorarlas. Definitivamente es posible usar menos instrucciones; la parte difícil es usar menos cubo ... ;-) Y gracias por señalar ese error -1, lo arreglaré pronto.
ETHproductions
@ETHproductions IMO No es un error, tiene sentido Idevolver -1 cuando la entrada termina al igual que las minúsculas i.
FlipTack
16
JavaScript (ES6), 9 bytes
Math.sign
Sencillo.
El más corto no incorporado es de 13 bytes:
n=>n>0|-(n<0)
Gracias a @Neil, esto se puede jugar por un byte, pero a costa de trabajar solo en enteros de 32 bits:
n=>n>0|n>>31
O podrías hacer
n=>n>0?1:!n-1
que parece más golfable, pero no estoy seguro de cómo.
No incorporado en 12 bytes para entero con signo de 32 bits n: n=>n>>31|!!n.
Neil
@Neil n>>31es realmente inteligente, ¡gracias!
ETHproductions
No creo que la tercera solución sea válida, ya que Javascript usa flotantes de doble precisión para los números. Pero podría estar equivocado.
Mego
@Mego Tienes razón. He aclarado esto en la publicación.
ETHproductions
1
@Mego Lo siento, me perdí tu comentario. Cuando se utilizan operadores bit a bit, JS convierte implícitamente sus operandos a enteros de 32 bits con signo, por lo que la tercera solución funciona, pero solo en números del -2147483648 al 2147483647.
' Push the entire program (except ' itself) onto the stack, which ends
with [... 1 47].
i Read the first character of the input.
$- Subtract the 47.
% Take the 1 modulo this value.
n Output the result as an integer.
0x01 Unknown command, terminates the program.
Como @ nmjcman101 señaló en los comentarios, se puede usar una sola expresión regular ( :s/\v(-)=[^0].*/\11^M, 20 bytes), pero dado que esto es básicamente lo mismo que sería una respuesta de Retina, me quedo con mi propio método.
Explicación:
xVp Delete everything except the first character. If the number is negative, this leaves a -, a positive leaves any number between 1 and 9, and 0 leaves 0.
:s/-/-1^M Replace a - with a -1
:s/[1-9]/1^M Replace any number between 1 and 9 with 1.
Aquí hay un gif que se ejecuta con un número negativo (versión anterior):
La semántica de flujo de control de Labyrinth realmente le brinda una forma "libre" de determinar el signo de un número, porque la ruta elegida en una bifurcación de 3 vías depende de si el signo es negativo, cero o positivo. Sin embargo, hasta ahora no he podido ajustar un programa con uniones en menos de 12 bytes (aunque puede ser posible).
En cambio, aquí hay una solución de forma cerrada, que no requiere ninguna rama:
El puntero de instrucción luego llega a un callejón sin salida, se da vuelta y termina cuando %ahora intenta una división por cero.
Es necesario duplicar la entrada para que esto funcione con entradas 1y -1, de lo contrario, una de las dos operaciones de módulo ya intentaría una división por cero.
No olvide mencionar que esta es solo una respuesta PHP7. Y ya que está usando <?=, debe usar $_GET[n], que no toma más bytes. Para usarlo <?=, debe estar dentro de un servidor web (como Apache), y allí no tendrá acceso $argv. Puede intentar ejecutar <?php var_dump($argv);desde un archivo PHP, accedido a través de Apache, y se mostrará NULL.
Ismael Miguel
1
"Para usar <? =, Debe estar dentro de un servidor web (como Apache)". No. El <?=operador funciona bien desde la línea de comandos.
Alex Howansky
Corriendo php -r '<?=1'lo consigo PHP Parse error: syntax error, unexpected '<' in Command line code on line 1. Pero parece funcionar bien desde un archivo. Supongo que tienes razón.
Ismael Miguel
La -rbandera es para ejecutar un fragmento de código. Esta es la fuente completa. php file.php
Guárdelo
Ya lo descubrí. Realmente no sabía que funcionaba desde un archivo, usando el -fparámetro (implícito) .
{ } # if 0 do nothing
( ) # push:
{}< > # the input, after
( ) # pushing:
[ ] # negative:
() # 1
( ) # Then push:
[ ] # the negative of the input
<> # on the other stack with:
() # a 1
( ) # pushed under it
{ } # while 1:
({}()) # increment this stack and...
<> # switch stacks
{} # pop the top (the counter or 0 from input)
( ) # push:
{} # the top (this is a no-op, or pushes a 0)
Revisión 2: Abusa de un error de memoria / pila en GCC donde, por lo que puedo decir, una función que no regresa devolverá la última variable establecida en ciertos casos.
Revisión 3: Abusa del comportamiento ternario donde el resultado indefinido devolverá un resultado condicional (es por eso que el verdadero retorno de mi ternario es nulo)
Revisión 4: reste un bool cast ( !!) de la sustitución condicional ternaria a la que se hace nilreferencia en la revisión 2.
Sería 0.<=>también el trabajo, o puede no hacer referencia a métodos como el de Ruby?
Nic Hartley
.<=>espera 1 argumento, por lo que terminaría siendo 0.<=> x, que es más largo.
Seims
@QPaysTaxes que necesitaría 0.method:<=>porque las llamadas a métodos en ruby no usan paréntesis y 0.<=>se interpretarían como llamadas a métodos con muy pocos argumentos.
Realmente no "requiere" -E, eso es solo si lo llama desde la CLI en lugar de un archivo, por lo que supongo que dijo que no hay costo adicional.
nyuszika7h
@ nyuszika7h, de hecho, requiere , supongo, en la forma en que las pruebas a través de -eno funcionarán, pero -Ese acepta como no más que -e. Según el consenso sobre meta. ¡Espero que eso ayude un poco!
Dom Hastings
Sí, no estaba sugiriendo que se requiera ningún costo adicional para eso, ya que funciona bien cuando ese script se ejecuta normalmente desde un archivo.
+4 bytes para las -nmbanderas. nes para E / S numéricas, y dado que Stack Cats requiere que los programas sean palindrómicos, mrefleja de manera implícita el código fuente para proporcionar la fuente original
_[:I!:!I:]_
Pruébalo en línea! Al igual que con todos los buenos campos de golf de Stack Cats, esto fue encontrado por la fuerza bruta, venció cualquier intento manual por un tiro largo y no puede incorporarse fácilmente en un programa más grande.
Agregue una Dmarca si desea ver un seguimiento del programa paso a paso, es decir, ejecutar -nmDy verificar STDERR / debug.
Stack Cats utiliza una cinta de pilas que se rellenan implícitamente con ceros en la parte inferior. Al comienzo del programa, toda la entrada se inserta en la pila de entrada, con un -1en la base para separar la entrada de los ceros implícitos. Al final del programa, se emite la pila actual, excepto una base -1si está presente.
Los comandos relevantes aquí son:
_ Perform subtraction [... y x] -> [... y y-x], where x is top of stack
[ Move left one stack, taking top of stack with you
] Move right one stack, taking top of stack with you
: Swap top two of stack
I Perform [ if top is negative, ] if positive or don't move if zero. Then
negate the top of stack.
! Bitwise negate top of stack (n -> -n-1)
Tenga en cuenta que todos estos comandos son invertibles, siendo su inverso el espejo del comando. Esta es la premisa de Stack Cats: todos los programas de terminación no triviales tienen una longitud impar, ya que los programas de longitud par se cancelan automáticamente.
Empezamos con
v
n
-1
... 0 0 0 0 0 ...
_resta, haciendo la parte superior -1-n, y [mueve el resultado a la izquierda una pila:
v
-1-n -1
... 0 0 0 0 0 ...
:intercambia los dos primeros y Ino hace nada, ya que la parte superior de la pila ahora es cero. !luego, a nivel de bits, niega el cero superior en a -1y :cambia los dos superiores hacia atrás. !a continuación, bit a bit niega la parte superior, convirtiendo -1-nde nuevo en notra vez:
v
n
-1 -1
... 0 0 0 0 0 ...
Ahora nos ramificamos según I, que se aplica a nuestro original n:
Si nes negativo, nos movemos hacia la izquierda una pila y terminamos con -nun cero implícito. :intercambia, coloca un cero en la parte superior y ]mueve el cero en la parte superior de la -1que acabamos de mover. _luego resta, dejando la pila final como [-1 -1], y solo -1se emite uno ya que -1se ignora la base .
Si nes cero, no nos movemos y :cambiamos, poniéndonos -1en la parte superior. ]luego mueve esta izquierda -1arriba de la derecha -1y _resta, dejando la pila final como [-1 0], sacando el cero e ignorando la base -1.
Si nes positivo, nos movemos a la derecha una pila y terminamos con -na -1. :intercambia, coloca la -1parte superior y ]mueve esta -1derecha, encima de un cero implícito. _luego resta, dando 0 - (-1) = 1y dejando la pila final como [1], que es la salida.
@ ConorO'Brien Símbolo negativo, para diferenciar entre el símbolo de resta de TI-Basic. Sé que Cemetech SC también usa ~para representar este token.
Timtech
Oh genial No tenía ni idea.
Conor O'Brien
@ ConorO'Brien Bueno, ya lo sabes. Gracias por preguntar :)
Timtech
1
Esto no es válido: el uso Anscomo entrada no cumple los criterios para ser un método de E / S predeterminado válido (no tiene el doble de votos positivos que votos negativos; actualmente está en + 19 / -12).
El signo monádico átomo , Ṡ, hace exactamente lo que se especifica para una entrada de número entero, ya sea como un programa completo o como un enlace monádico (función de tomar un argumento).
La idea para tomar asinviene de la pregunta donde dice output the sign:)
Explicación
Nota: dividir el número por piy multiplicarlo por 2es el equivalente a dividir el número entero porpi/2
Caso 0:
asin(0)rendimientos 0. Tomar la parte real de la misma y dividirla no pi/2hace ninguna diferencia en la salida.
Caso positive:
asin(1)rendimientos pi/2. asinde cualquier número mayor que 1dará pi/2+ número complejo. Tomar la parte real de eso da pi/2y dividirlo por pi/2da1
Caso negative:
asin(-1)rendimientos -pi/2. asinde cualquier número menor que -1dará -pi/2+ número complejo. Tomar la parte real de eso da -pi/2y dividirlo por pi/2da-1
;A\divide el valor absoluto de la entrada por la entrada. Esto da -1como resultado entradas negativas y 1entradas positivas. Desafortunadamente, debido al manejo de errores de Actually (si algo sale mal, el comando se ignora), 0ya que la entrada deja dos 0s en la pila. +rectifica esto al agregarlos (lo que causa un error con cualquier otra cosa, por lo que se ignora).
Este código piet cumple con el estándar (n>0)-(n<0), ya que no hay signos de verificación incorporados. De hecho, no hay nada menos que incorporado, por lo que sería una descripción más precisa de este método (n>0)-(0>n).
El texto de arriba representa la imagen. Puede generar la imagen pegándola en el cuadro de texto en la página del intérprete. Por conveniencia, he proporcionado la imagen a continuación donde el tamaño del códel es de 31 píxeles. La cuadrícula está ahí para facilitar la lectura y no forma parte del programa. También tenga en cuenta que este programa no cruza ningún códec blanco; siga los códeles de colores alrededor del borde de la imagen para seguir el flujo del programa.
Explicación
Instruction Δ Hue Δ Lightness Stack
------------ ----- ----------- --------------------
In (Number) 4 2 n
Duplicate 4 0 n, n
Push [1] 0 1 1, n, n
Duplicate 4 0 1, 1, in, in
Subtract 1 1 0, in, in
Duplicate 4 0 0, 0, in, in
Push [4] 0 1 4, 0, 0, in, in
Push [1] 0 1 1, 4, 0, 0, in, in
Roll 4 1 0, in, in, 0
Greater 3 0 greater, in, 0
Push [3] 0 1 3, greater, in, 0
Push [1] 0 1 1, 3, greater, in, 0
Roll 4 1 in, 0, greater
Greater 3 0 less, greater
Subtract 1 1 sign
Out (Number) 5 1 [Empty]
[Exit] [N/A] [N/A] [Empty]
Para reducir aún más el tamaño del archivo, necesitaría cambiar el programa (jadeo) en lugar de simplemente comprimir el archivo como lo he estado haciendo. Me gustaría eliminar una fila que reduciría esto a 36. También puedo desarrollar mi propio intérprete que tendría un formato de entrada mucho más pequeño, ya que cambiar el código para hacerlo más pequeño no es de lo que se trata el código golf.
Las modificaciones me dijeron que el tamaño de archivo general es lo que cuenta para el código Piet. Como el intérprete acepta el texto como entrada válida y el texto sin procesar tiene un recuento de bytes mucho menor que cualquier imagen, el texto es la opción obvia. Pido disculpas por ser descarado al respecto, pero no hago las reglas. La meta discusión sobre esto deja en claro mis opiniones sobre el asunto.
Si cree que eso va en contra del espíritu de Piet o le gustaría discutir esto más a fondo por cualquier motivo, consulte la discusión sobre meta .
Utiliza sign(x) = abs(x) / x, pero con un explícito sign(0) = 0para evitar el error de división cero.
\ Take implicit input
&? ; \ If the input is True (not 0):
&| \ Push its absolute value
/ \ Divide
# \ Output TOS (the sign)
Esto funciona porque x / abs(x)es 1 cuando x es positivo y -1 cuando x es negativo. Si la entrada es 0, el programa salta al comando de salida.
4 bytes (no competitivos)
Debido a las vacaciones y a tener demasiado tiempo, he hecho una reescritura completa del intérprete Pushy. El programa anterior aún funciona, pero como 0 / 0ahora está predeterminado a 0, lo siguiente es más corto:
Utilizando la orden interna es, por supuesto, más corto, pero menos divertido: sign(scan()).
Billywob
Lo siento, debería haber mencionado explícitamente que evitaba la construcción
JAD
5
V 14 12 bytes
Gracias @DJMcMayhem por 2 bytes. Utiliza un reg-ex para hacer la sustitución. Un poco divertido, porque no está integrado. Tengo una función más divertida, pero no funciona como esperaba.
Esto solo se traduce a :%s/\v(-)=[^0].*/\11qué coincide uno o más -seguido de cualquier cosa que no sea 0, seguido de cualquier cosa cualquier cantidad de veces. Se reemplaza con el primer partido (por lo tanto, a -o nada) y a 1. La expresión regular no coincide con 0, por lo que se queda sola.
Esto acepta la entrada como un argumento en lugar de en el búfer.
é<CR> Insertar una nueva línea.
Àejecuta el argumento como código V. a -moverá el cursor a la línea anterior, y cualquier número se convertirá en el recuento para el siguiente comando
é1inserte (cuenta) 1's
2| pasar a la segunda columna
D eliminar todo desde la segunda columna en adelante (dejando solo un carácter)
kJ Une las dos líneas juntas.
òhé-òse traduce como: "correr hé-hasta romper". Si el 1 estaba en la segunda línea, esto se rompe inmediatamente después de la h. Si estaba en la primera línea, insertará un -antes de romper.
ó^$/aEsto soluciona el hecho de que -1, 0, 1dejará un espacio en blanco, en lugar de un espacio en blanco con el registro de argumentos.
Sabía que debería haber leído esa página mejor. En realidad no es más corto: olvidé 0, pero estaba tratando de tomar el número como argumento y luego Àé1. Un número positivo da una cadena de unos, un número negativo DEBE dar una cadena de unos una fila hacia arriba, y 0 no daría nada. El bit de número negativo no funcionó À, pero sí cond$@"
nmjcman101
Ah Bueno, la razón por la que no funciona es porque no hay otra fila para que continúe. Si agrega é<cr>, tendrá dos líneas vacías y eso sí funciona . No estoy seguro de si puedes usar eso para obtener una respuesta completa
DJMcMayhem
Tenía otra línea para hacer, pero no lo dije explícitamente en mi comentario. ¿Cuál es el --argumento que agregaste?
nmjcman101
1
Significa "fin de opciones". Como -6comienza con un indicador, docopt (la biblioteca de Python para las opciones de línea de comando) cree que es un indicador de línea de comando en lugar de un argumento. Agregar --solo indica que es un argumento, no una opción. De lo contrario, no se ejecutará en absoluto debido a una invocación de línea de comando no válida.
Alternativamente, el método incorporado es 1 byte más largo:
n=>Math.Sign(n);
Programa completo con casos de prueba:
using System;
public class P
{
public static void Main()
{
Func<int,int> f =
n=>n>0?1:n>>31;
// test cases:
for (int i=-5; i<= 5; i++)
Console.WriteLine(i + " -> " + f(i));
}
}
Es un poco triste cuando la construcción no es la solución más corta.
Mego
Digamos que se sabe que C # es bastante detallado ...
adrianmp
1
A) No creo que necesites el seguimiento ;ya que una lambda es una expresión, no una declaración. B) ¿ Math.Signo Math::Signalgo similar sería una presentación válida? No estoy seguro de cómo C # en particular maneja los métodos. Básicamente, ¿ x = Math.Sign;sería una declaración válida de C # si xse inicializara con el tipo correcto?
s
una señal incorporada, o utilizar algunos cambios de bits / matemáticas inteligentes para resolverlo? Echa un vistazo a esta meta publicaciónRespuestas:
Retina , 9 bytes
Pruébalo en línea!
Reemplaza un dígito que no es cero y todo lo que sigue con él
1
. Esto deja un potencial líder-
intacto y cambia todos los números excepto a0
sí mismo a un valor absoluto1
.fuente
0.42e2
)?C (GCC),
24232218 bytes¡Gracias a @aross y @Steadybox por guardar un byte!
No se garantiza que funcione en todos los sistemas o compiladores, funciona en TIO .
fuente
return n>>16|!!n;
f(n){n=n>>31|!!n;}
también funciona Pero esto es solo una peculiaridad del compilador, no una función de lenguaje.Mathematica, 4 bytes
¿Qué tal no usar el incorporado
Sign
y aún anotar 4 bytes? ;)Clip
con un solo argumento recorta (o sujeta) el valor de entrada entre-1
y1
. Como las entradas solo serán enteras, esto es lo mismo que usarSign
.fuente
VACA,
225213201 bytesPruébalo en línea!
La forma en que funciona este código es que determina el signo alternando sumando y restando números más grandes, y viendo cuál fue el último que funcionó. Dado cualquier número entero distinto de cero, primero reste 1, luego sume 2, luego reste 3, etc. y eventualmente llegará a 0. Mantenga un registro de su estado alternando sumando y restando 2 a un valor que comience en 0. Para ejemplo:
Cuando haya terminado, reste 1 de su estado y obtendrá el signo, positivo o negativo. Si el número original es 0, no se moleste en hacer nada de esto y simplemente imprima 0.
Explicación detallada:
Todavía estoy experimentando con el golf (te sorprenderá descubrir que jugar al golf en COW es bastante difícil), por lo que esto puede reducirse unos pocos bytes más en el futuro.
fuente
OUT OF MANA!!!
Cubix , 10 bytes
¡Pruébelo en línea!
Este código está envuelto en la siguiente red de cubos:
Luego, el código se ejecuta con la IP (puntero de instrucción) comenzando en
I
, hacia el este.I
ingresa un entero con signo de STDIN, empujándolo a la pila.El siguiente comando es
?
, que cambia la dirección de la IP según el signo del elemento superior. Si la entrada es 0, sigue moviéndose en la misma dirección, ejecutando el siguiente código:>
- Apunte la IP hacia el este. (Sin operaciones ya que ya vamos hacia el este).O
- Salida del elemento superior como un entero.2
- Empuja 2 a la pila. Esto es prácticamente un no-op, porque ...@
- Termina el programa.Si la entrada es negativa, la IP gira a la izquierda en
?
; Como se trata de un cubo, la IP se mueve hacia0
la segunda fila, en dirección este.0
empuja un 0 literal, luego se ejecuta este código:^
- Apunte la IP al norte.W
- "Sidestep" el IP un punto a la izquierda.(
- Disminuir el elemento superior.El TOS es ahora
-1
, y la IP se envuelve alrededor del cubo a través de un montón de no-ops.
hasta que golpea el>
. Esto ejecuta el mismo código de salida mencionado anteriormente, la salida-1
.Si la entrada es positiva, sucede lo mismo que con las entradas negativas, con una excepción: la IP gira a la derecha en lugar de a la izquierda en el
?
, y se envuelve alrededor del cubo hacia el2
, que empuja un literal 2. Esto luego se reduce a 1 y enviado a la salida.fuente
I
devolver -1 cuando la entrada termina al igual que las minúsculasi
.JavaScript (ES6), 9 bytes
Sencillo.
El más corto no incorporado es de 13 bytes:
Gracias a @Neil, esto se puede jugar por un byte, pero a costa de trabajar solo en enteros de 32 bits:
O podrías hacer
que parece más golfable, pero no estoy seguro de cómo.
fuente
n
:n=>n>>31|!!n
.n>>31
es realmente inteligente, ¡gracias!APL (Dyalog APL) , 1 byte
También funciona para números complejos, devolviendo 1∠ θ :
TryAPL en línea!
Sin eso incorporado, para enteros (según OP):
¯1⌈
el mayor de uno negativo y1⌊
el más pequeño de uno y⊢
el argumentoTryAPL en línea!
... y uno general:
>∘0
más que cero-
menos<∘0
menos que ceroTryAPL en línea!
fuente
> <> ,
98 bytesGracias a Sp3000 por guardar un byte.
Hay un no imprimible
0x01
antes del/
.Pruébalo en línea!
Explicación
Este es un puerto de la respuesta Labyrinth basada en mi código de personaje .
fuente
;
lugar de uno que no se0x01
puede imprimir para finalizar el programa correctamente :)0x01
presionar un de1
todos modos.123
. Lección aprendida: prueba con más casos.Vim, 22 bytes
¡Guardado un byte gracias a @DJMcMayhem !
Aquí,
^M
hay una nueva línea literal.Como @ nmjcman101 señaló en los comentarios, se puede usar una sola expresión regular (
:s/\v(-)=[^0].*/\11^M
, 20 bytes), pero dado que esto es básicamente lo mismo que sería una respuesta de Retina, me quedo con mi propio método.Explicación:
Aquí hay un gif que se ejecuta con un número negativo (versión anterior):
Aquí está corriendo con 0:
Corriendo con positivo:
fuente
:s/\v(-)=[^0].*/\11
///,
5236 bytesUngolfed, explicación:
Básicamente es una implementación de MapReduce, es decir, hay dos fases:
2
-9
por1
, por ejemplo,1230405
->1110101
11
o10
a1
repetidamente, p1110101
. Ej. ->1
Si
-
inicialmente hubo un frente, permanecerá y la salida será-1
. Un solo0
nunca se reemplaza, lo que resulta en sí mismo.Actualización: Ahorre 16 bytes adicionales aliasing
//1/
cona
, gracias a Martin Ender.Pruébelo en línea, con casos de prueba
fuente
Python 2 , 17 bytes
Pruébalo en línea!
fuente
(0).__rcmp__
...-(0).__cmp__
embargo, puedes hacerlo .Laberinto , 10 bytes
Pruébalo en línea!
Explicación
La semántica de flujo de control de Labyrinth realmente le brinda una forma "libre" de determinar el signo de un número, porque la ruta elegida en una bifurcación de 3 vías depende de si el signo es negativo, cero o positivo. Sin embargo, hasta ahora no he podido ajustar un programa con uniones en menos de 12 bytes (aunque puede ser posible).
En cambio, aquí hay una solución de forma cerrada, que no requiere ninguna rama:
El puntero de instrucción luego llega a un callejón sin salida, se da vuelta y termina cuando
%
ahora intenta una división por cero.Es necesario duplicar la entrada para que esto funcione con entradas
1
y-1
, de lo contrario, una de las dos operaciones de módulo ya intentaría una división por cero.fuente
:D
PHP, 16 bytes
Utiliza el nuevo operador de nave espacial.
fuente
<?=
, debe usar$_GET[n]
, que no toma más bytes. Para usarlo<?=
, debe estar dentro de un servidor web (como Apache), y allí no tendrá acceso$argv
. Puede intentar ejecutar<?php var_dump($argv);
desde un archivo PHP, accedido a través de Apache, y se mostraráNULL
.<?=
operador funciona bien desde la línea de comandos.php -r '<?=1'
lo consigoPHP Parse error: syntax error, unexpected '<' in Command line code on line 1
. Pero parece funcionar bien desde un archivo. Supongo que tienes razón.-r
bandera es para ejecutar un fragmento de código. Esta es la fuente completa.php file.php
-f
parámetro (implícito) .Brain-Flak
74 4240 BytesGuardado 2 bytes gracias a 1000000000
Pruébalo en línea!
Explicación:
fuente
(())
J , 1 byte
¡Pruébelo en línea (con casos de prueba)!
fuente
C,
24201918 bytesAbuso de dos hazañas en C para jugar golf; Esto está en C (GCC).
Pruébalo en línea!
Revisión histórica:
1)
f(a){return(a>0)-(a<0);}
// 24 bytes2)
f(a){a=(a>0)-(a<0);}
// 20 bytes3)
f(a){a=a>0?:-1+!a;}
// 19 bytes4)
f(a){a=a>0?:-!!a;}
// 18 bytesRevisión 1: primer intento. Lógica simple
Revisión 2: Abusa de un error de memoria / pila en GCC donde, por lo que puedo decir, una función que no regresa devolverá la última variable establecida en ciertos casos.
Revisión 3: Abusa del comportamiento ternario donde el resultado indefinido devolverá un resultado condicional (es por eso que el verdadero retorno de mi ternario es nulo)
Revisión 4: reste un bool cast (
!!
) de la sustitución condicional ternaria a la que se hacenil
referencia en la revisión 2.fuente
Rubí, 10 bytes
fuente
0.<=>
también el trabajo, o puede no hacer referencia a métodos como el de Ruby?.<=>
espera 1 argumento, por lo que terminaría siendo0.<=> x
, que es más largo.0.method:<=>
porque las llamadas a métodos en ruby no usan paréntesis y0.<=>
se interpretarían como llamadas a métodos con muy pocos argumentos.Perl, 9 bytes
Requiere
-E
sin costo adicional.Uso
¡Estoy contento con el operador de pescado!
fuente
-E
, eso es solo si lo llama desde la CLI en lugar de un archivo, por lo que supongo que dijo que no hay costo adicional.-e
no funcionarán, pero-E
se acepta como no más que-e
. Según el consenso sobre meta. ¡Espero que eso ayude un poco!Pila de gatos , 6 + 4 = 10 bytes
+4 bytes para las
-nm
banderas.n
es para E / S numéricas, y dado que Stack Cats requiere que los programas sean palindrómicos,m
refleja de manera implícita el código fuente para proporcionar la fuente originalPruébalo en línea! Al igual que con todos los buenos campos de golf de Stack Cats, esto fue encontrado por la fuerza bruta, venció cualquier intento manual por un tiro largo y no puede incorporarse fácilmente en un programa más grande.
Agregue una
D
marca si desea ver un seguimiento del programa paso a paso, es decir, ejecutar-nmD
y verificar STDERR / debug.Stack Cats utiliza una cinta de pilas que se rellenan implícitamente con ceros en la parte inferior. Al comienzo del programa, toda la entrada se inserta en la pila de entrada, con un
-1
en la base para separar la entrada de los ceros implícitos. Al final del programa, se emite la pila actual, excepto una base-1
si está presente.Los comandos relevantes aquí son:
Tenga en cuenta que todos estos comandos son invertibles, siendo su inverso el espejo del comando. Esta es la premisa de Stack Cats: todos los programas de terminación no triviales tienen una longitud impar, ya que los programas de longitud par se cancelan automáticamente.
Empezamos con
_
resta, haciendo la parte superior-1-n
, y[
mueve el resultado a la izquierda una pila::
intercambia los dos primeros yI
no hace nada, ya que la parte superior de la pila ahora es cero.!
luego, a nivel de bits, niega el cero superior en a-1
y:
cambia los dos superiores hacia atrás.!
a continuación, bit a bit niega la parte superior, convirtiendo-1-n
de nuevo enn
otra vez:Ahora nos ramificamos según
I
, que se aplica a nuestro originaln
:Si
n
es negativo, nos movemos hacia la izquierda una pila y terminamos con-n
un cero implícito.:
intercambia, coloca un cero en la parte superior y]
mueve el cero en la parte superior de la-1
que acabamos de mover._
luego resta, dejando la pila final como[-1 -1]
, y solo-1
se emite uno ya que-1
se ignora la base .Si
n
es cero, no nos movemos y:
cambiamos, poniéndonos-1
en la parte superior.]
luego mueve esta izquierda-1
arriba de la derecha-1
y_
resta, dejando la pila final como[-1 0]
, sacando el cero e ignorando la base-1
.Si
n
es positivo, nos movemos a la derecha una pila y terminamos con-n
a-1
.:
intercambia, coloca la-1
parte superior y]
mueve esta-1
derecha, encima de un cero implícito._
luego resta, dando0 - (-1) = 1
y dejando la pila final como[1]
, que es la salida.fuente
TI-Basic, 8 bytes
Soluciones alternativas (siéntase libre de sugerir más):
fuente
~
supone que es?~
para representar este token.Ans
como entrada no cumple los criterios para ser un método de E / S predeterminado válido (no tiene el doble de votos positivos que votos negativos; actualmente está en + 19 / -12).MATL , 6 bytes
La entrada puede ser un número o una matriz. El resultado es un número o una matriz con los valores correspondientes.
Pruébalo en línea! O pruebe varios casos utilizando la entrada de matriz.
Explicación
Esto evita usar la función de signo incorporado (
ZS
).fuente
ZS
como se dice en la respuesta.Gelatina , 1 byte
TryItOnline!
El signo monádico átomo ,
Ṡ
, hace exactamente lo que se especifica para una entrada de número entero, ya sea como un programa completo o como un enlace monádico (función de tomar un argumento).fuente
Mathematica, 4 bytes
Exactamente lo que dice en la lata
fuente
sgn
Octava,
2624 bytesEsta es mi primera respuesta de octava de código de golf , ¡se agradece cualquier consejo de golf!
Pruébalo en línea!
La idea para tomar
asin
viene de la pregunta donde diceoutput the sign
:)Explicación
Nota: dividir el número por
pi
y multiplicarlo por2
es el equivalente a dividir el número entero porpi/2
Caso
0
:asin(0)
rendimientos0
. Tomar la parte real de la misma y dividirla nopi/2
hace ninguna diferencia en la salida.Caso
positive
:asin(1)
rendimientospi/2
.asin
de cualquier número mayor que1
darápi/2
+ número complejo. Tomar la parte real de eso dapi/2
y dividirlo porpi/2
da1
Caso
negative
:asin(-1)
rendimientos-pi/2
.asin
de cualquier número menor que-1
dará-pi/2
+ número complejo. Tomar la parte real de eso da-pi/2
y dividirlo porpi/2
da-1
fuente
N will be an integer
Tengo suerte, dice eso en la pregunta :)f=
si el resto es una expresión de función válida, no recursiva.En realidad , 1 byte
Pruébalo en línea!
Otro caso de exactamente lo que dice en la lata
s
es la función de signo.Sin el incorporado (4 bytes):
Pruébalo en línea!
;A\
divide el valor absoluto de la entrada por la entrada. Esto da-1
como resultado entradas negativas y1
entradas positivas. Desafortunadamente, debido al manejo de errores de Actually (si algo sale mal, el comando se ignora),0
ya que la entrada deja dos0
s en la pila.+
rectifica esto al agregarlos (lo que causa un error con cualquier otra cosa, por lo que se ignora).fuente
Piet,
188534641 bytesIntérprete en línea disponible aquí.
Este código piet cumple con el estándar
(n>0)-(n<0)
, ya que no hay signos de verificación incorporados. De hecho, no hay nada menos que incorporado, por lo que sería una descripción más precisa de este método(n>0)-(0>n)
.El texto de arriba representa la imagen. Puede generar la imagen pegándola en el cuadro de texto en la página del intérprete. Por conveniencia, he proporcionado la imagen a continuación donde el tamaño del códel es de 31 píxeles. La cuadrícula está ahí para facilitar la lectura y no forma parte del programa. También tenga en cuenta que este programa no cruza ningún códec blanco; siga los códeles de colores alrededor del borde de la imagen para seguir el flujo del programa.
Explicación
Para reducir aún más el tamaño del archivo, necesitaría cambiar el programa (jadeo) en lugar de simplemente comprimir el archivo como lo he estado haciendo. Me gustaría eliminar una fila que reduciría esto a 36. También puedo desarrollar mi propio intérprete que tendría un formato de entrada mucho más pequeño, ya que cambiar el código para hacerlo más pequeño no es de lo que se trata el código golf.
Las modificaciones me dijeron que el tamaño de archivo general es lo que cuenta para el código Piet. Como el intérprete acepta el texto como entrada válida y el texto sin procesar tiene un recuento de bytes mucho menor que cualquier imagen, el texto es la opción obvia. Pido disculpas por ser descarado al respecto, pero no hago las reglas. La meta discusión sobre esto deja en claro mis opiniones sobre el asunto.
Si cree que eso va en contra del espíritu de Piet o le gustaría discutir esto más a fondo por cualquier motivo, consulte la discusión sobre meta .
fuente
Pushy , 7 bytes
Este es probablemente el programa de aspecto más extraño que he escrito ...
Pruébalo en línea!
Utiliza
sign(x) = abs(x) / x
, pero con un explícitosign(0) = 0
para evitar el error de división cero.Esto funciona porque
x / abs(x)
es 1 cuando x es positivo y -1 cuando x es negativo. Si la entrada es 0, el programa salta al comando de salida.4 bytes (no competitivos)
Debido a las vacaciones y a tener demasiado tiempo, he hecho una reescritura completa del intérprete Pushy. El programa anterior aún funciona, pero como
0 / 0
ahora está predeterminado a 0, lo siguiente es más corto:Pruébalo en línea!
fuente
abs
, pero no tenía idea de qué hacer con el0
. ¡Bien hecho!R, 25 bytes
Lleva el número a STDIN. Luego comprueba si es cero, si no, devuelve
x/|x|
cuál es cualquiera1
de los dos-1
y emite 0 six=0
.Esto es sin usar el incorporado
sign
por supuesto.fuente
sign(scan())
.V
1412 bytesGracias @DJMcMayhem por 2 bytes. Utiliza un reg-ex para hacer la sustitución. Un poco divertido, porque no está integrado. Tengo una función más divertida, pero no funciona como esperaba.
Verificar casos de prueba
Esto solo se traduce a
:%s/\v(-)=[^0].*/\11
qué coincide uno o más-
seguido de cualquier cosa que no sea 0, seguido de cualquier cosa cualquier cantidad de veces. Se reemplaza con el primer partido (por lo tanto, a-
o nada) y a1
. La expresión regular no coincide con 0, por lo que se queda sola.La forma más divertida (21 bytes)
TryItOnline
Esto acepta la entrada como un argumento en lugar de en el búfer.
é<CR>
Insertar una nueva línea.À
ejecuta el argumento como código V. a-
moverá el cursor a la línea anterior, y cualquier número se convertirá en el recuento para el siguiente comandoé1
inserte (cuenta)1
's2|
pasar a la segunda columnaD
eliminar todo desde la segunda columna en adelante (dejando solo un carácter)kJ
Une las dos líneas juntas.òhé-ò
se traduce como: "correrhé-
hasta romper". Si el 1 estaba en la segunda línea, esto se rompe inmediatamente después de la h. Si estaba en la primera línea, insertará un-
antes de romper.ó^$/a
Esto soluciona el hecho de que-1
,0
,1
dejará un espacio en blanco, en lugar de un espacio en blanco con el registro de argumentos.fuente
Àé1
. Un número positivo da una cadena de unos, un número negativo DEBE dar una cadena de unos una fila hacia arriba, y 0 no daría nada. El bit de número negativo no funcionóÀ
, pero sí cond$@"
é<cr>
, tendrá dos líneas vacías y eso sí funciona . No estoy seguro de si puedes usar eso para obtener una respuesta completa--
argumento que agregaste?-6
comienza con un indicador, docopt (la biblioteca de Python para las opciones de línea de comando) cree que es un indicador de línea de comando en lugar de un argumento. Agregar--
solo indica que es un argumento, no una opción. De lo contrario, no se ejecutará en absoluto debido a una invocación de línea de comando no válida.C #,
1615 bytesSolución mejorada gracias a Neil
Alternativamente, el método incorporado es 1 byte más largo:
Programa completo con casos de prueba:
fuente
n>>31
lugar den<0?-1:0
.;
ya que una lambda es una expresión, no una declaración. B) ¿Math.Sign
oMath::Sign
algo similar sería una presentación válida? No estoy seguro de cómo C # en particular maneja los métodos. Básicamente, ¿x = Math.Sign;
sería una declaración válida de C # six
se inicializara con el tipo correcto?