L'une des nombreuses caractéristiques uniques du langage de programmation Malbolge est son OP
opérateur extrêmement peu intuitif , désigné uniquement par "op" dans la documentation et le code source, mais communément appelé l'opérateur "fou". Comme le décrit Ben Olmstead, le créateur du langage, dans sa documentation: " ne cherchez pas de motif, il n'y est pas ".
op est un opérateur "tritwise" - il opère sur les chiffres ternaires correspondants de ses deux arguments. Pour chaque trit (bit ternaire), le résultat de op est donné par la table de consultation suivante:
a
op(a,b) 0 1 2
+-------
0 | 1 0 0
b 1 | 1 0 2
2 | 2 2 1
Par exemple, pour calculer op(12345, 54321)
, écrivez d'abord les deux nombres en ternaire, puis recherchez chaque paire d'erreurs dans le tableau:
0121221020 (12345_3)
op 2202111220 (54321_3)
--------------
2202220211 (54616_3)
Le dernier point important est que toutes les valeurs dans Malbolge ont une largeur de 10 passages. Par conséquent, les valeurs en entrée doivent être complétées avec des zéros jusqu'à une largeur de 10. (Par exemple, elle op(0, 0)
est 1111111111
en ternaire.)
Votre tâche consiste à prendre deux nombres entiers 0 ≤ a
, b
<59049 en entrée et à afficher la valeur entière de op(a,b)
.
Cas de test (dans le format a b op(a,b)
):
0 0 29524
1 2 29525
59048 5 7
36905 2214 0
11355 1131 20650
12345 54321 54616
Voici une implémentation de référence (copiée directement du code source de Malbolge).
54616_3
ne signifie pas "cette autre chose est le nombre décimal 54616, mais représenté en base trois". Cela signifie "lire54616
en base 3". Ce que vous ne pouvez bien sûr pas faire (il y a des chiffres que Valve ne peut pas compter). Il serait probablement toujours aussi clair si vous vous en débarrassiez_3
entièrement et de manière plus précise.Réponses:
C (gcc) ,
999896 octets19683
au golfL'䳣'
.108609
au golfL''
.Essayez-le en ligne!
la source
JavaScript (ES7), 56 octets
Essayez-le en ligne!
Comment?
Étant donné et b dans [ 0..2 ] , nous calculons:a b [0..2]
Menant à:
Choix de fonction
Il existe plusieurs autres fonctions possibles du formulaire:
L'un des plus courts étant:
Mais la bonne chose à propos de est qu’elle peut être exécutée avec des opérateurs au niveau des bits, éliminant ainsi implicitement les parties décimales de a et b . C'est pourquoi nous pouvons simplement les diviser par 3 sans arrondir entre chaque itération.(a+512b+8) a b 3
Commenté
la source
(1581093>>b%3*2+a%3*8&3)
sauve un octet entier!a/3
etb/3
sans arrondir. Cela échouerait à cause de cela.k = 9 ... => ~k && ...
àk = 10 ... => k && ...
?for(k=9;k>=0;k--)
quefor(k=10;k>=1;k--)
.05AB1E , 18 octets
Code:
Utilise le codage 05AB1E . Essayez-le en ligne!
Explication de l'algorithme
Par exemple, pour les entrées 12345 et 54321 , celles-ci sont mappées sur:
Ce qui donne la liste suivante des entiers joints:
Finalement, après avoir mappé cette fonction sur la liste des entiers joints, nous traitons cette liste résultante comme un nombre représenté en base 3 et la convertissons de la base 3 en décimale.
Explication du code
la source
3Tm+3Bø19sm74%3%3β
être joué au golf?R ,
6462 octetsEssayez-le en ligne!
Merci à JAD pour quelques astuces de golf
magie noireet -2 octets!30801
lorsqu’il est converti en un entier ternaire de 10 chiffres,1120020210
ajoute simplement un zéro final à la table des opérations, lors de la lecture des colonnes. Ensuite, nous convertissons les chiffres ternaires dea
etb
élément par élément en un entier et l’utilisons comme index dans les chiffres ternaires de30801
.la source
x
aide[.*]
. Ensuite, toutes les%any%
opérations se produisent. La partie amusante est que si vous voyez30801%/%x%%3
commef=function(x)30801%/%x%%3
çaf(x[index]) == (f(x))[index]
. Sauver les accolades :)C (gcc) ,
747271 octetsEssayez-le en ligne!
Panne
La table de vérité
Peut être considéré comme un tableau 3x3, où a est la colonne et b est la ligne. Transformer cela en une liste unidimensionnelle nous donne 100102221. Pour économiser de l'espace, nous évitons les listes et les chaînes et nous en faisons un nombre. Pour ce faire, nous inversons l'ordre et transformons chaque analyse en un nombre de 2 bits. Collez-les ensemble et nous avons un nombre binaire dans lequel nous pouvons "indexer" en déplaçant vers la droite
2 * (b * 3 + a)
et en masquant:Ensuite, nous masquons l'expression en utilisant la puissance de la priorité des opérations pour devenir l'abomination ci-dessus.
3 ^ 9 = 19683, donc c'est une bonne limite de boucle. Puisque nous multiplions le compteur par 3 à chaque fois, nous pouvons écrire la limite comme à la2e4
place. Aussi, nous nous épargnons la peinepow()
ou similaire.À la réflexion, commençons à 3 ^ 10 et descendons avec une division et un test de pré-boucle.
la source
Haskell , 108 octets
Essayez-le en ligne!
la source
APL (Dyalog) ,
41 à25 octets9 octets sauvegardés grâce à @ Adám
Essayez-le en ligne!
la source
3⊥(b⊤6883)[3⊥⍉⎕⊤⍨3,b←9⍴3]
Gelée ,
23 à18 octets-1 grâce à Erik le Outgolfer (rearrange
3*⁵¤
à⁵3*
)Un lien monadique acceptant une liste de deux entiers.
Essayez-le en ligne! Ou voir une suite de tests .
⁹*%733%3
est un octet plus long queị⁽½Ṡb3¤
:(Comment?
Aussi 18:
⁵3*+b3ZḌ19*%74%3ḅ3
(utilise une formule magique après avoir obtenu les qualités par paires de convertir de la base dix puis prendre 19 à cette puissance, modulo 74, modulo 3 pour obtenir les qualités requises de la sortie - trouvées à l'aide d'une recherche en Python)la source
y
0
s" intégré)Python 2 ,
79 à656361 octetsgrâce à Arnauld pour sa formule (-2 octets).
Essayez-le en ligne!
la source
J , 37 octets
Explication:
Fini par être relativement lisible, tbh.
la source
Python 2 ,
9087 octetsEssayez-le en ligne!
la source
Charbon de bois , 31 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
Solution alternative, également 31 octets:
Essayez-le en ligne! Le lien est vers la version verbeuse du code.
la source
Ruby , 70 octets
Essayez-le en ligne!
Se décompose
a
etb
récursivement jusqu'à obtenir 10 chiffres de chacun.6883
donne la table ternaire aplatie (inversée). Reconstruit de ternaire à décimal en multipliant par3**(10-l)
.la source
Cjam, 31 octets
Essayez-le en ligne!
la source
J , 43 octets
On peut certainement jouer au golf plus loin.
Explication:
Essayez-le en ligne!
la source
Stax , 22 octets
Exécuter et déboguer
la source
Pyth
26 2524 octetsEnregistré 1 octet, grâce à @ErikTheOutgolfer
Enregistrez un autre octet, inspiré par la réponse de @ JonathanAllan
L'entrée est une liste de 2 éléments
[a,b]
. Essayez-le en ligne ici ou vérifiez tous les cas de test ici .la source
.T
peut êtreC
.K (ngn / k) ,
2522 octetsEssayez-le en ligne!
la source
Japt ,
2423 octetsFaire rouler la balle sur la course de Japt comme langue du mois - je m'attends vraiment à être dépassé sur ce point!
Prend les entrées dans l'ordre inverse sous la forme d'un tableau entier (c'est-à-dire
[b,a]
).L'essayer
la source
Perl 5
-p
, 102 octetsEssayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
757260 octetsEssayez-le en ligne!
version non-golfée:
Les deux
a
etb
sont convertis en listes à dix chiffres, puis utilisés par paire comme index 2D dans une table de correspondance de nombres{1, 0, 0, 1, 0, 2, 2, 2, 1}
. Le résultat est à nouveau interprété comme une liste de dix notes et reconverti en un nombre entier.La table de consultation est codée ainsi
IntegerDigits[6883,3]
, ce qui est court car nous recyclons leIntegerDigits
symbole.la source