Ceci est un CMC (mini défi de chat) que j'ai publié dans notre salon de discussion, The Ninteenth Byte , il y a un peu.
Le défi
Étant donné un entier positif x
, en fonction des 2 derniers bits de x
, procédez comme suit:
x & 3 == 0: 0
x & 3 == 1: x + x
x & 3 == 2: x * x
x & 3 == 3: x ^ x (exponentiation)
Entrée sortie
Single Integer -> Single Integer
Une nouvelle ligne de fin est autorisée dans la sortie. Aucun autre espace n'est autorisé.
Cas de test
input output
1 2
2 4
3 27
4 0
5 10
6 36
7 823543
8 0
9 18
10 100
11 285311670611
12 0
C'est un défi de code-golf , donc le code le plus court gagne!
0
cas êtrex + 2
, car comment les autres sontx * 2
,x ^ 2
etx ^^ 2
(tétration)? : Px ^ x
)? 32 bits ne sont déjà pas suffisants pour le scénario de test11
et 64 bits ne sont pas suffisants pour le scénario de test19
.Réponses:
Gelée , 8 octets
Essayez-le en ligne!
Comment ça marche
Tout d'abord, notez que
x&3
c'est équivalent àx%4
, où%
est modulo. Ensuite, puisque Jelly utilise l'indexation modulaire (a[n] == a[n+len(a)]
), nous n'avons donc même pas besoin de gérer cela.Ensuite:
x%4==0
, retourx_x
(soustraction) (pour cohérence);x%4==1
, retourx+x
;x%4==2
, retourx×x
(multiplication);x%4==3
, retourx*x
(exponentiation)Notez que Jelly utilise l'indexation 1, donc la soustraction
"_"
est déplacée à la fin.la source
wc --bytes
).Python , 30 octets
Essayez-le en ligne!
la source
CJam , 12 octets
Essayez-le en ligne!
Explication
Exécute l'une des opérations suivantes en fonction de
x
la valeur de mod 4 (le mod 4 est équivalent à AND 3).la source
Mathematica 25 octets
4 octets enregistrés grâce à @MartinEnder
la source
Pyth, 8 octets
Interprète
la source
v
place de.v
..v
ne pouvais pas y accéderQ
... Apparemment, je me suis fait déjouer en Pyth. +1 pour vous.v
qui a une portée locale,.v
juste une expression."0y*^
pourrait l'être"-+*^
.Rubis , 26 octets
Essayez-le en ligne!
la source
PHP, 37 octets
Version en ligne
PHP, 47 octets
Version en ligne
Fonctions BC Math
la source
Haskell,
2827 octetsEssayez-le en ligne!
Edit: Merci à @ Ørjan Johansen pour 1 octet.
la source
cycle
.JavaScript, 24 octets
Essayez-le en ligne!
la source
C, 63 ou 62 octets
-1 octet si les macros sont autorisées, en supposant que ce
x
n'est pas une expression comme3+5
(car cela gâcherait la priorité):la source
cast to incomplete array type "int[]" is not allowed
compilateur a diterror C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
; ÉGALEMENT! où est int f (int x)? le code est en fait au moins 8 octets plus long; il est également très lent et inefficace, car il évalue tout - ne le répétez pas IRL)(int[])
syntaxe pour cette situation. 2)f(x)
est parfaitement légal C89. Je n'ai pas précisé la norme. 3) Il s'agit de la taille du code, pas de l'efficacité. Et 4) Si vous allez être condescendant, utilisez au moins un vrai compilateur et / ou vérifiez vos faits.Java 7, 75 octets
Même s'il est valide selon les règles, il
long
est de 64 bits, il échoue donc pour les cas de test d'exponentiation de19^19
et au-dessus. Pour résoudre ce problème, nous pouvons utiliser uneBigDecimal
approche:148146 octetsExplication (de l'approche BigDecimal):
Code de test:
Essayez-le ici.
Sortie:
la source
Assembleur x86, syntaxe Intel, 192 octets
L'exemple prétend la vitesse de travail la plus rapide. Is est un programme ou une partie de programme qui utilise la convention fastcall. Il suppose une variable d'entrée
x
dans le registreeax
et renvoie le résultat également danseax
. L'idée de base est d'éviter d'utiliser des sauts conditionnels, comme dans certains exemples ici. En outre, il ne s'agit pas de tout évaluer (comme dans l'exemple C avec des tableaux), mais d'utiliser un tableau de pointeurs vers des fonctons et de faire des sauts inconditionnels plus rapides (jmp / call) comme un analogique "C language switch () - case .." optimisé. Cette technique pourrait également être utile dans des types d'automates finis, comme les émulateurs de processeurs, les exécuteurs, etc.Mise à jour: pour x64, utilisez "r" dans les noms de registres, au lieu de "e" (par exemple
rax
au lieu deeax
,rcx
au lieu deecx
). La taille ne sera pas modifiée et elle utilisera des mots non signés 64 bits.la source
C #, 39 octets
Explication
Observe ceci:
(xx, x + x, x * x, x ^ x) == (0, 2, x, x ^ (x-1)) * x
La solution crée un tableau, y indexe puis multiplie le résultat par
x
:Versions alternatives:
(39B, toute multiplication effectuée dans le tableau,
x%4
remplacex&3
)(39B, identique à la réponse de @ MetaColon mais
x%2*2*x
remplaçantx*x%4<1?0:2
)la source
En fait , 12 octets
Essayez-le en ligne!
Explication:
la source
05AB1E , 10 octets
Utilise l' encodage 05AB1E . Essayez-le en ligne!
la source
J , 14 octets
Essayez-le en ligne!
la source
(4&|{-,+,*,^)~
fonctionne aussi bien mais c'est le même nombre d'octets en raison des parens, bien que ce soit un peu plus évident.Oasis , 25 octets
Essayez-le en ligne!
Comment ça marche
Notez que cela
x&3
équivaut àx%4
, où%
est modulo.Oasis est un langage basé sur la pile où chaque personnage est une commande.
la source
Cubix , 29 octets
Essayez-le en ligne!
Une explication sera bientôt ajoutée ...
la source
C #, 42 octets
En fait, c'est C # normal, mais comme vous ne pouvez pas l'exécuter comme un programme entier et que vous devez le taper dans l'interactif, je suppose que vous pouvez l'appeler C # interactif .
Explication :
Je ne peux pas dire si c'est la variante la plus courte, toutes les suggestions sont appréciées.
la source
x
n'est pas défini. Cela en fait un extrait, pas un programme complet.x
» signifie que vous êtes donnésx
par un procédé d'entrée standard ( par exemple, de la fonction ou du programme).PHP, 36 octets
la source
dc, 27
Je n'ai jamais eu l'occasion d'utiliser des tableaux en DC auparavant:
Essayez-le en ligne .
la source
Groovy, 26 octets
Essayez-le en ligne!
la source
C, 115 octets
L'exemple est une fonction
int f(int x)
Il prétend la vitesse de travail la plus rapide car il empêche le CPU d'utiliser des sauts conditionnels. Et ce n'est que la manière correcte d'optimiser la vitesse pour cette tâche. En outre, il essaie de ne pas tout évaluer, comme dans l'exemple du tableau C,
return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
mais d'utiliser judicieusement le tableau de pointeurs vers les fonctons, afin de faire des sauts inconditionnels beaucoup plus rapides (jmp / call) avec une arithmétique d'adresse beaucoup plus rapide, comme une version optimisée de " switch () - case .. ". Cette technique pourrait également être utile dans plusieurs types d'automates finis - comme les émulateurs de processeur, les exécuteurs, les analyseurs de flux de commandes, etc. - où la vitesse est importante et le code commeswitch(x%4) case(0):... case(1):...
ne convient pas car elle produit plusieurs instructions cmp / jnz; et ce sont des opérations coûteuses pour le CPULe programme de test le plus simple et le plus court (dans les conditions par défaut) pour le cas sera le suivant:
Il ajoutera seulement 12 octets de charge utile et totalisera notre taille à 127 octets;
Mais il vaut mieux dire à l'éditeur de liens d'utiliser la
f
fonction comme point d'entrée au lieu demain
. C'est le moyen, si nous visons à obtenir le binaire de travail le plus rapide possible pour cette tâche à partir du code le plus court ;-) Cela se produit car la bibliothèque C ajoute du code init / shutdown supplémentaire avant d'appeler votre fonction main ().Le code se compile sur MSVS Community 2015 sans trucs et problèmes et produit des résultats corrects. Je ne l'ai pas testé avec gcc, mais je suis sûr que cela fonctionnera aussi bien.
la source
R,
4742 octetsApplique la fonction
-
,+
,*
, ou^
sur la base du modulex
dex
etx
.-
est la seule chose (un peu) intelligente, carx-x
est toujours 0.R, 33 octets
Même méthode que les autres utilisent. Bien qu'il soit plus court, je ne l'aime pas autant.
la source
Pyth , 12 octets
Essayez-le en ligne!
Comment ça marche
Tout d'abord, notez que
x&3
c'est équivalent àx%4
, où%
est modulo. Ensuite, puisque Pyth utilise l'indexation modulaire (a[n] == a[n+len(a)]
), nous n'avons donc même pas besoin de gérer cela.Ensuite:
x%4==0
, retournezx-x
(pour cohérence);x%4==1
, revenezx+x
;x%4==2
, revenezx*x
;x%4==3
, revenezx^x
.En savoir plus sur la notation polonaise: Wikipedia (tant pis si vous êtes en Turquie).
la source
Japt, 13 bytes
Try it online!
This uses the same method as the other eval answers, except the program
-U
just negatesU
, so we use^
(bitwise XOR) instead.la source
Vim, 50 bytes
Here,
^V
represents aCtrl+V
,^R
representsCtrl-R
and^[
represents theesc
keyWorks by first building up the expression and then letting
bc
evaluate it. Expects the input on the first line in an otherwise empty buffer.Explanation:
la source
^V
it just pastes what I have in my clipboard, instead of the number...D
instead ofd$
Pyth, 9 bytes
Test suite
Nothing fancy going on here, just calculate the four values, and select one with modular indexing.
la source
Batch, 135 bytes
I was hoping to create the exponentiation by building up and evaluating a string of the form
[0+...+0, 2+...+2, x+...+x, x*...*x]
depending on the last two bits ofx
but unfortunately the code to select the operation took too long to express because I couldn't use*
as afor
parameter, but I was at least able to use some fall-though trickery to golf away some bytes.la source
Retina, 87 bytes
Try it online! (Link includes test suite.)
Explanation: The first two lines convert the input into unary and duplicate it (so we now have
x;x
). The next two lines look for anx&3
of either0
or1
and changex;x
intox;0
orx;2
appropriately. The next two lines look forx&3==3
and changex;x
intox;x;x;...;x;1;x
(x
x
s). This means that we have eitherx;0
,x;2
,x;x
, orx;...;x
and it remains to multiply everything together and convert back to decimal. (The multiplication code is based on that in the Retina wiki but amended to handle multiplication by zero.)la source