Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 20 kết quả

Đề tài: Mã hóa văn bản gửi ra ngoài hành tinh

  1. #1
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Mặc định Mã hóa văn bản gửi ra ngoài hành tinh

    Lâu nay, người ta vẫn đồn đại rằng một số quốc gia có thể đã duy trì quan hệ bí mật với người ngoài hành tinh. File nguồn C dưới đây được cho là một trong hàng triệu tài liệu rò rỉ từ cơ quan thám hiểm không gian vũ trụ của một quốc gia không nêu tên.

    Bỏ qua nghi vấn về tính xác thực. Theo file nguồn này, người ngoài hành tinh vẫn có thể nhận và hồi đáp các thông điệp từ Trái Đất nhưng liên lạc là không hoàn hảo. Thông điệp là một chuỗi ký hiệu (ký tự) được truyền đi trong không trung dưới dạng một tín hiệu và người ngoài hành tinh dựa vào thay đổi trong tín hiệu để nhận biết ký hiệu. Do vậy, nếu một ký hiệu chỉ lặp lại ký hiệu ngay trước nó thì người ngoài hành tinh sẽ chỉ nhận cả hai như là một ký hiệu mà thôi. Ví dụ, nếu thông điệp phát đi là Facebook, thông điệp thu được sẽ là Facebok.

    Để cải thiện chất lượng giao tiếp, người ngoài hành tinh muốn đôi bên mã hóa thông điệp thành một dạng nào đó không có những ký hiệu lắp lại như thế (họ gọi là ký hiệu "sinh đôi"). Do ngôn ngữ giao tiếp là ngôn ngữ của Trái Đất, họ đề nghị Trái Đất chọn thuật toán mã hóa, cụ thể là viết hàm mã hóa (encode) và giải mã (decode) nối tiếp vào file nguồn mà họ đã soạn sẵn này. Trong file, họ đã viết sẵn một hàm kiểm thử (test) gọi đến encodedecode.

    Khi chạy, với dữ liệu đầu vào là một văn bản viết bằng ngôn ngữ Trái Đất, chương trình sẽ thử mã hóa và giải mã rồi in ra thông báo lỗi chỉ rõ yêu cầu nào chưa đạt và ở đâu chưa đạt, hoặc nếu đạt mọi yêu cầu thì chứng nhận bằng cách "chấm điểm". Điểm số nói lên thuật toán có đáng tin cậy hay không dựa theo khối lượng của dữ liệu kiểm thử, không dựa vào tiêu chuẩn nào khác.

    Bạn (người Trái Đất) hãy đáp ứng đề nghị của họ.

    Trên không phải là đề bài tập, chỉ là cách diễn giải của mình, để tham khảo. Đề bài được viết trong file nguồn. Ở đầu file là bối cảnh và yêu cầu khái quát dưới hình thức 1 đoạn trích thông điệp của người Trái Đất và hồi đáp của người ngoài hành tinh. Tiếp đó là mô tả yêu cầu ở các comment trong các khai báo hàm encodedecode, và cuối cùng, yêu cầu chính xác được đặc tả bằng code trong hàm test. Dữ liệu kiểm thử được đặc tả bằng code của hàm main.
    C Code:
    1. /* .ZNXZNZXNXZXNZNXZNZXNZNXZXNXZNZXNXZXNZNXZXNXZNZXNZNXZNZXNXZXNZNXZ. */
    2. /*
    3.  * "You named Stalin but didn't mention Churchil or Rosevelt while you
    4.  * were talking about the UK and the US without saying a word about
    5.  * the USR or Rusia. You named Voltaire, Montesquieu, Diderot, but
    6.  * didn't mention Jean Jaques Rouseu. You like Mozart and Chopin; but
    7.  * how about Bethoven? How could you talk about Albert Einstein without
    8.  * talking about Isac Newton? Why did you name Leonhard Euler without
    9.  * mentioning Carl Friedrich Gaus? You know of Alan Turing and Kurt
    10.  * Goedel; do you know who are John von Neuman and Haskel Broks Cury?"
    11.  * [TX S-T computed: Earth 1967-10-28 23:59:02.718281828459045235 GMT]
    12.  *
    13.  * "I know persons and countries you've named, and more. John Lenon and
    14.  * Luciano Pavaroti. Sean Conery and Dustin Hofman. Whitfield Difie
    15.  * and Martin Helman. Denis Ritchie and Richard Stalman. I know even
    16.  * Bil Gates and Marisa Mayer. I know what is Aple, Gogle, Facebok,
    17.  * Yaho, and I'm aware of the C+ programing language. I just don't want
    18.  * to lok like a ten-ager by mispeling their names."
    19.  *
    20.  * "At terminal velocity, time becomes relativistic. My transceiver
    21.  * isn't clock-based. A signal can be synchronised only with itself.
    22.  * Every symbol acts like a 'clock cycle' of its own, so it must be
    23.  * signified by a change in the signal. In quantum time, a symbol which
    24.  * duplicates the one right before it can't be recognised. I can only
    25.  * receive and transmit a symbol which is distinct from the imediately
    26.  * preceding one. For proper comunication, encode mesages in a format
    27.  * with solely such 'flip' and no such 'twin' symbols. Complete this C
    28.  * programe with your coding algorithm, test it with real texts in your
    29.  * languages and send it back before actual use."
    30.  * [RX S-T expected: Earth 2017-10-28 23:59:03.141592653589793238 UTC]
    31.  */
    32. /* .-|+-|-+|+-+|-|+-|-+|-|+-+|+-|-+|+-+|-|+-+|+-|-+|-|+-|-+|+-+|-|+-. */
    33. long encode(long n, char *x);
    34. /*
    35.  * Encode C-string x, up to n+1 chars. Return #encoded chars - 1
    36.  */
    37. long decode(long n, char *x);
    38. /*
    39.  * Decode x, up to n+1 chars, to C-string. Return #decoded chars - 1
    40.  */
    41. /* .-|+-|-+|+-+|-|+-|-+|-|+-+|+-|-+|+-+|-|+-+|+-|-+|-|+-|-+|+-+|-|+-. */
    42. #include <stdio.h>
    43. #include <stdlib.h>
    44. #include <string.h>
    45. #include <math.h>
    46. /* .-|+-|-+|+-+|-|+-|-+|-|+-+|+-|-+|+-+|-|+-+|+-|-+|-|+-|-+|+-+|-|+-. */
    47. void take(int b, int kod, const char *msg, int id)
    48. {
    49.  if(!b){ printf("%d:%s\n",id,msg); exit(kod); }
    50. }
    51. /* .-|+-|-+|+-+|-|+-|-+|-|+-+|+-|-+|+-+|-|+-+|+-|-+|-|+-|-+|+-+|-|+-. */
    52. void fail(int b, int kod, const char *msg, int id)
    53. {
    54.  if(b) { printf("%d:%s\n",id,msg); exit(kod); }
    55. }
    56. /* .-|+-|-+|+-+|-|+-|-+|-|+-+|+-|-+|+-+|-|+-+|+-|-+|-|+-|-+|+-+|-|+-. */
    57. #define FINPUT 1 /* Input failure */
    58. #define FSAMPL 2 /* Non-suitable text sample */
    59. #define FENCOD 3 /* Encode bug */
    60. #define FDECOD 4 /* Decode bug */
    61. #define FSECUR 5 /* Security bug */
    62. #define FLOGIC 6 /* Other logical bug */
    63. /* .-|+-|-+|+-+|-|+-|-+|-|+-+|+-|-+|+-+|-|+-+|+-|-+|-|+-|-+|+-+|-|+-. */
    64. void test(int g, char *a, const char *b, long M, long L, long m)
    65. /*
    66.  * encode-then-decode test, up to m+1 chars, on a C-string of length L
    67.  * already contained in memory section a of size M+1, whose initial
    68.  * content is identical to section b and remains identical upon return
    69.  * (if any). Report failure (and exit) using g as test case ID.
    70.  */
    71. {
    72.  fail(memcmp(a,b,M+1),FLOGIC, "Logical bug: precondition #1.",g);
    73.  take(L < M, FLOGIC,"Logical bug: precondition #2.",g);
    74.  fail(L-strlen(a),FLOGIC,"Logical bug: precondition #3.",g);
    75.  take(m <=M, FLOGIC,"Logical bug: precondition #4.",g);
    76.  fail(m <-1, FLOGIC,"Logical bug: precondition #5.",g);
    77.  long n = L < m ? L : m;
    78.  long N = encode(m,a);
    79.  fail(N > n, FSECUR, "Encode bug: probably mem. violation.",g);
    80.  fail(N < n, FENCOD, "Bad encode: length mismatch.",g);
    81.  fail(memcmp(a+n+1,b+n+1,M-n), FSECUR, "Encode bug: mem. violation.",g);
    82.  for(long i=1;i<N;i+=1) take(a[i]-a[i-1],FENCOD, "Bad encode: twin.",g);
    83.  long K = decode(m,a);
    84.  fail(K > n, FSECUR, "Decode bug: probably mem. violation.",g);
    85.  fail(K < n, FDECOD, "Bad decode: length mismatch.",g);
    86.  fail(memcmp(a+n+1,b+n+1,M-n), FSECUR, "Decode bug: mem. violation.",g);
    87.  fail(memcmp(a,b,K+1), FDECOD, "Bad decode: wrong original.",g);
    88. }
    89. /* .-|+-|-+|+-+|-|+-|-+|-|+-+|+-|-+|+-+|-|+-+|+-|-+|-|+-|-+|+-+|-|+-. */
    90. #define NUL '\0'
    91. #define M ( (long)1E8 ) /* Max sample size incl. NUL terminator */
    92. /* .-|+-|-+|+-+|-|+-|-+|-|+-+|+-|-+|+-+|-|+-+|+-|-+|-|+-|-+|+-+|-|+-. */
    93. int main()
    94. {
    95.  typedef long long IN;
    96.  static char a[M+1], b[M+1];
    97.  for(long i=0;i<sizeof(a);i+=1) a[i]=b[i]=rand();
    98.  char *t = a;
    99.  *t = NUL;
    100.  for(long n=M;(n>1)*(IN)fgets(t,n,stdin);){long k=strlen(t);t+=k;n-=k;}
    101.  fail(*t != NUL, FINPUT, "Input failure #1.", 0);
    102.  long L = t - a;
    103.  take(L < M, FINPUT, "Input failure #2.", 0);
    104.  fail(L-strlen(a),FINPUT, "Input failure #3.", 0);
    105.  long nTwin = 0, nFlip = 0;
    106.  for(long i=0;i<L-1;i+=1){if(a[i]-a[i+1]) nFlip+=1; else nTwin+=1;}
    107.  take(nTwin, FSAMPL, "Bad sample: no twin symbols.", 0);
    108.  take(nFlip, FSAMPL, "Bad sample: no flip symbols.", 0);
    109.  strcpy(b,a);
    110.  test(1, a, b, M, L, M);
    111.  test(2, a, b, M, L, L+1);
    112.  test(3, a, b, M, L, L);
    113.  test(4, a, b, M, L, L-1);
    114.  test(5, a, b, M, L, L/2);
    115.  test(6, a, b, M, L, 1);
    116.  test(7, a, b, M, L, 0);
    117.  test(8, a, b, M, L,-1);
    118.  printf( "%ld symbols encoded. You got %.0f points.\n", L, log10(L) );
    119.  return 0;
    120. }
    121. /* .ZNXZNZXNXZXNZNXZNZXNZNXZXNXZNZXNXZXNZNXZXNXZNZXNZNXZNZXNXZXNZNXZ. */
    122. /*
    123.  * Put code here
    124.  *
    125.  * Define encode() and decode(), nothing else.
    126.  */
    Đã được chỉnh sửa lần cuối bởi Ada : 17-10-2017 lúc 11:21 AM. Lý do: Thêm precondition #5 cho code rõ ràng hơn
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  2. #2
    Ngày gia nhập
    05 2017
    Bài viết
    5

    Mình có ý tưởng như này (còn viết code thì chưa đủ trình nên ko biết viết ): chỗ nào mà có kí tự lặp lại thì viết thêm số lần kí tự đó lặp lại ngay sau nó, ví dụ như facebook sẽ đc encode thành facebo<+2>k, hay là missing sẽ thành mis<+2>ing, Matt2@gmail.com-> Mat<+2>2@gmail.com .... Vì trong văn bản của ngôn ngữ giao tiếp hàng ngày không có thể loại kiểu abc<+2>def.... nên sẽ không bị hiểu lầm <+2> thành trường hợp nào đó.

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Họ yêu cầu bản mã cùng độ dài như nguyên bản cơ (xem dòng 79, 80.)

    Vả lại, ngôn ngữ giao tiếp hàng ngày thì không chứa chuỗi dạng này. Nhưng ngôn ngữ khác thì sao? Ngôn ngữ lập trình, ngôn ngữ dữ liệu, v.v. Có gì đảm bảo các văn bản ở dạng HTML, XML, TeX, LyX, v.v. không chứa chuỗi dạng này?
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  4. #4
    Ngày gia nhập
    05 2017
    Bài viết
    5

    Chơi kiểu nhập kiểu gì cũng được như là: 34%%<+>#$%64rwer#$*& thì mình nghĩ là nên nghĩ ra một kí hiệu mới mà trên bàn phím máy tính không có , ý tưởng thì vẫn như mình nói ở trên như kiểu là số 2 sẽ thành hình giống lá cây: hello -> hel(hình lá cây)o, đối với số 3 thì hình mì tôm sẽ tượng trưng cho nó, và để có độ dài như nguyên bản thì sẽ thành hình mì tôm mì tôm: ví dụ LLL</a> thành L(hình mì tôm) (hình mì tôm) </a> ... tương tự sáng tạo với các số 4 , 5 , 6 ..... =))

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Ý tưởng này là đúng hướng, nhưng cần cụ thể hơn, chi tiết hơn. Và mình lưu ý mấy cạm bẫy tiềm ẩn khi tiếp tục phát triển ý tưởng này.

    1. Hai "hình mì tôm" liên tiếp nhau là không được. Vì không thỏa yêu cầu cơ bản là hai ký hiệu liên tiếp phải khác nhau.

    2. Sáng tạo liên tiếp cho các số 4, 5, 6,... là không được. Vì trong nguyên bản, một ký hiệu có thể lặp nhiều lần và không ai biết bao nhiêu lần là tối đa. (Ví dụ, một file mã nguồn C có thể dùng chuỗi *****...* hoặc /////.../ để vẽ đường diềm hơn là chuỗi ZNXZNZXNX... mà người ngoài hành tinh đã dùng; một file cơ sở dữ liệu TXT có thể biểu diễn giá trị NULL của một trường text bằng một chuỗi gồm toàn dấu trắng.) Trong khi ấy, kiểu char được định nghĩa là kiểu 1 byte, và 1 byte trên các máy tính thời nay chỉ có đúng 8 bit, nghĩa là có đúng 256 giá trị phân biệt, nghĩa là chỉ có thể mã hóa nhiều nhất 256 ký hiệu mà thôi.

    3. Bảng mã ASCII có 128 ký hiệu, nhưng thường được mở rộng thành 256 ký hiệu và các bảng mã mở rộng như thế, nhờ tương thích với C-string, đã được dùng rộng rãi từ lâu. Nghĩa là chẳng còn mã nào bỏ trống để mà sáng tạo thêm bất cứ ký hiệu nào. (Unicode, một bảng mã cho phép sáng tạo thêm ký hiệu và có thể thực thi bằng UTF-8, một cách thức mã hóa tương thích với C-string nhưng một ký hiệu có thể là nhiều byte, tạm thời chưa bàn đến bởi vì người ngoài hành tinh xem ký hiệu là một byte.)

    4. Họ chỉ yêu cầu mã hóa C-string, tức là một xâu (chuỗi ký hiệu) theo quy ước [của ngôn ngữ] C. Mở rộng vấn đề cho "kiểu gì cũng được", tức là một chuỗi byte bất kỳ, sẽ không giải được. Ví dụ, một giá trị kiểu int, unsigned, float hay double, một hình ảnh, một bản nhạc, một bộ phim, một chương trình mã máy (OBJ LIB DLL EXE) hay một file nén nói chung không thể mã hóa thành một chuỗi byte có cùng độ dài mà lại có thêm tính chất đặc biệt là hai byte liên tiếp khác nhau.
    Đã được chỉnh sửa lần cuối bởi Ada : 18-10-2017 lúc 05:34 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  6. #6
    Ngày gia nhập
    05 2017
    Bài viết
    5

    Mặc định Mã hóa văn bản gửi ra ngoài hành tinh

    Cái ý mà : bản mã cùng độ dài như nguyên bản -> khó nghĩ quá.
    Còn nếu được sáng tạo (chắc phải build thêm một cái bảng mã mới tên là AlienCode và bảng này chỉ gồm 2 kí hiệu ) để thực hiện nốt cái ý tưởng của mình ở trên thì tự mình lập ra thêm 2 kí hiệu mới toanh mà trong ngôn ngữ C ko có ( ví dụ như là hình icon của hãng apple và icon của Samsung) và viết nó sau các từ bị lặp lại, mỗi lần xuất hiện các icon là thể hiện cho một lần từ đứng trc icon đó xuất hiện, và đan xen các icon với nhau để Alien có thể nhận được tín hiệu. ví dụ: chuỗi string này:
    LLLL<<
    sẽ được encode thành:
    L( icon của hãng apple)(icon của Samsung)( icon của hãng apple)<(icon của hãng apple)

    - - - Nội dung đã được cập nhật ngày 18-10-2017 lúc 07:58 PM - - -

    Với cách viết xen kẽ này thì sẽ chẳng bao giờ phải lo :"một ký hiệu có thể lặp nhiều lần và không ai biết bao nhiêu lần là tối đa".

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Bạn có lý đấy.

    Nhưng vì sao phải dùng đến tận 2 icon? Chỉ 1 icon thì có gì không ổn sao?

    Và, như minh đã nói ở điểm 3 trên, sao nhất thiết cứ phải sáng tạo ký hiệu mới (icon)? Sao không thử dùng ký hiệu nào đó sẵn có?

    Hai vấn đề đó có thể làm rõ hơn bằng vài câu hỏi thế này:

    1. Họ yêu cầu mã hóa C-string. Vậy, C-string là gì?

    2. Họ muốn chúng ta mã hóa thành một dạng xâu có tính chất nhất định, để cho tiện ta hãy gọi nó là A-string. Vậy, A-string là gì?

    3. Giữa các C-string và các A-string phải có quan hệ gì để có thể mã hóa C-string thành A-string (mà sau đó có thể giải mã được)?

    Nếu 3 câu hỏi trên ban đã tự trả lời mà vẫn cảm thấy chưa tìm ra cách thì có thể câu trả lời đó chưa được cụ thể lắm, chi tiết lắm. Khi ấy, hãy thử nghĩ về các câu hỏi chi tiết hơn sau đây.

    4. Một C-string có thể xem như một C-string mở được đóng lại bằng cách nối thêm 1 ký hiệu ở tận cùng. C-string mở là một xâu gồm toàn những ký hiệu có một tính chất C nhất định nào đó, và ký hiệu tận cùng để đóng nó có một tính chất C' nào đó loại trừ C (nếu không có sự loại trừ, một xâu có thể là vừa mở vừa đóng, vô lý.) Vậy, hai tính chất C, C' ấy là tính chất gì?

    5. Tương tự, một A-string cũng có thể xây dựng từ một A-string mở được đóng lại bởi một ký hiệu tận cùng, với những tính chất A và A' nhất định nào đó loại trừ lẫn nhau. Vậy, A và A' có thể là tính chất gì? Xin lưu ý là tính chất "khác ký hiệu đi trước" có thể là một phần nhưng không phải là toàn bộ tính chất A, bởi vì đối với một ký hiệu dẫn đầu thì làm gì có ký hiệu đi trước để mà "khác".

    6. Với mọi số tự nhiên k, có bao nhiêu C-string mở có độ dài k thì cũng có ít nhất bấy nhiêu A-string mở cùng độ dài; và điều tương tự cũng có thể phát biểu với các C-string và A-string đóng. Điều này có đúng không?

    Chú ý rằng các câu 4, 5 (tìm định nghĩa) và 6 (chứng minh định lý) không nên giải quyết riêng rẽ mà nên giải quyết đồng thời, nghĩa là phải căn cứ vào thực tế (sách giáo khoa ngôn ngữ C và yêu cầu của đề bài), xây dựng thêm các yếu tố khác để hoàn chỉnh định nghĩa (4, 5) sao cho điều mong muốn (6) trở thành định lý.

    Nếu chứng minh 6 có tính xây dựng, nghĩa là chỉ rõ một đơn ánh từ các C-string đến các A-string, thì bản thân đơn ánh ấy rất có thể đã là thuật toán (mã hóa). Nếu ngược lại không có tính xây dựng, việc chứng minh cũng có thể sẽ soi rọi vấn đề, giúp tìm ra cách mã hóa dễ dàng.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  8. #8
    Ngày gia nhập
    05 2017
    Bài viết
    5

    Ờ ha, chỉ cần 1 icon là đủ rồi, như LLLL encode -> L(icon)L(icon)
    Còn mấy ý dưới của bạn nói chắc mình cần nghĩ thêm, chưa trả lời ngay được.
    Lí do mình viết icon vì mình ko nghĩ ra cái kí hiệu nào trên bàn phím mà trong C-string lại ko có cả.

  9. #9
    Ngày gia nhập
    01 2013
    Bài viết
    1,477

    Chuỗi cần mã hóa sẽ chỉ có những kí tự nào, ngoài chuyện hai kí tự liên tiếp phải khác nhau?

  10. #10
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Trích dẫn Nguyên bản được gửi bởi Hangdtth Xem bài viết
    Lí do mình viết icon vì mình ko nghĩ ra cái kí hiệu nào trên bàn phím mà trong C-string lại ko có cả.
    Tất nhiên rồi. Bàn phím được chế tạo để nhập bất cứ ký hiệu nào. Và một C-string (đóng) bất kỳ có thể chứa bất cứ ký hiệu nào.

    Vấn đề chỉ trở nên rõ ràng khi ta xem xét các văn bản, nghĩa là một chuỗi ký hiệu có tính chất nhất định nào đó (mà ta gọi là tính chất C). Văn bản có thể là file hay một phần của file lưu trên ổ cứng, truyền qua mạng trong một gói tin, truyền ra ngoài hành tinh như một thông điệp, hay trong bộ nhớ máy tính, dưới dạng C-string mở.

    Và người ngoài hành tinh đòi encodedecode phải xử lý được cả C-string (đóng) lẫn C-string mở rất có thể là nhằm nhắc nhở chúng ta C-string mở mới là cốt lõi của thông tin và là chìa khóa để giải quyết vấn đề, bên cạnh lý do an ninh (C-string mở không phải là C-string hợp lệ, nhưng bất cứ hàm nào xử lý một string mà giả thiết rằng nó đóng đều là một lỗ thủng tiềm năng có thể làm cho chương trình bị crash hoặc thậm chí bị hack).

    - - - Nội dung đã được cập nhật ngày 19-10-2017 lúc 10:11 AM - - -

    Trích dẫn Nguyên bản được gửi bởi prog10 Xem bài viết
    Chuỗi cần mã hóa sẽ chỉ có những kí tự nào, ngoài chuyện hai kí tự liên tiếp phải khác nhau?
    Theo comment nguyên bản tiếng Anh, nguyên bản (chuỗi cần mã hóa) là các văn bản thực (real texts) của các ngôn ngữ loài người và có thể chứa trong một C-string; còn bản mã (chuỗi kết quả mã hóa) không được chứa hai kí hiệu liên tiếp giống nhau. Tuy nhiên, theo đặc tả chính xác (hàm test) thì yêu cầu này có 1 ngoại lệ (xem dòng 82).

    Vì theo khai báo của hàm encode, việc mã hóa được thực hiện tại chỗ, nên bản mã phải ngắn hơn hoặc cùng lắm là dài như nguyên bản. Tương tự, khai báo của hàm decode chỉ rõ yêu cầu nguyên bản phải ngắn hơn hoặc cùng lắm là dài như bản mã. Tóm lại, bản mã và nguyên bản phải có cùng độ dài. (Và yêu cầu ấy được kiểm thử khá kỹ trong hàm test.)

    Ngoài ra, mình không thấy yêu cầu nào khác. (Nói riêng, người ngoài hành tinh không đòi hỏi bản mã phải là một C-string.)

    Mình muốn dẫn topic đi từ dễ đến khó. Nên bước đầu mình bỏ qua các văn bản thực, nghĩa là chỉ tập trung vào việc tìm cách mã hóa một C-string bất kỳ thành cái mình gọi là A-string. Bước tiếp theo sẽ là xem chúng ta có thể làm tốt hơn người ngoài hành tinh mong muốn hay không, cụ thể là xem có cách mã hóa nào đảm bảo cho bản mã cũng là một C-string hay không. Việc này khó hơn, bởi vì phải xem các văn bản thực tế có thêm tính chất đặc biệt B nào đó giúp cho việc mã hóa một "BC-string" (một C-string có tính chất B) thành một "AC-string" (một C-string có tính chất A) hay không.

    P/S. Mình muốn dùng từ ký hiệu và tránh dùng từ ký tự ở giai đoạn này. Khi xem xét các văn bản thực tế, không thể bỏ qua các ngôn ngữ như tiếng Việt, Nga, Arab, Thái, Trung, Nhật, Hàn, v.v. nơi một ký tự trong nguyên bản đã có thể là vài byte, hay theo cách nói của người ngoài hành tinh, vài char hay vài ký hiệu (symbol).
    Đã được chỉnh sửa lần cuối bởi Ada : 19-10-2017 lúc 11:20 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn