Produza o programa mais curto que recebe dois números inteiros assinados como entrada (por meio de stdin ou como argumentos) e exibe 3 saídas diferentes, dependendo de o primeiro número ser (1) maior que, (2) menor que ou (3) igual ao segundo número.
A pegada
Você não pode usar nenhum dos seguintes itens no seu programa:
- Os operadores de comparação padrão:
<
,>
,<=
,>=
,==
,!=
. - Qualquer arquivo de biblioteca para além de
conio
,stdio
ouiostream
. - Qualquer caractere ASCII não ASCII ou imprimível.
O vencedor
O programa com o menor número de caracteres vence.
code-golf
restricted-source
c
c++
Arvoredo
fonte
fonte
abs
sem incluir o arquivo da biblioteca (porque o compilador sabe mesmo assim) também não é permitido?Respostas:
53 bytes
Somente o primeiro caractere da saída é relevante. As três saídas diferentes são:
Ele funciona para todo o intervalo de entrada de int em todas as plataformas em que sizeof (long)> sizeof (int).
Edit: custa um caractere extra para fazer com que o caso 3 imprima um '+' exclusivamente:
fonte
Talvez eu esteja perdendo algo nas regras, mas ...
81 bytes
Ouputs
00
sea > b
,-10
sea == b
e-1-1
sea < b
.fonte
long long
pode ter mais de 64 bits,int
pode ser tão grande que você possa estourar, o resultado da alteração correta dos valores negativos é definido pela implementação. Praticamente todas as respostas derivadas de C têm problemas semelhantes.sizeof
.90 bytes
Se pudermos usar
stdio
, por que não usar seus recursos de formatação para realizar comparações?Supõe codificação compatível com ASCII e pouca endianidade.
72 bytes
Os quocientes são arredondados para zero, mas os turnos à direita são (na prática) "arredondados para baixo". Essa é uma oferta morta.
6579 bytesOutra propriedade distintiva dos números negativos é que eles produzem módulo negativo. Este não depende de representação inteira; funciona até na minha torradeira excesso 127 de 8 bits! Ah, e como podemos usar
conio
, por que não salvar dois bytes computch
? Agora, se eu pudesse encontrar minha cópia do TurboC ...EDIT : lidar com grandes diferenças, assumindo que
long long
é maior queint
.fonte
%d
s no seuscanf
para analisar inequivocamente dois números inteiros. Boa idéia embora!a = 1, b = 23
ea = 12, b = 3
. Você não precisaria usar o123
STDIN nos dois casos?1 23
e12 3
como entradas).6461 caracteresImprime os valores dos caracteres -1, 0 e 1 para menos que, igual a ou maior que, respectivamente.
Essa implementação depende de um comportamento indefinido por
b
ser do tipoint
e por entradas fora do intervaloINT_MIN / 2
paraINT_MAX / 2
. Nas plataformas em que o excesso de sinal assinado envolve, seja o complemento 2s (basicamente todos eles) ou a magnitude do sinal, ele falhará em 25% dos possíveis pares válidosint
. Curiosamente (para mim de qualquer maneira), ele funcionará corretamente em plataformas onde o excesso de sinal assinado satura.fonte
a-b
estourar.-(2^14)
e2^14 - 1
em todas as plataformas compatíveis e provavelmente funcionará para uma faixa substancialmente maior na maioria das plataformas. Todas as outras respostas neste momento fazem suposições sobre tamanho de tipo, tamanhos relativos de tipos ou representação.main(a,b)
já é um comportamento indefinido, portanto, nenhuma das respostas é garantida para o trabalho. Não importa a portabilidade.66102 bytesLê os números inteiros de STDIN e imprime
0
(a <b),1
(a> b) ou2
(a == b).Editar: Agora também deve funcionar para diferenças grandes demais para caber em um número inteiro de 32 bits. Tenho certeza de que o ternário aninhado pode ser reduzido com um pouco mais de mágica.
fonte
52 bytes
Infelizmente, este só funciona para números inteiros positivos, mas achei interessante o conceito de usar operadores puramente aritméticos:
Saídas:
fonte
putchar(a/b-b/a)
é muito menor.5954 caracteres54 charcters com um compilador como o gcc que não se opõe a
main(x,y)
:59 caracteres caso contrário:
Resultado:
fonte
main(x,y)
funciona no gcc, portanto, sinta-se à vontade para remover esses 5 bytes da sua contagem de caracteres.66 bytes
Imprime o byte 0x00 se
a == b
, 0x01 sea < b
e 0xff sea > b
.Como o caractere ASCII não ASCII ou imprimível no programa [my] e se alguma coisa não for explicitamente proibida na pergunta, é permitido que o caractere não imprimível na saída esteja completamente correto.
fonte
long
é de 64 bits.87 caracteres
Usando o truque 2 ^ 31 para converter em int sem sinal
Converter a divisão em não assinado para manipular o bit superior como dados, não assinar
Usando ^ para XOR aeb, quando eles são iguais, isso retorna 0
Usando condicionais aninhados (?) Para obter "<", ">" ou "=" para alimentar feeds a puts ()
fonte
71 bytes
http://ideone.com/uvXm6c
fonte
z=x-y
e tenho certeza de que eles são necessários. Você também pode salvar dois caracteres usando49,
50` e51
diretamente, em vez de adicionar48
.-2000000000 2000000000
, assim como qualquer outra combinação de números inteiros que causam estouro na subtração.68 caracteres
Coloca o caractere ASCII 1, 2 ou 3 por menos que, maior que ou igual, respectivamente.
fonte
a-b
estourar.8889 bytesIsso começa adicionando
1<<31
(INT_MIN
) a aeb, para que 0 agora correspondaINT_MIN
. Em seguida, faz um loop e decrementa a e b a cada loop até que seja 0 e, em seguida, imprime 0, 1 ou 2, dependendo de a, b ou ambos serem 0.120119 bytesNão é a solução mais curta, mas pode ser um pouco melhor para o golfista do que eu. (Ou apenas pessoas com mais conhecimento de C do que eu)
A idéia é mascarar cada bit, começando pelo esquerdo e verificando a desigualdade. O resto deve se explicar. Como os números negativos começam com 1 bit, eu primeiro inverto o primeiro bit com
a^=1<<31
.fonte
;)
sorriso feliz deve ser um);
sorriso triste . 2.a&b
apenas testa sea
eb
possui bits em comum; você precisa&&
.Acho que nem vou tentar escrever código curto. O que tentarei é realizar essa comparação de maneira portátil, de acordo com a especificação C99.
O operador modulo preserva o sinal, mas pode muito bem produzir um zero (incluindo zero negativo), portanto, garantimos que temos um valor ímpar e par para verificar (mesmo sem saber se estamos usando o complemento). As operações aritméticas podem estourar, mas bit a bit não e, ao garantir que haja bits definidos e limpos, evitamos converter inadvertidamente nosso número em zero negativo ou em um valor de trap. O fato de que duas operações são necessárias para fazer isso de maneira estranha não deve importar, porque a possível representação de interceptação não causa comportamento indefinido até colocar um valor l. Fazer a operação com o bit 0 alternado garante que obtemos exatamente um restante diferente de zero. Armado com o conhecimento de ambos os sinais, podemos decidir como proceder com a comparação.
Este método pode ser um dos poucos que permitem extrair o sinal de um número inteiro negativo zero. Resolvemos isso verificando explicitamente zero. Se estivéssemos jogando golfe de verdade, é claro que poderíamos permitir que a comparação de dois zeros também realizasse a subtração.
fonte
C 80 chars
Imprime '<', '>' ou '=', como deveria.
C 63 chars
Uma nova abordagem:
Imprime '1', '2' ou '3'.
fonte
Em 64 caracteres sem stdio.h
a,b;main(){scanf("%d%d",&a,&b);puts((a-b)>>31?"<":a^b?">":"=");}
imprime '>' se a> b, '<' se a <b, '=' se a == b int overflow for UB. Só não transborde.
fonte