Telegraf Cooke dan Wheatstone, lima jarum


20

Definisi

Menurut Wikipedia :

Telegraf Cooke dan Wheatstone adalah sistem telegraf listrik awal yang berasal dari tahun 1830-an yang ditemukan oleh penemu Inggris William Fothergill Cooke dan ilmuwan Inggris Charles Wheatstone. Itu adalah sistem telegraf pertama yang dimasukkan ke dalam layanan komersial. Penerima terdiri dari sejumlah jarum yang dapat digerakkan oleh kumparan elektromagnetik untuk menunjuk ke huruf di papan tulis. Fitur ini disukai oleh pengguna awal yang tidak mau belajar kode, dan pengusaha yang tidak ingin berinvestasi dalam pelatihan staf.

Ini berfungsi seperti ini:

Skema Cooke dan Wheatstone telegraf, jarum lima

Di tengah ada lima jarum, yang dapat dibelokkan searah jarum jam (seperti halnya jarum tengah) atau berlawanan arah jarum jam (seperti halnya jarum terakhir).

Dalam gambar di atas, dua jarum yang dibelokkan menunjuk ke surat G, yang berarti bahwa surat yang dikirim / diterima adalah surat G.

Perhatikan bahwa surat-surat C, J, Q, V, X, Zhilang dan dengan demikian harus diganti dengan huruf lainnya.

Tugas

Anda akan menerima karakter ABDEFGHIKLMNOPRSTUWYsebagai input, dan Anda akan menampilkan konfigurasi yang sesuai dari lima jarum, dengan tidak terdeteksi sebagai |, dibelokkan searah jarum jam sebagai /, dan dibelokkan sebagai anti-jarum jam sebagai \.

Testcases

Ini mencakup semua input yang mungkin

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

Aturan / Persyaratan

  • Setiap pengajuan harus berupa program atau fungsi lengkap. Jika itu adalah suatu fungsi, itu harus dapat dijalankan dengan hanya perlu menambahkan panggilan fungsi ke bagian bawah program. Hal lain (mis. Tajuk dalam C), harus dimasukkan.
  • Jika memungkinkan, berikan tautan ke situs tempat program Anda dapat diuji.
  • Program Anda tidak boleh menulis apa pun STDERR.
  • Celah Standar dilarang.
  • Program Anda dapat menampilkan dalam hal apa pun, tetapi harus dicetak (bukan array atau serupa).

Mencetak gol

Program-program dinilai berdasarkan byte, dalam UTF-8 secara default atau serangkaian karakter pilihan Anda.

Eventually, jawaban dengan byte terkecil akan menang.

Pengajuan

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Jawaban:


6

C, 124 107 98 byte

Sebagai fungsi:

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

Ini bekerja dengan menggunakan memutar grid 45 derajat dan mencari baris / kolom dari blok yang dihasilkan.


Sebagai eksekusi penuh (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);}

Eksekusi penuh alternatif: (bytecount yang sama tetapi mengambil input dari stdin dan menyertakan baris baru setelah keluaran)

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

Kerusakan:

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
}

Rincian alternatif:

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
}

Bonus: ekstensi 0-9 dari halaman 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);}

Bonus bonus: program lengkap (jika berantakan) untuk kedua pesan encoding dan decoding:

#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

Uji di sini

Meskipun ada banyak struktur untuk output saya belum sepenuhnya yakin saya dapat menghitung hasilnya secara efisien (dalam hal byte). Jadi ini masih tabel pencarian, tapi saya sedang membuat daftar kemungkinan konfigurasi jarum melalui permutasi daftar [0 1 2 3 4].


3

MATL , 50 byte

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

Cobalah online!

Penjelasan singkat

Kode mendekompresi string yang ditampilkan ( '!#$...J~v') menjadi string yang berisi \, |dan /; membentuk kembali menjadi array di mana setiap kolom sesuai dengan huruf; dan mengindeks array dengan karakter input.

Penjelasan panjang

String yang dikompresi telah diperoleh (offline) menggunakan pengkodean basis-3 ke basis-95. Data dari tantangan telah disusun menjadi string panjang \, |dan /, di mana setiap kelompok 5karakter sesuai dengan huruf. String ini ditafsirkan sebagai representasi basis-3 dari sejumlah besar, yang dikonversi ke basis-95, menggunakan semua karakter ASCII yang dapat dicetak sebagai digit. Hasilnya adalah string terkompresi yang muncul dalam kode ( '!#$...J~v').

Program dimulai dekompresi string ini, yaitu, mengkonversi dari dasar-95 ke basis-3 dengan alfabet \, |, /. String yang didekompresi dibentuk kembali menjadi array char 2D 5-baris, di mana setiap kolom mewakili huruf. Mari kita panggil array ini Λ. Array ini akan diindeks menggunakan titik kode ASCII dari huruf input.

Array Λmencakup dua trik:

  1. Itu telah diisi dengan nilai-nilai dummy untuk lima huruf yang hilang antara Adan Y;
  2. Dimulai dengan L(tidak A) dan kemudian dilanjutkan secara sirkuler.

Alasan kedua trik ini adalah sebagai berikut:

  1. Surat Amemiliki titik kode 65. Huruf terakhir yang perlu ditangani adalah Y, dengan titik kode 89. Jadi kita perlu menangani rentang 25nilai, bahkan jika beberapa nilai menengah (seperti huruf C) tidak ada. Untuk memudahkan pengindeksan, lima huruf yang hilang di antara Adan Ytelah diisi dengan representasi tiruan, sehingga mereka memiliki kolom di dalamnya Λ. Jadi, Λmemiliki ukuran 5 × 25.

  2. Pengindeksan modular digunakan. Jadi huruf A, atau angka 65, sama dengan 65 mod 25, yaitu 15. Oleh karena itu Aperlu di kolom 15dari Λ, Bdi kolom 16, ..., dan Ydalam kolom 14.

Kode yang dikomentari

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

Tidak ada algoritma, hanya tabel pencarian.

Disimpan 20 byte berkat @LeakyNun!

Menyimpan satu byte berkat @TheBikingViking!

Menyimpan 72 byte kekalahan berkat @Keeta!


Anda bisa menggunakan findbukan indexuntuk -1 byte.
TheBikingViking

2
Jika Anda memanfaatkan tumpang tindih garis miring, Anda dapat mengurangi sebanyak 72 karakter menjadi sesuatu seperti lambda x: r '/ ||| \ / ||| / \ ||| / | \ || / || \ | / || '[' APONM LKIHY GFEWU DBTSR'.find (x):] [: 5]
Keeta - mengembalikan Monica


1

JavaScript (ES6), 97 89 byte

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

Sunting: Disimpan 3 byte dengan beralih ke tabel pencarian yang tidak perlu padding. Disimpan 5 byte dengan mengatur elemen array alih-alih mencoba mengedit string.

Penjelasan: Tabel ABEHMDFINRGKOSULPTWYini disusun sehingga jika Anda membaginya menjadi 5 grup dengan 4 huruf yang berdekatan maka setiap huruf dalam grup berada pada /kemiringan yang sama dalam diagram, sedangkan jika Anda membaginya menjadi 5 grup dengan mengambil modulo indeks 5 maka masing-masing huruf dalam grup berada pada \kemiringan yang sama pada diagram. Kelompok-kelompok yang terakhir ini dalam urutan terbalik tetapi itu mudah ditangani dengan mengurangi dari 4. (Mengatur tabel sehingga kelompok-kelompok sebelumnya dalam urutan terbalik membutuhkan biaya lebih banyak untuk memperbaiki.)


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)="/"

Bita terakhir adalah enteryang dihasilkan secara otomatis End Function. Dengan ucapan terima kasih atas skema @Dave dirancang .

Meminta di spreadsheet atau di jendela VBA Immediate misalnya dengan ?v("K")


0

Mathematica, 129 byte

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

Fungsi anonim. Mengambil string sebagai input dan mengembalikan string yang mewakili kodenya sebagai output. Menggunakan skema pengkodean yang relatif sederhana.


0

Pyth, 27 byte

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

Ganti escapes \x94, \x18dengan byte yang sesuai.

Cobalah online

Bagaimana itu bekerja

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

Tanpa menggunakan tabel pencarian hard-coded.

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

Cobalah online

Bagaimana itu bekerja

@                                    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

Ini adalah implementasi sederhana, tetapi bisa menggunakan beberapa golf. Saran diterima.

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

Tidak Terkumpul:

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

versi yang ditampilkan adalah semua ASCII yang dapat dicetak, 79 byte. Yang kedua \\dapat diganti dengan byte tunggal yang memiliki 6 bit terakhir yang sama dengan \karakter 0x5C: 0x1C (jika kompiler Anda mengizinkannya), 0x9C atau 0xDC.

Karakter input mendongak dalam string sihir yang berisi nilai-nilai untuk Ake Y(termasuk spasi untuk karakter yang tidak didukung CJQVXkarakter dari tabel lookup ditafsirkan sebagai lima tumpang tindih kode 2-bit mana.):

01 = /   10 = \    00 or 11 = |

Kode yang dikomentari dalam program uji

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

Penjelasan:

Posisi jarum yang dibelokkan dipetakan ke 0..4, dan dianggap sebagai nomor basis-5 (2 digit). Untuk AL, angkanya "apa adanya"; untuk MZ, tambahkan 25 ke nomor tersebut. Peta ini dari variabel ake w.

Mengingat nomor yang sesuai dengan huruf, gunakan representasi basis-5: digit 5s untuk jarum pertama, digit 1s untuk jarum kedua, dan digit 25s untuk arah jarum.

Suatu program untuk menyandikan seluruh string, alih-alih satu karakter, hanya sedikit lebih lama: 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}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.