Produzca el programa más corto que tome dos enteros con signo como entrada (a través de stdin o como argumentos) y muestre 3 salidas diferentes dependiendo de si el primer número es (1) mayor que, (2) menor que o (3) igual al segundo número.
La captura
No puede utilizar ninguno de los siguientes en su programa:
- Los operadores de comparación estándar:
<
,>
,<=
,>=
,==
,!=
. - Cualquier archivo de biblioteca, aparte de
conio
,stdio
oiostream
. - Cualquier carácter ASCII no ASCII o no imprimible.
El ganador
El programa con el menor número de caracteres gana.
code-golf
restricted-source
c
c++
arboleda
fuente
fuente
abs
sin incluir el archivo de la biblioteca (porque el compilador lo sabe de todos modos) ¿tampoco está permitido?Respuestas:
53 bytes
Solo el primer carácter de la salida es relevante. Las tres salidas diferentes son:
Funciona para el rango de entrada completo de int en todas las plataformas donde sizeof (long)> sizeof (int).
Editar: cuesta un carácter adicional hacer que el caso 3 imprima un '+' de forma exclusiva:
fuente
Tal vez me falta algo en las reglas, pero ...
81 bytes
Ouputs
00
sia > b
,-10
sia == b
y-1-1
sia < b
.fuente
long long
podría ser más de 64 bits,int
podría ser tan grande que podría desbordarse, el resultado del desplazamiento negativo de los valores negativos está definido por la implementación. Casi todas las respuestas derivadas de C tienen problemas similares.sizeof
.90 bytes
Si podemos usar
stdio
, ¿por qué no usar sus capacidades de formateo para realizar la comparación?Asume codificación compatible con ASCII y poca endianidad.
72 bytes
Los cocientes se redondean hacia cero, pero los desplazamientos a la derecha son (en la práctica) "redondeados hacia abajo". Eso es un regalo muerto.
sesenta y cinco79 bytesOtra propiedad distintiva de los números negativos es que producen un módulo negativo. Este no depende en absoluto de la representación entera; ¡incluso funciona en mi tostadora con exceso de 127 bits de 8 bits! Ah, y como podemos usar
conio
, ¿por qué no guardar dos bytes conputch
? Ahora, si solo pudiera encontrar mi copia de TurboC ...EDITAR : Manejar grandes diferencias asumiendo que
long long
es más amplio queint
.fuente
%d
s en suscanf
para analizar sin ambigüedad dos enteros. Buena idea sin embargo!a = 1, b = 23
ya = 12, b = 3
. ¿No necesitarías ponerte123
STDIN en cualquier caso?1 23
y12 3
como entradas).6461 caracteresImprime los valores de caracteres de -1, 0 y 1 para menor, igual o mayor que, respectivamente.
Esta aplicación se basa en un comportamiento indefinido para
b
ser de tipoint
y para las entradas fuera del rangoINT_MIN / 2
aINT_MAX / 2
. En plataformas donde el desbordamiento firmado se envuelve, ya sea 2s-complemento (básicamente todos) o magnitud de signo, fallará para el 25% de los posibles pares de válidosint
. Curiosamente (para mí de todos modos), funcionará correctamente en plataformas donde se satura el desbordamiento firmado.fuente
a-b
desborda.-(2^14)
y2^14 - 1
en todas las plataformas compatibles, y probablemente funcionará para un rango sustancialmente mayor en la mayoría de las plataformas. Todas las otras respuestas en este punto hacen suposiciones sobre el tamaño del tipo, los tamaños relativos de los tipos o la representación.main(a,b)
es un comportamiento indefinido, por lo que ninguna de las respuestas está garantizada para funcionar. No importa la portabilidad.66102 bytesLee los enteros de STDIN e imprime
0
(a <b),1
(a> b) o2
(a == b).Editar: ahora también debería funcionar para diferencias que son demasiado grandes para caber en un entero de 32 bits. Estoy seguro de que ese ternario anidado se puede acortar con algo más de magia de bits.
fuente
52 bytes
Lamentablemente, este solo funciona para enteros positivos, pero pensé que el concepto de usar operadores puramente aritméticos era interesante:
Salidas:
fuente
putchar(a/b-b/a)
es mucho más corto.5954 caracteres54 caracteres con un compilador como gcc que no se opone a
main(x,y)
:59 caracteres de lo contrario:
Salida:
fuente
main(x,y)
funciona en gcc, así que siéntete libre de eliminar esos 5 bytes de tu cuenta de caracteres.66 bytes
Imprime el byte 0x00 if
a == b
, 0x01 ifa < b
y 0xff ifa > b
.Dado que los caracteres ASCII no ASCII o no imprimibles en [mi] programa y si algo no está explícitamente prohibido en la pregunta, entonces está permitido , el carácter no imprimible en la salida debería estar completamente bien.
fuente
long
es de 64 bits.87 caracteres
Usando el truco 2 ^ 31 para convertir a int sin firmar
Convertir la división en sin signo para manejar el bit superior como datos, no firmar
Usando ^ para XOR a y b, cuando son iguales esto devuelve 0
Usando condicionales anidados (?) Para obtener "<", ">", o "=" para alimentar a put ()
fuente
71 bytes
http://ideone.com/uvXm6c
fuente
z=x-y
y estoy bastante seguro de que son necesarios. También puede guardar dos caracteres usando49,
50` y51
directamente, en lugar de agregar48
.-2000000000 2000000000
, así como cualquier otra combinación de enteros que provoque un desbordamiento en la resta.68 caracteres
Pone el carácter ASCII 1, 2 o 3 por menor que, mayor que o igual, respectivamente.
fuente
a-b
desborda.8889 bytesEsto comienza agregando
1<<31
(INT_MIN
) a a y b, de modo que 0 ahora correspondeINT_MIN
. Luego repite y decrementa ayb cada ciclo hasta que sea 0, luego imprime 0, 1 o 2 dependiendo de si a, b o ambos son 0.120119 bytesNo es la solución más corta como es, pero podría ser menos golfista por un mejor golfista que yo. (O simplemente personas con más conocimiento de C que yo)
La idea es enmascarar cada bit, comenzando por el izquierdo y verificando la desigualdad. El resto debería explicarse por sí mismo. Como los números negativos comienzan con 1 bit, primero invierto el primer bit con
a^=1<<31
.fuente
;)
carita feliz debería ser una);
carita triste . 2.a&b
solo prueba sia
yb
tiene bits en común; lo que necesita&&
.Creo que ni siquiera voy a intentar escribir código corto. Lo que intentaré es realizar esta comparación de una manera que sea portátil según la especificación C99.
El operador de módulo conserva el signo, pero bien puede producir un cero (incluido el cero negativo), por lo que nos aseguramos de que tengamos un valor par e impar para que lo verifique (incluso sin saber si estamos usando un complemento). Las operaciones aritméticas pueden desbordarse, pero los bits no lo harán, y al asegurarnos de que los bits estén configurados y borrados, evitamos convertir nuestro número en cero negativo o en un valor de trampa sin darse cuenta. El hecho de que se requieran dos operaciones para hacerlo de manera extraña no debería importar, porque la posible representación de trampa no causa un comportamiento indefinido hasta que se pone en un valor. Hacer la operación con el bit 0 activado garantiza que obtengamos exactamente un resto distinto de cero. Armados con el conocimiento de ambos signos, podemos decidir cómo proceder con la comparación.
Este método puede ser uno de los pocos que permiten extraer el signo de un cero negativo entero. Resolvemos eso comprobando explícitamente el cero. Si estuviéramos jugando al golf de verdad, podríamos permitir la comparación de dos ceros para realizar también la resta.
fuente
C 80 caracteres
Imprime '<', '>' o '=', como debería.
C 63 caracteres
Un nuevo enfoque:
Imprime '1', '2' o '3'.
fuente
En 64 caracteres sin stdio.h
a,b;main(){scanf("%d%d",&a,&b);puts((a-b)>>31?"<":a^b?">":"=");}
imprime '>' si a> b, '<' si a <b, '=' si a == b int desbordamiento es UB. Simplemente no se desborde.
fuente