Lý lịch
Năm 1870 Émile Baudot đã phát minh ra Baudot Code , mã hóa ký tự có độ dài cố định cho điện báo. Ông đã thiết kế mã được nhập từ bàn phím thủ công chỉ với năm phím; hai hoạt động với tay trái và ba với bên phải:
Chỉ số phải, ngón tay giữa và vòng vận hành tôi , II , và
III phím, tương ứng, và chỉ số trái và ngón tay giữa hoạt động
IV và Ⅴ . (Do đó, tôi sẽ sử dụng các chữ số Tây Ả Rập của họ, tức là
1 , đến 5. ) Các ký tự được nhập dưới dạng hợp âm. Để nhập chữ "C", ví dụ, toán tử nhấn 1 , 3 và 4các phím đồng thời, trong đó một nhánh bàn chải xoay đọc từng phím theo trình tự và truyền một dòng điện hoặc, cho các phím không bị đè, không có dòng điện. Kết quả là, theo thuật ngữ hiện đại, mã hóa nhị phân đầu tiên ít nhất có ý nghĩa 5 bit, trong đó ví dụ của chúng tôi, "C", được mã hóa thành 10110
.
5 bit ??
Bạn có thể nghĩ rằng 5 bit, có thể biểu thị tối đa 32 ký hiệu duy nhất, không đủ cho tất cả các chữ cái và chữ số tiếng Anh, không nói gì đến dấu câu. Baudot đã có một mánh khóe, mặc dù: Bộ ký tự của anh ta thực sự là hai bộ khác nhau: Chữ và
Hình , và anh ta đã xác định hai mã đặc biệt để chuyển đổi giữa chúng.
Shift Shift , chuyển sang chế độ Chữ cái, được kích hoạt bằng cách nhấn phím 5 một mình ( 00001
) và Hình Shift được kích hoạt bằng
phím 4 ( 00010
).
Thử thách
Thử thách của bạn là viết một chương trình hoặc chức năng giải mã truyền Baudot Code.
Việc truyền thực sự sẽ bắt đầu với một số bit khởi tạo, cộng với bit bắt đầu và dừng trước và sau mỗi ký tự, nhưng chúng ta sẽ bỏ qua chúng và chỉ lo lắng về 5 bit duy nhất cho mỗi ký tự. Định dạng đầu vào và đầu ra được thảo luận dưới đây.
Mã của Baudot
Có hai phiên bản khác nhau của Mã Baudot: Lục địa và Vương quốc Anh Chúng tôi sẽ sử dụng phiên bản Vương quốc Anh, không bao gồm các ký tự như "É" từ tiếng Pháp bản địa của Baudot. Chúng tôi cũng sẽ loại bỏ tất cả các biểu tượng trong phiên bản Vương quốc Anh không nằm trong số các ký tự ASCII có thể in được. Bạn sẽ chỉ phải giải mã các ký tự trong bảng bên dưới, tất cả đều là các ký tự ASCII có thể in được ngoại trừ ba ký tự điều khiển cuối cùng được giải thích bên dưới bảng.
Cột "Ltr" hiển thị các ký tự trong chế độ Chữ và "Hình" hiển thị các ký tự chế độ Hình:
Encoding Encoding
Ltr Fig 12345 Ltr Fig 12345
--- --- -------- --- --- --------
A 1 10000 P + 11111
B 8 00110 Q / 10111
C 9 10110 R - 00111
D 0 11110 S 00101
E 2 01000 T 10101
F 01110 U 4 10100
G 7 01010 V ' 11101
H 11010 W ? 01101
I 01100 X 01001
J 6 10010 Y 3 00100
K ( 10011 Z : 11001
L = 11011 - . 10001
M ) 01011 ER ER 00011
N 01111 FS SP 00010
O 5 11100 SP LS 00001
/ 11000
Ba hàng cuối cùng trong cột bên phải là các ký tự điều khiển:
ER
là tẩy xóa . Các máy điện báo của Baudot sẽ in biểu tượng giống dấu hoa thị cho nhân vật này để nói với người đọc rằng nhân vật trước nên được bỏ qua, nhưng chúng ta sẽ còn đẹp hơn với người đọc và thực sự bỏ qua (không in) ký tự trước . Nó hoạt động giống nhau trong cả chế độ Chữ và Hình.FS
là hình Shift . Thao tác này sẽ chuyển bộ ký tự từ Chữ sang Hình. Nếu các bộ giải mã là đã ở chế độ hình, FS được coi là một vũ trụ (ergoSP
trong cột "ltr"). Khi bộ giải mã ở chế độ Hình, nó sẽ ở chế độ Hình cho đến khi nhận được ký tự LS.LS
là dịch chuyển thư . Nó chuyển bộ ký tự từ hình sang chữ. Nếu bộ giải mã đã ở chế độ Letter, LS được coi là Space . Khi ở chế độ Letter, bộ giải mã vẫn ở chế độ Letter cho đến khi nhận được ký tự FS.
Bộ giải mã luôn khởi động ở chế độ Letter.
Đây là một ví dụ với hình Shift, Letter Shift và Space:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
Điều này mang lại thông điệp MAY 15TH
. Như bạn có thể thấy, ký tự đầu tiên 00001
(Shift Shift / Space) hoạt động như một khoảng trắng, bởi vì bộ giải mã đã ở chế độ Letter. Ký tự tiếp theo, 00010
(Hình Shift / Space) chuyển bộ giải mã sang chế độ Hình để in 15
. Sau đó 00001
xuất hiện lại, nhưng lần này nó hoạt động như Letter Shift để đưa bộ giải mã trở lại trong chế độ Letter.
Để thuận tiện cho bạn, đây là các ký tự có định dạng có thể dễ tiêu hóa hơn trong trình chỉnh sửa, được sắp xếp theo mã:
A,1,10000|E,2,01000|/,,11000|Y,3,00100|U,4,10100|I,,01100|O,5,11100|FS,SP,00010|J,6,10010|G,7,01010|H,,11010|B,8,00110|C,9,10110|F,,01110|D,0,11110|SP,LS,00001|-,.,10001|X,,01001|Z,:,11001|S,,00101|T,,10101|W,?,01101|V,',11101|ER,ER,00011|K,(,10011|M,),01011|L,=,11011|R,-,00111|Q,/,10111|N,,01111|P,+,11111
Đầu vào
Đầu vào sẽ là một chuỗi, mảng hoặc danh sách các bit theo thứ tự ít quan trọng nhất đầu tiên. Mỗi ký tự sẽ được đại diện bởi một nhóm 5 bit. Các bit có thể ở bất kỳ định dạng hợp lý nào, ví dụ chuỗi nhị phân, mảng 0
s và 1
s, chuỗi "0"
và "1"
ký tự, một số rất lớn, v.v., miễn là nó ánh xạ trực tiếp đến các bit của truyền.
Mỗi lần truyền sẽ có ít nhất một nhóm có thể in và nhiều nhất là 255 nhóm (có thể in hoặc bằng cách khác), tức là đã bao gồm 5 bit1,275 bit.
Các đầu vào có thể chứa chỉ các bit của việc truyền tải, với hai trường hợp ngoại lệ cho phép: Bất kỳ số ở đầu hoặc cuối 0
bit và / hoặc, đối với đầu vào chuỗi, một dấu xuống dòng duy nhất có thể được bổ sung vào việc truyền tải. Không thể thêm các bit hoặc ký tự đầu hoặc trước hoặc sau mỗi nhóm, nghĩa là bạn không thể đệm mỗi nhóm thành 8 bit (hoặc lấy mỗi nhóm thành một số trong một mảng, trừ khi ngôn ngữ của bạn có loại số nguyên 5 bit) hoặc riêng biệt các nhóm với bất kỳ bit bổ sung, ví dụ "01111\n11100"
.
Ghi chú & trường hợp cạnh
Việc truyền sẽ chỉ chứa các ký tự trong cột "Ltr" và "Hình" trong bảng trên. Bạn sẽ không bao giờ nhận được ví dụ
01110
trong chế độ Hình, vì nó không có trong cột "Hình".Giả định rằng bộ giải mã sẽ luôn ở chế độ Letter khi bắt đầu truyền. Tuy nhiên, ký tự đầu tiên có thể là ký tự FS để chuyển sang chế độ Hình ngay lập tức.
Khi bộ giải mã ở chế độ Letter, nó có thể nhận được một ký tự LS và khi ở chế độ Hình, nó có thể nhận được một ký tự FS. Trong cả hai trường hợp, một ký tự Space phải được in (xem Đầu ra).
Ký tự ER sẽ không bao giờ là ký tự đầu tiên trong truyền, cũng không bao giờ ngay lập tức đi theo LS, FS hoặc ER khác.
Một nhân vật FS có thể ngay lập tức đi theo một nhân vật LS và ngược lại.
Cả nhân vật LS và FS sẽ không phải là nhân vật cuối cùng trong bất kỳ việc truyền tải nào.
Các ký tự
/
và-
ký tự có thể được nhận ở chế độ Chữ (mã11000
và10001
, tương ứng) hoặc chế độ Hình (10111
và00111
).
Đầu ra
Đầu ra có thể ở bất kỳ định dạng hợp lý nào, hợp lý nhất là ASCII (hoặc UTF-8, với tất cả các ký tự được biểu diễn giống như ASCII). Vui lòng cho biết trong câu trả lời của bạn nếu đầu ra của bạn ở dạng mã hóa hoặc định dạng khác.
Ghi chú
- Ký tự khoảng trắng (xem 3. ở trên) phải là khoảng trắng ASCII (0x20) hoặc tương đương mã hóa của bạn, tức là những gì bạn nhận được khi nhấn thanh dấu cách.
Chiến thắng
Đây là mã golf . Mã ngắn nhất tính bằng byte thắng.
Hạn chế
Sơ hở tiêu chuẩn bị cấm.
Không gian lưu trữ và / hoặc một dòng mới duy nhất được cho phép. Không gian hàng đầu hoặc các ký tự khác (không phải là một phần của truyền) không được phép.
Bạn không được sử dụng bất kỳ chức năng thư viện hoặc chức năng tích hợp nào để giải mã Mã Baudot (hoặc bất kỳ hậu duệ nào của nó, ví dụ: Mã Murray, ITA-1, v.v.).
Các trường hợp thử nghiệm
Input: 001101000010100111101110010101
Output: BAUDOT
Input: 11010010001001100011110111101111100
Output: HELLO
Input: 01011100000010000001000101000011100000011010111010
Output: MAY 15TH
Input: 0001000100010000001000001011101110011100101010010110101010001111100101
Output: 32 FOOTSTEPS
Input: 10110000110101011100111100001111011010000001101110
Output: GOLF
Input: 000100011000001111100000100010110111001100010110010000111111
Output: 8D =( :P
Input: 0000100001000010000100010001111011111011000011100010001
Output (4 leading spaces): -/=/-
00010
được liệt kê SP
ở chế độ chữ và FS
ở chế độ hình. Theo mô tả, nếu chúng ta ở chế độ chữ cái và chúng ta nhận được mã 00010
, chúng ta nên chuyển sang chế độ hình, nhưng các giá trị trong bảng dường như ngược lại. Ngoài ra, ngược lại cho 00001
.