Ketertarikan Antara Kata

11

Teori gravitasi Newton mengatakan bahwa gaya gravitasi antara dua titik massa adalah

F = (Gm 1 m 2 ) / r 2

Dimana

  • G adalah konstanta gravitasi: 6.674 × 10 −11 N · (m / kg) 2
  • m 1 adalah massa benda pertama
  • m 2 adalah massa benda kedua
  • r adalah jarak antara pusat massa mereka

Tantangan

Anda perlu mensimulasikan tarikan antara dua kata. Setiap huruf kecil memiliki massa yang diberikan oleh posisinya dalam alfabet. Huruf kapital memiliki massa dua kali lipat dari rekan kecil mereka! Anda akan diberi string berisi dua kata yang dipisahkan oleh beberapa spasi, serta bilangan bulat positif detik, s . Output apa string akan terlihat seperti setelah s detik.

Info

  • Karena kata-kata itu abstrak, mereka memiliki satuan unit dan konstanta yang berbeda
    • Massa: WMU (Word Mass Unit) - sama dengan massa huruf 'a'.
    • Jarak: em , panjang satu karakter.
    • Angkatan: N W (Word Newton) = WMU · em / s 2
    • Konstanta Gravitasi: G = 1 N w · (em / WMU) 2
  • Karakter pertama sesuai dengan posisi 0 pada sumbu x.
  • Semua perhitungan harus dilakukan dengan setepat mungkin, hanya pada akhirnya Anda membulatkan ke mereka terdekat.
  • Anda tidak perlu menggunakan kalkulus, Anda hanya perlu menghitung ulang F setiap detik, secara otomatis menerapkan akselerasi baru ke kecepatan, dan setelah sedetik menerapkan kecepatan ke posisi (lihat contoh).
  • Setelah dua kata saling bertabrakan (seperti catdog ), mereka tidak bergerak lebih jauh.

Pusat massa

The pusat massa dari sebuah kata dapat ditemukan dengan rumus:

masukkan deskripsi gambar di sini

Di mana M adalah total massa kata, m i adalah massa huruf, dan r i adalah posisi huruf.

Contoh:

(Catatan: Meskipun contoh ini tidak menunjukkannya, ingatlah bahwa huruf kapital memiliki massa dua kali lipat dari rekan-rekan huruf kecil mereka.)

Input:, cat dog2

  1. Pertama, apa posisi masing-masing kata? "kucing" mulai dari posisi 0 dan "anjing" mulai dari posisi 9, jadi

    • x c = 0 dan x d = 9
  2. Selanjutnya, mari kita cari pusat massa "kucing".

    • Ini memiliki massa 24 WMU (3 + 1 + 20).
    • R c = 1/24 (3 * 0 + 1 * 1 + 20 * 2) = 41/24 = 1.70833 em
    • Jadi tidak mengherankan pusat massa sangat dekat dengan huruf 't'.
  3. Sekarang mari kita dapatkan pusat massa "anjing"

    • R d = 1/26 (4 * 9 + 15 * 10 + 7 * 11) = 263/26 = 10.11538 em
    • Jadi pusat massa untuk anjing dekat dengan huruf 'o', sedikit ke arah 'g'.
  4. Sekarang kita dapat menghitung gaya antara dua kata.

    • F = 24 * 26 / (10.11538-1.70833) 2 = 8.82871 N w
  5. Sekarang kita perlu menerapkan kekuatan ini pada kedua kata dan mendapatkan akselerasi mereka

    • a c = 8.82871 / 24 = .36786 em / s 2
    • a d = -8.82871 / 26 = -.33957 em / s 2
  6. Mengikuti aturan di atas, kami menerapkan akselerasi ke kecepatan, jadi

    • v c = .36786 em / s
    • v d = -.33957 em / s
  7. Lalu kami menerapkan kecepatan ke posisi, jadi setelah satu detik,

    • 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. Sekarang kami ulangi prosedur sekali lagi dengan posisi baru:

    • 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. Jadi kita berakhir dengan "cat" di x = 1.17429 dan "dog" di x = 7.91603.

    • Kami membulatkannya ke bilangan bulat terdekat sehingga "kucing" pergi ke posisi 1 dan "anjing" pergi ke posisi 8, sehingga hasilnya adalah cat dog

Menangani Tabrakan

Ingat bahwa akselerasi baru segera ditambahkan ke kecepatan setiap detik. Karena itu, jika dua kata bertabrakan pada waktu tertentu, gunakan aljabar untuk menemukan titik tumbukan. Ambil contoh ini:

  • kata 1 panjangnya 4 huruf (|| w 1 || = 4)
  • kata 2 panjangnya 4 huruf (|| w 2 || = 4)
  • x 1 = 3, x 2 = 8
  • v 1 = 2, v 2 = -6

    Pecahkan 3 + (4-1) + 2t = 8 - 6t. t = .25s. Posisi tumbukan adalah x col = 6.5. Karenanya, tabrakan akan muncul antara x = 6 dan x = 7

    ####@@@@ .

Rumus eksplisit untuk posisi kata-kata setelah tabrakan adalah

  • x 1 = lantai (x col ) - || w 1 || +1
  • x 2 = lantai (x col ) +1
geokavel
sumber
@FryAmTheEggman Poin terakhir dalam "info" berbicara tentang tabrakan. Anda dapat melakukannya dalam satu langkah tetapi pastikan untuk mengikuti aturan yang ditetapkan.
geokavel
Mungkinkah kata-kata saling melewati?
xnor
@xnor Tidak, mereka tidak akan. Saya menambahkan bagian tentang penanganan tabrakan dengan benar.
geokavel
Saya mencoba memahami fisika yang terlibat di sini. Pertimbangkan konfigurasi xx a(satu ruang antara kata xxdan a). Dalam fisika Newton, gaya yang aterasa akan disebabkan oleh xtarikan yang lebih dekat dari jarak dua em, dan yang lain xmenarik dari jarak tiga em, ya? Itu tidak sama dengan kekuatan satu titik-massa yang Xmenarik dari jarak 2.5em (yaitu, pusat massa xx), karena hukum kuadrat-terbalik ...
mathmandan
1
... jadi hanya untuk memperjelas, saya seharusnya memperlakukan setiap KATA seolah-olah itu adalah titik-massa dengan semua massanya terkonsentrasi di pusat massanya, di mana dengan "pusat massanya" maksud kami "di mana pusatnya dari massa akan menjadi jika kita sebaliknya memperlakukan SURAT sebagai titik-massa ". Apakah ini benar?
mathmandan

Jawaban:

3

Python 3, 556 byte

Terima kasih kepada FryAmTheEggman dan Sherlock9 untuk beberapa byte

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)mengambil string ( w) dan waktu ( t), dan mengembalikan hasilnya. Fungsi lainnya adalah pembantu.

Coba online (cetak *bukan spasi sehingga lebih terlihat)

Mego
sumber