Ce défi a été publié sur le sous-programme DailyProgrammer, et j’ai pensé que ce serait un excellent candidat pour un défi de golf. Déterminer si une lettre est en équilibre est basé sur sa distance par rapport au point d'équilibre et la valeur de la lettre. La valeur d'une lettre peut être déterminée en prenant sa position indexée dans l'alphabet ou en soustrayant 64 de sa valeur ASCII. De plus, la valeur d'une lettre est multipliée par sa distance au point de la balance. Regardons un exemple STEAD
:
STEAD -> 19, 20, 5, 1, 4 ASCII values
This balances at T, and I'll show you why!
S T EAD -> 1*19 = 1*5 + 2*1 + 3*4
Each set of letters on either side sums to the same value, so
T is the anchor.
Cependant, il convient de noter que tous les mots ne sont pas en équilibre. Par exemple, le mot WRONG
ne s'équilibre dans aucune configuration. De plus, les mots doivent être en équilibre sur une lettre et non entre deux lettres. Par exemple, SAAS
équilibrerait s’il y avait une lettre au milieu des deux lettres A
, mais comme il n’y en a pas, il n’y a pas d’équilibre.
La tâche
Vous devez créer un programme ou une fonction qui prend un mot majuscule en tant qu'argument d'entrée ou argument de fonction , puis génère l'un des deux résultats suivants:
Si le mot est équilibré, alors le mot doit être imprimé avec le côté gauche, un espace, la lettre d'ancrage, un autre espace et le côté droit.
function (STEAD) -> S T EAD
Si le mot n’équilibre pas, vous devez l’imprimer, suivi de
DOES NOT BALANCE
function (WRONG) -> WRONG DOES NOT BALANCE
Vous pouvez supposer que toutes les entrées seront majuscules et qu'il n'y aura que des caractères alphabétiques.
Exemple I / O
function (CONSUBSTANTIATION) -> CONSUBST A NTIATION
function (WRONGHEADED) -> WRO N GHEADED
function (UNINTELLIGIBILITY) -> UNINTELL I GIBILITY
function (SUPERGLUE) -> SUPERGLUE DOES NOT BALANCE
C'est du code-golf , donc la réponse la plus courte en octets est gagnante.
function (A)
->A
au lieu de -> `A`?BALANCE DOES NOT BALANCE
Réponses:
Pyth, 49 octets
Manifestation.
Explication:
la source
Pure bash (pas de coreutils ou d’autres utilitaires), 125
Calcul standard du centre de masse en utilisant des moments relatifs à l'origine:
Test de sortie:
la source
Python 3, 124
Ce code ne teste pas les points d'appui potentiels, mais trouve plutôt le "centre de gravité" et vérifie s'il s'agit d'un entier. Pour ce faire, il fait la somme de la masse totale
a
et de la masse pondérée en fonction de la positionb
afin de déterminer le centre de massem=b/a
. Il imprime ensuite soit la chaîne fractionnée à la positionm
, soit la chaîne plus"DOES NOT BALANCE"
, choisie par le[_::2]
trucage liste-tranchage.la source
CJam, 57 octets
Cela peut encore être joué au golf un peu.
Essayez-le en ligne ici
la source
'@fm
est plus court que64f-:i
.JavaScript (ES6),
211200160 octetsTentative précédente, 200 octets
Merci à edc56 et nderscore de m’avoir aidé à jouer au golf cette
Démo
Firefox et Edge uniquement pour l'instant, car il s'agit de l'ES6
la source
j=0
dans l'appel àcharCodeAt
:)C,
236198192188180 180173 octetsDéveloppé avec main ():
Vérification:
la source
i,l=1,j;g(char*v){for(;v[i]&&l;++i)for(j=l=0;v[j];++j)l+=(i-j)*(v[j]-64);l?printf("%s DOES NOT BALANCE",v):printf("%.*s %c %s",--i,v,v[i],v+i+1);}
Remarque: utilise un comportement indéfini :)CJam, 50 octets
A l'aide de l'interpréteur Java, cela aboutit avec une erreur à STDERR pour les mots non équilibrés.
Si vous essayez le code dans l' interpréteur CJam , ignorez tout, sauf la dernière ligne de sortie.
Idée
Mon «idée originale» s’est avérée être la même approche que @xnor a publiée plusieurs heures avant moi. Néanmoins, ça y est:
Étant donné une liste de valeurs (v 0 ,… v n ) , nous avons que v_t est l'ancre de la liste si et seulement si l'une des conditions suivantes est remplie, les conditions équivalentes étant remplies:
tv 0 +… + 1v t-1 == 1v t + 1 +… tv n
(0 - t) v 0 +… + (n - t) v n == 0
0v 0 +… + nv n == t (v 0 +… + v n )
t: = (0v 0 +… + nv n ) / (v 0 +… + v n ) est un entier.
Code
Dans cette partie, nous commençons à nous amuser un peu avec des opérateurs surchargés.
Pour le quotient, cela se produit:
Pour la chaîne, cela se produit:
À ce stade, une erreur d'exécution se produit car elle
""
n'a pas de dernier caractère. La pile est imprimée et l'exécution est immédiatement abandonnée.la source
Julia, 122 octets
Cela crée une fonction non nommée qui accepte une chaîne en entrée et retourne une chaîne. Pour l'appeler, donnez-lui un nom, par exemple
f=s->...
.Nous traitons le mot comme un système unidimensionnel pour lequel nous devons trouver le centre de gravité. Le centre de masse est calculé comme le produit scalaire des masses avec leur emplacement, divisé par la masse totale du système. Si le centre calculé est un entier, il correspond à l'une des lettres du mot. Sinon, le mot ne s'équilibre pas.
Ungolfed + explication:
Exemples:
la source
PHP,
249174 octetsPrend un argument de ligne de commande.
Tentative initiale:
la source
Haskell,
161135 octetsExemple d'utilisation:
Comment ça marche:
f
appelle la fonction d'assistance!
qui prend deux paramètres, la partie gauche et droite du mot à une position donnée. Il s’arrête si les deux parties ont le même poids (fonctionv
) ou s’appelle de manière récursive avec la première lettre de la partie droite déplacée vers la gauche. Il se termine par leDOES NOT BALANCE
message si la partie droite est vide.la source
C,
183134 octetsNouvelle version expliquée:
Comme les deux autres entrées, il utilise l’addition constante d’un côté et la soustraction de l’autre pour atteindre, espérons-le, la valeur zéro, ce qui est l’indication de l’équilibre. Ma sortie originale est réutilisée de la première réponse, bien que légèrement modifiée.
Ancienne version expliquée:
La première boucle (h) est l'itérateur principal de la longueur de la chaîne. La deuxième boucle (i) s'accumule (b) jusqu'à ce que h == i. Une fois que cela se produit, (b) est stocké dans (a), remis à 0, puis continue jusqu'à la fin de la chaîne, où (a) est comparé à (b). S'il y a une correspondance, la boucle de l'itérateur principal est cassée et la sortie est imprimée.
la source
Ruby 175
Testez-le en ligne: http://ideone.com/G403Fv
Ceci est une implémentation assez simple de Ruby. Voici le programme lisible:
la source
R, 190 octets
En tant que fonction non nommée. Je pense pouvoir en obtenir un peu plus, mais cela devra attendre.
Ungolfed un peu avec une brève explication
Cela ne met pas une nouvelle ligne à la fin.
Essai
la source
C, 142 octets
Crédit à un utilisateur de m'avoir battu :)
la source
Java, 240 octets
la source