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


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.