Calculez n
modulo 12
pour un entier 32 bits non signé.
Les règles:
- Doit fonctionner pour tous
n
entre 0 et 23. Autres numéros facultatifs. - Ne doit utiliser l' un des opérateurs
+-*
,~&^|
ou<<
,>>
comme généralement défini sur 32 uints bits. - Peut utiliser un nombre arbitraire d'uints constants.
- Ne peut utiliser aucune forme de pointeurs, y compris des tableaux ou des
if
instructions, y compris des éléments qui se compilent pour des instructions telles que des opérateurs ternaires ou des opérateurs "supérieurs à".
Le score:
- Les opérateurs
+ -
et les opérateurs au niveau du bit~ & ^ | << >>
(NOT, AND, XOR, OR, décalage de bits) donnent un score de1
,*
donne un score de2
. - Le score total le plus bas gagne.
+-*
on additionne, soustrait, multiplie;~&^|
sont au niveau du bit NOT, AND, XOR, OR; et<< >>
sont des décalages de bits.for i in x:y:z, .dostuff
?n % 12
pour une multiplication et un changement comme dans le plaisir des pirates, donc c'est trivial, il suffit de sortir l'assemblage et de voirRéponses:
4
(La langue n'est pas pertinente)
Courtiser! Je suis arrivé à 4.
11-n
garantira que tous les bits de poids fort sont définis si et seulement si n> = 12.48&(11-n)
== si n> 11 puis 48 sinon 0(48&(11-n))>>2
== si n> 11 puis 12 sinon 0n-((48&(11-n))>>2)
Est la réponsela source
n - (((11 - n) & 0xC0000000) >> 28)
. Bien joué, je ne pense pas que ce soit possible en moins de quatre.4
Une solution avec une table de recherche (elle recherche
i ^ (i % 12)
):4
Voici une autre solution avec 4 opérations:
Il suppose que l'opérande de comptage des décalages de bits est implicitement pris mod 32, c'est
x >> -1
-à- dire est le même quex >> 31
.5
Une autre approche, à l'aide d'une table de recherche:
la source
bash - 1
par exemple
la source
stdin
etstdout
? Bien sûr, en interne, ce sont des pointeurs, mais nous pourrions aussi bien disqualifier Java car il utilise laInteger
classe en interne pour beaucoup de choses.C, petit-boutien - 2
C'est probablement de la triche mais je pense que cela satisfait les règles ...
la source
= 0
au lieu de& 0x0
, ce qui devrait compter comme 2 opérations supplémentaires. Mais +1 pour la créativité :)PHP - score 0
Je me demande comment est-il possible que personne ne soit venu avec ça avant moi !!!
la source
C, score 5
Fonctionne jusqu'à 23, non garanti au-dessus.
((n+4)>>2)&4
renvoie 4 pour n> = 12. Ajoutez-le à n et vous obtenez la bonne réponse dans les 4 bits les moins significatifs, puis tronquez les autres bits.la source
quelle que soit la langue: 5
ne va pas gagner, mais participer parce que c'est amusant et peut-être parce qu'il est plus facile de comprendre que les autres:
cela équivaut à
c'est équivalent parce que lorsque vous ajoutez 20 à 12, vous obtenez 32, donc le 5ème bit devient 1. Ce n'est que lorsque n> 1 que 32 est le plus petit nombre où le 5ème bit devient 1.
notez également qu'il est facilement extensible pour une gamme plus élevée, comme vous pouvez le faire
pour atteindre une plage jusqu'à 35
la source
Python 2.x - 4
Est
=
un opérateur?Dans ce cas, le score est de 6.
La solution de BTW @steveverrill peut également être utilisée directement en Python.
Fonctionne pour la gamme 0 .. 23
Alors que se passe-t-il ? Multipliez par 357913942 et divisez par 2 ^ 32 (ou décalage à droite 32)
la source
C - 6
la source
Cobra - 2 (ou 3)
Cela pourrait un peu déformer les règles, mais j'ai demandé et j'ai été autorisé à utiliser cela.
Il fonctionne également pour n'importe quel numéro.
la source
Kona - 5
Peut être invalide car je ne sais pas si l'opérateur de plancher est autorisé, mais j'en ai deux
*
et un moins:Ce qui devrait fonctionner pour n'importe quel entier.
la source