Giải quyết đảo chữ


9

Xem thêm: Granma yêu Ana

Bạn sẽ được cung cấp một chuỗi các chữ cái ASCII viết thường. Sử dụng tệp từ điển này (CẬP NHẬT), nhiệm vụ của bạn là giải quyết đảo chữ. Để giải quyết đảo chữ, bạn phải xuất tất cả các từ hoặc nhóm từ có thể được tạo bằng cách sử dụng mỗi chữ cái từ chuỗi đầu vào chính xác một lần, cách nhau bởi dòng mới. Các nhóm của cùng một từ theo thứ tự khác nhau không phải là duy nhất và không nên được xuất riêng; tuy nhiên, thứ tự của các từ không quan trọng . Thứ tự của các giải pháp đầu ra cũng không thành vấn đề . Nếu đầu vào không thể tạo thành một từ, đầu ra không có gì.

Một số trường hợp kiểm tra hữu ích:

Input:  viinlg
Output: living

Input:  fceodglo
Output: code golf

Input:  flogflog
Output: golf golf

Input:  ahwhygi
Output: highway
        high way

Input:  bbbbbb
Output: 

Quy tắc / hãy cẩn thận:

  • Bạn có thể truy cập danh sách từ điển bất kỳ cách nào bạn muốn. Đối số dòng lệnh, stdin, đọc từ tệp hoặc đọc từ internet đều được chấp nhận.

  • Đầu vào sẽ chỉ bao gồm các chữ cái ASCII viết thường. Bạn không cần phải xuất kết quả trong mọi trường hợp cụ thể.

  • Bạn sẽ không được cung cấp một chuỗi đã tạo thành một từ hợp lệ (tuy nhiên, bạn có thể được cung cấp một chuỗi tạo thành nhiều từ, chẳng hạn như bluehouse).

  • Trailing newlines được phép nhưng không bắt buộc.

  • Tiêu chuẩn áp dụng.

Đây là . Mã ngắn nhất trong byte thắng. Chúc may mắn!



Chúng ta có nên sử dụng 1 khoảng trắng để phân tách các bộ từ hoặc bất kỳ phân tách không chữ nào không?
Erik the Outgolfer

@EriktheOutgolfer Để tách các nhóm từ, bất kỳ dấu tách nào cũng được; tuy nhiên bạn vẫn nên tách các từ trong một giải pháp duy nhất với một khoảng trắng.
phân tán

@Christian Rules nói rằng bạn phải tách các bộ từ với dòng mới.
Erik the Outgolfer

@EriktheOutgolfer Vậy tại sao bạn lại hỏi "Chúng ta có nên sử dụng 1 khoảng trắng để phân tách các từ" không? Câu hỏi của bạn làm tôi bối rối, và không có lý do gì để thích bất cứ điều gì hơn các dòng mới để phân tách các bộ. Tôi muốn nói dính vào thông số kỹ thuật.
phân tán

Câu trả lời:


2

Python 2 , 341 327 337 320 byte

Giải pháp này giả định từ điển được lưu trữ trong một biến wdưới dạng một chuỗi. Bộ đầu tiên combinationskhông cần sử dụng combinations_with_replacement, nhưng sử dụng bộ sau sẽ tiết kiệm byte.

from itertools import*
d,o,j,c={},sorted,''.join,combinations_with_replacement
s,w=o(raw_input()),input()
l=len(s)
r=range(l)
for x in w:d.setdefault(j(o(x)),[]).append(x)
b=set(chain(*[d[j(x)]for y in r for x in c(s,y+1)if j(x) in d]))
print'\n'.join(' '.join(x)for y in r for x in c(b,y+1)if(len(j(x)),o(j(x)))==(l,s))

Hãy thử trực tuyến!

Đầu vào - Từ đảo chữ theo sau là từ điển các từ dưới dạng tập hợp:

anagram_word
{'entry1', 'entry2', ...., 'entryN'}

Chỉnh sửa: Cập nhật đầu vào.


1

Python 3 , 248 202 byte

from itertools import*
A=set()
def f(s,*G,i=1,A=A):
 if' '>s:A|={' '.join(sorted(G))}
 for _ in s:s[:i]in S and f(s[i:],s[:i],*G);i+=1
I,*S=iter(input,'')
for p in permutations(I):f(''.join(p))
print(A)

Hãy thử trực tuyến!

Đầu vào như sau:

word_input
dic_entry_1
dic_entry_2
....
dic_entry_N
                 # <<< empty line + \n

Tăng tốc nó lên:

Đối với mục đích thử nghiệm, nếu bạn thay đổi từ I,*S=iter(input,'')sang I=input();S=set(iter(input,'')), thời gian chạy sẽ bị giảm mạnh và đầu ra sẽ giống nhau.

Giải trình:

Trong mọi hoán vị của đầu vào, nó cố gắng phân chia đệ quy hoán vị ở tất cả các vị trí có thể, bắt đầu từ trái sang phải, không bỏ qua các chữ cái, với các từ có trong từ điển. Nếu một kết hợp phân tách khớp với tất cả các hoán vị đầu vào, các từ phân tách được sắp xếp và thêm vào một từ setsẽ được in tại và của đánh giá.


1

Javascript, 139 137 129 byte

-2 byte nhờ vào @FelipeNardiBatista

-8 Byte nhờ đọc tài liệu;)

k=>w=>{t=w;return k.reduce((a,v)=>{r=([...v].every(c=>w.includes(c)&&((w=w.replace(c,""))||!0)))?a.concat(v):a;w=t;return r},[])}

Lấy trong từ điển làm đầu vào dưới dạng một chuỗi các chuỗi.

var arr = ["living", "code", "golf", "highway", "high", "way"];

var _=
k=>w=>{t=w;return k.reduce((a,v)=>{r=([...v].every(c=>w.includes(c)&&((w=w.replace(c,""))||!0)))?a.concat(v):a;w=t;return r},[])};

console.log(_(arr)("viinlg"));
console.log(_(arr)("fceodglo"));

Giải trình:

Đối với mỗi từ trong từ điển, hãy kiểm tra xem mỗi chữ cái có trong từ đã chọn hay không, đồng thời xóa từ đó khỏi từ. Vào cuối mỗi mục từ điển, khôi phục từ đó về trạng thái không thay đổi để kiểm tra các kết quả khớp tiếp theo.


@FelipeNardiBatista Bạn nói đúng, tôi đã quên chơi cái tên đó. Cảm ơn :)
Hankrecords
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.