言葉の間の魅力


11

ニュートンの重力理論では、2つの点質量の間の重力は

F =(Gm 1 m 2)/ r 2

どこ

  • Gは重力定数です:6.674×10 -11 N・(m / kg)2
  • m 1は最初のオブジェクトの質量です
  • m 2は2番目のオブジェクトの質量
  • rは、重心間の距離です。

チャレンジ

2つの単語間のプルをシミュレートする必要があります。各小文字には、アルファベットの位置によって与えられる質量があります。大文字には小文字の2倍の質量があります!いくつかのスペースで区切られた2つの単語と、正の整数の秒数sを含む文字列が与えられます。s秒後に文字列がどのように見えるかを出力します。

情報

  • 単語は抽象的であるため、単位と定数の異なるセットがあります
    • 質量:WMU(Word Mass Unit)-文字「a」の質量に等しい。
    • 距離:em、1文字の長さ。
    • フォース: N W(ワードニュートン)= WMU・em / s 2
    • 重力定数:G = 1 N w・(em / WMU)2
  • 最初の文字は、x軸の位置0に対応します。
  • すべての計算は可能な限り正確に行う必要があり、最後にのみ最も近いemに丸めます。
  • 微積分を使用する必要はありません。Fを毎秒再計算し、新しい加速度を速度に自動的に適用し、1秒後に位置に速度を適用する必要があります(例を参照)。
  • 2つの単語が互いに衝突すると(など catdog )、それ以上移動しません。

重心

単語の重心は次の式で見つけることができます:

ここに画像の説明を入力してください

ここで、Mは単語の総質量、m iは文字の質量、r iは文字の位置です。

例:

(注:この例では表示されていませんが、大文字には対応する小文字の2倍の質量があることに注意してください。)

入力: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. これで、2つの単語間の力を計算できます。

    • F = 24 * 26 /(10.11538から1.70833)2 = 8.82871 N W
  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. 次に、速度を位置に適用します。1秒後に、

    • 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 N W
    • 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

衝突の処理

新しい加速度は、毎秒速度にすぐに追加されることに注意してください。したがって、特定の時間に2つの単語が衝突する場合は、代数を使用して衝突点を見つけます。次の例をご覧ください。

  • ワード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 = floor(x col)-|| w 1 || +1
  • x 2 = floor(x col)+1

@FryAmTheEggman「情報」の最後の箇条書きでは、衝突について説明しています。1ステップでそれを行うことができますが、レイアウトされたルールに従うようにしてください。
-geokavel

言葉はお互いを通過するのでしょうか?
-xnor

@xnorいいえ、ありません。衝突の適切な処理に関する部分を追加しました。
-geokavel

ここに含まれる物理学を理解しようとしています。構成を検討しますxx a(単語xxとの間に1つのスペースa)。ニュートンの物理学では、a感じる力xは、2 emのx距離からの引き寄せと、3 emの距離からの引き寄せによるものです。これは、逆二乗の法則により、emのX距離2.5(つまり、の重心xx)から引き抜く単一の点質量の力とは
異なり

1
...そのため、明確にするために、各WORDを、そのすべての質量がその質量中心に集中している点質量であるかのように扱うことになっています。代わりに、そのレターをポイントマスとして扱った場合に質量になります」。これは正しいです?
-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を印刷して、より見やすくします)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.