Atracción entre palabras

11

La teoría de la gravitación de Newton dice que la fuerza gravitacional entre dos masas de puntos es

F = (Gm 1 m 2 ) / r 2

Dónde

  • G es la constante gravitacional: 6.674 × 10 −11 N · (m / kg) 2
  • m 1 es la masa del primer objeto
  • m 2 es la masa del segundo objeto
  • r es la distancia entre sus centros de masa

Desafío

Necesita simular la atracción entre dos palabras. Cada letra minúscula tiene masa dada por su posición en el alfabeto. ¡Las letras mayúsculas tienen el doble de masa que sus equivalentes en minúsculas! Se le dará una cadena que contiene dos palabras separadas por varios espacios, así como un número entero positivo de segundos, s . Muestra cómo se vería la cadena después de s segundos.

Informacion

  • Como las palabras son abstractas, tienen un conjunto diferente de unidades y constantes.
    • Masa: WMU (Unidad de masa de palabras): igual a la masa de la letra 'a'.
    • Distancia: em , la longitud de un personaje.
    • Fuerza: N W (Palabra Newton) = WMU · em / s 2
    • Constante gravitacional: G = 1 N w · (em / WMU) 2
  • El primer carácter corresponde a la posición 0 en el eje x.
  • Todos los cálculos deben hacerse con la mayor precisión posible, solo al final se redondea al em más cercano.
  • No necesita usar cálculo, solo necesita recalcular la F cada segundo, aplicar automáticamente la nueva aceleración a la velocidad y después de un segundo aplicar la velocidad a la posición (ver ejemplo).
  • Una vez que dos palabras chocan entre sí (como catdog ), no se mueven más.

Centro de masa

El centro de masa de una palabra se puede encontrar con la fórmula:

ingrese la descripción de la imagen aquí

Donde M es la masa total de la palabra, m i es la masa de una letra y r i es la posición de la letra.

Ejemplo:

(Nota: aunque este ejemplo no lo muestra, recuerde que las letras mayúsculas tienen el doble de masa que sus equivalentes en minúsculas).

Entrada: cat dog2

  1. Primero, ¿cuáles son las posiciones de cada palabra? "cat" comienza en la posición 0 y "dog" comienza en la posición 9, entonces

    • x c = 0 yx d = 9
  2. A continuación, busquemos el centro de masa del "gato".

    • Tiene una masa de 24 WMU (3 + 1 + 20).
    • R c = 1/24 (3 * 0 + 1 * 1 + 20 * 2) = 41/24 = 1.70833 em
    • Así que, como era de esperar, el centro de masa está muy cerca de la letra 't'.
  3. Ahora vamos al centro de masa del "perro"

    • R d = 1/26 (4 * 9 + 15 * 10 + 7 * 11) = 263/26 = 10.11538 em
    • Entonces, el centro de masa para el perro está cerca de la letra 'o', ligeramente hacia 'g'.
  4. Ahora podemos calcular la fuerza entre las dos palabras.

    • F = 24 * 26 / (10.11538-1.70833) 2 = 8.82871 N w
  5. Ahora necesitamos aplicar esta fuerza a ambas palabras y obtener sus aceleraciones

    • a c = 8.82871 / 24 = .36786 em / s 2
    • a d = -8.82871 / 26 = -.33957 em / s 2
  6. Siguiendo las reglas anteriores, aplicamos la aceleración a la velocidad, entonces

    • v c = .36786 em / s
    • v d = -.33957 em / s
  7. Luego aplicamos la velocidad a la posición, así que después de un segundo,

    • x c = .36786 em
    • x d = 9 -.33957 = 8.66043 em.
    • R c = 1.70833 + .36786 = 2.07619 em
    • R d = 10.11538-.33957 = 9.77581 em
  8. Ahora repetimos el procedimiento una vez más con las nuevas posiciones:

    • F = 24 * 26 / ((9.77581) - (2.07619)) 2 = 10.52558 N w
    • a c = 10.52558 / 24 = .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 = .36786 + .80643 = 1.17429 em, x d = 8.66043 - .74440 = 7.91603 em
    • R c = 2.07619 + .80643 = 2.88262 em, R d = 9.77581 - .74440 = 9.03141 em
  9. Entonces terminamos con "gato" en x = 1.17429 y "perro" en x = 7.91603.

    • Los redondeamos al número entero más cercano para que "cat" vaya a la posición 1 y "dog" vaya a la posición 8, por lo que la salida es cat dog

Manejo de colisiones

Recuerde que la nueva aceleración se agrega inmediatamente a la velocidad cada segundo. Por lo tanto, si dos palabras chocan en cierto momento, use álgebra para encontrar el punto de colisión. Toma este ejemplo:

  • la palabra 1 tiene 4 letras (|| w 1 || = 4)
  • la palabra 2 tiene 4 letras (|| w 2 || = 4)
  • x 1 = 3, x 2 = 8
  • v 1 = 2, v 2 = -6

    Resolver 3 + (4-1) + 2t = 8 - 6t. t = .25s. La posición de la colisión es x col = 6.5. Por lo tanto, la colisión debería aparecer entre x = 6 yx = 7, como tal

    ####@@@@ .

La fórmula explícita para las posiciones de las palabras después de una colisión es

  • x 1 = piso (x col ) - || w 1 || +1
  • x 2 = piso (x col ) +1
geokavel
fuente
@FryAmTheEggman La última viñeta en "información" habla sobre la colisión. Puede hacerlo en un solo paso, pero asegúrese de seguir las reglas establecidas.
geokavel
¿Podrían pasar las palabras entre sí?
xnor
@xnor No, no lo serán. Me han agregado una parte sobre el manejo adecuado de colisiones.
geokavel
Estoy tratando de entender la física involucrada aquí. Considere la configuración xx a(un espacio entre las palabras xxy a). En la física newtoniana, la fuerza que ase sentiría se debería a la xatracción más cercana desde una distancia de dos em, y la otra xatracción desde una distancia de tres em, ¿sí? Eso no es lo mismo que la fuerza de un solo punto de Xextracción de masa desde una distancia de 2.5em (es decir, el centro de masa del xx), debido a la ley del cuadrado inverso ...
Mathmandan
1
... así que para aclarar, se supone que debo tratar cada PALABRA como si fuera una masa de punto con toda su masa concentrada en su centro de masa, donde por "su centro de masa" queremos decir "donde su centro de la masa sería si en su lugar tratamos sus LETRAS como masas puntuales ". ¿Es esto correcto?
Mathmandan

Respuestas:

3

Python 3, 556 bytes

Gracias a FryAmTheEggman y Sherlock9 por algunos bytes

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)toma la cadena ( w) y el tiempo ( t), y devuelve el resultado. Las otras funciones son ayudantes.

Pruébelo en línea (imprime *s en lugar de espacios para que sea más visible)

Mego
fuente