Anziehung zwischen Wörtern

11

Newtons Gravitationstheorie besagt, dass die Gravitationskraft zwischen zwei Punktmassen ist

F = (Gm 1 m 2 ) / r 2

Wo

  • G ist die Gravitationskonstante: 6,674 × 10 –11 N · (m / kg) 2
  • m 1 ist die Masse des ersten Objekts
  • m 2 ist die Masse des zweiten Objekts
  • r ist der Abstand zwischen ihren Massenschwerpunkten

Herausforderung

Sie müssen den Zug zwischen zwei Wörtern simulieren. Jeder Kleinbuchstabe hat eine Masse, die durch seine Position im Alphabet angegeben wird. Großbuchstaben haben die doppelte Masse ihrer Kleinbuchstaben! Sie werden einen String mit zwei Worten durch mehrere Räume, sowie eine positive ganze Zahl von Sekunden getrennt gegeben werden, s . Geben Sie aus, wie die Zeichenfolge nach s Sekunden aussehen würde .

Die Info

  • Da Wörter abstrakt sind, haben sie unterschiedliche Einheiten und Konstanten
    • Masse: WMU (Word Mass Unit) - entspricht der Masse des Buchstabens 'a'.
    • Entfernung: em , die Länge eines Zeichens.
    • Kraft: N W (Word Newton) = WMU · em / s 2
    • Gravitationskonstante: G = 1 N w · (em / WMU) 2
  • Das erste Zeichen entspricht der Position 0 auf der x-Achse.
  • Alle Berechnungen sollten so genau wie möglich durchgeführt werden. Erst am Ende runden Sie zum nächsten em.
  • Sie müssen keinen Kalkül verwenden, sondern müssen nur das F jede Sekunde neu berechnen , die neue Beschleunigung automatisch auf die Geschwindigkeit anwenden und nach einer Sekunde die Geschwindigkeit auf die Position anwenden (siehe Beispiel).
  • Sobald zwei Wörter miteinander kollidieren (wie catdog ), bewegen sie sich nicht weiter.

Massezentrum

Der Schwerpunkt eines Wortes kann mit der Formel gefunden werden:

Geben Sie hier die Bildbeschreibung ein

Dabei ist M die Gesamtmasse des Wortes, m i die Masse eines Buchstabens und r i die Position des Buchstabens.

Beispiel:

(Hinweis: Obwohl dieses Beispiel dies nicht zeigt, denken Sie daran, dass Großbuchstaben die doppelte Masse ihrer Gegenstücke in Kleinbuchstaben haben.)

Eingabe : cat dog, 2

  1. Was sind zuerst die Positionen der einzelnen Wörter? "Katze" beginnt an Position 0 und "Hund" beginnt an Position 9, also

    • x c = 0 und x d = 9
  2. Als nächstes finden wir den Schwerpunkt von "Katze".

    • Es hat eine Masse von 24 WMU (3 + 1 + 20).
    • R c = 1/24 (3 · 0 + 1 · 1 + 20 · 2) = 41/24 = 1,70833 em
    • Es ist also nicht überraschend, dass der Schwerpunkt sehr nahe am Buchstaben 't' liegt.
  3. Lassen Sie uns nun den Schwerpunkt von "Hund" erhalten

    • R d = 1/26 (4 · 9 + 15 · 10 + 7 · 11) = 263/26 = 10,11538 em
    • Der Schwerpunkt des Hundes liegt also nahe am Buchstaben 'o', leicht in Richtung 'g'.
  4. Jetzt können wir die Kraft zwischen den beiden Wörtern berechnen.

    • F = 24 · 26 / (10.11538-1.70833) 2 = 8,82871 N w
  5. Jetzt müssen wir diese Kraft auf beide Wörter anwenden und ihre Beschleunigungen erhalten

    • a c = 8,82871 / 24 = 0,36786 em / s 2
    • a d = -8,82871 / 26 = -.33957 em / s 2
  6. Nach den obigen Regeln wenden wir die Beschleunigung auf die Geschwindigkeit an

    • v c = 0,36786 em / s
    • v d = -.33957 em / s
  7. Dann wenden wir die Geschwindigkeit auf die Position an, also nach einer Sekunde

    • x c = 0,36786 em
    • x d = 9 - 33957 = 8,66043 em.
    • R c = 1,70833 + 0,36786 = 2,07619 em
    • R d = 10,11538 - 0,33957 = 9,77581 em
  8. Jetzt wiederholen wir den Vorgang noch einmal mit den neuen Positionen:

    • 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 = -.33957 - .40483 = -.74440 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
  9. Am Ende haben wir also "Katze" bei x = 1,17429 und "Hund" bei x = 7,91603.

    • Wir runden diese auf die nächste ganze Zahl, so dass "Katze" auf Position 1 und "Hund" auf Position 8 geht, also ist die Ausgabe cat dog

Umgang mit Kollisionen

Denken Sie daran, dass die neue Beschleunigung jede Sekunde sofort zur Geschwindigkeit hinzugefügt wird. Wenn daher zwei Wörter zu einem bestimmten Zeitpunkt kollidieren, verwenden Sie Algebra, um den Kollisionspunkt zu finden. Nehmen Sie dieses Beispiel:

  • Wort 1 ist 4 Buchstaben lang (|| w 1 || = 4)
  • Wort 2 ist 4 Buchstaben lang (|| w 2 || = 4)
  • x 1 = 3, x 2 = 8
  • v 1 = 2, v 2 = -6

    Löse 3 + (4-1) + 2t = 8 - 6t. t = 0,25 s. Die Position der Kollision ist x col = 6,5. Daher sollte die Kollision als solche zwischen x = 6 und x = 7 auftreten

    ####@@@@ .

Die explizite Formel für die Positionen der Wörter nach einer Kollision lautet

  • x 1 = Boden (x Spalte ) - || w 1 || +1
  • x 2 = Boden (x Spalte ) +1
Geokavel
quelle
@FryAmTheEggman Der letzte Punkt in "info" handelt von Kollisionen. Sie können dies in einem Schritt tun, aber stellen Sie sicher, dass Sie die festgelegten Regeln befolgen.
Geokavel
Könnten sich die Wörter gegenseitig durchdringen?
xnor
@xnor Nein, das werden sie nicht. Ich habe einen Teil über den richtigen Umgang mit Kollisionen hinzugefügt.
Geokavel
Ich versuche die Physik hier zu verstehen. Betrachten Sie die Konfiguration xx a(ein Leerzeichen zwischen den Wörtern xxund a). In der Newtonschen Physik wäre die Kraft, die sich aanfühlt, auf das nähere xZiehen aus einer Entfernung von zwei Ems und das andere xZiehen aus einer Entfernung von drei Ems zurückzuführen, ja? Das ist nicht dasselbe wie die Kraft einer einzelnen Punktmasse X, die aus einer Entfernung von 2.5em (dh dem Schwerpunkt der xx) gezogen wird, aufgrund des Gesetzes des umgekehrten Quadrats ...
mathmandan
1
... nur um das zu verdeutlichen, soll ich jedes WORT so behandeln, als wäre es eine Punktmasse, deren gesamte Masse sich auf seinen Massenschwerpunkt konzentriert, wobei mit "seinem Massenschwerpunkt" gemeint ist, "wo sein Mittelpunkt liegt" Masse wäre, wenn wir stattdessen seine BRIEFE als Punktmassen behandeln würden ". Ist das richtig?
Mathmandan

Antworten:

3

Python 3, 556 Bytes

Vielen Dank an FryAmTheEggman und Sherlock9 für einige Bytes

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)Nimmt den String ( w) und die Zeit ( t) und gibt das Ergebnis zurück. Die anderen Funktionen sind Helfer.

Probieren Sie es online aus (druckt *s anstelle von Leerzeichen aus, damit es besser sichtbar ist)

Mego
quelle