Lý lịch
Sự cố là một ngôn ngữ lập trình khá bất thường, trong đó danh sách mã thông báo của nó không được xác định trước, mà được suy ra từ đầu vào. Do đó, việc mã hóa chương trình Sự cố có thể khá khó khăn, đặc biệt nếu bạn muốn thực hiện một cách hiệu quả. Nhiệm vụ này là về việc tự làm điều đó.
Nhiệm vụ
Chương trình của bạn sẽ được cung cấp một chuỗi làm đầu vào. Đây là thuật toán mà Incident sử dụng để mã hóa nó:
- Xác định tất cả các chuỗi xảy ra dưới dạng một chuỗi con của đầu vào theo đúng ba cách (nghĩa là có chính xác ba lần xuất hiện của chuỗi đó trong đầu vào).
- Loại bỏ bất kỳ chuỗi nào trong số các chuỗi này là một chuỗi con của một chuỗi khác như vậy (ví dụ: đối với đầu vào
ababab
, chuỗi còn lại sẽ làab
, khônga
hoặcb
, bởi vìa
vàb
cả hai chuỗi con củaab
). - Hủy bỏ bất kỳ chuỗi trùng lặp trong đầu vào. (Ví dụ:
aaaa
chứa chính xác ba bản saoaa
, nhưng các bản sao này trùng nhau ở các ký tự thứ hai và thứ ba, do đó sẽ bị loại bỏ. Tương tự, trongabababa
đó, có ba bản saoab
và ba bản saoba
, nhưng mỗi ký tự thứ hai đến thứ sáu chồng chéo của mộtab
và aba
, vì vậy cả haiab
vàba
sẽ bị loại bỏ). - Bất kỳ chuỗi nào còn lại tại thời điểm này là mã thông báo được sử dụng bởi chương trình. Mã thông báo đầu vào ban đầu thành một chuỗi các mã thông báo này (do loại bỏ trong bước trước đó, sẽ chỉ có một cách để làm điều đó). Bất kỳ ký tự nào trong đầu vào không phải là một phần của bất kỳ mã thông báo nào đều được coi là nhận xét và bị loại bỏ.
Chương trình của bạn phải lấy một chuỗi làm đầu vào và trả về mã thông báo tương ứng của chuỗi (danh sách các mã thông báo, mỗi mã được thể hiện dưới dạng chuỗi) làm đầu ra. Ngoài ra, điều này phải được thực hiện ít nhất là hiệu quả vừa phải; cụ thể, chương trình phải chạy trong thời gian bậc hai ("O (n²)") hoặc tốt hơn. (Ngẫu nhiên, gần như chắc chắn có thể đi nhanh hơn bậc hai, nhưng đây không phải là thuật toán nhanh nhất , vì vậy hãy sử dụng thuật toán khó nhất mà bạn có thể tìm thấy phù hợp trong giới hạn phức tạp.)
Làm rõ
- Mặc dù về mặt lý thuyết, các chương trình sự cố có thể chứa bất kỳ trong số 256 octet, nhưng mục đích của thách thức này là chấp nhận được cho chương trình của bạn để xử lý chỉ các đầu vào được hình thành từ ASCII có thể in (bao gồm cả không gian), cộng với dòng mới và tab. (Tất cả các chương trình sự cố đã biết giới hạn bản thân trong tập hợp con này). Lưu ý rằng dấu cách / dòng mới / tab không đặc biệt và có thể xuất hiện ở giữa các mã thông báo; Sự cố coi tất cả 256 octet là mờ đục.
- Định nghĩa của "thời gian bậc hai" là "nếu kích thước của đầu vào được nhân đôi, chương trình sẽ chạy chậm hơn không quá một hằng số cộng với hệ số 4", tức là nếu t ( x ) là thời gian tối đa mà chương trình của bạn đạt được xử lý một đầu vào có kích thước x , sau đó phải có một số k không đổi sao cho t (2 x ) <4 t ( x ) + k với mọi x . Hãy nhớ rằng việc so sánh các chuỗi cần thời gian tỷ lệ thuận với độ dài của các chuỗi.
- Về mặt lý thuyết, chương trình của bạn sẽ có thể xử lý các chương trình đầu vào có độ dài bất kỳ nếu chạy trong một biến thể (có thể là giả thuyết) của ngôn ngữ của bạn có bộ nhớ không giới hạn và sử dụng các số nguyên không giới hạn (không sao nếu chương trình không đạt được mục tiêu này khi chạy trong thực tế do số nguyên hoặc bộ nhớ của ngôn ngữ thực sự rất lớn). Bạn có thể giả định (với mục đích tính toán độ phức tạp) rằng các số nguyên không lớn hơn độ dài của đầu vào có thể được so sánh trong thời gian không đổi (mặc dù lưu ý rằng nếu bạn sử dụng các giá trị lớn hơn, ví dụ do chuyển đổi đầu vào thành số nguyên đơn, chúng sẽ mất một khoảng thời gian để so sánh tỷ lệ với số chữ số chúng có).
- Bạn có thể sử dụng bất kỳ thuật toán nào phù hợp với giới hạn phức tạp, ngay cả khi nó không tuân theo các bước giống như thuật toán được đăng ở trên, miễn là nó tạo ra kết quả tương tự.
- Câu đố này là về tokenising đầu vào, không thực sự về định dạng đầu ra. Nếu cách tự nhiên nhất để xuất danh sách bằng ngôn ngữ của bạn liên quan đến định dạng không rõ ràng (ví dụ: phân tách dòng mới khi chuỗi chứa dòng mới bằng chữ hoặc không có dấu phân cách giữa các chuỗi), đừng lo lắng về việc đầu ra kết thúc không rõ ràng ( miễn là danh sách thực sự được xây dựng). Bạn có thể muốn tạo một phiên bản thứ hai của bài nộp của mình để tạo đầu ra rõ ràng, để hỗ trợ kiểm tra, nhưng phiên bản gốc là phiên bản được tính cho việc ghi điểm.
Trường hợp thử nghiệm
Đối với chuỗi đầu vào sau:
aaabcbcbcdefdfefedghijghighjkllkklmmmmonono-nonppqpq-pqprsrsrstststuvuvu
chương trình của bạn sẽ tạo ra danh sách đầu ra sau đây:
a a a bc bc bc d e f d f e f e d gh gh gh k l l k k l pq pq pq u u u
Điều kiện chiến thắng
Đây là mã golf , vì vậy chương trình hợp lệ đầu vào / đầu ra hợp lệ ngắn nhất và đủ nhanh để thực hiện), được đo bằng byte, thắng.