Source code for submission s589

fs.cpp

  1.  
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. int morsetoint(const char *a) {
  10. int out = 0;
  11. for (const char *c = a; *c; c++) {
  12. out <<= 1;
  13. out |= *c == '-';
  14. }
  15. return out;
  16. }
  17.  
  18. int morsetoint(const char *a, int l) {
  19. int out = 0;
  20. for (const char *c = a; l--; c++) {
  21. out <<= 1;
  22. out |= *c == '-';
  23. }
  24. return out;
  25. }
  26.  
  27. int chartomorse[256];
  28. int chartolen[256];
  29. const char *chartomcode[256];
  30.  
  31. char morsetochar[4][16];
  32. const char *morsetomcode[4][16];
  33.  
  34. #define m(a,b) { chartomorse[a] = morsetoint(b); chartomcode[a] = b; chartolen[a] = strlen(b); morsetochar[strlen(b)][morsetoint(b)] = a; morsetomcode[strlen(b)][morsetoint(b)] = b; }
  35.  
  36. int tlen;
  37. char input[1024];
  38. int incodes[1024];
  39. int inlens[1024];
  40. char morse[4096];
  41. int outcodes[1024];
  42. int outlens[1024];
  43. char output[1024];
  44.  
  45. int main() {
  46.  
  47. m('A', ".-")
  48. m('B', "-...")
  49. m('C', "-.-.")
  50. m('D', "-..")
  51. m('E', ".")
  52. m('F', "..-.")
  53. m('G', "--.")
  54. m('H', "....")
  55. m('I', "..")
  56. m('J', ".---")
  57. m('K', "-.-")
  58. m('L', ".-..")
  59. m('M', "--")
  60. m('N', "-.")
  61. m('O', "---")
  62. m('P', ".--.")
  63. m('Q', "--.-")
  64. m('R', ".-.")
  65. m('S', "...")
  66. m('T', "-")
  67. m('U', "..-")
  68. m('V', "...-")
  69. m('W', ".--")
  70. m('X', "-..-")
  71. m('Y', "-.--")
  72. m('Z', "--..")
  73. m('_', "..--")
  74. m(',', ".-.-")
  75. m('.', "---.")
  76. m('?', "----")
  77.  
  78. do {
  79. char cur = getchar();
  80. if (cur < '\n') break;
  81. tlen = 0;
  82. while (cur != '\n') {
  83. input[tlen++] = cur;
  84. cur = getchar();
  85. }
  86. input[tlen] = 0;
  87. // vstup nacten
  88. for (int i = 0; i < tlen; i++) {
  89. incodes[i] = chartomorse[input[i]];
  90. inlens[i] = chartolen[input[i]];
  91. }
  92. // build morse string
  93. char *tar = morse;
  94. for (int i = 0; i < tlen; i++) {
  95. //printf("%s ", chartomcode[input[i]]);
  96. const char *cd = chartomcode[input[i]];
  97. for (; *cd; cd++)
  98. *(tar++) = *cd;
  99. //tar = strcpy(tar, chartomcode[input[i]]);
  100. }
  101. *tar = 0;
  102. printf("\n%s\n", morse);
  103. // flip lens
  104. for (int i = 0; i < tlen; i++) {
  105. outlens[i] = inlens[tlen-i-1];
  106. }
  107. // decode new morse
  108. const char *src = morse;
  109. for (int i = 0; i < tlen; i++) {
  110. outcodes[i] = morsetoint(src, outlens[i]);
  111. src += outlens[i];
  112. }
  113. // build output
  114. for (int i = 0; i < tlen; i++) {
  115. output[i] = morsetochar[outlens[i]][outcodes[i]];
  116. }
  117. output[tlen] = 0;
  118. printf("%s\n", output);
  119. } while (true);
  120. return 0;
  121. }
  122.