Bác của bạn giúp đỡ nhu cầu say rượu


10

Bác say rượu (xin lỗi ME và AUS cho khóa khu vực) là một nhân vật hư cấu từ Saturday Night Live. Anh ta thường nhầm lẫn những từ dành cho người khác nghe giống họ. Đối với thử thách này, bạn cần chuyển đổi lời nói bình thường thành say rượu.

Thuật toán

Dịch sang say rượu yêu cầu hoán đổi thứ tự các từ trong văn bản. Trao đổi dựa trên sự giống nhau của say rượu của hai từ. Độ tương tự say rượu được định nghĩa là số lượng chữ cái mà hai từ đã xảy ra tại cùng một chỉ số . Tuy nhiên, hai từ giống hệt nhau có độ tương tự say là -1 . Ví dụ: treefriendcó độ tương tự say rượu là 2, vì cả hai đều có 'r' ở chỉ số 1 và 'e' ở chỉ số 3.

Tất cả bạn phải làm là tìm hai từ trong văn bản có độ tương tự say cao nhất, sau đó trao đổi chúng. Khi bạn trao đổi hai điều khoản, chúng không di chuyển nữa. Sau đó, bạn nhìn vào các điều khoản có thể trao đổi còn lại và trao đổi hai điều có độ tương tự say cao nhất. Bạn tiếp tục làm điều này cho đến khi bạn không thể trao đổi thêm nữa. Sau đó, bạn xuất (hoặc trả lại, cho một chức năng) văn bản được cập nhật.

Cụ thể

  • Để đơn giản, đầu vào là danh sách các từ bao gồm các ký tự trong [A-Za-z]
  • Mỗi đầu vào chứa ít nhất một từ
  • Khớp chữ không phân biệt chữ hoa chữ thường: Akhớp với a( Lưu ý: Do quy tắc này Dogdoggiống hệt nhau, do đó có DS là -1)
  • Nếu nhiều cặp có độ tương tự say cao nhất:
    1. Trong số các từ, có thể tối đa hóa sự giống nhau của say rượu, hãy chọn một từ có chỉ số thấp nhất trong danh sách
    2. Ghép nối từ đó với từ có chỉ số thấp nhất tối đa hóa độ tương tự say rượu

Ví dụ

  1. Drunk Uncle needs your help (tiêu đề)

    • S 1 : Say rượu <=> của bạn (DS: 1)your Uncle needs Drunk help
    • S 2 : cần <=> trợ giúp (DS: 1)your Uncle help Drunk needs
    • Đầu ra: your Uncle help Drunk needs
  2. I love fidget spinners (ví dụ nhàm chán)

    • S 1 : Tôi <=> tình yêu (DS: 0)love I fidget spinners
    • S 2 : fidget <=> spinners (DS: 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : ăn <=> tai (DS: 2)dog ear dog eat
    • S 2 : dog <=> dog (DS: -1) dog ear dog eat(bước này chỉ là hình thức)
  4. Let me tell you a story

    • S 1 : Hãy <=> tôi (DS: 1)me Let tell you a story
    • S 2 : nói với <=> bạn (DS: 0)me Let you tell a story
    • S 3 : một câu chuyện <=> (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : màu tím <=> người (DS: 4)Too many money and people purple
    • S 2 : nhiều <=> tiền (DS: 2)Too money many and people purple
    • S 3 : Quá <=> và (DS: 0)and money many Too people purple

Hãy cho tôi biết nếu có nhiều ví dụ bạn muốn tôi đề cập.


8
vui lòng thay đổi 'i love fid-get spinners' thành 'i ghét fid-get spinners'
Okx 18/07/17

1
"ngôn ngữ tự nhiên"
HyperNeutrino

Câu trả lời:


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

Bạn có thể thử nó trên JSFiddle .


Chào mừng (một lần nữa) đến PPCG :) Lần gửi đầu tiên tốt đẹp!
HyperNeutrino

2

Con trăn 3 285 277 270 267 Byte, không hoạt động

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

Tôi đã cố gắng làm cho đầu ra khớp với thử thách, không phải các trường hợp thử nghiệm, vì một vài trường hợp thử nghiệm mâu thuẫn với thử thách.

Chỉnh sửa: đánh gôn 'hạ' điều.

Chỉnh sửa: đã thay đổi split ("") thành split ()

Chỉnh sửa: Tôi nhận ra rằng điều này không thực sự hoàn thành tất cả các điều, và trong khi tôi có thể đưa ra một câu trả lời đầy đủ, trong khi đó tôi cũng có thể nói thêm rằng điều này chỉ hoàn thành một lần lặp.


1
Bạn cần xác định một trong hai g = str.lowerhoặc g = lambda s: s.lower()sau đó bạn có thể sử dụng như thế này .
ბიმო

@Bruce Forte Cảm ơn! Điều này đã loại bỏ 8 byte. (Tuy nhiên, nó chỉ giảm xuống còn 270 vì tôi cũng phải sửa một thứ để làm cho nó có thể hoán đổi các từ ngay cả khi độ tương tự cao nhất là 0; điều này đã thêm một byte).
Vô hại

1
Không có vấn đề và chào mừng bạn đến với PPCG! Nếu bạn chưa thấy, những bài đăng này rất hữu ích. Btw .split(' ')có thể được thay thế bởi .split().
ბიმო

Đợi đã, trường hợp kiểm tra nào bạn đã thay đổi, và điều gì đã xảy ra với họ?
geokavel

Tôi không có đủ đại diện để thay đổi một bài đăng, nhưng mâu thuẫn rõ ràng là ví dụ đầu tiên - câu trả lời được đưa ra cho 'chú say rượu cần sự giúp đỡ của bạn' là 'chú bạn giúp đỡ say rượu' hơn 'chú bạn cần giúp đỡ say'. Cả hai câu trả lời này đều hoán đổi các từ có cùng số điểm giống nhau và cả hai đều theo dõi bộ ngắt kết nối đã cho của bạn bằng cách sử dụng từ đầu tiên của cặp để quyết định hoán đổi, theo nghĩa là cả hai đều bắt đầu bằng từ đầu tiên. (Bây giờ tôi nhận ra khi tôi viết điều này rằng mâu thuẫn không thực sự như vậy, nhưng nhiều hơn một sự mơ hồ). Cách đưa ra để quyết định - hết ký tự sẽ thấy tiếp theo
Vô hại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.