โทรเลข Cooke และ Wheatstone ห้าเข็ม


20

คำนิยาม

ตามที่Wikipedia :

โทรเลข Cooke และ Wheatstone เป็นระบบโทรเลขไฟฟ้ายุคแรกที่สร้างขึ้นตั้งแต่ยุค 1830 ที่ประดิษฐ์โดยนักประดิษฐ์ชาวอังกฤษ William Fothergill Cooke และนักวิทยาศาสตร์ชาวอังกฤษ Charles Wheatstone มันเป็นระบบโทรเลขแรกที่ให้บริการเชิงพาณิชย์ ตัวรับประกอบด้วยเข็มจำนวนหนึ่งซึ่งสามารถเคลื่อนย้ายโดยขดลวดแม่เหล็กไฟฟ้าเพื่อชี้ไปที่ตัวอักษรบนกระดาน ฟีเจอร์นี้เป็นที่ชื่นชอบของผู้ใช้งานยุคแรกที่ไม่ต้องการเรียนรู้รหัสและนายจ้างที่ไม่ต้องการลงทุนในการฝึกอบรมพนักงาน

มันได้ผลเช่นนี้:

โครงการโทรเลข Cooke และ Wheatstone ห้าเข็ม

ตรงกลางมีเข็มห้าเข็มซึ่งสามารถเบี่ยงเบนเข็มนาฬิกาตามเข็มนาฬิกา (เช่นในกรณีของเข็มกลาง) หรือเข็มนาฬิกาทวนเข็มนาฬิกา (เช่นกรณีของเข็มสุดท้าย)

ในภาพข้างต้นสองเข็มหักเหชี้ไปที่ตัวอักษรGซึ่งหมายความว่าตัวอักษรที่ถูกส่ง / Gรับเป็นตัวอักษร

โปรดทราบว่าตัวอักษรC, J, Q, V, X, Zหายไปจึงต้องได้รับการแทนที่ด้วยตัวอักษรอื่น ๆ

งาน

คุณจะได้รับตัวละครในABDEFGHIKLMNOPRSTUWYเป็น input และคุณจะส่งออกการกำหนดค่าที่สอดคล้องกันของห้าเข็มกับ undeflected เป็น|เบี่ยงเบนเข็มนาฬิกาเป็นและหักเหทวนเข็มนาฬิกาเป็น/\

Testcases

ซึ่งจะครอบคลุมอินพุตที่เป็นไปได้ทั้งหมด

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

ลีดเดอร์บอร์ด

นี่คือ Stack Snippet เพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

คำตอบ:


6

C, 124 107 98 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);}

ทางเลือกที่สามารถใช้งานได้แบบเต็มรูปแบบ: (bytecount เดียวกัน แต่รับอินพุตจาก 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

ทดสอบที่นี่

แม้ว่าจะมีโครงสร้างจำนวนมากสำหรับผลลัพธ์ที่ฉันไม่แน่ใจทั้งหมด แต่ฉันสามารถคำนวณผลลัพธ์ได้อย่างมีประสิทธิภาพ (ในรูปของไบต์) ดังนั้นนี้ยังคงเป็นตารางการค้นหา [0 1 2 3 4]แต่ฉันสร้างรายการของการกำหนดค่าเข็มไปได้ผ่านทางพีชคณิตของรายการ


3

MATL , 50 ไบต์

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

ลองออนไลน์!

คำอธิบายสั้น ๆ

รหัส decompresses สตริงแสดงอยู่ ( '!#$...J~v') เป็นสตริงที่มี\, |และ/; ปรับรูปร่างใหม่ให้เป็นอาร์เรย์ที่แต่ละคอลัมน์สอดคล้องกับตัวอักษร และดัชนีที่อาร์เรย์ด้วยอักขระอินพุต

คำอธิบายยาว ๆ

สตริงที่บีบอัดได้รับมา (ออฟไลน์) โดยใช้การเข้ารหัสฐาน -3 ถึงฐาน -95 ข้อมูลที่ได้จากความท้าทายที่ได้รับการจัดเป็นสายยาวของ\, |และ/ที่แต่ละกลุ่ม5สอดคล้องกับตัวอักษรตัวอักษร สายนี้ถูกตีความว่าเป็นตัวแทนฐาน 3 ของจำนวนมากบางส่วนซึ่งถูกแปลงเป็นฐาน -95 โดยใช้ตัวอักษร ASCII ที่พิมพ์ได้ทั้งหมดเป็นตัวเลข ผลลัพธ์ที่ได้คือสตริงที่บีบอัดที่ปรากฏในรหัส ( '!#$...J~v')

โปรแกรมจะเริ่มคลายสายนี้ซึ่งก็คือการแปลงจากฐาน-95 ไปยังฐานที่ 3 ที่มีตัวอักษร\, ,| /สตริงที่คลายการบีบอัดจะถูกเปลี่ยนรูปร่างเป็นอาร์เรย์ 2D ถ่าน 5 แถวซึ่งแต่ละคอลัมน์แสดงถึงตัวอักษร ให้เราเรียกอาร์เรย์นี้Λว่า อาร์เรย์นี้จะได้รับการจัดทำดัชนีโดยใช้รหัสจุด ASCII ของจดหมายที่ป้อน

อาร์เรย์Λมีสองเทคนิค:

  1. มันเต็มไปด้วยค่าตัวอย่างสำหรับตัวอักษรห้าตัวที่หายไประหว่างAและY;
  2. มันเริ่มต้นด้วยL(ไม่ A) แล้วดำเนินการเป็นวงกลม

เหตุผลสำหรับเทคนิคทั้งสองนี้มีดังนี้:

  1. จดหมายมีจุดรหัสA 65จดหมายฉบับสุดท้ายที่จะต้องจัดการคือมีจุดรหัสY 89ดังนั้นเราจึงต้องจัดการกับช่วงของ25ค่าแม้ว่าบางสื่อกลาง (เช่นจดหมายC) ไม่มีอยู่ เพื่ออำนวยความสะดวกในการจัดทำดัชนีตัวอักษรห้าตัวที่ขาดหายไประหว่างAและYถูกเติมด้วยตัวแทนจำลองดังนั้นพวกเขาจึงมีคอลัมน์Λมา ดังนั้นจึงΛมีขนาด 5 × 25

  2. ใช้การทำดัชนีแบบแยกส่วน ดังนั้นตัวอักษรAหรือตัวเลข65เป็นเช่นเดียวกับที่เป็น65 mod 25 15ดังนั้นAจะต้องอยู่ในคอลัมน์15ของΛ, Bในคอลัมน์16... และในคอลัมน์Y14

รหัสแสดงความคิดเห็น

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

ไม่มีอัลกอริทึมเพียงแค่ตารางการค้นหา

บันทึก 20 ไบต์ขอบคุณ @LeakyNun!

บันทึกเป็นไบต์ด้วย @TheBikingViking!

บันทึก72ไบต์ขนาดมหึมาต้องขอบคุณ @Keeta!


คุณสามารถใช้findแทนindex-1 ไบต์
TheBikingViking

2
หากคุณใช้ประโยชน์จากการทับซ้อนของเครื่องหมายทับคุณสามารถลดได้ 72 ตัวอักษรสำหรับบางสิ่งเช่นแลมบ์ดา 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 bytes

นี่เป็นการใช้งานที่ง่าย แต่ก็สามารถใช้ตีกอล์ฟได้ ยินดีต้อนรับข้อเสนอแนะ

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

Ungolfed:

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 ไบต์ วินาที\\สามารถถูกแทนที่ด้วยไบต์เดี่ยวใด ๆ ที่มี 6 บิตสุดท้ายเหมือนกับ\อักขระ 0x5C: 0x1C (ถ้าคอมไพเลอร์ของคุณอนุญาต), 0x9C หรือ 0xDC

อักขระอินพุตถูกค้นหาในสตริงมายากลซึ่งมีค่าสำหรับAถึง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

ทับทิม, 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 ไปยังหมายเลข แผนที่จากตัวแปรที่จะaw

ให้ตัวเลขที่ตรงกับตัวอักษรให้ใช้การแทนเบส -5: หลัก 5 หลักสำหรับเข็มแรก, 1 หลักสำหรับเข็มที่สองและ 25 หลักสำหรับเข็มของเข็ม

โปรแกรมที่จะเข้ารหัสสตริงทั้งหมดแทนที่จะเป็นหนึ่งตัวอักษรมีความยาวเพียงเล็กน้อย: 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}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.