Nguồn đề bài: http://vn.spoj.com/problems/CHATCHIT/
1. Đề bài CHATCHIT spoj
Sau khi trải qua kỳ thi chọn đội tuyển Quốc tế đầy căng thẳng, các vCoders quyết định tạm gác niềm đam mê tin học của mình một thời gian để đi tìm những niềm vui mới. Một số quyết định đi Hồng Kông nghỉ mát để bù lại những ngày học hành vất vả. Số khác quay lại trường học. Nhưng đặc biệt, có một số vCoders sau những buổi chat đêm đã đi đến quyết định: dùng kiến thức tin học của mình góp phần giữ gìn sự trong sáng của tiếng Việt. Nhóm quyết định lấy tên là vitko (Viet-Coder) để mọi người ý thức được công việc thầm lặng họ đang làm.
Nhận thấy rằng ngôn ngữ chat tiếng Việt bị lạm dụng quá nhiều, các vitkos đã suy nghĩ và tìm một thuật toán để dịch từ ngôn ngữ chat trở lại tiếng Việt. Dữ liệu vào sẽ là một câu chat (gồm các chữ cái latin in thường và không dấu). Thuật toán của các vitkos gồm một số quy tắc được áp dụng theo thứ tự vào câu văn. Các quy tắc này dựa trên hai thao tác cơ bản:
- R(p)=q: thay tất cả các chuỗi con p bằng chuỗi con q trong câu văn.
- RW(p)=q: thay tất cả các từ p bằng từ q trong câu văn.
Các quy tắc được áp dụng lần lượt theo thứ tự như sau:
- RW(‘k’)=’khong’
- RW(‘ko’)=’khong’
- RW(‘ng’)=’nguoi’
- RW(‘n’)=’nhieu’
- RW(‘dc’)=’duoc’
- RW(‘hok’)=’khong’
- RW(‘ntn’)=’nhu the nao’
- RW(‘kq’)=’ket qua’
- R(‘j’)=’gi’
- R(‘w’)=’qu’
- R(‘f’)=’ph’
- R(‘dz’)=’d’
- R(‘z’)=’d’
Mặc dù đây là những quy tắc rất đơn giản, tuy nhiên chúng cũng giúp các vitkos đỡ căng mắt khi nhìn vào các đoạn chat! Hãy giúp các vitkos cài đặt thuật toán này. Họ sẽ dùng chương trình của bạn để viết một plugin cho Yahoo Messenger 🙂
Dữ liệu
Gồm một dòng duy nhất chứa một câu chat vitko vừa nhận được. Câu chat có độ dài không vượt quá 255 ký tự, chỉ gồm các ký tự latin in thường, khoảng trắng và các dấu câu. Các từ được cách nhau đúng một khoảng trắng.
Kết quả
In ra một dòng là câu chat đã được dịch theo thuật toán trên.
Ví dụ
Dữ liệu chan wa. jo den luc co kq cha mun lam bai j nua :( Kết quả chan qua. gio den luc co ket qua cha mun lam bai gi nua :(
Hiện các vitkos quyết định phát triển hiệu quả hơn thuật toán của mình!
2. Hướng dẫn CHATCHIT spoj
Gợi ý: bài này chủ yếu xử lí xâu cơ bản thôi. các bạn có thể dùng hàm pos trong pascal để tìm và thay thế. xem code sẽ hiểu rõ ý tưởng…
3. Code tham khảo CHATCHIT spoj
const fi=''; vao:array[1..13] of string = (' k ',' ko ',' ng ',' n ',' dc ',' hok ',' ntn ',' kq ','j','w','f','dz','z'); ra:array[1..13] of string = (' khong ',' khong ',' nguoi ',' nhieu ',' duoc ',' khong ',' nhu the nao ',' ket qua ','gi','qu','ph','d','d'); nmax=255; type data=longint; var S:string; f:text; i,j,vt:data; begin assign(f,fi); reset(f); readln(f,s); close(f); s:=' '+s+' '; for i:=1 to 13 do begin repeat vt:=pos(vao[i],s); if vt<>0 then begin delete(s,vt,length(vao[i])); insert(ra[i],s,vt); end; until vt=0; end; writeln(copy(s,2,length(s)-2)); end.