Przyciąganie między słowami


11

Teoria grawitacji Newtona mówi, że siła grawitacji między dwiema masami punktowymi jest

F = (Gm 1 m 2 ) / r 2

Gdzie

  • G to stała grawitacyjna: 6,674 x 10 -11 Nm (m / kg), 2
  • m 1 to masa pierwszego obiektu
  • m 2 to masa drugiego obiektu
  • r jest odległością między ich środkami masy

Wyzwanie

Musisz zasymulować przyciąganie między dwoma słowami. Każda mała litera ma masę wynikającą z jej pozycji w alfabecie. Wielkie litery mają dwa razy więcej niż małe litery! Otrzymasz ciąg zawierający dwa słowa oddzielone kilkoma spacjami, a także dodatnią liczbę całkowitą sekund, s . Wypisuj, jak wyglądałby łańcuch po s sekundach.

Informacje

  • Ponieważ słowa są abstrakcyjne, mają inny zestaw jednostek i stałych
    • Mass: WMU (Word Mass Unit) - równa masie litery „a”.
    • Odległość: em , długość jednego znaku.
    • Siła: N W (Słowo Newton) = WMU · em / s 2
    • Stała grawitacyjna: G = 1 N w · (em / WMU) 2
  • Pierwszy znak odpowiada pozycji 0 na osi x.
  • Wszystkie obliczenia powinny być wykonywane z możliwie największą precyzją, tylko na końcu zaokrąglasz się do najbliższego.
  • Nie musisz używać rachunku całkowego, wystarczy ponownie obliczyć F co sekundę, automatycznie zastosować nowe przyspieszenie do prędkości, a po drugiej zastosować prędkość do pozycji (patrz przykład).
  • Kiedy dwa słowa zderzą się ze sobą (jak catdog ), nie ruszają się dalej.

Centrum Mszy

Środek ciężkości danego słowa może być znaleziony z wzoru:

wprowadź opis zdjęcia tutaj

Gdzie M jest całkowitą masą słowa, m i jest masą litery, a r i jest pozycją litery.

Przykład:

(Uwaga: chociaż ten przykład tego nie pokazuje, pamiętaj, że wielkie litery mają dwa razy większą masę niż małe odpowiedniki).

Wejście:, cat dog2

  1. Po pierwsze, jakie są pozycje każdego słowa? „kot” zaczyna się w pozycji 0, a „pies” zaczyna się w pozycji 9, więc

    • x c = 0 i x d = 9
  2. Następnie znajdźmy środek masy „kota”.

    • Ma masę 24 WMU (3 + 1 + 20).
    • R c = 1/24 (3 * 0 + 1 * 1 + 20 * 2) = 41/24 = 1,70833 em
    • Nic więc dziwnego, że środek masy znajduje się bardzo blisko litery „t”.
  3. Teraz zdobądźmy środek masy „psa”

    • R d = 1/26 (4 * 9 + 15 * 10 + 7 * 11) = 263/26 = 10,11538 em
    • Środek masy dla psa jest więc zbliżony do litery „o”, nieco w kierunku „g”.
  4. Teraz możemy obliczyć siłę między dwoma słowami.

    • F = 24 * 26 / (10,11538-1,70833) 2 = 8,82871 N w
  5. Teraz musimy zastosować tę siłę do obu słów i uzyskać ich przyspieszenie

    • a c = 8,82871 / 24 = .36786 em / s 2
    • a d = -8,82871 / 26 = -333957 em / s 2
  6. Zgodnie z powyższymi zasadami stosujemy przyspieszenie do prędkości, więc

    • v c = 0,36786 em / s
    • v d = -333957 em / s
  7. Następnie zastosujemy prędkość do pozycji, więc po jednej sekundzie

    • x c = .36786 em
    • x d = 9 -3 3957 = 8,66043 em.
    • R c = 1,70833 + .36786 = 2,07619 em
    • R d = 10,11538 0,33957 = 9,77581-em
  8. Teraz powtarzamy procedurę jeszcze raz z nowymi pozycjami:

    • F = 24 * 26 / ((9,77581) - (2,07619)) 2 = 10,52558 N w
    • a c = 10,52558 / 24 = 0,43857 em / s 2 , a d = 10,52558 / 26 = -.40483 em / s 2
    • v c = .36786 + .43857 = .80643 em / s, v d = -333957 - .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, Rd = 9,77581 - .74440 = 9,03141 em
  9. W rezultacie otrzymujemy „cat” przy x = 1,17429 i „dog” przy x = 7,91603.

    • Zaokrąglamy je do najbliższej liczby całkowitej, więc „kot” przechodzi na pozycję 1, a „pies” na pozycję 8, więc wynikiem jest cat dog

Obsługa kolizji

Pamiętaj, że nowe przyspieszenie jest natychmiast dodawane do prędkości co sekundę. Dlatego, jeśli dwa słowa zderzają się w określonym czasie, użyj algebry, aby znaleźć punkt zderzenia. Weź ten przykład:

  • słowo 1 ma 4 litery (|| w 1 || = 4)
  • słowo 2 ma 4 litery (|| w 2 || = 4)
  • x 1 = 3, x 2 = 8
  • v 1 = 2, v 2 = -6

    Rozwiązać 3 + (4-1) + 2t = 8 - 6t. t = .25s. Pozycja kolizji wynosi x col = 6,5. Dlatego zderzenie powinno wyglądać jak występujące między x = 6 a x = 7

    ####@@@@ .

Wyraźna formuła dla pozycji słów po zderzeniu to

  • x 1 = podłoga (x kolumna ) - || w 1 || +1
  • x 2 = podłoga (x kolumna ) +1

@FryAmTheEggman Ostatni punkt w „informacji” mówi o kolizji. Możesz to zrobić w jednym kroku, ale pamiętaj o przestrzeganiu określonych zasad.
geokavel

Czy słowa mogą się przenikać?
xnor

@ xnor Nie, nie będą. Dodałem część dotyczącą prawidłowej obsługi kolizji.
geokavel

Próbuję zrozumieć fizykę związaną z tym zjawiskiem. Rozważ konfigurację xx a(jedna spacja między słowami xxi a). W fizyce newtonowskiej odczuwalna siła abyłaby spowodowana bliższym xprzyciąganiem z odległości dwóch em, a drugim xprzyciąganiem z odległości trzech em, tak? To nie to samo, co siła pojedynczej masy punktowej Xciągnącej się z odległości 2.5ich (tj. xx
Środka

1
... aby wyjaśnić, każde SŁOWO należy traktować jak masę punktową z całą masą skupioną w środku masy, gdzie przez „środek masy” rozumiemy „gdzie jego środek masa byłaby, gdybyśmy zamiast tego traktowali jej LISTY jako masy punktowe ". Czy to jest poprawne?
matmandan

Odpowiedzi:


3

Python 3, 556 bajtów

Dzięki FryAmTheEggman i Sherlock9 za niektóre bajty

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)pobiera string ( w) i time ( t) i zwraca wynik. Pozostałe funkcje są pomocnikami.

Wypróbuj online (drukuje *s zamiast spacji, aby był bardziej widoczny)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.