fs.cpp
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int morsetoint(const char *a) {
int out = 0;
for (const char *c = a; *c; c++) {
out <<= 1;
out |= *c == '-';
}
return out;
}
int morsetoint(const char *a, int l) {
int out = 0;
for (const char *c = a; l--; c++) {
out <<= 1;
out |= *c == '-';
}
return out;
}
int chartomorse[256];
int chartolen[256];
const char *chartomcode[256];
char morsetochar[4][16];
const char *morsetomcode[4][16];
#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; }
int tlen;
char input[1024];
int incodes[1024];
int inlens[1024];
char morse[4096];
int outcodes[1024];
int outlens[1024];
char output[1024];
int main() {
m('A', ".-")
m('B', "-...")
m('C', "-.-.")
m('D', "-..")
m('E', ".")
m('F', "..-.")
m('G', "--.")
m('H', "....")
m('I', "..")
m('J', ".---")
m('K', "-.-")
m('L', ".-..")
m('M', "--")
m('N', "-.")
m('O', "---")
m('P', ".--.")
m('Q', "--.-")
m('R', ".-.")
m('S', "...")
m('T', "-")
m('U', "..-")
m('V', "...-")
m('W', ".--")
m('X', "-..-")
m('Y', "-.--")
m('Z', "--..")
m('_', "..--")
m(',', ".-.-")
m('.', "---.")
m('?', "----")
do {
char cur = getchar();
if (cur < '\n') break;
tlen = 0;
while (cur != '\n') {
input[tlen++] = cur;
cur = getchar();
}
input[tlen] = 0;
// vstup nacten
for (int i = 0; i < tlen; i++) {
incodes[i] = chartomorse[input[i]];
inlens[i] = chartolen[input[i]];
}
// build morse string
char *tar = morse;
for (int i = 0; i < tlen; i++) {
//printf("%s ", chartomcode[input[i]]);
const char *cd = chartomcode[input[i]];
for (; *cd; cd++)
*(tar++) = *cd;
//tar = strcpy(tar, chartomcode[input[i]]);
}
*tar = 0;
printf("\n%s\n", morse);
// flip lens
for (int i = 0; i < tlen; i++) {
outlens[i] = inlens[tlen-i-1];
}
// decode new morse
const char *src = morse;
for (int i = 0; i < tlen; i++) {
outcodes[i] = morsetoint(src, outlens[i]);
src += outlens[i];
}
// build output
for (int i = 0; i < tlen; i++) {
output[i] = morsetochar[outlens[i]][outcodes[i]];
}
output[tlen] = 0;
printf("%s\n", output);
} while (true);
return 0;
}