De l'article Wikipedia :
L'arithmétique de localisation (Latin arithmeticæ localis) est les systèmes numériques binaires additifs (non positionnels) que John Napier a explorés comme technique de calcul dans son traité Rabdology (1617), à la fois symboliquement et sur une grille de type échiquier.
Quelle?
Les chiffres d'emplacement sont un moyen d'écrire des nombres en utilisant les lettres de l'alphabet.
La notation binaire n'avait pas encore été normalisée, donc Napier a utilisé ce qu'il a appelé des chiffres d'emplacement pour représenter des nombres binaires. Le système de Napier utilise la notation de valeur de signe pour représenter les nombres; il utilise des lettres successives de l'alphabet anglais pour représenter des puissances successives de deux: a = 2 ^ 0 = 1, b = 2 ^ 1 = 2, c = 2 ^ 2 = 4, d = 2 ^ 3 = 8, e = 2 ^ 4 = 16 et ainsi de suite.
Un exemple
ab
= 1 + 2 = 3 en base 10
aabb
= 1 + 1 + 2 + 2 = 6 en base 10
Notez que cela aabb
peut être raccourci bc
en remplaçant 2 instances d'une lettre par une plus élevée.
Une addition
Vous venez de concaténer les deux nombres et de simplifier.
acd
+ bde
= acdbde
= abcdde
= acebe
= abcf
= 39
en base 10
Soustraction
Supprimez simplement tous les chiffres apparaissant également dans les deux parties de la soustraction. Une extension (conversion b
en aa
) peut être nécessaire
abde
- ad
= be
= 18 en base 10
Multiplication
C'est un peu plus difficile.
Disons que nous voulons multiplier acd
(13) par def
(56). Vous organisez d'abord acd
verticalement:
a
c
d
Ensuite, vous ajoutez def
après le premier a
:
a def
c
d
Maintenant, c est 2 positions plus tard dans l'alphabet que a, donc nous ajoutons 2 positions dans l'alphabet def
à faire fgh
. Cela est ajouté à la deuxième ligne.
a def
c fgh
d
Enfin, d est 1 position plus tard dans l'alphabet que c, nous ajoutons donc 1 position dans l'alphabet fgh
à faire ghi
. Cela est ajouté à la troisième ligne.
a def
c fgh
d ghi
Ensuite, vous prenez la somme de la droite: def
+ fgh
+ ghi
= deffgghhi
= deggghhi
= deghhhi
= deghii
= deghj
(728)
Un autre exemple de multiplication
Contribution:
bc * de
Première:
b
c
ensuite
b ef
c
ensuite
b ef
c fg
Notez que nous avons écrit ef
sur la première ligne. C'est parce que bc
commence par b
, et b
est la deuxième lettre de l'alphabet, nous devons donc décaler de
d'une lettre, donc cela devient ef
.
ensuite
ef+fg
Sortie:
eh
Division
Cela ne fait pas partie de ce défi, car cela peut devenir très complexe.
Votre véritable défi
Votre programme ou fonction doit prendre l'entrée comme une chaîne qui ressemble à ceci:
a + b
Et vous devez sortir:
ab
Bien sûr, votre programme ou la fonction doit prendre en charge un nombre de longueur arbitraire (jusqu'à la chaîne ou de limiter l' entrée de votre langue) avec l' un des opérateurs +
, -
ou *
. Quelques exemples supplémentaires:
Contribution:
ab + bd
Sortie:
acd
Contribution:
d - ab
Sortie:
ac
Contribution:
ab * cd
Sortie:
cf
Remarques:
- L'ordre des lettres dans la sortie n'a pas d'importance, mais vous pouvez toujours supposer que l'ordre des lettres en chiffres dans l'entrée sera croissant (a avant z).
- Vous pouvez prendre une entrée avec une nouvelle ligne de fin et une sortie avec une nouvelle ligne de fin.
- Vous ne pouvez pas prendre la saisie comme une liste de
ab
,*
etbd
pourab * bd
. - L'alphabet anglais est utilisé (
abcdefghijklmnopqrstuvwxyz
) - Votre sortie doit être simplifiée (
aa
n'est pas autorisée,b
est obligatoire) - L'entrée sera simplifiée (
b
+c
, pasaa
+bb
ouaa
+aaaa
) - Vous pouvez avoir besoin d' un espace avant et l'opérateur (
+
,-
ou*
), ou vous pouvez exiger qu'il y ait aucune. - Il n'y aura qu'un seul opérateur par entrée.
- Vous pouvez supposer que la sortie et l'entrée ne dépasseront jamais 2 ^ 27-1 (
abcdefghijklmnopqrstuvwxyz
) - C'est le code-golf , donc la réponse la plus courte en octets l'emporte!
la source
d is 2 positions later in the alphabet than c
est ce Wright? ne devrait-il pas en être ainsi1
?That is added to the second row.
sur la même phrase, n'est-ce pasthird
?bc*de==efgh
mais ceefgh
n'est240
pas le cas144
bc*de
devrait êtreeh
Réponses:
Gelée ,
2625 octetsUtilise les opérateurs de Jelly (
×
plutôt que*
et_
plutôt que-
) dans la chaîne d'entrée comme le permet l'OP .(Nécessite des espaces autour des opérateurs)
Essayez-le en ligne! ou voir la suite de tests
Comment?
la source
Mathematica, 168 octets
Ma solution initiale (avant la publication du post pour préciser que la sortie devait être simplifiée) était
64
plus courte en octets:Cela vient de modifier cette solution pour qu'elle fonctionne. Il est probablement plus court d'utiliser les méthodes décrites dans le défi, mais je voulais quand même mettre cela en place.
Explication:
Remplace chaque séquence de lettres par son entier correspondant par une arithmétique de code de caractères, puis convertit la chaîne résultante en une expression (qui se simplifiera automatiquement en un entier), puis produit une chaîne de
a
caractères de longueur égale à cet entier, et remplace finalement les adjacents identiques caractères avec le code de caractère suivant jusqu'à ce qu'un point fixe soit atteint.la source
JavaScript (ES6),
136134133 octets1 octet enregistré grâce à Luke
Cas de test
Afficher l'extrait de code
la source
Perl 5 , 95 octets
94 octets de code +
-p
indicateur.Essayez-le en ligne!
Trois étapes ici:
-
s/\w/a x 2**(-97+ord$&)/ge;
convertit l'entrée en une chaîne dea
seulement.-
s/(.*)-\1|+//;/*/&&($_=$`x length$')
exécutera l'opérateur (qui est très simple sur les chaînes dea
):+
est la concaténation,-
signifie supprimer de la première partie autanta
qu'il y en a dans la deuxième partie, et*
signifie dupliquer la première partie autant de fois qu'il y en aa
dans la seconde partie.-
1while s/(.)\1/chr 1+ord$1/e
replie les mêmes lettres consécutives dans la lettre suivante de l'alphabet.la source
05AB1E , 29 octets
Essayez-le en ligne! ou comme suite de tests
Explication
la source
C & x86 asm, 340 octets
Compiler avec -O0
Explication
Comme C n'en a pas
eval()
, j'ai utilisé un tableau d'instructions x86 à sa place. J'ai dû choisir des instructions qui étaient toutes de la même longueur (ou rembourrées avec des nops), et qui attendaient src et destination des mêmes types. Il était particulièrement gênant que MUL ne puisse écrire que sur des registres et que les opcodes MUL à 1 octet ne pouvaient écrire que sur EAX. De plus, il ne semblait pas y avoir d'instruction SUB d'écriture de registre soustraite de la mémoire, au lieu de l'inverse, d'où le XCHG.modifier
Comme cela a été demandé dans les commentaires, une approche plus traditionnelle ressemblerait à ceci:
Il est en fait un peu plus court, à 301 caractères, pour plusieurs raisons: 1. Parce qu'il doit y avoir beaucoup de fonctions, la surcharge de chacune peut être hachée avec quelques règles de préprocesseur. 2. Linux moderne protège de l'exécution sur la pile, donc l'appel mprotect () pour désactiver ces 34 octets sacrifiés. 3. L'appel XCHG est très sous-optimal et coûte 30 octets supplémentaires. Sinon, le combo x86 gagnerait d'environ 10 à 20 octets.
Également haché 2 octets des deux en améliorant l'appel islower () en g.
la source
GNU sed + coreutils, 329 octets
Ouais, je n'ai aucune idée de ce qui m'a pris, mais au moins je connais un peu mieux les scripts sed maintenant. Notez que cette solution nécessite l'
e
extension GNU sed , qui exécute une commande shell.Je suppose qu'il n'y aura pas d'espace autour des opérateurs. Depuis mon terminal:
Et, pour les plus sains que moi: la version commentée!
la source
sed: file golf.sed line 24: ":" lacks a label
PHP, 168
Sortie croissante avec utilisation de eval
PHP, 185 octets
Sortie croissante
Version en ligne
Étendu
PHP, 201 octets
Sortie décroissante
Version en ligne
Étendu
la source
Python 3 ,
176167 octetsEssayez-le en ligne!
la source
m>=2**(t+1)
avecm>=2**t*2
, et cinq octets en remplaçanta=a.split();m=eval(i(a[0])+a[1]+i(a[2]))
par quelque chose commeb,c,d=a.split();m=eval(i(b)+c+i(d))
.2**(ord(i)-97)
par1<<ord(i)-97
.PHP, 130
version étendue:
courir avec
php -R <code>
.la source
AWK, 201 octets
"(awk '$0="a s"'<<<1)"|getline v
est la meilleure façon que je pouvais venir avec faire unevaluate
dansAWK
. Je «triche» peut-être un peu pour appeler cela simplementAWK
, puisque j'exécute une commande, mais au moins la commande est aussiAWK
:)Je suis sûr que je manque un moyen de réduire le nombre d'octets, mais je ne le vois certainement pas.
L' utilisation est assez standard, par exemple , mettre le code
FILE
et faire:Notez que les espaces ne sont pas requis et tout caractère non op / non [az] sera silencieusement ignoré. Pourrait être étendu pour fonctionner avec des nombres supérieurs à "abcdefghijklmnopqrstuvwxyz" en modifiant la boucle. Pour faire la division, ajoutez simplement le
/
caractère à la chaîne d'opération :). Imprime également une ligne vierge si leresult <= 0
.la source