Dường như có một cơn sốt liên tục về những người tẻ nhạt học cách bố trí bàn phím mới như Dvorak hoặc Neo vì nó được cho là làm cho chúng hiệu quả hơn. Tôi cho rằng việc chuyển đổi bố cục bàn phím là một ý tưởng tồi, bởi vì bạn có thể mất nhiều tháng để tăng tốc và khi bạn nhanh hơn 5% so với phần còn lại, bạn sẽ bị rối nếu bạn cần gõ trên máy tính không của riêng bạn
Ngoài ra, tất cả những người này quên nơi tắc nghẽn thực sự trong giao tiếp hiện đại - bàn phím điện thoại.
Đây là cách bàn phím điện thoại trung bình của bạn trông như thế nào:
Chữ 'r' là chữ cái thứ ba trên nút 7; vì vậy, nếu bạn nhập chữ 'r' trên điện thoại di động, bạn sẽ nhấn nút 7 ba lần, vì 'bạn' bạn nhấn nó 4 lần và cho 'a' bạn nhấn nút 2 một lần.
Xem xét điều này, đặt 'e' sau 'd' có lẽ là một quyết định tồi - 'e' là chữ cái được sử dụng phổ biến nhất trong bảng chữ cái tiếng Anh, vì vậy, nếu bạn đặt nhãn 3 "EDF" thay vì "DEF", bạn sẽ tiết kiệm khá nhiều tổ hợp phím.
Hơn nữa, có lẽ bạn đã từng trải qua việc gõ 2 chữ cái có chung nút là một điều phiền toái - nếu bạn muốn viết "TU", bạn không thể nhấn 8 ba lần, vì điều đó sẽ dẫn đến 'V'. Vì vậy, thông thường bạn sẽ viết 'T', sau đó nhấn phím cách, sau đó nhấn backspace và sau đó viết 'U', bằng 5 lần nhấn nút thay vì 3.
TL; DR
Đưa ra hai quy tắc sau:
- Một chữ cái được gõ bằng cách nhấn nút n lần, trong đó n là vị trí của chữ cái trên nhãn của nút
- Viết hai chữ cái được gõ bằng cùng một nút yêu cầu thêm 2 lần nhấn nút
Cách bố trí bàn phím điện thoại yêu cầu số lần nhấn nút ít nhất, được cung cấp một văn bản cụ thể? Bạn chỉ nên sử dụng các nút 2-9, 1 và 0 được dành riêng cho các ký hiệu đặc biệt.
Đầu vào
Văn bản mà bạn nên tìm bố cục tối ưu được cung cấp qua stdin. Bạn không cần phải xử lý bất cứ điều gì khác ngoài bảng chữ cái chữ thường và có thể cho rằng đầu vào chỉ bao gồm điều đó. Bạn cũng có thể giả định rằng văn bản đầu vào lớn một cách hợp lý và mỗi chữ cái đều ở đó ít nhất một lần, nếu điều đó có ích.
Đầu ra
Tôi không muốn đặt quá nhiều ràng buộc cho đầu ra, vì điều đó đôi khi mang lại một số lợi thế về ngôn ngữ so với các ngôn ngữ khác; do đó, tuy nhiên ngôn ngữ của bạn hiển thị các mảng là tốt, thay vào đó, bạn có thể tách riêng từng nhãn bằng một dòng mới.
Có thể có nhiều bố cục tối ưu có thể, bạn có thể in bất kỳ một trong số chúng. Đây là một ví dụ đơn giản:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Điểm thưởng
-35 nếu thuật toán của bạn không bắt buộc tất cả các bố cục có thể (Tôi đang xem 'hoán vị' của Haskell ở đây)
-3 nếu mã của bạn vừa với tin nhắn văn bản (140 ký tự) và bạn đăng một bức ảnh bạn gửi mã cho bạn bè.
Đây là thử thách đầu tiên của tôi trên StackExchange. Tôi rất vui khi biết bạn thích nó hay có bất kỳ phản hồi nào khác về nó!
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
các hoán vị duy nhất, chỉ tính các sắp xếp lại đơn giản của các phím một lần.