Attraction entre les mots


11

La théorie de la gravitation de Newton dit que la force gravitationnelle entre deux masses ponctuelles est

F = (Gm 1 m 2 ) / r 2

  • G est la constante gravitationnelle: 6,674 × 10 −11 N · (m / kg) 2
  • m 1 est la masse du premier objet
  • m 2 est la masse du deuxième objet
  • r est la distance entre leurs centres de masse

Défi

Vous devez simuler la traction entre deux mots. Chaque lettre minuscule a une masse donnée par sa position dans l'alphabet. Les majuscules ont deux fois la masse de leurs homologues minuscules! Vous recevrez une chaîne contenant deux mots séparés par plusieurs espaces, ainsi qu'un nombre entier positif de secondes, s . Affiche à quoi ressemblerait la chaîne après s secondes.

Info

  • Parce que les mots sont abstraits, ils ont un ensemble différent d'unités et de constantes
    • Masse: WMU (Word Mass Unit) - égale à la masse de la lettre «a».
    • Distance: em , la longueur d'un caractère.
    • Force: N W (Word Newton) = WMU · em / s 2
    • Constante gravitationnelle: G = 1 N w · (em / WMU) 2
  • Le premier caractère correspond à la position 0 sur l'axe des x.
  • Tous les calculs doivent être effectués avec autant de précision que possible, seulement à la fin vous arrondissez au plus proche em.
  • Vous n'avez pas besoin d'utiliser le calcul, vous avez juste besoin de recalculer le F chaque seconde, d'appliquer automatiquement la nouvelle accélération à la vitesse et, après une seconde, d'appliquer la vitesse à la position (voir l'exemple).
  • Une fois que deux mots entrent en collision (comme catdog ), ils ne bougent plus.

Le centre de masse

Le centre de masse d'un mot peut être trouvé avec la formule:

entrez la description de l'image ici

M est la masse totale du mot, m i est la masse d'une lettre et r i est la position de la lettre.

Exemple:

(Remarque: bien que cet exemple ne le montre pas, n'oubliez pas que les majuscules ont deux fois la masse de leurs homologues en minuscules.)

Entrée:, cat dog2

  1. Quelles sont d'abord les positions de chaque mot? "chat" commence à la position 0 et "chien" commence à la position 9, donc

    • x c = 0 et x d = 9
  2. Ensuite, trouvons le centre de masse de "chat".

    • Il a une masse de 24 WMU (3 + 1 + 20).
    • R c = 1/24 (3 * 0 + 1 * 1 + 20 * 2) = 41/24 = 1,70833 em
    • Sans surprise, le centre de masse est donc très proche de la lettre «t».
  3. Maintenant, obtenons le centre de masse du "chien"

    • R d = 1/26 (4 * 9 + 15 * 10 + 7 * 11) = 263/26 = 10.11538 em
    • Le centre de gravité du chien est donc proche de la lettre «o», légèrement vers «g».
  4. Maintenant, nous pouvons calculer la force entre les deux mots.

    • F = 24 * 26 / (10.11538-1.70833) 2 = 8.82871 N w
  5. Maintenant, nous devons appliquer cette force aux deux mots et obtenir leurs accélérations

    • a c = 8,82871 / 24 = 0,36786 em / s 2
    • a d = -8,82871 / 26 = -,33957 em / s 2
  6. En suivant les règles ci-dessus, nous appliquons l'accélération à la vitesse, donc

    • v c = 0,36786 em / s
    • v d = -,33957 em / s
  7. Ensuite, nous appliquons la vitesse à la position, donc après une seconde,

    • x c = 0,36786 em
    • x d = 9 -33957 = 8,66043 em.
    • R c = 1,70833 + 0,36786 = 2,07619 em
    • R d = 10.11538-.33957 = 9.77581 em
  8. Maintenant, nous répétons la procédure une fois de plus avec les nouvelles positions:

    • F = 24 * 26 / ((9,77581) - (2,07619)) 2 = 10,52558 N w
    • a c = 10,52558 / 24 = 0,43857 em / s 2 , a d = 10,52558 / 26 = -,40483 em / s 2
    • v c = .36786 + .43857 = .80643 em / s, v d = -.33957 - .40483 = -.74440 em / s
    • x c = 0,36786 + 0,80643 = 1,17429 em, x d = 8,66043 - 0,74440 = 7,91603 em
    • R c = 2,07619 + 0,80643 = 2,888262 em, R d = 9,77581 - 0,74440 = 9,03141 em
  9. Nous nous retrouvons donc avec "chat" à x = 1,17429 et "chien" à x = 7,91603.

    • Nous arrondissons ceux-ci à l'entier le plus proche pour que "cat" passe en position 1 et "dog" passe en position 8, donc la sortie est cat dog

Gestion des collisions

N'oubliez pas que la nouvelle accélération est immédiatement ajoutée à la vitesse à chaque seconde. Par conséquent, si deux mots entrent en collision à un certain moment, utilisez l'algèbre pour trouver le point de collision. Prenez cet exemple:

  • le mot 1 a 4 lettres (|| w 1 || = 4)
  • le mot 2 a 4 lettres (|| w 2 || = 4)
  • x 1 = 3, x 2 = 8
  • v 1 = 2, v 2 = -6

    Résolvez 3 + (4-1) + 2t = 8 - 6t. t = 0,25 s. La position de la collision est x col = 6,5. Par conséquent, la collision devrait apparaître comme se produisant entre x = 6 et x = 7, en tant que telle

    ####@@@@ .

La formule explicite pour les positions des mots après une collision est

  • x 1 = étage (x col ) - || w 1 || +1
  • x 2 = étage (x col ) +1

@FryAmTheEggman La dernière puce dans "info" parle de collision. Vous pouvez le faire en une seule étape, mais assurez-vous de suivre les règles énoncées.
geokavel

Les mots pourraient-ils se traverser?
xnor

@xnor Non, ils ne le seront pas. J'ai ajouté une partie sur la gestion correcte des collisions.
geokavel

J'essaie de comprendre la physique impliquée ici. Considérez la configuration xx a(un espace entre les mots xxet a). En physique newtonienne, la force qui ase ressent serait due au xtirage plus rapproché à une distance de deux em, et l'autre xtirant à une distance de trois em, oui? Ce n'est pas la même chose que la force d'une masse ponctuelle unique Xtirant d'une distance de 2.5em (c.-à-d., Le centre de masse de la xx), en raison de la loi du carré inverse ...
mathmandan

1
... donc juste pour clarifier, je suis censé traiter chaque MOT comme s'il s'agissait d'une masse ponctuelle avec toute sa masse concentrée en son centre de masse, où par "son centre de masse", nous entendons "où son centre de la masse serait si nous traitions plutôt ses LETTRES comme des masses ponctuelles ". Est-ce correct?
mathmandan

Réponses:


3

Python 3, 556 octets

Merci à FryAmTheEggman et Sherlock9 pour quelques octets

s,E,a,b,e=str.split,enumerate,lambda c:ord(c)%32*-~c.isupper(),lambda w:sum(map(a,w)),' '
def j(w):z,y=map(len,s(w));h=w.count(e);return sum(i*a(x)for i,x in E(w)if i<z)/b(w[:z]),sum(i*a(x)for i,x in E(w)if i>=y+h)/b(w[-y:])
def f(w):x,v=j(w);m,n=map(b,s(w));return m*n/(x-v)**2
def q(w):x,v=s(w);return f(w)/b(x),-f(w)/b(v)
def p(w,t):
 x,v=q(w);c,d=x,v;m,n=map(b,s(w));r,u=j(w);g,h=r,u;
 for i in range(t):r+=x;u+=v;f=m*n/(r-u)**2;c,d=f/m,f/n;x+=c;v+=d
 return int(r-g),int(1+h-u)
def g(w,t):x,y=p(w,t);u,v=s(w);return e*x+u+e*(len(w)-len(u+v)-x-y)+v+e*y

g(w,t)prend la chaîne ( w) et le temps ( t), et retourne le résultat. Les autres fonctions sont des aides.

Essayez-le en ligne (imprime *s au lieu d'espaces pour qu'il soit plus visible)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.