Влечение между словами


11

Теория гравитации Ньютона говорит, что гравитационная сила между двумя точечными массами

F = (Гм 1 м 2 ) / г 2

куда

  • G - гравитационная постоянная: 6,674 × 10 -11 Н · (м / кг) 2
  • m 1 - масса первого объекта
  • м 2 - масса второго объекта
  • r - расстояние между их центрами масс

Вызов

Вам нужно смоделировать тягу между двумя словами. Каждая строчная буква имеет массу, заданную ее положением в алфавите. Заглавные буквы имеют вдвое большую массу, чем их строчные буквы! Вам будет предоставлена ​​строка, содержащая два слова, разделенных несколькими пробелами, а также положительное целое число секунд, с . Выведите, как будет выглядеть строка через s секунд.

Информация

  • Поскольку слова являются абстрактными, они имеют различный набор единиц и констант
    • Масса: WMU (Word Mass Unit) - равна массе буквы «а».
    • Расстояние: em , длина одного символа.
    • Сила: N W (Слово Ньютон) = WMU · em / s 2
    • Гравитационная постоянная: G = 1 N w · (em / WMU) 2
  • Первый символ соответствует позиции 0 на оси х.
  • Все вычисления должны быть сделаны с максимально возможной точностью, только в конце вы округляетесь до ближайшего значения.
  • Вам не нужно использовать исчисление, вам просто нужно пересчитывать F каждую секунду, автоматически применять новое ускорение к скорости, а через секунду применять скорость к позиции (см. Пример).
  • Как только два слова сталкиваются друг с другом (как catdog ), они не двигаются дальше.

Центр массы

Центр масс слова можно найти по следующей формуле:

введите описание изображения здесь

Где M - общая масса слова, m i - масса буквы, а r i - позиция буквы.

Пример:

(Примечание. Хотя в этом примере это не показано, помните, что заглавные буквы имеют в два раза большую массу, чем их строчные буквы.)

Вход:, cat dog2

  1. Во-первых, каковы позиции каждого слова? «кошка» начинается с позиции 0, а «собака» начинается с позиции 9, поэтому

    • х с = 0 и х д = 9
  2. Далее давайте найдем центр масс «кота».

    • Он имеет массу 24 WMU (3 + 1 + 20).
    • R c = 1/24 (3 * 0 + 1 * 1 + 20 * 2) = 41/24 = 1,70833
    • Поэтому неудивительно, что центр масс очень близок к букве «т».
  3. Теперь давайте получим центр масс «собаки»

    • R d = 1/26 (4 * 9 + 15 * 10 + 7 * 11) = 263/26 = 10,11538 em
    • Таким образом, центр масс собаки близок к букве «о», слегка в направлении «г».
  4. Теперь мы можем рассчитать силу между двумя словами.

    • F = 24 * 26 / (10,11538-1,70833) 2 = 8,82871 N ш
  5. Теперь нам нужно применить эту силу к обоим словам и получить их ускорения

    • a c = 8,82871 / 24 = .36786 em / с 2
    • a d = -8,82871 / 26 = -,33957 em / с 2
  6. Следуя приведенным выше правилам, мы применяем ускорение к скорости, поэтому

    • v c = .36786 em / s
    • V д = -,33957 Ем / с
  7. Затем мы применяем скорость к позиции, поэтому через одну секунду

    • х с = .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. Теперь повторим процедуру еще раз с новыми позициями:

    • F = 24 * 26 / ((9,77581) - (2,07619)) 2 = 10,52558 Н ш
    • a c = 10,52558 / 24 = .43857 em / с 2 , a d = 10,52558 / 26 = -.40483 em / с 2
    • v c = .36786 + .43857 = .80643 em / с, v d = -.33957 - .40483 = -.74440 em / с
    • 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. Таким образом, мы получаем «кошка» в x = 1.17429 и «собака» в x = 7.91603.

    • Мы округляем их до ближайшего целого числа, так что «кошка» переходит в позицию 1, а «собака» переходит в позицию 8, поэтому вывод cat dog

Обработка коллизий

Помните, что новое ускорение немедленно добавляется к скорости каждую секунду. Поэтому, если два слова сталкиваются в определенное время, используйте алгебру, чтобы найти точку столкновения. Возьмите этот пример:

  • слово 1 состоит из 4 букв (|| w 1 || = 4)
  • слово 2 имеет длину 4 буквы (|| w 2 || = 4)
  • х 1 = 3, х 2 = 8
  • v 1 = 2, v 2 = -6

    Решите 3 + (4-1) + 2t = 8 - 6t. t = 0,25 с. Положение столкновения x col = 6,5. Поэтому столкновение должно выглядеть как происходящее между x = 6 и x = 7, как таковое

    ####@@@@ ,

Явная формула для положения слов после столкновения

  • x 1 = этаж (x цв ) - || w 1 || +1
  • х 2 = этаж (х цв ) +1

@FryAmTheEggman Последний пункт в «информации» говорит о столкновении. Вы можете сделать это за один шаг, но обязательно следуйте изложенным правилам.
геокавель

Могут ли слова проходить сквозь друг друга?
xnor

@xnor Нет, они не будут. Я добавил часть о правильной обработке столкновений.
геокавель

Я пытаюсь понять физику, связанную здесь. Рассмотрим конфигурацию xx a(один пробел между словами xxи a). В ньютоновской физике сила, которая aощущается, должна быть связана с более близким xнатяжением с расстояния двух, а другое x- с расстояния трех, да? Это не то же самое, что сила Xвытягивания одной точки-массы с расстояния 2.5их (т. xx
Е.

1
... так что, чтобы уточнить, я должен относиться к каждому СЛОВУ, как к точке-массе со всей массой, сконцентрированной в его центре масс, где под "его центром масс" мы подразумеваем "где его центр масса была бы, если бы мы вместо этого рассматривали его буквы как точечные массы ". Это верно?
Матмандан

Ответы:


3

Python 3, 556 байт

Спасибо FryAmTheEggman и Sherlock9 за некоторые байты

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)принимает строку ( w) и время ( t) и возвращает результат. Другие функции являются помощниками.

Попробуйте онлайн (распечатывает *s вместо пробелов, чтобы он был более заметным)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.