Créez une calculatrice Gematria bidirectionnelle, pour n'importe quelle séquence donnée de caractères Unicode comme l'alphabet.
Gematri-Quoi?
La gématrie est un système d'attribution de valeurs numériques aux symboles, développé par les anciens Grecs et adopté par les anciens Juifs. C'est d'une manière comme ASCII ou Unicode, c'est juste non linéaire ... Voir le tableau suivant (le tableau complet est disponible dans le lien ci-dessus):
Index Letter Letter name Value
--------------------------
0 א "Alef" 1
1 ב "Bet" 2
...
8 ט "Tet" 9
9 י "Yud" 10
10 כ "Kaf" 20
...
17 צ "Tsady" 90
18 ' "Kuf" 100
19 ר "Resh" 200
...
Les noms des lettres ne sont pas importants, seulement leur index dans le "tableau" de l'alphabet et la valeur numérique respective. L'alphabet hébreu ne compte que 22 lettres (sans compter les lettres "finales"), la valeur maximale disponible est donc de 400.
Si nous empruntons ce système à l'alphabet anglais (AZ), nous nous retrouverons avec A = 1, B = 2 ... L = 30 ... U = 300 ... Z = 800.
Deux choses que nous devons savoir.
L'une des caractéristiques les plus importantes de ce système est le calcul de la "valeur en gématrie" d'un mot , en additionnant les valeurs de ses lettres. (Certains disent qu'il existe un lien mystique entre des mots ou des phrases (lorsque la valeur de l'espace est nulle) - qui partagent la même valeur de Gematria).
Tout entier non négatif peut être représenté par des symboles. Par exemple (et restons avec l'alphabet anglais pour l'instant), la valeur de 32 est LB (L = 30 + B = 2). La valeur de 1024 est ZTKD (800 + 200 + 20 + 4. Notez que ZSSKD est également 1024, mais ce n'est pas une représentation légale, car il peut être compacté).
Le défi
Écrivez un programme / une fonction / un extrait de code dans la langue de votre choix, qui est d'abord configuré avec un alphabet (voir API ci-dessous), puis acceptez un argument. Cet argument peut être un entier ou un mot / une phrase. S'il s'agit d'un nombre entier - votre programme devrait afficher / renvoyer sa représentation dans les symboles de l'alphabet - le plus compact (voir (2) ci-dessus). S'il s'agit d'un mot ou d'une phrase, votre programme doit générer / renvoyer la valeur de Gematria (en additionnant les valeurs des symboles, sans compter les espaces, voir (1) ci-dessus).
API
Votre programme / fonction doit accepter 3 arguments. Vous pouvez les obtenir à partir de STDIN, ou en tant qu'arguments de fonction, vous pouvez même supposer que ce sont des variables qui ont été initialisées par programme avant l'invocation de votre fonction.
- Premier argument - le premier caractère (en Unicode) de l'alphabet.
- Deuxième argument - le dernier caractère (en Unicode) de l'alphabet.
- Troisième argument - Un entier, à représenter en symboles, OU une phrase qui est créée par l'alphabet donné.
Valeur de sortie / retour: selon le troisième argument, comme expliqué ci-dessus.
Hypothèses
- Les deux premiers arguments auront toujours un caractère chacun, et le second sera toujours plus gracieux que le premier.
- La séquence (du premier au dernier inclus) n'inclura jamais aucune des valeurs 30-39 (qui représentent les chiffres 0-9), sinon elle rendra le troisième argument ambigu. EDIT: Il ne contiendra pas d'espace non plus, car dans les phrases, les espaces sont comptés comme des zéros.
- Le troisième argument, s'il s'agit d'une phrase, ne peut contenir que des espaces et des lettres de l'alphabet donné. Une chaîne vide n'est pas une entrée valide (vous pouvez supposer qu'elle n'est pas vide). Dans le cas où il s'agit d'un entier, vous pouvez supposer qu'il s'agit d'un entier positif.
Exemples
Input Output
A Z CODE GOLF 175
a s 512 sssssjb
A B 7 BBBA
≐ ⊐ ≤≫ ≥ 1700
Notation
Score = upvotes - length/100.0
Votre code doit être court, mais surtout populaire. Les scores négatifs peuvent également jouer. Le gagnant sera la réponse avec le score le plus élevé dans une semaine à partir de maintenant, 2014-11-29 19:20:00 UTC.
Réponses:
CJam,
807570 octets, votes positifs - 0,7Testez-le ici.
Il s'agit d'un programme complet, qui prend les données de STDIN et imprime le résultat dans STDOUT.
Je ne sais pas vraiment comment je suis censé tirer pour la popularité ici, alors je joue simplement au golf en espérant obtenir une taille de code assez impressionnante à la place. ;)
Je crois que la conversion int-to-string peut encore être améliorée, mais je ne la vois pas pour le moment.
Merci à Optimizer de m'avoir rappelé l'intersection définie et que les tableaux vides sont faux.
Dans le second cas, le résultat est laissé sur la pile, qui est imprimée automatiquement à la fin du programme.
la source
Java 7, Score = Votes - 3,97
Yay!!! Java!!! La langue de golf préférée du monde dans le monde. Quoi, vous pouvez réellement jouer au golf en java ??? Eh bien, c'est un peu comme utiliser un bulldozer pour putter.
a
devrait contenir le premier caractère.b
devrait contenir le dernier caractère.c
devrait avoir la chaîne d'entrée.Voici la fonction jouée:
Ici, il est en retrait avec le code de structure:
Ici, il est complètement développé:
la source
APL (votes positifs - 1.05)
Il s'agit d'une fonction qui prend les deux caractères à gauche et l'argument à convertir à droite:
Version non golfée:
la source
Haskell, 188 octets; Upvotes - 1,88
Il s'agit d'un programme complet de STDIN à STDOUT, fortement golfé. EDIT: maintenant en moins de 200 octets! EDIT2: enregistré un octet avec la suggestion de @ proudhaskeller.
Il construit la liste infinie de valeurs
x = [1,2,3,4,5,6,7,8,9,10,20,30,..]
sur la première ligne et effectue des E / S sur la troisième ligne. La valeur d'une lettrec
, compte tenu de la plage[a..b]
, est alors la valeur à la positionlength [a..c] - 1
dex
. Sur la deuxième ligne, nous nous branchons sur la première lettreu
du troisième argument, et soit additionnons ses valeurs de gématrie (si ceu
n'est pas un chiffre), soit construisons avidement un mot avec la valeur donnée (siu
c'est un chiffre).Version non golfée avec des noms de variables plus lisibles:
la source
{}
clause where pour un gain d'un octetCJam, 70 octets, # Upvotes - 0,7
Cela suppose qu'une entrée valide sera transmise. Prend l'entrée de STDIN comme le spécifie l'API et imprime le résultat sur STDOUT.
Exemples:
Essayez-le en ligne ici
Explication sage :
la source