Привабливість між словами


11

Теорія гравітації Ньютона говорить, що сила тяжіння між двома точковими масами є

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

Де

  • G - гравітаційна константа: 6674 × 10 −11 N · (м / кг) 2
  • m 1 - маса першого об’єкта
  • m 2 - маса другого об'єкта
  • r - відстань між їх центрами мас

Виклик

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

Інформація

  • Оскільки слова абстрактні, вони мають різний набір одиниць і констант
    • Маса: WMU (Word Mass Unit) - дорівнює масі літери 'a'.
    • Відстань: em , довжина одного символу.
    • Сила: N W (Word Newton) = WMU · em / s 2
    • Гравітаційна константа: G = 1 N w · (em / WMU) 2
  • Перший символ відповідає позиції 0 на осі x.
  • Усі обчислення слід робити з якомога більшою точністю, лише в кінці ви обернетесь до найближчого.
  • Вам не потрібно використовувати обчислення, просто потрібно перерахувати F кожну секунду, автоматично застосувати нове прискорення до швидкості, а через секунду застосувати швидкість до положення (див. Приклад).
  • Після того, як два слова стикаються між собою (як catdog ), вони більше не рухаються.

Центр меси

Центр мас слова можна знайти за такою формулою:

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

Де M - загальна маса слова, m i - маса букви, а r i - положення літери.

Приклад:

(Примітка. Хоча цей приклад не показує цього, пам’ятайте, що великі літери мають вдвічі більше маси їхніх малих аналогів.)

Вхід:, cat dog2

  1. По-перше, які позиції кожного слова? "кішка" починається з позиції 0, а "собака" починається з позиції 9, так

    • x c = 0 і x d = 9
  2. Далі знайдемо центр маси «кота».

    • Він має масу 24 ВМУ (3 + 1 + 20).
    • R c = 1/24 (3 * 0 + 1 * 1 + 20 * 2) = 41/24 = 1.70833 em
    • Тож не дивно, що центр маси дуже близький до літери 't'.
  3. Тепер давайте отримаємо центр маси "собаки"

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

    • F = 24 * 26 / (10.11538-1.70833) 2 = 8.82871 N ш
  5. Тепер нам потрібно застосувати цю силу до обох слів і отримати їх прискорення

    • a c = 8.82871 / 24 = .36786 em / s 2
    • a d = -8.82871 / 26 = -.33957 em / s 2
  6. Дотримуючись наведених вище правил, ми застосовуємо прискорення до швидкості, так

    • v c = .36786 em / s
    • v d = -39397 ем / с
  7. Потім застосовуємо швидкість до позиції, тож через одну секунду,

    • x c = .36786 em
    • x d = 9 -393957 = 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 N ш
    • 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. Таким чином, ми закінчуємо "cat" у x = 1,17429 та "dog" при 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 = .25s. Положення зіткнення становить x col = 6,5. Отже, зіткнення повинно бути таким, що відбувається між x = 6 і x = 7, як таким

    ####@@@@ .

Явна формула позицій слів після зіткнення є

  • x 1 = підлога (x col ) - || w 1 || +1
  • x 2 = підлога (x col ) +1

@FryAmTheEggman Остання точка кулі в "info" говорить про зіткнення. Ви можете зробити це за один крок, але обов’язково дотримуйтесь викладених правил.
геокавель

Чи можуть слова проходити один через одного?
xnor

@xnor Ні, вони не будуть. Мені додано частину про належне поводження зіткненнями.
geokavel

Я намагаюся зрозуміти фізику, яка тут займається. Розглянемо конфігурацію xx a(один пробіл між словами xxта a). У ньютонівській фізиці сила, яка aвідчувається, була б зумовлена ​​ближчим xвитягуванням з відстані двох ем, а інша xтягне з відстані трьох ем, так? Це не те саме, що сила однієї точки-маси, яка Xтягнеться з відстані 2.5ем (тобто центру маси осередку xx), через закон зворотного квадрата ...
математика

1
... щоб просто уточнити, я повинен ставитися до кожного СЛОВА так, ніби це точкова маса з усією її масою, зосередженою в центрі його маси, де під "центром маси" ми маємо на увазі "там, де його центр маса була б, якби ми замість цього ставились до її ЛІТЕРІВ як до маси ". Це правильно?
mathmandan

Відповіді:


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.