J'aime jouer au golf dc
, mais je suis parfois frustré car je n'ai dc
pas d'opérations au niveau du bit.
Défi
Fournir quatre fonctions nommées qui mettent en œuvre l'équivalent des c opérations binaires &
, |
, ~
et ^
( au niveau du bit, OR, NOT et XOR). Chaque fonction prendra deux opérandes ( ~
n'en prend qu'un) qui sont des entiers non signés d'au moins 32 bits. Chaque fonction renverra un entier non signé de la même largeur de bits que les opérandes.
Restriction
Vous ne pouvez utiliser que des opérations prises en charge par dc
. Ceux-ci sont:
+
-
*
/
Addition, soustraction, multiplication et division arithmétiques~
modulo (ou divmod si votre langue le prend en charge)^
exponentiation|
exponentiation modulairev
racine carrée>
>=
==
!=
<=
<
opérateurs standard d'égalité / inégalité>>
<<
opérateurs de décalage de bits.dc
n'a pas ces derniers, mais comme ils sont trivialement mis en œuvre en termes de division / multiplication par des puissances de 2, alors je les autoriserai.
Les structures de contrôle dc
peuvent être maladroitement construites à l'aide de macros (récursives) et d'opérations (in) d'égalité. Vous pouvez utiliser toutes les structures de contrôle intégrées de votre langue.
Vous pouvez également utiliser des opérateurs logiques &&
||
!
, même s'ils ne sont pas directement disponibles dans dc
.
Vous ne devez pas utiliser les opérateurs binaires &
, |
, ~
et ^
ou toutes les fonctions qui les mettent en œuvre trivialement.
De plus, vous ne devez pas utiliser d'opérateurs ou de fonctions de conversion de chaîne de base intégrés.
Veuillez également envisager de fournir un programme de test ou un extrait de compilateur en ligne (non inclus dans le score de golf) pour aider à vérifier votre réponse.
la source
Réponses:
C, 134
Le préprocesseur C est assez amusant à abuser. Fondamentalement , cette macro définit les 3 fonctions,
a
,o
, etx
, pourand
,or
et ,xor
respectivement. La seule différence dans l'algorithme pour ces opérations réside dans les critères de définition du bit dans le résultat.not
est la fonctionn
.Programme de testeur (prend beaucoup de temps, je n'ai pas passé de temps à l'optimiser, mais il teste tous les cas de test possibles, à l'exception de ceux liés à MAX_INT):
la source
76 octets
ised n'a pas non plus d'opérations au niveau du bit - généralement ennuyeux, mais maintenant les bienvenus, car nous avons vraiment besoin implémenter.
Les fonctions seront stockées dans des emplacements de mémoire numérotés (pas de noms détaillés).
Conversion vers et depuis binaire:
NON pourrait l'être,
@1{:$6::{1-$5::x}:}
mais il est évidemment plus facile de simplement soustraire:OU:
ET:
XOR:
Cela nous amènerait à 156 octets (avec des nouvelles lignes et des points-virgules). Un code de test serait simplement (PAS, OU, ET, XOR successivement, trouvé sous les noms $ 1, $ 2, $ 3, $ 4):
Mais bien sûr, OU et NON sont tout ce dont nous avons vraiment besoin et les choses peuvent être simplifiées:
Cela fait 109 caractères. Lorsque les sauts de ligne et les points-virgules sont ignorés, et avec un peu plus de golf, nous avons 76 caractères:
la source
Nim
(537)(490)Nim Compiler 0.10.2
Je cherchais une raison pour apprendre le nim alors c'est parti.
Pour le golf de code, j'ai utilisé des paramètres variables et des retours implicites. Les paramètres variables, selon la documentation, sont moins efficaces en pile. Personnellement, je trouve les retours implicites plus difficiles à lire et ne les utiliserais probablement que dans des procédures triviales.
Quant aux algorithmes, ils sont assez simples. Pour toutes les opérations sauf NOT, nous comparons chaque bit et les comparons manuellement à notre table de vérité attendue. Réglez chaque bit selon vos besoins en cours de route dans notre variable de sortie. Dans Nim, le résultat est la valeur de retour implicite.
Je ne savais pas si nous étions autorisés à utiliser OR et AND intégrés pour affirmer deux conditions booléennes, de sorte que la procédure notZero a été mise à leur place.Toujours à la recherche d'une meilleure méthode ...
Voici la version non écrasée et le harnais de test complet pour fonctionner sur votre propre machine.
Si vous souhaitez simplement exécuter quelques entrées, voici le cas de test Lite .
la source
CJam, 71 octets
Explication
Suite de tests
Ce code teste les exécutions de chacune de mes fonctions et, ou, et non, et xor 100 fois avec des entrées non signées 64 bits uniformément réparties et compare le résultat avec celui produit par l'opérateur intégré. En raison de l'utilisation gratuite de l'opérateur eval, il est assez lent et peut prendre jusqu'à environ une minute avec l'interprète en ligne. Mais si tout se passe bien, l'exécution devrait se terminer sans sortie, car les écarts trouvés sont imprimés.
la source
Javascript
294267A pu raser quelques octets de plus avec les suggestions de @ AlexA. Et @ kennytm.
Les fonctions:
exemple:
production:
la source
for
et le remplacerfunction B(n,m,t)
parB=(n,m,t)=>
. De même pour les autres fonctions.4*(1<<30)
pour 4294967296 et-1>>>0
4294967295. ② est-cevar
vraiment nécessaire ici? ③ vous pourriez écrire(n,m)=>B(n,m,'a')
au lieu de(n,m)=>{return B(n,m,'a')}