fork download
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. static const unsigned char alpha_signal[] = {
  5. /* 0 1 2 3 4 5 6 7 8 9 A B C D E */
  6. 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0
  7. };
  8. static const unsigned char alpha_table[] = {
  9. /* A B C D E F G H I J */
  10. 0x02, 0x34, 0x14, 0x33, 0x01, 0xE4, 0x83, 0x44, 0x42, 0xA4,
  11. /* K L M N O P Q R S T */
  12. 0x13, 0x24, 0x82, 0x12, 0xB3, 0x74, 0x84, 0x03, 0x43, 0x11,
  13. /* U V W X Y Z */
  14. 0x63, 0x54, 0x73, 0xD4, 0x94, 0xC4
  15. };
  16. static const unsigned char num_table[] = {
  17. /* 0 1 2 3 4 5 6 7 8 9 */
  18. 0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x12, 0x13, 0x14, 0x15
  19. };
  20. void num2morse(char c, char *buf) {
  21. char m;
  22. int i, n;
  23. unsigned char v;
  24. while (*buf != '\0') buf++;
  25. v = num_table[c - '0'];
  26. m = ((v & 0x10) == 0x00) ? '0' : '1';
  27. for (i = 0, n = (v & 0x0F); i < n; i++) {
  28. *buf++ = m;
  29. }
  30. m = ((v & 0x10) == 0x00) ? '1' : '0';
  31. for (i = 0, n = 5 - (v & 0x0F); i < n; i++) {
  32. *buf++ = m;
  33. }
  34. *buf++ = ' '; *buf = '\0';
  35. }
  36. void morse2num(char *buf, char *c) {
  37. char m;
  38. int i, n;
  39. unsigned char v;
  40. *c = '*';
  41. m = buf[0];
  42. n = 0;
  43. while (*buf == m) buf++, n++;
  44. v = ((m == '0') ? 0x00 : 0x10 ) | n;
  45. for (i = 0; i < 10; i++) {
  46. if (num_table[i] == v) {
  47. *c = '0' + i;
  48. break;
  49. }
  50. }
  51. }
  52. void alpha2morse(char c, char *buf) {
  53. int i, j, n;
  54. unsigned char v;
  55. while (*buf != '\0') buf++;
  56. v = alpha_table[c - 'A'];
  57. j = (v & 0xF0) >> 4;
  58. for (i = 0, n = (v & 0x0F); i < n; i++) {
  59. *buf++ = (alpha_signal[j++ % 15] == 0x0) ? '0' : '1';
  60. }
  61. *buf++ = ' '; *buf = '\0';
  62. }
  63. void morse2alpha(char *buf, char *c) {
  64. int i, j, k, n;
  65. unsigned char v;
  66. *c = '*';
  67. n = strlen(buf);
  68. for (i = 0; i < 15; i++) {
  69. for (j = 0; j < n; j++) {
  70. if (alpha_signal[(i + j) % 15] != (buf[j] - '0')) break;
  71. }
  72. if (j == n) {
  73. v = (i << 4) | n;
  74. for (k = 0; k < 26; k++) {
  75. if (alpha_table[k] == v) break;
  76. }
  77. if (k != 26) *c = 'A' + k;
  78. break;
  79. }
  80. }
  81. }
  82. int encode_morse(char *s) {
  83. int i, n;
  84. char c;
  85. char buf[20];
  86. char *p;
  87. printf("[ENCODE]\n%s -> \n", s);
  88. for (i = 0, n = strlen(s); i < n; i++) {
  89. buf[0] = '\0';
  90. c = *s++;
  91. if (c >= '0' && c <= '9') {
  92. num2morse(c, buf);
  93. } else {
  94. if (c >= 'a' && c <= 'z') {
  95. c += 'A' - 'a';
  96. }
  97. if (c >= 'A' && c <= 'Z') {
  98. alpha2morse(c, buf);
  99. }
  100. }
  101. for (p = &buf[0]; *p != '\0'; p++) {
  102. switch (*p) {
  103. case '0': printf("・"); break;
  104. case '1': printf("-"); break;
  105. case ' ': printf("   "); break;
  106. }
  107. }
  108. }
  109. printf("\n");
  110. }
  111. int decode_morse(char *s) {
  112. char buf[20];
  113. char *p;
  114. char c;
  115. int i, n, m;
  116. p = &buf[0];
  117. printf("[DECODE]\n%s\n -> ", s);
  118. for (i = 0, n = strlen(s); i < n; ) {
  119. if (strncmp(&s[i], "・", strlen("・")) == 0) {
  120. *p++ = '0';
  121. i += strlen("・");
  122. } else if (strncmp(&s[i], "-", strlen("-")) == 0) {
  123. *p++ = '1';
  124. i += strlen("-");
  125. } else if (strncmp(&s[i], " ", strlen(" ")) == 0) {
  126. *p = '\0';
  127. m = strlen(buf);
  128. if (m > 0) {
  129. if (m == 5) {
  130. morse2num(buf, &c);
  131. printf("%c", c);
  132. } else {
  133. morse2alpha(buf, &c);
  134. printf("%c", c);
  135. }
  136. }
  137. p = &buf[0];
  138. i += strlen(" ");
  139. } else {
  140. break;
  141. }
  142. }
  143. printf("\n");
  144. }
  145. void main_part11_378(int argc, char *argv[]) {
  146. if (strcmp(argv[1], "encode") == 0) {
  147. encode_morse(argv[2]);
  148. } else if (strcmp(argv[1], "decode") == 0) {
  149. decode_morse(argv[2]);
  150. }
  151. }
  152. int main(int argc, char *argv[]) {
  153. char *argv1[] = {"", "encode", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
  154. char *argv2[] = {"", "decode", "・----   ・・---   ・・・--   ・・・・-   ・・・・・   -・・・・   --・・・   ---・・   ----・   -----   ・-   -・・・   -・-・   -・・   ・   ・・-・   --・   ・・・・   ・・   ・---   -・-   ・-・・   --   -・   ---   ・--・   --・-   ・-・   ・・・   -   ・・-   ・・・-   ・--   -・・-   -・--   --・・   "};
  155. if (argc <= 2) {
  156. main_part11_378(sizeof(argv1) / sizeof(char*), argv1);
  157. main_part11_378(sizeof(argv2) / sizeof(char*), argv2);
  158. } else {
  159. main_part11_378(argc, argv);
  160. }
  161. return 0;
  162. }
  163.  
Success #stdin #stdout 0s 4308KB
stdin
Standard input is empty
stdout
[ENCODE]
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -> 
・----   ・・---   ・・・--   ・・・・-   ・・・・・   -・・・・   --・・・   ---・・   ----・   -----   ・-   -・・・   -・-・   -・・   ・   ・・-・   --・   ・・・・   ・・   ・---   -・-   ・-・・   --   -・   ---   ・--・   --・-   ・-・   ・・・   -   ・・-   ・・・-   ・--   -・・-   -・--   --・・   
[DECODE]
・----   ・・---   ・・・--   ・・・・-   ・・・・・   -・・・・   --・・・   ---・・   ----・   -----   ・-   -・・・   -・-・   -・・   ・   ・・-・   --・   ・・・・   ・・   ・---   -・-   ・-・・   --   -・   ---   ・--・   --・-   ・-・   ・・・   -   ・・-   ・・・-   ・--   -・・-   -・--   --・・   
 -> 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ