PROBLÈME
Étant donné deux mots, trouvez le gagnant dans une bataille racine numérique .
Définissez la racine numérique d'un mot de cette façon:
- Chaque lettre de l'alphabet se voit attribuer un numéro: A = 1, B = 2, C = 3, ..., Z = 26
- Ajoutez les valeurs de chaque lettre pour additionner le mot. Prenez "CAT", par exemple. C + A + T = 3 + 1 + 20 = 24
- Ajoutez tous les chiffres uniques qui composent ce résultat: 24 => 2 + 4 = 6
- Répétez l'étape 3 jusqu'à ce que vous atteigniez un seul chiffre. Ce chiffre unique est la racine numérique du mot.
Règles:
- Un gagnant est déclaré si sa racine numérique est plus grande que l'autre.
- Si les valeurs de racine numériques sont égales, raccourcissez les mots en supprimant chaque instance de la lettre de valeur la plus élevée des deux mots et en recalculant.
- Répétez les étapes 1 et 2 jusqu'à ce qu'il y ait un gagnant ou qu'un des mots ne contienne qu'une seule lettre (ou aucune lettre).
- Si les valeurs de racine numérique sont égales après avoir suivi le processus de raccourcissement, le mot le plus long est déclaré vainqueur.
- Si les mots sont de longueur égale et qu'aucun gagnant n'est trouvé après avoir suivi le processus de raccourcissement, aucun gagnant n'est déclaré.
Règles spéciales:
- Aucune utilisation du module n'est autorisée dans le calcul de la racine numérique elle-même. Il peut être utilisé partout ailleurs.
- Supposons que les mots se composent uniquement de lettres majuscules - pas de ponctuation, pas d'espaces, etc.
CONTRIBUTION
Tirez les mots dans stdin (séparés par des virgules). paramètres de méthode, ou comme vous le souhaitez. Expliquez clairement dans votre solution ou dans le code comment les mots sont analysés ou préparés.
SORTIE
Affichez le mot gagnant. S'il n'y a pas de gagnant, affichez "STALEMATE".
Exemples:
entrée: CAN, BAT
CAN = 18 = 9
BAT = 23 = 5
sortie: CAN
entrée: ZOO, NON
ZOO = 56 = 11 = 2
NO = 29 = 11 = 2
OO = 30 = 3
N = 14 = 5
sortie: NON
MISE À JOUR : L'entrée doit être lue en utilisant stdin avec les mots comme une chaîne séparée par des virgules.
MISE À JOUR : Ajout de quelques exemples pour tester.
MISE À JOUR : clarifié la suppression de la lettre la plus valorisée dans le cas d'une égalité - cela modifie également légèrement la condition d'arrêt également - si un mot a une lettre ou zéro lettre, le processus de raccourcissement est arrêté
la source
Réponses:
J, 100
fonctionne comme ceci:
il n'accepte pas encore la saisie exactement comme demandé.
la source
APL (Dyalog) (
9186)Explication (par ordre d'exécution):
⎕ML←3
: définissez ML sur 3 (cela rend⊂
la partition moyenne, entre autres).G←Z⊂⍨','≠Z←⍞
: lire l'entrée, séparée par des virgules, stocker dans G et passer à la fonction.+/¨⎕A∘⍳¨⍵
: calcule le score de chaque mot. (⎕A
est une liste contenant l'alphabet.)Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨
: calculez la racine numérique de chaque partition (en additionnant tous les chiffres tant qu'il y a encore plus d'un chiffre) et stockez-les dans Z.Z≡∪Z
: si tous les scores sont uniques ...:G[↑⍒Z]
: ... puis sortir le mot avec le score le plus élevé (de la liste d'origine).⋄1∊↑¨⍴¨⍵:'STALEMATE'
: sinon (s'il y a égalité), si l'un des mots est de longueur 1, sortir STALEMATE.⋄∇1∘↓¨⍵
: sinon, retirez la première lettre de chaque mot et exécutez à nouveau la fonction.la source
Rubis - 210
Tests:
la source
d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}
."If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
Haskell, 205 caractères
Exemples de cycles:
w
, module plus ancien importé, plus courtla source
',':b
→_:b
(-2), si vous n'êtes pas trop attaché au traitement multiligneinteract$unlines.map([...]).lines
→putStr.[...]=<<getLine
(-11), si vous vous autorisez à une sortie laxisteputStr
→print
(-1). Je déteste ces opérations de négation prenant autant de caractères, mais je ne trouve pas de moyen de les contourner.Perl, 224
225229Golf de base (rien d'intelligent pour l'instant):
Perl 5.10 et supérieur, exécuté avec
perl -M5.010 <file>
ouperl -E '<code here>'
la source
K, 106
Utilise la gestion des exceptions pour détecter les erreurs de pile, ce qui entraîne des cas de blocage.
la source
VBA (
242462)Il s'avère que le code ci-dessous ne correspondait pas aux spécifications, j'ai donc dû retravailler, en ajoutant beaucoup de longueur (voir ci-dessus). : - / Cela peut peut-être être joué plus loin, mais il est déjà assez compact et je doute que je puisse le ramener à un score compétitif.
L'original (ci-dessous) n'a pas supprimé la lettre la plus valorisée des mots en cas d'égalité.
la source
Cela m'a vraiment pris de fantaisie et c'est mon premier post. Bien qu'il soit vieux, j'ai remarqué que personne n'avait fait de version php alors voici la mienne.
534 caractères.
Maintenant, je ne suis pas sûr des règles de démarrage, j'ai donc commencé avec $ f = 'CAN, CBN' comme entrée. J'espère que c'était vrai. J'ai exécuté tous les tests et il les réussit tous bien qu'il ne soit pas particulièrement élégant. Je dois vraiment dormir un peu maintenant, mais j'ai eu beaucoup de plaisir à travailler cela - merci pour un grand puzzle.
Codé sur http://codepad.org/ZSDuCdin
la source
$f=trim(fgets(fopen('php://stdin')));
pour prendre l'entrée.$w=fgetcsv(STDIN);
fonctionne mieux.D: 326 caractères
Plus lisiblement:
la source
Mathematica
Certains détails manquent encore
la source
Mathematica
220207Après avoir écrit ceci, j'ai remarqué que cela suit le même raisonnement que celui utilisé par Bélisaire,
Usage
Parce que la réponse n'est pas compétitive (étant si longue), j'ai décidé d'utiliser un format d'entrée plus convivial pour Mathematica.
la source
CoffeeScript - 335
Pas aussi content de celui-ci que j'aurais pu l'être, mais je le mettrai quand même. Le score réel est très concis (
y
fonction), mais leif
s pour comparer les résultats (enz
) deviennent assez longs.Pour l'utiliser, appelez
z
avec vos deux mots (par exemplez 'FOO','BAR'
). Il marquera les deux mots et renverra le mot ayant le score le plus élevé. S'il s'agit d'une égalité, il récurrera avec les mots modifiés (en conservant les originaux pour revenir éventuellement, d'où les deux paramètres supplémentaires) qu'il obtient de lax
fonction.Le javascript équivalent (étendu) pour les personnes intéressées:
la source
Raquette 479 octets
Non golfé:
Essai:
Sortie:
la source
PHP,
339(pas SPEC),410382359339337 octetsEDIT 1 : +71 octets. Utilisation
STDIN
defopen('php://stdin','r');
balises au lieu de et courtes. En outre, pleine conformité à la spécification.EDIT 2 : -28 octets. Utilisation
fgetcsv(STDIN)
au lieu deexplode(',',trim(fgets(STDIN)))
, etfor
boucle utilisée au lieu de lawhile
boucle.EDIT 3 : -23 octets. Fonctions fusionnées
a
etb
, fusionnées pour les boucles.EDIT 4 : -20 octets. Passé
c
d'un récursif en boucle. Ensuite, supprimez la fonctionc
et placez son code dans l'espace de noms global.EDIT 5 : -2 octets. Merci à @Titus pour le
-r
drapeau.la source
-r
indicateurJAVA
la source
C ++, 473 (j'emprunte un cours de fer)
Je suis sûr que je pourrais le raccourcir d'une manière ou d'une autre, mais je suis fatigué.
Edit: initialement pris l'argument de la ligne de commande, modifié pour utiliser cin. C'est probablement quelques caractères de plus maintenant mais je suis trop fatigué pour le raconter.
la source
Python: 383 caractères
exécutez la fonction
c('CAN','BAT')
:la source
F #,
559533530 octetsPas encore compétitif. Je suis sûr que c peut être raccourci ainsi que les dernières lignes. Ne pas avoir un accès plus facile aux arguments de la ligne de commande est également un problème ici.
Essayez-le en ligne!
Version non golfée
la source
PHP,
296 281267 octetscourir avec
-n
ou essayer en ligne (TiO inclut la panne).En février 2011, la version PHP actuelle était la 5.3.5; donc je ne pouvais pas
[$a,$b]=fgetcsv(...)
et autres)count_chars
lignesubstr
Mais ni l'un ni l'autre n'aurait économisé beaucoup; donc peu importe.
Les choses les plus coûteuses étaient les boucles (bien sûr) et la règle # 4 (
4036 octets).la source