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,stdiooiostream. - 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

abssin 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
00sia > b,-10sia == by-1-1sia < b.fuente
long longpodría ser más de 64 bits,intpodrí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 longes más amplio queint.fuente
%ds en suscanfpara analizar sin ambigüedad dos enteros. Buena idea sin embargo!a = 1, b = 23ya = 12, b = 3. ¿No necesitarías ponerte123STDIN en cualquier caso?1 23y12 3como 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
bser de tipointy para las entradas fuera del rangoINT_MIN / 2aINT_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-bdesborda.-(2^14)y2^14 - 1en 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 < by 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
longes 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-yy estoy bastante seguro de que son necesarios. También puede guardar dos caracteres usando49,50` y51directamente, 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-bdesborda.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&bsolo prueba siaybtiene 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