Khi làm việc trên Polyglot Non-Palindromic Polygle , tôi thấy khá tẻ nhạt khi đóng gói mã hiệu quả nhất có thể lên bảng Boggle, thậm chí chỉ có hai chuỗi. Nhưng chúng ta là lập trình viên, phải không? Chúng tôi biết làm thế nào để tự động hóa mọi thứ.
Đưa ra một danh sách các chuỗi, bạn sẽ tạo một bảng Boggle mà trên đó mỗi chuỗi đó có thể được tìm thấy (độc lập với các chuỗi khác). Thách thức là làm cho bảng Boggle càng nhỏ càng tốt. Vì đây là (hy vọng) là một nhiệm vụ khá khó khăn, đây là một thách thức về mã : không có yêu cầu về sự tối ưu - thách thức là phải làm nó tốt nhất có thể.
Quy tắc
- Bảng Boggle sẽ có hình chữ nhật và chỉ chứa các chữ cái viết hoa. Do đó, các chuỗi đầu vào cũng sẽ chỉ chứa các chữ cái viết hoa.
- Các quy tắc Boggle thông thường được áp dụng: một chuỗi là một phần của bảng nếu, bắt đầu từ bất cứ đâu, bạn có thể tìm thấy chuỗi bằng cách liên tục di chuyển đến các ký tự liền kề (theo chiều ngang, chiều dọc hoặc đường chéo). Để tạo thành một chuỗi, bạn không thể sử dụng bất kỳ ô nào của bảng nhiều lần. Tuy nhiên, các ký tự có thể được sử dụng lại giữa các chuỗi khác nhau.
- Bạn đã có 30 phút để xử lý dữ liệu thử nghiệm và mã của bạn không được sử dụng quá 4 GB bộ nhớ. Tôi sẽ đưa ra một chút chậm trễ về giới hạn bộ nhớ, nhưng nếu chương trình của bạn liên tục sử dụng hơn 4 GB hoặc tăng đột biến trên nó, tôi sẽ (tạm thời) loại bỏ nó.
- Tôi sẽ kiểm tra tất cả các lần gửi trên máy của mình, máy đang chạy Windows 8. Tôi có Ubuntu VM, nhưng nếu tôi phải kiểm tra thì bạn sẽ không thể sử dụng 30 phút như vậy. Vui lòng bao gồm một liên kết đến một trình thông dịch / trình biên dịch miễn phí cho ngôn ngữ bạn đã chọn, cũng như các hướng dẫn về cách biên dịch / chạy mã của bạn.
- Điểm của bạn sẽ là kích thước của bảng Boggle cho dữ liệu kiểm tra bên dưới (không tính các dòng mới). Trong trường hợp hòa (ví dụ vì nhiều người quản lý để tạo ra một giải pháp tối ưu), người chiến thắng sẽ là người đệ trình tạo ra giải pháp tối ưu này nhanh hơn.
- Bạn không được tối ưu hóa mã của mình cụ thể đối với dữ liệu thử nghiệm. Nếu tôi nghi ngờ bất cứ ai làm như vậy, tôi có quyền tạo dữ liệu thử nghiệm mới.
Thí dụ
Cho các chuỗi
FOO
BAR
BOOM
Một lần tầm thường có thể đặt chúng vào một bảng Boggle 4x3:
FOOX
BARX
BOOM
Bằng cách sử dụng thực tế là các chuỗi không phải thẳng, chúng ta có thể nén nó thành 5x2:
BORFO
OMABO
Nhưng chúng ta có thể làm cho nó nhỏ hơn nữa bằng cách sử dụng lại các ký tự giữa các chuỗi khác nhau và khớp với các chuỗi trong 4x2:
FOOM
BARX
Bây giờ B
được sử dụng cho cả hai BOOM
và BAR
, và OO
được sử dụng cho cả hai BOOM
và FOO
.
Kiểm tra dữ liệu
Trình của bạn sẽ được kiểm tra trên 50 chuỗi sau đây. Đối với mục đích thử nghiệm, bạn chỉ cần sử dụng các tập hợp con nhỏ hơn của dữ liệu này để chạy nhanh hơn. Tôi tin rằng giới hạn dưới tuyệt đối cho dữ liệu thử nghiệm này là một bảng có 120 ký tự, mặc dù điều này không nhất thiết có thể đạt được.
T
WP
GVI
CIHM
EGWIV
QUTYFZ
LWJVPNG
XJMJQWSW
JLPNHFDUW
SWMHBBZWUG
XVDBMDQWDEV
TIUGAVZVUECC
IWDICFWBPSPQR
MMNWFBGMEXMSPY
YIHYXGJXKOUOIZA
BZSANEJNJWWNUJLJ
XTRMGOVPHVZYLLKKG
FLXFVVHNTWLMRRQYFQ
VZKJRAFQIYSBSXORTSH
FNQDIGCPALCHVLHDNZAV
GEAZYFSBSWCETXFKMSWLG
KWIZCEHVBDHEBGDGCJHOID
SKMQPHJAPDQKKHGTIPJCLMH
ZSFQDNYHALSUVWESQVVEUIQC
HXHBESUFCCECHNSTQGDUZPQRB
DSLXVHMOMLUXVHCNOJCBBRPVYB
DVTXKAOYYYRBVAVPSUAOYHIPPWN
PJAIYAWHMTNHTQDZDERPZYQEMLBZ
SYNSHJNOIWESMKWTBIANYUAUNRZOS
WADGUKIHUUFVRVUIBFUXQIOLAWIXAU
LGLXUFIXBEPSOFCKIAHXSHVKZPCXVPI
LIUYFHITTUYKDVQOZPNGZLWOZSRJTCTZ
IZDFTFFPNEBIYGVNTZHINICBXBXLBNBAL
BSKQNTPVUAVBXZGHVZCOUCRGCYISGFGYAS
DPGYYCIKDGCETXQOZGEQQLFQWACMVDTRYAT
RQDNIPGUHRYDRVHIPJLOWKBXMIBFAWCJGFMC
PFKOAGEQLXCMISSVEARWAPVYMRDCLSLPJOMQQ
EQPCNHQPTWABPFBVBXHQTFYELPNMNCWVKDDKGR
RAHTJMGIQJOJVWJBIHVRLJYVCSQJCKMEZRGRJMU
SZBJBPQYVYKDHAJHZMHBEWQEAQQKIEYCFACNLJBC
ANVDUCVXBPIZVRAXEBFEJOHSYKEKBIJELPIWEYXKH
DJUNPRLTISBFMGBEQNXSNUSOGDJNKESVKGAAMTIVXK
TZPUHDSHZFEURBNZTFBKXCDPYRELIAFMUWDIQTYWXGU
FJIKJROQSFSZUCGOOFJIEHBZREEUUSZWOLYFPCYHUSMR
TPMHJEAWVAJOCSDOPMQMHKRESBQSTRBXESYGCDVKLFOVS
ABJCCDJYMYDCYPZSGPGIAIKZQBYTZFDWYUZQBOESDSDGOY
IIHKTVPJNJDBCBOHCIYOPBKOVVKGNAKBDKEEKYIPRPHZOMF
IABGEPCSPNSMLVJBSGLRYNFSSYIALHWWAINTAVZAGJRVMDPW
GFMFVEFYJQJASVRIBLULUEHPMZPEXJMHIEMGJRMBLQLBDGTWT
YPWHLCVHQAVKVGHMLSOMPRERNHVYBECGCUUWTXNQBBTCMVTOVA
Trình xác minh
Bạn có thể sử dụng Đoạn mã sau đây để xác minh xem bảng Boggle có chứa tất cả các chuỗi trong danh sách đã cho hay không. Tôi đã chuyển mã tìm kiếm Boggle từ câu trả lời của edc65 ở đây . Hãy cho tôi biết nếu bất cứ điều gì có vẻ lỗi.