库克和惠斯通电报,五针


20

定义

根据维基百科

Cooke and Wheatstone电报机是一种早期的电报系统,其历史可以追溯到1830年代,由英国发明家William Fothergill Cooke和英国科学家Charles Wheatstone发明。这是第一个投入商业使用的电报系统。接收器由许多针组成,这些针可以通过电磁线圈移动以指向板上的字母。不愿意学习代码的早期用户以及不想投资于员工培训的雇主都喜欢此功能。

它的工作方式如下:

库克和惠斯通电电方案,五针

中间有五个针,可以顺时针(如中间针的情况)或逆时针(如最后一个针的情况)偏转。

在上图中,两个偏转的针指向该字母G,这意味着正在发送/接收的字母是该字母G

请注意,信件CJQVXZ失踪,因此必须与其他字母来代替。

任务

您将收到一个字符ABDEFGHIKLMNOPRSTUWY作为输入,并且将输出五根针的相应配置,未偏转为|,顺时针偏转为,逆时针/偏转为\

测试用例

这涵盖了所有可能的输入

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     \|||/

规则/要求

  • 每个提交应该是完整的程序或功能。如果它是一个函数,则只需将函数调用添加到程序底部即可使其可运行。其他任何内容(例如C中的标头)都必须包括在内。
  • 如果可能,请提供指向可以测试您的程序的站点的链接。
  • 您的程序不得向写入任何内容STDERR
  • 禁止使用标准漏洞
  • 您的程序在任何情况下都可以输出,但是必须将其打印出来(而不是数组或类似的东西)。

计分

程序根据字节评分,默认情况下为UTF-8或您选择的其他字符集。

Eventually,则字节数最少的答案将获胜。

意见书

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

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

您还可以将语言名称设置为链接,然后该链接将显示在页首横幅代码段中:

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

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

Answers:


6

C,124个 107 98字节

作为功​​能:

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]);}

通过将网格旋转45度并从生成的块中查找行/列来工作。


作为完整的可执行文件(107字节):

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);}

另一个完整的可执行文件:(相同的字节数,但从stdin接收输入,并在输出之后包含换行符)

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

分解:

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
}

备用细目:

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
}

奖励:维基百科页面的0-9扩展名:

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);}

红利红利:用于编码和解码消息的完整程序(如果杂乱无章):

#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个字节

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

在这里测试

尽管输出有很多结构,但我不确定,但我可以有效地计算结果(以字节为单位)。因此,这仍然是一个查询表,但是我正在通过list的排列生成可能的针配置的列表[0 1 2 3 4]


3

MATL,50字节

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

在线尝试!

简短说明

的代码解压缩串所示('!#$...J~v')为一个字符串包含\|/; 将其整形为数组,其中每列对应一个字母;并使用输入字符对该数组进行索引。

详细说明

已使用base-3至base-95编码获得(离线)压缩的字符串。来自质询的数据已排列为\|和的长字符串/,其中每组5字符对应一个字母。该字符串被解释为某个大数的以3为基的表示形式,并使用所有可打印的ASCII字符作为数字将其转换为以95为基。结果是出现在代码('!#$...J~v')中的压缩字符串。

该程序开始解压缩该字符串,即从基地-95转化为基-3字母\|/。将解压缩后的字符串重新整形为5行2D char数组,其中每列代表一个字母。让我们称之为这个数组Λ。该数组将使用输入字母的ASCII码点进行索引。

该数组Λ包括两个技巧:

  1. 它已经充满了五个字母之间缺失的虚拟值AY;
  2. 它以L(not A)开头,然后循环进行。

这两个技巧的原因如下:

  1. 字母A有代码点65。需要处理的最后一个字母是Y,带有代码点89。因此25,即使一些中间值(例如letter C)不存在,我们也需要处理一系列值。为便于索引,在A和之间缺少的五个字母Y已用虚拟表示填充,因此它们在中确实有一列Λ。因此,Λ具有5×25的尺寸。

  2. 使用模块化索引。所以字母A或数字6565 mod 25就是一样 15。因此A需要在的列15ΛB16...和Y列中14

注释代码

'!#$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字节

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

没有算法,只有查找表。

@LeakyNun节省了20个字节!

感谢@TheBikingViking,节省了一个字节!

感谢@Keeta,节省了多达72个字节!


您可以使用find代替index-1个字节。
TheBikingViking '16

2
如果您利用斜杠的重叠,则可以减少72个字符,例如lambda x:r'/ ||| \ / ||| / \ |||||||| / |||| // ||''['APONM LKIHY GFEWU DBTSR'.find(x):] [:5]
Keeta-恢复莫妮卡


1

JavaScript(ES6),97 89字节

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

编辑:切换到不需要填充的查找表,节省了3个字节。通过设置数组元素而不是尝试编辑字符串来节省5个字节。

说明:表格ABEHMDFINRGKOSULPTWY的组织方式是,如果将表格分为5组,每组4个相邻字母,则该组中的每个字母都在/图表中的同一斜度上;而如果通过对索引取5来将表格分为5组,则每个表格组中的字母在\图中相同。后面的组是相反的顺序,但是通过从4中减去就可以轻松处理。(安排表格以使前面的组处于相反的顺序需要花费更多的时间来修复。)


1

VBA,106个字节

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

最后一个字节是enter自动生成的End Function对该方案表示感谢,@ Dave设计了

在电子表格或VBA立即窗口中调用,例如使用 ?v("K")


0

Mathematica,129个字节

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

匿名函数。将字符串作为输入,并返回表示其代码的字符串作为输出。使用相对简单的编码方案。


0

Pyth,27个字节

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

更换逃逸\x94\x18与相应的字节。

在线尝试

怎么运行的

@                                      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)

Pyth,32个字节

无需使用任何硬编码的查找表。

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

在线尝试

怎么运行的

@                                    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字节

这是一个简单的实现,但是可能会打高尔夫球。欢迎提出建议。

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

取消高尔夫:

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个字节

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

显示的版本均为可打印的ASCII,79字节。第二\\个字节可以由任何最后一个与\字符0x5C 相同的最后6位的字节代替:0x1C(如果编译器允许),0x9C或0xDC。

在包含Ato的值的魔术字符串中查找输入字符Y(包括不支持的字符的空格CJQVX。)来自查找表的字符被解释为五个重叠的2位代码,其中:

01 = /   10 = \    00 or 11 = |

测试程序中的注释代码

/*
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个字节

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

说明:

偏转针的位置映射到0..4,并被认为是以5为底的数字(2位数字)。对于AL,数字是“原样”;对于MZ,将数字加25。映射是从a到的w

给定对应于字母的数字,请使用以5为底的表示形式:第一个针的数字为5s,第二个针的数字为1s,针的方向为25s。

用于编码整个字符串而不是一个字符的程序要长一点:172个字节。

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}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.