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:
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 dog
2
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
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'.
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'.
Agora podemos calcular a força entre as duas palavras.
- F = 24 * 26 / (10.11538-1.70833) 2 = 8.82871 N w
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
Seguindo as regras acima, aplicamos a aceleração à velocidade, então
- v c = 0,36786 em / s
- v d = -.33957 em / s
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
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
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
- 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
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
fonte
xx a
(um espaço entre as palavrasxx
ea
). Na física newtoniana, a força que sea
sente seria devida aox
puxar mais próximo de uma distância de dois ems e a outrax
puxar a uma distância de três ems, sim? Isso não é o mesmo que a força de um único ponto em massaX
puxando a uma distância de2.5
em de (ou seja, o centro de massa doxx
), devido à lei do inverso do quadrado ...Respostas:
Python 3, 556 bytes
Obrigado a FryAmTheEggman e Sherlock9 por alguns bytes
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)fonte