tuo zio aiuta bisogni ubriachi


10

Drunk Uncle (mi dispiace ME e AUS per il blocco della regione) è un personaggio immaginario di Saturday Night Live. Confonde spesso parole per gli altri che suonano come loro. Per questa sfida devi convertire i normali discorsi in drunkspeak.

Algoritmo

La traduzione in drunkspeak richiede lo scambio dell'ordine delle parole nel testo. Lo scambio si basa sulla somiglianza dell'ubriachezza di due parole. La somiglianza con l'ubriachezza è definita come il numero di lettere che due parole hanno negli stessi indici . Tuttavia, due parole identiche hanno una somiglianza di ubriachezza di -1 . Ad esempio, treee friendhanno una somiglianza di ubriachezza di 2, perché entrambi hanno una 'r' all'indice 1 e una 'e' all'indice 3.

Tutto quello che devi fare è trovare le due parole nel testo con la più alta somiglianza di ubriachezza, quindi scambiarle. Dopo aver scambiato due termini, questi non si spostano più. Quindi guardi i rimanenti termini scambiabili e scambia i due che hanno la somiglianza di ubriachezza più alta. Continui a farlo fino a quando non puoi più scambiare. Quindi si genera (o si restituisce, per una funzione) il testo aggiornato.

specifiche

  • Per semplicità, l'input è un elenco di parole composto da caratteri in [A-Za-z]
  • Ogni input contiene almeno una parola
  • La corrispondenza delle lettere non fa distinzione tra maiuscole e minuscole: Acorrisponde a a( Nota: a causa di questa regola Doge dogsono identici e quindi hanno un DS di -1)
  • Se più coppie hanno la somiglianza di ubriachezza più alta:
    1. Delle parole, che possono massimizzare la somiglianza dell'ubriachezza, scegli quella con l'indice più basso nell'elenco
    2. Associa quella parola alla parola con l'indice più basso che massimizza la somiglianza dell'ubriachezza

Esempi

  1. Drunk Uncle needs your help (titolo)

    • S 1 : Ubriaco <=> tuo (DS: 1)your Uncle needs Drunk help
    • S 2 : necessita di <=> aiuto (DS: 1)your Uncle help Drunk needs
    • Produzione: your Uncle help Drunk needs
  2. I love fidget spinners (esempio noioso)

    • S 1 : I <=> love (DS: 0)love I fidget spinners
    • S 2 : fidget <=> spinner (DS: 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : mangia <=> orecchio (DS: 2)dog ear dog eat
    • S 2 : cane <=> cane (DS: -1) dog ear dog eat(questo passaggio è solo formalità)
  4. Let me tell you a story

    • S 1 : Lasciami <=> me (DS: 1)me Let tell you a story
    • S 2 : dì <=> tu (DS: 0)me Let you tell a story
    • S 3 : una <=> storia (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : viola <=> persone (DS: 4)Too many money and people purple
    • S 2 : molti <=> soldi (DS: 2)Too money many and people purple
    • S 3 : Troppo <=> e (DS: 0)and money many Too people purple

Fammi sapere se ci sono altri esempi che vuoi che io copra.


8
per favore cambia 'I love fid-get spinners' in 'Odio fid-get spinners'
Okx,

1
"linguaggio naturale"
HyperNeutrino,

Risposte:


3

JavaScript - 286 279 byte

f=(a,n=(a=a.split` `).length)=>{for(d=n>>1;w=-2,d--;){for(i=n;i--;)for(j=n;j--;)s=((a,f,v=0)=>{for(u=s=a!=f;(r=a[v])&&(t=f[v++]);s+=(p=a=>a.toLowerCase())(r)==p(t));return u*s-1})(a[i],a[j]),!(f[i]|f[j])&&s>=w&&(w=s,x=i,y=j);f[x]=f[y]=1,[a[x],a[y]]=[a[y],a[x]];}return a.join` `}

Puoi provarlo su JSFiddle .


Benvenuto (di nuovo) su PPCG :) Bella prima presentazione!
HyperNeutrino,

2

Python 3, 285 277 270 267 byte, non funzionante

i=input().split();r=range;l=len;t=y=z=-1;n=str.lower
for p in r(l(i)):
 for q in r(p):
  b=min(l(i[p]),l(i[q]));x=0
  for s in r(b):
   if n(i[p][s])==n(i[q][s]):
    x=x+1
  if n(i[p])==n(i[q]):
   x=-1
  if x>t:
   t=x;y=p;z=q
i[y],i[z]=i[z],i[y]
print(" ".join(i))

Ho cercato di far sì che l'output corrispondesse alla sfida, non ai casi di test, poiché un paio di casi di test contraddicono la sfida.

Modifica: golfato il cosa "inferiore".

Modifica: cambiato split ("") in split ()

Modifica: mi sono reso conto che questo in realtà non completa tutte le cose, e mentre potrei trovare una risposta completa, nel frattempo potrei anche aggiungere che questo completa solo una iterazione.


1
È necessario definire uno g = str.lowero g = lambda s: s.lower()che è possibile utilizzare in questo modo .
ბიმო

@Bruce Forte Grazie! Questo si è sbarazzato di 8 byte. (È sceso a 270 solo perché ho dovuto anche sistemare una cosa per farlo in modo da scambiare le parole anche se la somiglianza più alta fosse 0; questo ha aggiunto un byte).
Innocuo

1
Nessun problema e benvenuto in PPCG! Se non l'hai già visto, questo tipo di post è molto utile. Btw .split(' ')può essere sostituito da .split().
ბიმო

Aspetta, quali casi di test hai cambiato e cosa c'era di sbagliato in loro?
geokavel,

Non ho abbastanza rappresentante per cambiare un post, ma l'apparente contraddizione era per il primo esempio: la risposta data per "lo zio ubriaco ha bisogno del tuo aiuto" era "lo zio ha bisogno dell'ubriacatura ha bisogno" rispetto a "lo zio ha bisogno dell'aiuto ubriaco". Entrambe queste risposte hanno scambiato le parole con lo stesso punteggio di somiglianza ed entrambe seguono il tuo pareggio dato usando il primo della coppia per decidere quale scambiare, nel senso che entrambi iniziano con la prima parola. (Mi rendo conto ora mentre scrivo che la contraddizione non è proprio quella, ma più un'ambiguità). Il modo dato per decidere - a corto di caratteri vedi dopo
Innocuo
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.