Atração entre palavras

11

A teoria da gravitação de Newton diz que a força gravitacional entre duas massas pontuais é

F = (Gm 1 m 2 ) / r 2

Onde

  • G é a constante gravitacional: 6.674 × 10 −11 N · (m / kg) 2
  • m 1 é a massa do primeiro objeto
  • m 2 é a massa do segundo objeto
  • r é a distância entre seus centros de massa

Desafio

Você precisa simular a atração entre duas palavras. Cada letra minúscula tem massa dada por sua posição no alfabeto. As letras maiúsculas têm o dobro da massa de suas contrapartes em minúsculas! Você receberá uma sequência contendo duas palavras separadas por vários espaços, além de um número inteiro positivo de segundos, s . Saída como seria a string após s segundos.

Info

  • Como as palavras são abstratas, elas têm um conjunto diferente de unidades e constantes
    • Massa: WMU (Word Mass Unit) - igual à massa da letra 'a'.
    • Distância: em , o comprimento de um caractere.
    • Força: N W (Palavra Newton) = WMU · em / s 2
    • Constante gravitacional: G = 1 N w · (em / WMU) 2
  • O primeiro caractere corresponde à posição 0 no eixo x.
  • Todos os cálculos devem ser feitos com a maior precisão possível, somente no final você arredonda para o em mais próximo.
  • Você não precisa usar cálculo, basta recalcular o F a cada segundo, aplicar automaticamente a nova aceleração à velocidade e depois de um segundo aplicar a velocidade na posição (veja o exemplo).
  • Uma vez que duas palavras colidem umas com as outras (como catdog ), elas não se movem mais.

Centro de massa

O centro de massa de uma palavra pode ser encontrado com a fórmula:

insira a descrição da imagem aqui

Onde M é a massa total da palavra, m i representa a massa de uma letra, e r i representa a posição da carta.

Exemplo:

(Nota: embora este exemplo não o mostre, lembre-se de que as letras maiúsculas têm o dobro da massa de suas letras minúsculas.)

Entrada:, cat dog2

  1. Primeiro, quais são as posições de cada palavra? "gato" começa na posição 0 e "cachorro" começa na posição 9, então

    • x c = 0 ex x = 9
  2. Em seguida, vamos encontrar o centro de massa de "gato".

    • Tem uma massa de 24 WMU (3 + 1 + 20).
    • R c = 1/24 (3 * 0 + 1 * 1 + 20 * 2) = 41/24 = 1,70833 em
    • Então, sem surpresa, o centro de massa está muito próximo da letra 't'.
  3. Agora vamos ao centro da massa de "cachorro"

    • R d = 1/26 (4 * 9 + 15 * 10 + 7 * 11) = 263/26 = 10,11538 em
    • Portanto, o centro de massa do cão fica próximo à letra 'o', ligeiramente na direção de 'g'.
  4. Agora podemos calcular a força entre as duas palavras.

    • F = 24 * 26 / (10.11538-1.70833) 2 = 8.82871 N w
  5. Agora precisamos aplicar essa força nas duas palavras e obter suas acelerações

    • a c = 8,82871 / 24 = 0,36786 em / s 2
    • a d = -8.82871 / 26 = -.33957 em / s 2
  6. Seguindo as regras acima, aplicamos a aceleração à velocidade, então

    • v c = 0,36786 em / s
    • v d = -.33957 em / s
  7. Em seguida, aplicamos a velocidade na posição. Depois de um segundo,

    • x c = 0,36786 em
    • x d = 9 -393957 = 8,66043 em.
    • R c = 1,70833 + 0,36786 = 2,07619 em
    • R d = 10,11538-0,33957 = 9,77581 em
  8. Agora repetimos o procedimento mais uma vez com as novas posições:

    • 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 = 0,36786 + 0,43857 = 0,80643 em / s, v d = -393957 - 0,40483 = -74444 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,88262 em, R d = 9,77581 - 0,74440 = 9,03141 em
  9. Então, acabamos com "gato" em x = 1,17429 e "cachorro" em x = 7,91603.

    • Arredondamos esses números para o número inteiro mais próximo, para que "cat" vá para a posição 1 e "dog" vá para a posição 8, para que a saída seja cat dog

Tratamento de colisões

Lembre-se de que a nova aceleração é imediatamente adicionada à velocidade a cada segundo. Portanto, se duas palavras colidirem em um determinado momento, use álgebra para encontrar o ponto de colisão. Veja este exemplo:

  • a palavra 1 tem 4 letras (|| w 1 || = 4)
  • a palavra 2 tem 4 letras (|| w 2 || = 4)
  • x 1 = 3, x 2 = 8
  • v 1 = 2, v 2 = -6

    Solve 3 + (4-1) + 2t = 8 - 6t. t = 0,25s. A posição da colisão é x col = 6,5. Portanto, a colisão deve aparecer entre x = 6 ex = 7, como tal

    ####@@@@ .

A fórmula explícita para as posições das palavras após uma colisão é

  • x 1 = piso (x col ) - || w 1 || +1
  • x 2 = piso (x col ) +1
geokavel
fonte
@FryAmTheEggman O último marcador em "info" fala sobre colisão. Você pode fazer isso em uma única etapa, mas certifique-se de seguir as regras estabelecidas.
precisa saber é
As palavras podem passar uma pela outra?
Xnor
@xnor Não, eles não vão. Eu adicionei uma parte sobre como lidar adequadamente com colisões.
precisa saber é
Estou tentando entender a física envolvida aqui. Considere a configuração xx a(um espaço entre as palavras xxe a). Na física newtoniana, a força que se asente seria devida ao xpuxar mais próximo de uma distância de dois ems e a outra xpuxar a uma distância de três ems, sim? Isso não é o mesmo que a força de um único ponto em massa Xpuxando a uma distância de 2.5em de (ou seja, o centro de massa do xx), devido à lei do inverso do quadrado ...
mathmandan
1
... então, para esclarecer, devo tratar cada PALAVRA como se fosse uma massa pontual com toda a sua massa concentrada no centro de massa, onde por "seu centro de massa" queremos dizer "onde seu centro de massa seria se nós tratássemos suas LETRAS como massas pontuais ". Isso está correto?
mathmandan

Respostas:

3

Python 3, 556 bytes

Obrigado a FryAmTheEggman e Sherlock9 por alguns 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)pega a string ( w) e a hora ( t) e retorna o resultado. As outras funções são ajudantes.

Experimente online (imprime *s em vez de espaços para ficar mais visível)

Mego
fonte