Telegraphy Golf: Decode Baudot Code
Pyth, 98 97 95 93 90 83 80 bytes
The code contains unprintable characters, so here is a reversible xxd
hexdump:
00000000: 753f 7133 4a69 4832 5047 2b47 3f3c 334a u?q3JiH2PG+G?<3J
00000010: 4040 6332 2e22 275a 75ae 5751 fb4e 3cd7 @@c2."'Zu.WQ.N<.
00000020: 02ce 8719 aac1 e0e0 fe1f 09e5 85bc a767 ...............g
00000030: 8e0c 1f47 508a cad1 1acb b26f 951e e5d6 ...GP......o....
00000040: 225a 4a2a 5c20 715a 3d5a 744a 637a 356b "ZJ*\ qZ=ZtJcz5k
Try it online. Test suite.
Quite long, but the lookup table does take up most half of the space.
For 117 bytes, here's the same thing without unprintables (needs ISO-8859-1, though):
u?q3JiH2PG+G?<3J@@c2."'Zu®WQûN<×\x02Î\x87\x19ªÁààþ\x1f\tå\x85¼§g\x8e\x0c\x1fGP\x8aÊÑ\x1a˲o\x95\x1eåÖ"ZJ*\ qZ=ZtJcz5k
Or, for 93 bytes, with no compression on the lookup table:
u?q3JiH2PG+G?<3J@@c2"OVDPYSBREXGMIWFNA-JKUTCQ/ZHL5'0+3;8-2;7);?;;1.6(4;9/;:;="ZJ*\ qZ=ZtJcz5k
JavaScript (ES6), 160 158 153 bytes
let f =
s=>s.replace(/.{5}/g,s=>(n='0b'+s-1)<2?m-n?(m^=1,''):' ':"? !YSBREXGMIWFNA-JKUTCQ/ZHLOVDP? ?!3 8-2 7) ? 1.6(4 9/ : =5'0+"[n+m*32],m=0).replace(/.!/g,'')
console.log(f("001101000010100111101110010101"));
console.log(f("11010010001001100011110111101111100"));
console.log(f("01011100000010000001000101000011100000011010111010"));
console.log(f("0001000100010000001000001011101110011100101010010110101010001111100101"));
console.log(f("10110000110101011100111100001111011010000001101110"));
console.log(f("000100011000001111100000100010110111001100010110010000111111"));
console.log(f("0000100001000010000100010001111011111011000011100010001"));
Batch, 306 304 bytes
@echo off
set/pc=
set r=
set d=! !!YSBREXGMIWFNA-JKUTCQ/ZHLOVDP!! !3!8-2!7)!?!!1.6(4!9/!:!=5'0+
set s=2
:l
set/an=(s^&32)+0%c:~,2%%%6*8+0x%c:~2,3%%%14
set c=%c:~5%
if %n%==%s% set/as^^=35&goto l
call set r=%%r%%%%d:~%n%,1%%
if %r:~-1%==! set r=%r:~,-2%&goto l
if not "%c%"=="" goto l
echo %r%
Takes input on STDIN. Since Batch has no binary conversion, I have to fake it using octal and hex conversion.
- The first two digits are converted from octal (I can't use decimal because the first digit might be
0
). Possible values are00
,01
,10
and11
. The latter two have value8
and9
but I want2
or3
so I take the remainder modulo6
. - The last three digits are converted from hexadecimal. Digits are either
14
or252
times their desired value, to I take the remainder modulo14
(252=14*18
). c
is the coded stringr
is the result so fard
is the decoding arrays
is the the index (taking the shift state into account) of the character that switches shift staten
is the binary decode plus bit 5 ofs
, which either equals the shift state, in which case the shift state is toggled, or indexes into the decoding array to find the next character (or ! to erase)