Vì tôi không thể tập trung vào bất kỳ tác vụ nào trong hơn 5 giây, tôi thường thấy mình chia các từ thành một chuỗi con, mỗi chuỗi có độ dài khác nhau và không chứa bất kỳ ký tự lặp lại nào. Ví dụ: từ "pasta" có thể bị chia nhỏ trong "quá khứ" & "a", "pas" & "ta" hoặc "pa" & "sta" và bạn có được hình ảnh.
Tuy nhiên, vì việc nhớ tất cả các kết hợp là khó khăn, tôi thường chỉ chọn một kết hợp và tôi thích chọn kết hợp đẹp nhất. Chúng tôi xem xét cách tốt nhất để có "điểm" thấp nhất. Nhiệm vụ của bạn sẽ là, cho một từ, để in điểm của nó, đưa ra các quy tắc phức tạp sau đây.
Chấm điểm
Mô tả cách ghi một từ:
Một từ là một chuỗi các ký tự Latinh, chữ hoa nên được thay thế bằng 2 chữ cái viết thường (vì vậy "Hộp" trở thành "bbox")
Phân đoạn là một chuỗi con liền kề (nghiêm ngặt) của một từ và không được chứa bất kỳ ký tự nào hai lần ("her", "re", "h" là tất cả các phân đoạn hợp lệ của "Ở đây" ("hhere"), nhưng "hh" và "ere" thì không)
Phân đoạn là một tập hợp các phân đoạn có độ dài khác nhau, khi được nối, tạo thành từ gốc ("tre" và "e" tạo thành "cây") và không thể phân đoạn thêm trong phân khúc (tức là "ba" có một phân đoạn duy nhất phân đoạn, "ba"; và "alp" & "hjack" không phải là phân đoạn hợp lệ của "bảng chữ cái", bởi vì một trong hai phân đoạn này có thể được phân đoạn thêm (ví dụ: "a" & "lp" & "hjack", hiện tại một phân đoạn hợp lệ ("hjack" không thể được phân đoạn mà không tạo thành một phân đoạn có độ dài 2 hoặc 1))).
Điểm của một phân đoạn là tổng số điểm của từng ký tự riêng biệt xuất hiện trong từ gốc (một khi chữ viết hoa đã được thay thế)
Điểm của các nhân vật được giải thích dưới đây
Điểm của một từ là điểm của phân đoạn đẹp nhất có thể của nó (với điểm thấp nhất)
Nếu không có phân đoạn hợp lệ tồn tại cho một từ (ví dụ: "Brass" ("bbrass"), không thể phân đoạn vì "b" đầu tiên và "s" cuối cùng sẽ phải nằm trong phân khúc riêng của họ, điều đó sẽ dẫn đến trong hai phân đoạn có cùng độ dài), sau đó bạn nên xuất văn bản "ác", nếu không, bạn nên xuất điểm của từ.
Điểm nhân vật
Cách tính điểm của các ký tự dựa trên số lần nhân vật xuất hiện và trọng số của các phân đoạn xuất hiện. Trọng số của các phân đoạn phụ thuộc vào độ dài của phân đoạn và bội số chung thấp nhất của tất cả các phân đoạn trong sự phân chia.
segment weighting = lowest common multiple of lengths segments / length of segment
Hãy xem xét từ "ô liu", có thể được phân đoạn thành "ol" & "ive" và được hiển thị dưới dạng 2 hộp có cùng diện tích, một trong số "ol" có trọng lượng 3 và một "ive" có trọng lượng 2 (LCM của 6).
ol
ol ive
ol ive
Điều này có nghĩa là để mô tả hai hộp, một hộp được làm từ 3 "ol" và một hộp được làm từ 2 "ive". Thay vào đó, nó có thể là "o" & "sống" (LCM 4)
o
o
o
o live
Điểm của mỗi ký tự sau đó là tổng trọng số của các phân đoạn xuất hiện, nhân với số lần xuất hiện sau khi thay thế chữ hoa (vì vậy nếu xuất hiện hai lần, bạn sẽ bị tính phí gấp đôi cho mỗi lần bạn phải nói ).
character score = character count * sum(segment weights in which character appears)
Ví dụ chấm điểm
Chúng tôi lấy từ "ngã", nó chỉ có thể được phân thành "fal" và "l". Bội số chung thấp nhất của 3 và 1 là 3, vì vậy "fal" có trọng số 1 và "l" có trọng số 3.
l
l
fal l
Đi qua từng nhân vật ...
"f" xuất hiện một lần và nằm trong phân đoạn "fal" với trọng số 1, do đó, có điểm 1 * 1 = 1
"a" cũng chỉ xuất hiện một lần, có tổng trọng số là 1, vì vậy có điểm 1 * 1 = 1
"l" xuất hiện hai lần và xuất hiện trong "fal" (trọng lượng 1) và "l" (trọng lượng 3), do đó, có điểm 2 * (1 + 3) = 8
Tổng của những điều này là 10 (điểm của phân khúc và của từ, vì đây là phân khúc đẹp nhất). Đây là định dạng tương tự như các ví dụ dưới đây:
fall = fal l
2*1 [fa] + 2*(1+3) [ll] = 10
Ví dụ ghi bàn
Những ví dụ về ghi điểm có thể hoặc không thể giúp:
class -> clas s
3*1 [cla] + 2*(4+1) [ss] = 13
fish -> fis h
3*1 [fis] + 1*3 [h] = 6
eye -> e ye
1*1 [y] + 2*(1+2) [ee] = 7
treasure -> treas u re
3*2 [tas] + 2*2*(2+5) [rree] + 1*10 [u] = 44
Wolf -> w wolf
3*1 [olf] + 2*(1+4) = 13
book
evil
"Cuốn sách" là một từ xấu xa, vì vậy không có điểm.
Lưu ý rằng "kho báu" có thể được phân đoạn theo một số cách, nhưng phân đoạn cho thấy lợi ích từ việc có các chữ cái thường xuyên hơn ("r" và "e") trong các phân đoạn dài hơn, vì vậy chúng không có trọng lượng như nhau. Phân đoạn "t" & "re" & "asure" sẽ cho kết quả tương tự, trong khi "treas" & "ur" & "e" sẽ bị ảnh hưởng, với "e" có điểm 2 * (1 + 10 + 2 ) = 24 trên chính nó. Quan sát này thực sự là tinh thần của toàn bộ bài tập. Một ví dụ về điểm "kho báu" không chính xác (không chính xác vì nó không xuất phát từ điểm của phân khúc đẹp nhất (có điểm thấp nhất)):
treasure = treas ur e
3*2 [tas] + 2*(2+5) [rr] + 1*5 [u] + 2*[2+10] = 49
Đầu vào
Một chuỗi duy nhất chỉ chứa các ký tự Latin của một trong hai trường hợp ("ngựa", "Ngựa" và "hOrSe" đều là các đầu vào hợp lệ) có thể được chấp nhận bởi STDIN, đối số dòng lệnh, đối số hàm hoặc nếu không thì ngôn ngữ của bạn sự lựa chọn không hỗ trợ bất kỳ điều nào đã nói ở trên.
Đầu ra
Bạn phải xuất điểm của từ, là một số nguyên dương duy nhất lớn hơn 0 hoặc "ác" nếu không có phân đoạn nào tồn tại. Đầu ra phải là STDOUT hoặc đối số trả về của hàm, trừ khi ngôn ngữ bạn chọn không hỗ trợ cả hai thứ này, trong trường hợp đó làm một cái gì đó thể thao.
Ví dụ
Tôi không mong đợi bạn in tất cả những thứ này, tất cả những gì tôi muốn là điểm của từ hoặc đầu ra "ác", ví dụ (đầu vào tiếp theo là đầu ra)
eye
7
Eel
evil
a
1
Establishments
595
antidisestablishmentarianism
8557
Tôi không quan tâm đến hiệu suất, nếu bạn có thể ghi được bất kỳ từ 15 bản nào (sau khi thay thế chữ hoa) trong một phút trên một máy hợp lý (mơ hồ còn mơ hồ), điều đó đủ tốt cho tôi.
Đây là môn đánh gôn, có thể là đoạn mã ngắn nhất sẽ thắng.
Cảm ơn PeterTaylor, MartinBüttner và SP3000 vì sự giúp đỡ của họ với thử thách này