词间吸引力


11

牛顿的引力理论说,两点质量之间的引力是

F =(Gm 1 m 2)/ r 2

哪里

  • G为重力常数:6.674×10 -11 N·(m / kg)2
  • m 1是第一个物体的质量
  • m 2是第二个物体的质量
  • r是它们的质心之间的距离

挑战

您需要模拟两个单词之间的拉动。每个小写字母的质量取决于其在字母表中的位置。大写字母的质量是小写字母的两倍!您将得到一个字符串,其中包含两个单词,这些单词由几个空格分隔,以及正整数秒数s。在s秒后输出字符串的外观。

信息

  • 因为单词是抽象的,所以它们具有一组不同的单位和常量
    • 质量:WMU(字质量单位)-等于字母“ a”的质量。
    • 距离:em,一个字符的长度。
    • 力: N W(牛顿(Word Newton))= WMU·em / s 2
    • 重力常数:G = 1 N w ·(em / WMU)2
  • 第一个字符对应于x轴上的位置0。
  • 所有计算都应尽可能精确地进行,直到最后才舍入到最接近的em。
  • 您不需要使用微积分,只需要每秒重新计算F,自动将新的加速度应用于速度,然后一秒钟将速度应用于位置(请参见示例)。
  • 一旦两个单词相互碰撞(如 catdog ),它们就不会再移动了。

质量中心

质心的单词的可与式中找到:

在此处输入图片说明

其中中号是单词的总质量,中号是字母的质量,和- [R 是字母的位置。

例:

(注意:尽管此示例未显示,但请记住,大写字母的质量是小写字母的两倍。)

输入:cat dog,2

  1. 首先,每个单词的位置是什么?“ cat”从位置0开始,“ dog”从位置9开始,因此

    • x c = 0且x d = 9
  2. 接下来,让我们找到“猫”的重心。

    • 它的质量为24 WMU(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
    • 因此,狗的质心接近字母“ o”,稍微靠近“ g”。
  4. 现在我们可以计算两个单词之间的力。

    • F = 24 * 26 /(10.11538-1.70833)2 = 8.82871Ñ 瓦特
  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 = -.33957 em / s
  7. 然后我们将速度应用于该位置,因此一秒钟后,

    • x c = .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 / 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. 因此,我们在x = 1.17429处获得“ cat”,在x = 7.91603处获得“ dog”。

    • 我们将它们四舍五入到最接近的整数,以便“ cat”转到位置1,“ dog”转到位置8,因此输出为 cat dog

处理碰撞

请记住,新的加速度会立即每秒添加到速度中。因此,如果两个单词在特定时间发生碰撞,请使用代数找到碰撞点。举个例子:

  • 单词1长4个字母(|| w 1 || = 4)
  • 单词2的长度为4个字母(|| w 2 || = 4)
  • x 1 = 3,x 2 = 8
  • v 1 = 2,v 2 = -6

    解决3 + (4-1) + 2t = 8 - 6t。t = .25秒。碰撞的位置是x col = 6.5。因此,碰撞应出现在x = 6和x = 7之间

    ####@@@@

碰撞后单词位置的显式公式为

  • x 1 =楼板面积(x col)-|| w 1 || +1
  • x 2 =楼板面积(x col)+1

@FryAmTheEggman“信息”中的最后一个要点是碰撞。您可以一步一步完成操作,但请确保遵循列出的规则。
geokavel

单词可能会彼此通过吗?
xnor

@xnor不,他们不会。我添加了有关正确处理冲突的部分。
geokavel

我试图了解这里涉及的物理学。考虑配置xx a(单词xx和之间的一个空格a)。在牛顿物理学中,a感觉到的力是由于x从两个em的距离拉近而另一个x从三个em的距离拉远,是吗?由于平方反比的关系,这与单点质量X2.5em的距离(即的质心)拉出的力不同xx
。– mathmandan

1
...所以只是为了澄清一下,我应该将每个WORD视作一个点质量,其所有质量都集中在其质心上,这里的“质心”是指“如果我们改为将其字母视为点质量,则为质量”。这个对吗?
mathmandan

Answers:


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而不是空格,使其更可见)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.