Arka fon
1870 yılında Émile Baudot , telgrafiyi kodlayan sabit uzunlukta bir karakter olan Baudot Kodunu icat etti . Manuel klavyeden girilecek kodu yalnızca beş tuş ile tasarladı; iki tanesi sol el ile ve üç tanesi sağ el ile kumanda edilir:
Sağ işaret, orta ve zil parmakları sırasıyla I , II ve
III tuşlarını, sol işaret ve orta parmakları IV ve Ⅴ tuşlarını kullanır
. (Bundan böyle, onların Batılı, Arap rakamları kullanacağız yani
1 yoluyla 5 .) Karakterler akor olarak girilir. Örneğin "C" harfini girmek için, operatör 1 , 3 ve 4 tuşlarına basar.tuşlar aynı anda, döner bir fırça kolu her tuşa sırayla okur ve bir akım iletir ya da, basılmamış tuşlar için akım olmaz. Sonuç, modern terimlerle, "C" örneğimizin olduğu gibi kodlandığı, 5 bitlik en az anlamlı olan ilk bitlik ikili kodlamadır 10110
.
5 bit ??
En fazla 32 benzersiz sembolü ifade edebilecek 5 bitin, tüm İngilizce harfleri ve sayıları için bile, noktalama işareti söylememesi için yeterli olmadığını düşünüyor olabilirsiniz. Ancak Baudot, kılıfını kandırdı: Karakter karakteri aslında iki ayrı setti: Harfler ve
Rakamlar ve aralarında geçiş yapmak için iki özel kod tanımladı.
Harfler moduna geçen Letter Shift , sadece 5 tuşuna ( 00001
) basılarak ve Şekil Shift , 4 tuşu ( 00010
) ile etkinleştirilir
.
Meydan okuma
Buradaki zorluk, Baudot Kodu iletimlerinin kodunu çözen bir program veya işlev yazmaktır.
Gerçek bir iletim bazı başlatma bitleriyle başlar, artı her karakterden önce ve sonra bir başlangıç ve durma biti ile başlar, ancak bunları atlayacağız ve her karakter için sadece 5 benzersiz bit için endişeleneceğiz. Giriş ve çıkış formatları aşağıda tartışılmaktadır.
Baudot Kodu
Baudot Kodunun iki farklı sürümü vardır: Kıta ve İngiltere Baudot'un ana dilindeki Fransızca'dan "É" gibi karakterler içermeyen İngiltere sürümünü kullanacağız . Ayrıca, Birleşik Krallık versiyonunda, yazdırılabilir ASCII karakterleri arasında olmayan tüm sembolleri dışarıda bırakacağız. Aşağıdaki tabloda, sadece tablonun altında açıklanan son üç kontrol karakteri dışında yazdırılabilir ASCII karakterleri olan karakterlerin kodunu çözmeniz gerekecektir.
"Ltr" sütunu, Harf modundaki karakterleri gösterir ve "Şekil", Şekil modu karakterlerini gösterir:
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
Sağ sütundaki son üç satır kontrol karakterleridir:
ER
olduğunu Silme . Baudot'un telgraf makineleri, okuyucuya önceki karakterin göz ardı edilmesi gerektiğini söylemesi için bu karaktere yıldız işareti benzeri bir simge basar, ancak okuyucuya daha iyi davranırız ve aslında önceki karakteri atlar (basmaz) . Hem Letter hem de Şekil modunda aynı şekilde hareket eder.FS
olan Şekil Kaydırma . Bu, karakter kümesini Harflerden Rakamlara değiştirir. Kod çözücü zaten Şekil modundaysa, FS Boşluk olarak değerlendirilir (SP
"Ltr" sütununda ergo ). Kod çözücü Şekil modundayken, bir LS karakteri alınana kadar Şekil modunda kalır.LS
olduğunu Harf Shift . Karakter kümesini Şekillerden Harflere değiştirir. Kod çözücü zaten Letter modundaysa, LS Boşluk olarak değerlendirilir . Letter modundayken kod çözücü, bir FS karakteri alınana kadar Letter modunda kalır.
Kod çözücü her zaman Harf modunda başlar.
İşte Şekil Değiştirme, Harf Değiştirme ve Boşluğa bir örnek:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
Bu mesaj verir MAY 15TH
. Gördüğünüz gibi, ilk 00001
(Harf Kaydırma / Boşluk) karakteri boşluk olarak işlev görür, çünkü kod çözücü zaten Harf modundadır. Bir sonraki karakter, 00010
(Figure Shift / Space), dekoderi yazdırmak için Şekil moduna getirir 15
. Sonra 00001
tekrar belirir, ancak bu sefer dekoderi Letter moduna geri döndürmek için Letter Shift işlevi görür.
Size kolaylık sağlamak için, burada bir düzenleyicide sindirilmesi daha kolay, biçimine göre sıralanmış, kodlara göre sıralanmış karakterler:
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
Giriş
Girdi, en az anlamlı bit ilk sırada bir dize, dizi veya bitlerin listesi olacaktır. Her karakter 5 bitlik bir quintet ile temsil edilecektir. Bitler,
doğrudan iletim bitlerine eşlendiği sürece herhangi bir makul formatta, örneğin bir ikili dize, bir 0
s ve 1
s dizisi , bir dize "0"
ve "1"
karakter, tek bir çok büyük sayı vb. Olabilir.
Her iletimin en az bir adet yazdırılabilir beşlisi ve en çok 255 adet beşlisi (yazdırılabilir veya başka türlü), yani 5–1,275 bit olacaktır.
Girdi, izin verilen iki istisna dışında yalnızca iletimin bitlerini içerebilir : Herhangi bir sayıda 0
satır veya iz bit ve / veya dizge girişi için iletime tek bir izleyen satır eklenebilir. Liderlik veya takip bitleri veya karakterleri , her beşlikten önce veya sonra eklenemez; yani, her beşlisi 8 bite (ya da her beşlisi bir dizide tek bir sayı olarak kabul edemezsiniz - diliniz 5 bitlik bir tamsayı tipinde değilse) veya ayrı Herhangi bir ek bit ile quintets, ör "01111\n11100"
.
Notlar ve kenar kılıfları
İletim yalnızca yukarıdaki tabloda "Ltr" ve "Fig" sütunlarındaki karakterleri içerecektir.
01110
"Şekil" sütununda bulunmadığından, örneğin Şekil modundayken asla almazsınız .Kod çözücünün bir iletimin başlangıcında her zaman Harf modunda olacağı varsayılmaktadır. Bununla birlikte, ilk karakter hemen Şekil moduna geçmek için bir FS karakteri olabilir .
Kod çözücü Letter modundayken, bir LS karakteri alabilir ve Şekil modundayken bir FS karakteri alabilir. Her iki durumda da bir Boşluk karakteri yazdırılmalıdır (Çıktıya bakın).
ER karakteri hiçbir zaman bir iletimdeki ilk karakter olmayacak ve bir LS, FS veya başka bir ER'yi de hemen izleyemeyecektir.
Bir FS karakteri hemen bir LS karakterini takip edebilir ve tam tersi de olabilir.
Ne LS ne de FS karakter hiçbir iletideki son karakter olmayacak.
/
Ve-
karakterler ya mektup modunda (kodları içine alınabilir11000
ve10001
, sırası ile) ya da Şekil modu (10111
ve00111
).
Çıktı
Çıktı, en makul olan ASCII (veya temsil edilen karakterlerin hepsinin ASCII ile aynı olduğu UTF-8) olan herhangi bir makul formatta olabilir. Lütfen çıktınızın başka bir kodlama veya formatta olup olmadığını cevabınızda belirtiniz.
notlar
- Boşluk karakteri (yukarıya bakın 3.) bir ASCII boşluğu (0x20) veya kodlamanın eşdeğeri olmalıdır, yani boşluk çubuğuna bastığınızda ne elde edersiniz.
Kazanan
Bu kod golfü . Bayt cinsinden en kısa kod kazanır.
Kısıtlamalar
Standart boşluklar yasaktır.
Sondaki boşluklara ve / veya sondaki tek bir yeni satıra izin verilir. Önde gelen boşluklara veya diğer karakterlere (iletimin parçası olmayan) izin verilmez.
Baudot Kodunu (veya onun torunlarından herhangi birini, örneğin Murray Code, ITA-1 vb.) Deşifre eden herhangi bir yerleşik veya kütüphane işlevini kullanamazsınız.
Test Kılıfları
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
olduğu gibi listelenir . Açıklamaya göre, harf modundaysak ve kod alırsak, şekil moduna geçmeliyiz, ama tablodaki değerler tersi gibi görünüyor. Ayrıca, bunun tersi de geçerlidir . SP
FS
00010
00001