Golf mã EBCDIC (Chúc mừng sinh nhật, Hệ thống / 360!)


11

Sẽ sớm có 50 năm kể từ khi IBM công bố dòng máy tính System / 360 của mình. Đây là những người đầu tiên sử dụng bộ tự EBCDIC .

Để đánh dấu dịp này, hãy xem ai có thể viết chương trình ngắn nhất có khả năng chuyển đổi văn bản "thông thường" sang và từ mã EBCDIC 037. Chúng tôi sẽ sử dụng bảng dịch từ Wikipedia ánh xạ CP037 sang siêu dữ liệu ISO-8859-1 :

EBCDIC037_to_Latin1 = [
    0x00,0x01,0x02,0x03,0x9c,0x09,0x86,0x7f,0x97,0x8d,0x8e,0x0b,0x0c,0x0d,0x0e,0x0f,
    0x10,0x11,0x12,0x13,0x9d,0x85,0x08,0x87,0x18,0x19,0x92,0x8f,0x1c,0x1d,0x1e,0x1f,
    0x80,0x81,0x82,0x83,0x84,0x0a,0x17,0x1b,0x88,0x89,0x8a,0x8b,0x8c,0x05,0x06,0x07,
    0x90,0x91,0x16,0x93,0x94,0x95,0x96,0x04,0x98,0x99,0x9a,0x9b,0x14,0x15,0x9e,0x1a,
    0x20,0xa0,0xe2,0xe4,0xe0,0xe1,0xe3,0xe5,0xe7,0xf1,0xa2,0x2e,0x3c,0x28,0x2b,0x7c,
    0x26,0xe9,0xea,0xeb,0xe8,0xed,0xee,0xef,0xec,0xdf,0x21,0x24,0x2a,0x29,0x3b,0xac,
    0x2d,0x2f,0xc2,0xc4,0xc0,0xc1,0xc3,0xc5,0xc7,0xd1,0xa6,0x2c,0x25,0x5f,0x3e,0x3f,
    0xf8,0xc9,0xca,0xcb,0xc8,0xcd,0xce,0xcf,0xcc,0x60,0x3a,0x23,0x40,0x27,0x3d,0x22,
    0xd8,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0xab,0xbb,0xf0,0xfd,0xfe,0xb1,
    0xb0,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0xaa,0xba,0xe6,0xb8,0xc6,0xa4,
    0xb5,0x7e,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0xa1,0xbf,0xd0,0xdd,0xde,0xae,
    0x5e,0xa3,0xa5,0xb7,0xa9,0xa7,0xb6,0xbc,0xbd,0xbe,0x5b,0x5d,0xaf,0xa8,0xb4,0xd7,
    0x7b,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0xad,0xf4,0xf6,0xf2,0xf3,0xf5,
    0x7d,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xb9,0xfb,0xfc,0xf9,0xfa,0xff,
    0x5c,0xf7,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0xb2,0xd4,0xd6,0xd2,0xd3,0xd5,
    0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xb3,0xdb,0xdc,0xd9,0xda,0x9f];

Quy tắc:

  1. Chương trình của bạn nên có hai đầu vào: (a) một chuỗi văn bản và (b) một cờ cho biết thao tác được thực hiện.

  2. Dựa trên cờ này, chương trình của bạn sẽ chuyển đổi từng byte văn bản thành ký tự EBCDIC tương ứng hoặc ngược lại.

  3. Đầu vào có thể được lấy từ bất kỳ nguồn hợp lý nào (ví dụ: đối số dòng lệnh, stdin, đầu vào bàn phím), nhưng không được mã hóa cứng vào chương trình của bạn.

  4. Đầu ra phải được hiển thị trên màn hình (ví dụ, thiết bị xuất chuẩn, document.write) hoặc được ghi vào tệp / đường ống.

  5. Không sử dụng bất kỳ chức năng chuyển đổi mã hóa tích hợp hoặc bên ngoài ( iconv, v.v.).

  6. Đây là một thử thách , vì vậy câu trả lời ngắn nhất (ít byte nhất) sẽ giành chiến thắng.

Ví dụ:

(Lưu ý: Những ví dụ này được tạo ra trong một thiết bị đầu cuối được cấu hình để sử dụng mã hóa UTF-8. Bạn có thể thấy các kết quả khác nhau tùy thuộc vào cách hệ thống của bạn được định cấu hình. Tương đương hex chỉ được hiển thị để tham khảo và không phải được tạo bởi mã của bạn .)

Input: "HELLO WORLD", convert to EBCDIC
Output: "ÈÅÓÓÖ@æÖÙÓÄ" (0xc8c5d3d3d640e6d6d9d3c4)

Input: "ÈÅÓÓÖ@æÖÙÓÄ", convert from EBCDIC
Output: "HELLO WORLD"

Input: "lower case mostly ends up as gremlins", convert to EBCDIC
Output "" <-- unprintable in utf-8
(0x9396a68599408381a285409496a2a393a840859584a240a4974081a24087998594938995a2)

# 5 có nghĩa là ví dụ tôi không thể có chuỗi được mã hóa base64 và s.decode('base64')để có được bảng tra cứu của mình?
Claudiu

Văn bản "thông thường" là gì? ASCII? UTF-8? Một kiểu chuỗi gốc?
intx13

Có phải chúng ta đang chuyển đổi mã kiểm soát không? Hay chỉ in các ký tự? Nếu vậy, theo quy tắc nào?
intx13

@ intx13, bảng dịch nằm trong câu hỏi.
Peter Taylor

@Claudiu Điều đó sẽ hoàn toàn ổn
r3mainer

Câu trả lời:


7

Bash + tr, 240 byte

Hexdump

00000000  58 3d 27 9c 09 86 7f 97  8d 8e 0b 2d 13 9d 85 08  |X='........-....|
00000010  87 18 19 92 8f 1c 2d 1f  80 2d 84 0a 17 1b 88 2d  |......-..-.....-|
00000020  8c 05 06 07 90 91 16 93  2d 96 04 98 2d 9b 14 15  |........-...-...|
00000030  9e 1a 20 a0 e2 e4 e0 e1  e3 e5 e7 f1 a2 2e 3c 28  |.. ...........<(|
00000040  2b 7c 26 e9 ea eb e8 ed  ee ef ec df 21 24 2a 29  |+|&.........!$*)|
00000050  3b ac 5c 2d 2f c2 c4 c0  c1 c3 c5 c7 d1 a6 2c 25  |;.\-/.........,%|
00000060  5f 3e 3f f8 c9 ca cb c8  cd ce cf cc 60 3a 23 40  |_>?.........`:#@|
00000070  27 5c 27 27 3d 22 d8 61  2d 69 ab bb f0 fd fe b1  |'\''=".a-i......|
00000080  b0 6a 2d 72 aa ba e6 b8  c6 a4 b5 7e 73 2d 7a a1  |.j-r.......~s-z.|
00000090  bf d0 dd de ae 5e a3 a5  b7 a9 a7 b6 bc bd be 5b  |.....^.........[|
000000a0  5d af a8 b4 d7 7b 41 2d  49 ad f4 f6 f2 f3 f5 7d  |]....{A-I......}|
000000b0  4a 2d 52 b9 fb fc f9 fa  ff 5c 5c f7 53 2d 5a b2  |J-R......\\.S-Z.|
000000c0  d4 d6 d2 d3 d5 30 2d 39  b3 db dc d9 da 9f 27 3b  |.....0-9......';|
000000d0  5b 20 24 31 20 5d 26 26  74 72 20 04 2d ff 20 22  |[ $1 ]&&tr .-. "|
000000e0  24 58 22 7c 7c 74 72 20  22 24 58 22 20 04 2d ff  |$X"||tr "$X" .-.|

Giải pháp khá tầm thường. Đọc từ STDIN, in ra STDOUT.

Cách sử dụng

  • Để lưu tập lệnh và làm cho tập lệnh thực thi, hãy chạy các lệnh sau:

    base64 -d <<< WD0nnAmGf5eNjgstE52FCIcYGZKPHC0fgC2EChcbiC2MBQYHkJEWky2WBJgtmxQVnhogoOLk4OHj5efxoi48KCt8Junq6+jt7u/s3yEkKik7rFwtL8LEwMHDxcfRpiwlXz4/+MnKy8jNzs/MYDojQCdcJyc9IthhLWmru/D9/rGwai1yqrrmuMaktX5zLXqhv9Dd3q5eo6W3qae2vL2+W12vqLTXe0EtSa309vLz9X1KLVK5+/z5+v9cXPdTLVqy1NbS09UwLTmz29zZ2p8nO1sgJDEgXSYmdHIgBC3/ICIkWCJ8fHRyICIkWCIgBC3/ > ebcdic.sh
    chmod +x ebcdic.sh
    
  • Để chuyển đổi sang EBCDIC (mã hóa), hãy thực hiện lệnh đơn giản:

    ./ebcdic.sh
    
  • Để chuyển đổi từ EBCDIC (giải mã), chỉ định bất kỳ đối số đầu tiên:

    ./ebcdic.sh -d
    

Ý tưởng hay, nhưng tôi không thể làm cho nó hoạt động ở Darwin hoặc Debian. Bạn đang chạy nó trên hệ thống nào?
r3mainer

Tôi trộn lẫn mã hóa và giải mã. Tôi thực sự đã có hướng ngay trong phiên bản đầu tiên (sử dụng nghịch đảo của bảng tra cứu), nhưng bằng cách nào đó tôi đã xoay sở để xóa dấu ngoặc kép xung quanh các biến. Đã sửa.
Dennis

Làm việc ngay bây giờ :-)
r3mainer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.