Attrazione tra parole


11

La teoria della gravitazione di Newton afferma che la forza gravitazionale tra due masse di punti è

F = (Gm 1 m 2 ) / r 2

Dove

  • G è la costante gravitazionale: 6,674 × 10 −11 N · (m / kg) 2
  • m 1 è la massa del primo oggetto
  • m 2 è la massa del secondo oggetto
  • r è la distanza tra i loro centri di massa

Sfida

Devi simulare il tiro tra due parole. Ogni lettera minuscola ha la massa data dalla sua posizione nell'alfabeto. Le lettere maiuscole hanno il doppio della massa delle loro controparti minuscole! Ti verrà data una stringa contenente due parole separate da più spazi, nonché un numero intero positivo di secondi, s . Stampa come dovrebbe apparire la stringa dopo s secondi.

Informazioni

  • Poiché le parole sono astratte, hanno un insieme diverso di unità e costanti
    • Massa: WMU (Word Mass Unit) - uguale alla massa della lettera 'a'.
    • Distanza: em , la lunghezza di un personaggio.
    • Forza: N W (Word Newton) = WMU · em / s 2
    • Costante gravitazionale: G = 1 N w · (em / WMU) 2
  • Il primo carattere corrisponde alla posizione 0 sull'asse x.
  • Tutti i calcoli dovrebbero essere eseguiti con la massima precisione possibile, solo alla fine si arrotonda all'em più vicino.
  • Non è necessario utilizzare il calcolo, è sufficiente ricalcolare la F ogni secondo, applicare automaticamente la nuova accelerazione alla velocità e dopo un secondo applicare la velocità alla posizione (vedere esempio).
  • Una volta che due parole si scontrano (come catdog ), non si spostano più.

Centro di Massa

Il centro di massa di una parola può essere trovato con la formula:

inserisci qui la descrizione dell'immagine

Dove M è la massa totale della parola, m i è la massa di una lettera, e r i è la posizione della lettera.

Esempio:

(Nota: sebbene questo esempio non lo mostri, ricorda che le lettere maiuscole hanno il doppio della massa delle loro controparti minuscole.)

Ingresso:, cat dog2

  1. Innanzitutto quali sono le posizioni di ogni parola? "cat" inizia nella posizione 0 e "dog" inizia nella posizione 9, quindi

    • x c = 0 e x d = 9
  2. Quindi, troviamo il centro di massa di "gatto".

    • Ha una massa di 24 WMU (3 + 1 + 20).
    • R c = 1/24 (3 * 0 + 1 * 1 + 20 * 2) = 41/24 = 1.70833 em
    • Quindi non sorprende che il centro di massa sia molto vicino alla lettera 't'.
  3. Ora prendiamo il centro di massa di "cane"

    • R d = 1/26 (4 * 9 + 15 * 10 + 7 * 11) = 263/26 = 10.11538 em
    • Quindi il centro di massa per il cane è vicino alla lettera 'o', leggermente verso 'g'.
  4. Ora possiamo calcolare la forza tra le due parole.

    • F = 24 * 26 / (10.11538-1.70833) 2 = 8.82871 N p
  5. Ora dobbiamo applicare questa forza ad entrambe le parole e ottenere le loro accelerazioni

    • a c = 8.82871 / 24 = .36786 em / s 2
    • a d = -8.82871 / 26 = -.33957 em / s 2
  6. Seguendo le regole sopra, applichiamo l'accelerazione alla velocità, quindi

    • v c = .36786 em / s
    • v d = -.33957 em / s
  7. Quindi applichiamo la velocità alla posizione, quindi dopo un secondo,

    • 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. Ora ripetiamo la procedura ancora una volta con le nuove posizioni:

    • F = 24 * 26 / ((9.77581) - (2.07619)) 2 = 10.52558 N p
    • 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. Quindi finiamo con "cat" in x = 1.17429 e "dog" in x = 7.91603.

    • Arrotondiamo quelli al numero intero più vicino in modo che "cat" vada in posizione 1 e "dog" vada in posizione 8, quindi l'output è cat dog

Gestione delle collisioni

Ricorda che la nuova accelerazione viene immediatamente aggiunta alla velocità ogni secondo. Pertanto, se due parole si scontrano in un determinato momento, utilizzare l'algebra per trovare il punto di collisione. Prendi questo esempio:

  • la parola 1 è lunga 4 lettere (|| w 1 || = 4)
  • la parola 2 è lunga 4 lettere (|| w 2 || = 4)
  • x 1 = 3, x 2 = 8
  • v 1 = 2, v 2 = -6

    Risolvi 3 + (4-1) + 2t = 8 - 6t. t = .25s. La posizione della collisione è x col = 6.5. Pertanto, la collisione dovrebbe apparire tra x = 6 e x = 7, in quanto tale

    ####@@@@ .

La formula esplicita per le posizioni delle parole dopo una collisione è

  • x 1 = piano (x col ) - || w 1 || +1
  • x 2 = piano (x col ) +1

@FryAmTheEggman L'ultimo punto in "info" parla della collisione. Puoi farlo in un solo passaggio, ma assicurati di seguire le regole stabilite.
geokavel,

Le parole potrebbero attraversarsi?
xnor

@xnor No, non lo faranno. Ho aggiunto una parte sulla gestione corretta delle collisioni.
geokavel,

Sto cercando di capire la fisica coinvolta qui. Considera la configurazione xx a(uno spazio tra le parole xxe a). Nella fisica newtoniana, la forza che si asente sarebbe dovuta al xtiro più vicino da una distanza di due em, e l'altro che xtira da una distanza di tre em, sì? Non è la stessa forza di un singolo punto-massa che Xtira da una distanza di 2.5em (cioè il centro di massa del xx), a causa della legge del quadrato inverso ...
Mathmandan,

1
... quindi solo per chiarire, dovrei trattare ogni WORD come se fosse una massa puntuale con tutta la sua massa concentrata al suo centro di massa, dove per "il suo centro di massa" intendiamo "dove il suo centro di massa sarebbe se invece trattassimo le sue LETTERE come masse puntiformi ". È corretto?
Mathmandan,

Risposte:


3

Python 3, 556 byte

Grazie a FryAmTheEggman e Sherlock9 per alcuni 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)accetta la stringa ( w) e il tempo ( t) e restituisce il risultato. Le altre funzioni sono di aiuto.

Provalo online (stampa *s invece di spazi in modo che sia più visibile)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.