Máy điện báo Cooke và Wheatstone, năm kim


20

Định nghĩa

Theo Wikipedia :

Máy điện báo Cooke và Wheatstone là một hệ thống điện báo đầu tiên có từ những năm 1830 được phát minh bởi nhà phát minh người Anh William Fothergill Cooke và nhà khoa học người Anh Charles Wheatstone. Đó là hệ thống điện báo đầu tiên được đưa vào dịch vụ thương mại. Máy thu bao gồm một số kim có thể được di chuyển bằng cuộn điện từ để chỉ vào các chữ cái trên bảng. Tính năng này được yêu thích bởi những người dùng đầu tiên không muốn học mã và các nhà tuyển dụng không muốn đầu tư vào đào tạo nhân viên.

Nó hoạt động như thế này:

Sơ đồ điện báo Cooke và Wheatstone, năm kim

Ở giữa là năm kim, có thể bị lệch theo chiều kim đồng hồ (như trường hợp của kim giữa) hoặc ngược chiều kim đồng hồ (như trường hợp của kim cuối cùng).

Trong hình trên, hai kim bị lệch hướng đến chữ cái G, có nghĩa là chữ được truyền / nhận là chữ cái G.

Lưu ý rằng các chữ cái C, J, Q, V, X, Zđang thiếu và do đó phải được thay thế bằng chữ cái khác.

Bài tập

Bạn sẽ nhận được một ký tự ABDEFGHIKLMNOPRSTUWYlàm đầu vào và bạn sẽ xuất cấu hình tương ứng của năm kim, với độ |lệch không bị lệch, lệch theo chiều kim đồng hồ /, và bị lệch theo chiều kim đồng hồ \.

Tủ thử

Điều này bao gồm tất cả các đầu vào có thể

input output
A     /|||\
B     /||\|
D     |/||\
E     /|\||
F     |/|\|
G     ||/|\  (explanation: see above)
H     /\|||
I     |/\||
K     ||/\|
L     |||/\
M     \/|||
N     |\/||
O     ||\/|
P     |||\/
R     \|/||
S     |\|/|
T     ||\|/
U     \||/|
W     |\||/
Y     \|||/

Quy tắc / Yêu cầu

  • Mỗi bài nộp phải là một chương trình hoặc chức năng đầy đủ. Nếu nó là một hàm, nó phải được chạy bằng cách chỉ cần thêm lệnh gọi hàm vào cuối chương trình. Bất cứ điều gì khác (ví dụ như các tiêu đề trong C), phải được bao gồm.
  • Nếu có thể, hãy cung cấp một liên kết đến một trang web nơi chương trình của bạn có thể được kiểm tra.
  • Chương trình của bạn không được viết bất cứ điều gì STDERR.
  • Lỗ hổng tiêu chuẩn bị cấm.
  • Chương trình của bạn có thể xuất ra trong mọi trường hợp, nhưng nó phải được in (không phải là một mảng hoặc tương tự).

Chấm điểm

Các chương trình được ghi theo byte, theo UTF-8 theo mặc định hoặc một bộ ký tự khác bạn chọn.

Eventually, câu trả lời có ít byte nhất sẽ giành chiến thắng.

Đệ trình

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

# Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Câu trả lời:


6

C, 124 107 98 byte

Là một chức năng:

x,i;W(char*v){for(i=strcspn(" MRUYH NSWEI OTBFK PADGL",v);x<5;++x)putchar(x^i%5?x^i/5?124:92:47);}

// main(int c,char**v){W(v[1]);}

Điều này hoạt động bằng cách sử dụng xoay lưới 45 độ và tìm kiếm hàng / cột từ khối kết quả.


Là một thực thi đầy đủ (107 byte):

x;main(i,v)char**v;{for(i=strcspn(" MRUYH NSWEI OTBFK PADGL",v[1]);x<5;++x)putchar(x^i%5?x^i/5?124:92:47);}

Một thực thi đầy đủ thay thế: (cùng bytecount nhưng lấy đầu vào từ stdin và bao gồm dòng mới sau đầu ra)

main(i){char*r=" MRUYH NSWEI OTBFK PADGL",b[]="|||||";i=strchr(r,getchar())-r;b[i%5]=47;b[i/5]=92;puts(b);}

Phá vỡ:

x;                                      // Implicit int declaration
main(i,v)char**v;{                      // K&R function declaration to save a byte
    for(i=strcspn("<...>",v[1]);        // Find index of input in lookup table
        x<5;++x)                        // Loop 0 to 4
        putchar(x^i%5?x^i/5?124:92:47); //  Print /, \ or | depending on value of i
}

Sự cố thay thế:

main(i){
    char*r="<...>",                     // Store lookup table
    b[]="|||||";                        // Malleable base string for return
    i=strchr(r,getchar())-r;            // Find input in lookup table
    b[i%5]=47;                          // Set correct char in output to /
    b[i/5]=92;                          // Set correct char in output to \
    puts(b);                            // Print result
}

Phần thưởng: 0-9 phần mở rộng từ trang wikipedia:

x;main(i,v)char**v;{for(i=strcspn(" MRUY6H NSW7EI OT8BFK P9ADGL 012345",v[1]);x<5;++x)putchar(x^i%6?x^i/6?124:92:47);}

Phần thưởng tiền thưởng: một chương trình hoàn chỉnh (nếu lộn xộn) cho cả tin nhắn mã hóa và giải mã:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>

static const char *REF = " MRUY6H NSW7EI OT8BFK P9ADGL 012345 ";

char sub(char c) {
    c = toupper(c);
    if(c == 'C') { c = 'K'; }
    if(c == 'J') { c = 'G'; }
    if(c == 'Q') { c = 'K'; }
    if(c == 'V') { c = 'W'; }
    if(c == 'X') { c = 'S'; }
    if(c == 'Z') { c = 'S'; }
    return c;
}

void print_encoded(char c) {
    char b[] = "|||||";
    const char *p = strchr(REF, sub(c));
    if(!p) { return; }
    int i = p - REF;
    if(i) {
        if(i%6 < 5) { b[i%6] = '/'; }
        if(i/6 < 5) { b[i/6] = '\\';}
    }
    puts(b);
}

char decode(const char *m) {
    int pf = 5;
    int pb = 5;
    for(int x=0;x<5;++x) {
        if(m[x] == '/') {
            pf=x;
        } else if(m[x] == '\\') {
            pb=x;
        } else if(m[x] == '\0') {
            return '!';
        }
    }
    return REF[pb*6+pf];
}

int main(int c, const char **v) {
    int inArg;
    bool isDecode;
    if(c > 1 && (strcmp(v[1], "-h") == 0 || strcmp(v[1], "--help") == 0)) {
        printf("Usage:\n  %s [-d] [<input>]\n\n", v[0]);
        printf("Converts input to/from Cooke and Wheatstone 5-needle encoding.\n\n");
        printf("If no input arguments are given, takes input from stdin.\n\n");
        printf("Parameters:\n");
        printf("  -h --help   Displays help.\n");
        printf("  -d --decode Switches to decode mode.\n");
        printf("\n");
        return 0;
    } else if(c > 1 && (strcmp(v[1], "-d") == 0 || strcmp(v[1], "--decode") == 0)) {
        inArg = (c > 2 ? 2 : 0);
        isDecode = true;
    } else if(c > 1) {
        inArg = 1;
        isDecode = false;
    } else {
        inArg = 0;
        isDecode = false;
    }
    if(isDecode) {
        if(inArg == 0) {
            char ln[6];
            while(scanf("%5s", ln) == 1) {
                putchar(decode(ln));
            }
        } else {
            for(int p = inArg; p < c; ++p) {
                for(const char *q = v[p], *e = strchr(v[p], '\0'); q < e; q += 5) {
                    while(*q == ' ') { ++q; }
                    putchar(decode(q));
                }
            }
        }
        putchar('\n');
    } else {
        if(inArg == 0) {
            int c;
            while((c = getchar()) != EOF) {
                print_encoded(c);
            }
        } else {
            for(const char *p = v[inArg]; *p; ++p) {
                print_encoded(*p);
            }
        }
    }
    return 0;
}

5

CJam, 42 byte

r"HEBAMRUYIFDNSWKGOTLP"5e!{_$"/\|"er}%_&er

Kiểm tra nó ở đây

Mặc dù có rất nhiều cấu trúc cho các kết quả đầu ra nhưng tôi không hoàn toàn chắc chắn rằng tôi có thể tính toán các kết quả một cách hiệu quả (tính theo byte). Vì vậy, đây vẫn là một bảng tra cứu, nhưng tôi đang tạo danh sách các cấu hình kim có thể thông qua hoán vị của danh sách [0 1 2 3 4].


3

MATL , 50 byte

'!#$kYAqof^EZC}40iA*9n4JK?45/J~v'6Y2'\|/'Za5eioZ)!

Hãy thử trực tuyến!

Giải thích ngắn

Mã này decompresses chuỗi hiển thị ( '!#$...J~v') vào một chuỗi chứa \, |/; định hình lại nó thành một mảng trong đó mỗi cột tương ứng với một chữ cái; và lập chỉ mục mảng đó với ký tự đầu vào.

Giải thích dài

Chuỗi đã nén đã được lấy (ngoại tuyến) bằng cách sử dụng mã hóa cơ sở 3 đến cơ sở 95. Các dữ liệu từ các thách thức đã được sắp xếp thành một chuỗi dài \, |/, trong đó mỗi nhóm 5ký tự tương ứng với một lá thư. Chuỗi này được hiểu là đại diện cơ sở 3 của một số số lớn, được chuyển đổi thành cơ sở 95, sử dụng tất cả các ký tự ASCII có thể in dưới dạng chữ số. Kết quả là chuỗi nén xuất hiện trong mã ( '!#$...J~v').

Chương trình bắt đầu giải nén chuỗi này, có nghĩa là, chuyển đổi từ cơ sở-95 tới căn cứ-3 với bảng chữ cái \, |, /. Chuỗi giải nén được định hình lại thành một mảng char 5 hàng, trong đó mỗi cột đại diện cho một chữ cái. Hãy để chúng tôi gọi mảng này Λ. Mảng này sẽ được lập chỉ mục bằng cách sử dụng điểm mã ASCII của chữ cái đầu vào.

Mảng Λbao gồm hai thủ thuật:

  1. Nó đã được lấp đầy với các giá trị giả cho năm chữ cái bị thiếu giữa AY;
  2. Nó bắt đầu bằng L(không A) và sau đó tiến hành theo vòng tròn.

Những lý do cho hai thủ thuật này như sau:

  1. Thư Acó điểm mã 65. Chữ cái cuối cùng cần xử lý là Y, với điểm mã 89. Vì vậy, chúng ta cần xử lý một loạt các 25giá trị, ngay cả khi một số giá trị trung gian (như chữ cái C) không tồn tại. Để tạo điều kiện lập chỉ mục, năm chữ cái bị thiếu giữa AYđã được điền vào một đại diện giả, vì vậy chúng có một cột trong Λ. Do đó, Λcó kích thước 5 × 25.

  2. Lập chỉ mục mô-đun được sử dụng. Vì vậy, chữ cái A, hoặc số 65, là giống như 65 mod 25, đó là 15. Do đó, Acần phải ở trong cột 15của Λ, Btrong cột 16, ... và Ytrong cột 14.

Mã nhận xét

'!#$kYAqof^EZC}40iA*9n4JK?45/J~v'     % Compressed string (in base-95)
6Y2                                   % Predefined literal 'AB...Z': source alphabet
                                      % for decompression
'\|/'                                 % Target alphabet for decompression
Za                                    % Change of base representation (decompress)
5e                                    % Reshape into 5-row array `Λ`
i                                     % Input letter
o                                     % Convert to number (ASCII code point)
Z)                                    % Use as column index into `Λ`
!                                     % Transpose into a row. Implicitly display

3

Python 2, 172 152 151 79 byte

lambda x:r'/|||\/|||/\|||/|\||/||\|/||'['APONM LKIHY GFEWU DBTSR'.find(x):][:5]

Không có thuật toán, chỉ là một bảng tra cứu.

Đã lưu 20 byte nhờ @LeakyNun!

Đã lưu một byte nhờ @TheBikingViking!

Đã tiết kiệm được 72 byte nhờ @Keeta!


Bạn có thể sử dụng findthay vì indexcho -1 byte.
TheBikingViking

2
Nếu bạn tận dụng sự chồng chéo của các dấu gạch chéo, bạn có thể giảm 72 ký tự thành một cái gì đó như lambda x: r '/ ||| \ / ||| / \ ||| / | \ || / || \ | / || '[' APONM LKIHY GFEWU DBTSR'.find (x):] [: 5]
Keeta - phục hồi Monica


1

JavaScript (ES6), 97 89 byte

c=>(n=`ABEHMDFINRGKOSULPTWY`.search(c),s=[...`|||||`],s[4-n%5]=`\\`,s[n>>2]=`/`,s.join``)

Chỉnh sửa: Đã lưu 3 byte bằng cách chuyển sang bảng tra cứu không cần đệm. Đã lưu 5 byte bằng cách đặt các phần tử mảng thay vì cố gắng chỉnh sửa một chuỗi.

Giải thích: Bảng ABEHMDFINRGKOSULPTWYđược sắp xếp sao cho nếu bạn chia nó thành 5 nhóm 4 chữ cái liền kề thì mỗi chữ cái trong nhóm sẽ nằm trên cùng một /biểu đồ, trong khi nếu bạn chia nó thành 5 nhóm bằng cách lấy chỉ số modulo 5 thì mỗi nhóm chữ cái trong nhóm nằm trên cùng một \sơ đồ. Các nhóm sau này theo thứ tự ngược lại nhưng điều đó dễ dàng được xử lý bằng cách trừ đi 4. (Sắp xếp bảng sao cho các nhóm trước theo thứ tự ngược lại tốn nhiều chi phí hơn để khắc phục.)


1

VBA, 106 byte

Function v(s):v="|||||":p=InStr(1,v &"MRUYH NSWEI OTBFK PADGL",s):Mid(v, p\5)="\":Mid(v, (p Mod 5)+1)="/"

Byte cuối cùng là entertự động tạo End Function. Với sự thừa nhận cho chương trình @Dave đã nghĩ ra .

Gọi vào bảng tính hoặc trong cửa sổ VBA ngay lập tức, ví dụ như với ?v("K")


0

Toán học, 129 byte

""<>(IntegerDigits[IntegerDigits[36^^3ucgb2abu46m2rewohw225q4lc6hczypueyb3,190][[LetterNumber@#]],3,5]/.{0->"|",1->"/",2->"\\"})&

Chức năng ẩn danh. Lấy một chuỗi làm đầu vào và trả về một chuỗi đại diện cho mã của nó là đầu ra. Sử dụng một sơ đồ mã hóa tương đối đơn giản.


0

Bình thường, 27 byte

@{.p"/|\||"x."AW
Ú/Ç\x94E\x18µð££

Thay thế các lối thoát \x94, \x18với các byte tương ứng.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

@                                      index into this list:
  .p"/|\||"                              permutations of /|\||
 {                                       deduplicate
                                       at index:
            ."AW\nÚ/Ç\x94E\x18µð££"      compressed string: EBAHIFDNSWKGOTLPMRU
           x                       Q     index in that of input (or -1 for Y)

Bình thường, 32 byte

Không sử dụng bất kỳ bảng tra cứu mã hóa cứng.

@o-xN\/xN\\{.p"/\|||"x-rG2"CJQVX

Dùng thử trực tuyến

Làm thế nào nó hoạt động

@                                    index into this list:
            .p"/\|||"                  all permutations of /\|||
           {                           deduplicate
 o                                     sort by the following key for N in the list:
   xN\/                                  index of / in N
  -    xN\\                              … minus index of \ in N
                                     at index:
                       rG2             capitalized alphabet
                      -   "CJQVX"      minus CJQVX
                     x           Q     index in that of input

0

Python 2, 115 111 byte

Đây là một thực hiện đơn giản, nhưng nó có thể sử dụng một số môn đánh gôn. Gợi ý chào mừng.

def f(c):s=["|"]*5;a=0xdb52384ebd9f46caa72899c838d50/25**(ord(c)-65)%25;s[a/5]="/";s[a%5]="\\";return''.join(s)

Ung dung:

def f(c):
    s = ["|"] * 5
    d = ord(c) - 65
    # 0xdb52384ebd9f46caa72899c838d50 is our lookup number
    # 0040004100304231200043322110342300120124130214000304
    # in hexadecimal
    a = 0xdb52384ebd9f46caa72899c838d50 / 25**d % 25
    s[a/5] = "/"
    s[a%5] = "\\"
    return ''.join(s)

0

C, 78 byte

i;f(x){for(i=5;i--;)putchar("|/\\|"["^\\ NXLFPH DBow{} gsyc q a"[x-65]>>i&3]);}

phiên bản hiển thị là tất cả ASCII có thể in, 79 byte. Thứ hai \\có thể được thay thế bằng bất kỳ byte đơn nào có cùng 6 bit cuối cùng với \ký tự 0x5C: 0x1C (nếu trình biên dịch của bạn cho phép nó), 0x9C hoặc 0xDC.

Nhân vật đầu vào được ngẩng đầu lên trong chuỗi ma thuật, trong đó có giá trị cho Ađến Y(bao gồm cả không gian cho các nhân vật không được hỗ trợ CJQVXcác nhân vật từ các bảng tra cứu được hiểu là năm chồng chéo mã 2-bit ở đâu.):

01 = /   10 = \    00 or 11 = |

Mã nhận xét trong chương trình thử nghiệm

/*
magic string codes: bytes are 01XXXXXX
A     /|||\ 011110 ^
B     /||\| 011100 \\
D     |/||\ 001110 N 
E     /|\|| 011000 X
F     |/|\| 001100 L
G     ||/|\ 000110 F
H     /\||| 010000 P
I     |/\|| 001000 H
K     ||/\| 000100 D
L     |||/\ 000010 B
M     \/||| 101111 o
N     |\/|| 110111 w
O     ||\/| 111011 {
P     |||\/ 111101 }
R     \|/|| 100111 g
S     |\|/| 110011 s
T     ||\|/ 111001 y
U     \||/| 100011 c
W     |\||/ 110001 q
Y     \|||/ 100001 a

                                     ABBCDEFGHIJKLMNOPQRSTUVWXY*/
i;f(x){for(i=5;i--;)putchar("|/\\|"["^\\ NXLFPH DBow{} gsyc q a"[x-65]>>i&3]);}

j;
main(){
  j=getchar();
  f(j);
} 

0

Ruby, 159 byte

v=[1,2,3,4,7,8,9,13,14,19];w=v+v.map{|e|25+e};a="HEBAIFDKGLMRUYNSWOTP";b="\\/"
x=w[a.index($*[0][0])];g="|"*5;y=(x>25)?0:1;g[(x/5)%5]=b[y];g[x%5]=b[1-y];puts g

Giải trình:

Vị trí của các kim bị lệch được ánh xạ đến 0..4 và được coi là số cơ sở 5 (2 chữ số). Đối với AL, các số là "nguyên trạng"; đối với MZ, thêm 25 vào số. Bản đồ là từ các biến ađến w.

Cho số tương ứng với chữ cái, sử dụng đại diện cơ sở 5 của nó: chữ số 5s cho kim đầu tiên, chữ số 1s cho kim thứ hai và chữ số 25 cho hướng của kim.

Một chương trình mã hóa toàn bộ một chuỗi, thay vì một ký tự, chỉ dài hơn một chút: 172 byte.

v=[1,2,3,4,7,8,9,13,14,19];w=v+v.map{|e|25+e};a="HEBAIFDKGLMRUYNSWOTP";b="\\/"
$*[0].each_char{|c|x=w[a.index(c)];g="|"*5;y=(x>25)?0:1;g[(x/5)%5]=b[y];g[x%5]=b[1-y];puts g}
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.