삼촌이 취한 필요를 도와주십시오


10

술에 취한 아저씨 (지역 잠금에 대한 미안 ME와 AUS)는 Saturday Night Live의 가상의 인물입니다. 그는 종종 다른 사람들의 말처럼 혼란스러워합니다. 이 문제를 해결하려면 보통 말을 술취한 말로 바꿔야합니다.

연산

drunkspeak로 번역하려면 텍스트에서 단어의 순서를 바꾸어야합니다. 스와핑은 두 단어 의 술 취함 유사성 을 기반으로합니다 . 술 취함 유사성은 두 단어가 같은 색인에서 나타나는 글자 수로 정의됩니다 . 그러나 두 개의 동일한 단어는 술 취함 유사성이 -1 입니다. 예를 들어, tree그리고 friend둘 인덱스 1에서 'R'을 가지고 있기 때문에, 2의 음주 유사성을 가지고, 및 'E'인덱스 3에서.

텍스트에서 두 가지 단어가 술 취함 유사성이 가장 높은 것을 찾은 다음 서로 바꾸면됩니다. 두 용어를 바꾸면 더 이상 움직이지 않습니다. 그런 다음 나머지 교환 가능한 용어를보고 술 취함 유사성이 가장 높은 두 용어를 교환합니다. 더 이상 교체 할 수 없을 때까지이 작업을 계속합니다. 그런 다음 업데이트 된 텍스트를 출력하거나 함수에 대해 반환합니다.

사양

  • 간단히하기 위해 입력은 [A-Za-z]의 문자로 구성된 단어 목록입니다.
  • 모든 입력은 적어도 하나의 단어를 포함
  • : 문자 일치하는 경우를 구분 A과 일치 a( 주의 : 이 규칙으로 인해 Dogdog동일하며, 따라서의 DS가 -1)
  • 여러 쌍이 술 취함 유사성이 가장 높은 경우 :
    1. 즉, 술 취함 유사성을 극대화 할 수있는 목록에서 가장 낮은 색인을 가진 것을 선택하십시오.
    2. 그 단어를 술 취함 유사성을 최대화하는 가장 낮은 인덱스 단어와 연결

  1. Drunk Uncle needs your help (표제)

    • S 1 : 음주 <=> 귀하의 (DS : 1)your Uncle needs Drunk help
    • S 2 : 도움 <=> 도움말 (DS : 1)your Uncle help Drunk needs
    • 산출: your Uncle help Drunk needs
  2. I love fidget spinners (지루한 예)

    • S 1 : I = 사랑 (DS : 0)love I fidget spinners
    • S 2 : fidget <=> 스피너 (DS : 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : 먹다가 귀 (DS : 2)dog ear dog eat
    • S 2 : 개 <=> 개 (DS : -1) dog ear dog eat(이 단계는 형식적임)
  4. Let me tell you a story

    • S 1 : 렛미 = (DS : 1)me Let tell you a story
    • S 2 : 말해 <=> 당신 (DS : 0)me Let you tell a story
    • S 3 : a <=> 이야기 (DS : 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : 자색 사람 (DS : 4)Too many money and people purple
    • S 2 : 많은 <=> 돈 (DS : 2)Too money many and people purple
    • S 3 : 너무 큼 및 (DS : 0)and money many Too people purple

더 자세히 설명해달라고 알려주십시오.


8
'나는 fid-get 스피너를 좋아한다'를 'i-fid-get 스피너를 싫어한다'로 변경하십시오
Okx

1
"자연어"
HyperNeutrino

답변:


3

자바 스크립트 -286 279 바이트

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` `}

JSFiddle에서 시도해 볼 수 있습니다 .


PPCG에 다시 오신 것을 환영합니다 :) 멋진 첫 번째 제출!
HyperNeutrino

2

파이썬 3, 285 277 270 작동하지 않는 267 바이트,

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))

몇 가지 테스트 사례가 도전과 모순되므로 출력이 테스트 사례가 아닌 도전과 일치하도록 노력했습니다.

편집 : '낮은'것을 골퍼.

편집 : split ( "")을 split ()으로 변경했습니다.

편집 : 나는 이것이 실제로 모든 것을 완료하지는 않는다는 것을 깨달았고 완전한 답변을 얻을 수는 있지만 그 동안 하나의 반복 만 완료한다고 덧붙일 수도 있습니다.


1
당신은 정의 중 하나가 필요 g = str.lower하거나 g = lambda s: s.lower()어떤 당신이 다음과 같이 사용할 수 있습니다 .
ბიმო

@Bruce Forte 감사합니다! 이것은 8 바이트를 제거했습니다. (하지만 가장 높은 유사성이 0 인 경우에도 단어를 바꿀 수 있도록 수정해야했기 때문에 270으로 줄어 들었습니다. 이는 바이트를 추가했습니다).
무해한

1
문제없고 PPCG에 오신 것을 환영합니다! 아직 보지 못했다면 이런 종류의 게시물이 매우 유용합니다. Btw .split(' ')는로 대체 할 수 있습니다 .split().
ბიმო에서

잠깐, 어떤 테스트 사례를 변경했으며 무엇이 잘못 되었습니까?
geokavel

나는 게시물을 바꿀 충분한 담당자가 없지만 첫 번째 예에 대한 명백한 모순이있었습니다. 이 두 대답은 모두 같은 유사점으로 단어를 교체했으며, 둘 다 첫 번째 단어로 시작한다는 의미에서 첫 번째 쌍을 사용하여 교환 할 대상을 결정함으로써 주어진 순위를 따릅니다. (이 글을 쓸 때 모순이 실제로는 아니라 모호함이라는 것을 알았습니다.) 숯불을 결정하는 주어진 방법은 다음을 참조하십시오
무해한
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.