Produire le programme le plus court qui prend en entrée deux entiers signés (via stdin ou comme arguments) et affiche 3 sorties différentes selon que le premier nombre est (1) supérieur à, (2) inférieur à ou (3) égal au second nombre.
The Catch
Vous ne pouvez utiliser aucun des éléments suivants dans votre programme:
- Les opérateurs de comparaison standard:
<
,>
,<=
,>=
,==
,!=
. - Tout fichier de bibliothèque à part
conio
,stdio
ouiostream
. - Tout caractère ASCII non ASCII ou non imprimable.
Le gagnant
Le programme avec le plus petit nombre de caractères gagne.
code-golf
restricted-source
c
c++
bosquet
la source
la source
abs
sans inclure le fichier de bibliothèque (parce que le compilateur le sait de toute façon) n'est pas autorisée non plus?Réponses:
53 octets
Seul le premier caractère de la sortie est pertinent. Les trois sorties différentes sont:
Il fonctionne pour la plage d'entrée complète de int sur toutes les plates-formes où sizeof (long)> sizeof (int).
Edit: il faut un caractère supplémentaire pour que le cas 3 imprime un '+' uniquement à la place:
la source
Peut-être que je manque quelque chose dans les règles, mais ...
81 octets
Ouputs
00
sia > b
,-10
sia == b
et-1-1
sia < b
.la source
long long
pourrait être supérieur à 64 bits,int
pourrait être aussi grand que vous pourriez déborder, le résultat du décalage à droite des valeurs négatives est défini par l'implémentation. Presque toutes les réponses dérivées de C ont des problèmes similaires.sizeof
.90 octets
Si nous pouvons utiliser
stdio
, pourquoi ne pas utiliser ses capacités de formatage pour effectuer une comparaison?Suppose un encodage compatible ASCII et peu d'endianisme.
72 octets
Les quotients sont arrondis vers zéro mais les décalages vers la droite sont (en pratique) "arrondis vers le bas". C'est un cadeau mort.
6579 octetsUne autre propriété distinctive des nombres négatifs est qu'ils produisent un modulo négatif. Celui-ci ne dépend pas du tout de la représentation entière; ça marche même sur mon grille-pain 8 bits en excès-127! Oh, et puisque nous pouvons utiliser
conio
, pourquoi ne pas enregistrer deux octets avecputch
? Maintenant, si je pouvais seulement trouver ma copie de TurboC ...EDIT : gérer de grandes différences en supposant qu'il
long long
est plus large queint
.la source
%d
s dans votrescanf
pour analyser sans ambiguïté deux entiers. Belle idée quand même!a = 1, b = 23
eta = 12, b = 3
. N'auriez-vous pas besoin de mettre123
STDIN dans les deux cas?1 23
et12 3
comme entrées).6461 caractèresImprime les valeurs de caractères -1, 0 et 1 pour respectivement inférieur, égal ou supérieur à.
Cette implémentation repose sur un comportement non défini pour
b
être de typeint
et pour des entrées en dehors de la plageINT_MIN / 2
deINT_MAX / 2
. Sur les plates-formes où le débordement signé s'enroule, qu'il s'agisse d'un complément 2s (essentiellement tous) ou d'une amplitude de signe, il échouera pour 25% des paires possibles de paires validesint
. Fait intéressant (pour moi en tout cas), cela fonctionnera correctement sur les plateformes où le débordement signé sature.la source
a-b
débordement.-(2^14)
et2^14 - 1
sur toutes les plates-formes conformes, et elle fonctionnera probablement pour une plage sensiblement plus grande sur la plupart des plates-formes. Toutes les autres réponses à ce stade font des hypothèses sur la taille du type, les tailles relatives des types ou la représentation.main(a,b)
est déjà un comportement indéfini, donc aucune des réponses n'est garantie pour fonctionner. La portabilité peu importe.66102 octetsLit les entiers de STDIN et imprime
0
(a <b),1
(a> b) ou2
(a == b).Edit: Maintenant, il devrait également fonctionner pour les différences qui sont trop grandes pour tenir dans un entier 32 bits. Je suis sûr que le ternaire imbriqué peut être raccourci avec un peu plus de magie magique.
la source
52 octets
Malheureusement, celui-ci ne fonctionne que pour des nombres entiers positifs, mais je pensais que le concept d'utiliser des opérateurs purement arithmétiques était intéressant:
Les sorties:
la source
putchar(a/b-b/a)
c'est beaucoup plus court.5954 caractères54 caractères avec un compilateur comme gcc qui ne rechigne pas à
main(x,y)
:59 caractères sinon:
Production:
la source
main(x,y)
fonctionne dans gcc, alors n'hésitez pas à supprimer ces 5 octets de votre nombre de caractères.66 octets
Imprime l'octet 0x00 if
a == b
, 0x01 ifa < b
et 0xff ifa > b
.Étant donné que le caractère ASCII non ASCII ou non imprimable dans [mon] programme et si quelque chose n'est pas explicitement interdit dans la question, alors il est autorisé , le caractère non imprimable dans la sortie devrait être tout à fait correct .
la source
long
est 64 bits.87 caractères
Utilisation de l'astuce 2 ^ 31 pour convertir en int non signés
Casting de la division sur unsigned pour gérer le bit supérieur en tant que données, pas signer
En utilisant ^ à XOR a et b, quand ils sont égaux, cela renvoie 0
Utilisation de conditions imbriquées (?) Pour obtenir "<", ">" ou "=" pour alimenter les options put ()
la source
71 octets
http://ideone.com/uvXm6c
la source
z=x-y
et je suis sûr qu'elles sont nécessaires. Vous pouvez également enregistrer deux caractères en utilisant49,
50` et51
directement, au lieu d'ajouter48
.-2000000000 2000000000
, ainsi que toute autre combinaison d'entiers qui provoquent un débordement dans la soustraction.68 caractères
Place le caractère ASCII 1, 2 ou 3 pour respectivement inférieur, supérieur ou égal.
la source
a-b
débordement.8889 octetsCela commence par ajouter
1<<31
(INT_MIN
) à a et b, de sorte que 0 correspond maintenantINT_MIN
. Ensuite, boucle et décrémente a et b chaque boucle jusqu'à ce que soit 0, puis imprime 0, 1 ou 2 selon que a, b ou les deux sont 0.120119 octetsCe n'est pas la solution la plus courte, mais elle pourrait être un peu golfée par un meilleur golfeur que moi. (Ou juste des gens avec plus de connaissance de C que moi)
L'idée est de masquer chaque bit, en commençant par celui de gauche et en vérifiant les inégalités. Le reste devrait s'expliquer. Étant donné que les nombres négatifs commencent par 1 bit, j'inverse d'abord le premier bit avec
a^=1<<31
.la source
;)
smiley heureux devrait être un);
smiley triste . 2.a&b
teste uniquement sia
etb
ont des bits en commun; vous avez besoin&&
.Je pense que je ne vais même pas essayer d'écrire du code court. Ce que je vais tenter est d'effectuer cette comparaison d'une manière qui est portable selon la spécification C99.
L'opérateur modulo conserve le signe, mais il peut très bien produire un zéro (y compris un zéro négatif), nous nous assurons donc d'avoir une valeur à la fois impaire et paire à vérifier (même sans savoir si nous utilisons des compléments). Les opérations arithmétiques peuvent déborder, mais pas au niveau du bit, et en veillant à ce qu'il y ait des bits à la fois définis et effacés, nous évitons de convertir par inadvertance notre nombre en zéro négatif ou en valeur d'interruption. Le fait que deux opérations soient nécessaires pour le faire étrangement ne devrait pas avoir d'importance, car la représentation d'interruption possible ne provoque pas de comportement indéfini jusqu'à ce qu'elle soit mise dans une valeur l. Faire l'opération avec le bit 0 basculé garantit que nous obtenons exactement un reste non nul. Armé de la connaissance des deux signes, nous pouvons décider comment procéder à la comparaison.
Cette méthode peut être l'une des rares à permettre d'extraire le signe d'un zéro négatif entier. Nous résolvons cela en vérifiant explicitement zéro. Si nous jouions au golf pour de vrai, nous pourrions bien sûr permettre la comparaison de deux zéros pour effectuer également la soustraction.
la source
C 80 caractères
Il imprime '<', '>' ou '=', comme il se doit.
C 63 caractères
Une nouvelle approche:
Imprime «1», «2» ou «3».
la source
En 64 caractères sans stdio.h
a,b;main(){scanf("%d%d",&a,&b);puts((a-b)>>31?"<":a^b?">":"=");}
affiche '>' si a> b, '<' si a <b, '=' si a == b int débordement est UB. Ne débordez pas.
la source