Telegraf Cooke i Wheatstone, pięcioigłowy

20

Definicja

Według Wikipedii :

Telegraf Cooke and Wheatstone był wczesnym systemem telegraficznym z lat 30. XIX wieku, wynalezionym przez angielskiego wynalazcę Williama Fothergilla Cooke i angielskiego naukowca Charlesa Wheatstone'a. Był to pierwszy system telegraficzny wprowadzony do użytku komercyjnego. Odbiornik składał się z wielu igieł, które można przesuwać za pomocą cewek elektromagnetycznych, aby wskazywały litery na tablicy. Ta funkcja podobała się początkującym użytkownikom, którzy nie chcieli uczyć się kodów, oraz pracodawcom, którzy nie chcieli inwestować w szkolenie personelu.

Działa to tak:

Schemat telegrafu Cooke'a i Wheatstone'a, pięcioigłowy

Na środku znajduje się pięć igieł, które można odchylić zgodnie z ruchem wskazówek zegara (jak w przypadku igły środkowej) lub przeciwnie do ruchu wskazówek zegara (jak w przypadku ostatniej igły).

Na powyższym obrazku dwie odchylone igły wskazują na literę G, co oznacza, że ​​przesyłany / odbierany list jest literą G.

Zauważ, że litery C, J, Q, V, X, Zbrakuje, a więc muszą być zastąpione innymi literami.

Zadanie

Otrzymasz znak w ABDEFGHIKLMNOPRSTUWYpostaci wejściowej i wyprowadzisz odpowiednią konfigurację pięciu igieł, z nieodkształconą jako |, odchyloną zgodnie z ruchem wskazówek zegara /i odchyloną przeciwnie do ruchu wskazówek zegara jako \.

Przypadki testowe

Obejmuje to wszystkie możliwe dane wejściowe

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

Zasady / wymagania

  • Każde zgłoszenie powinno być pełnym programem lub funkcją. Jeśli jest to funkcja, musi być uruchomiona, wystarczy dodać wywołanie funkcji na dole programu. Wszystko inne (np. Nagłówki w C) musi zostać uwzględnione.
  • Jeśli to możliwe, podaj link do strony, na której można przetestować Twój program.
  • Twój program nie może nic pisać STDERR.
  • Standardowe luki są zabronione.
  • Twój program może wysyłać dane w każdym przypadku, ale musi zostać wydrukowany (nie tablica lub podobny).

Punktacja

Programy są oceniane według bajtów, domyślnie w UTF-8 lub według innego zestawu znaków.

Eventually, wygra odpowiedź z najmniej bajtami.

Zgłoszenia

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Leaky Nun
źródło

Odpowiedzi:

6

C, 124 107 98 bajtów

Jako funkcja:

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

Działa to poprzez obrócenie siatki o 45 stopni i wyszukiwanie wiersza / kolumny z wynikowego bloku.


Jako pełny plik wykonywalny (107 bajtów):

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

Alternatywny pełny plik wykonywalny: (ta sama liczba bajtów, ale pobiera dane wejściowe ze standardowego wejścia i zawiera znak nowej linii po wyjściu)

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

Awaria:

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
}

Alternatywny podział:

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: rozszerzenie 0-9 ze strony wikipedii:

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 bonusowy: kompletny (jeśli bałagan) program do kodowania i dekodowania wiadomości:

#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;
}
Dave
źródło
5

CJam, 42 bajty

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

Sprawdź to tutaj

Mimo że struktura danych wyjściowych jest duża, nie jestem jeszcze do końca pewien, czy mogę skutecznie obliczyć wyniki (pod względem bajtów). To wciąż tabela przeglądowa, ale generuję listę możliwych konfiguracji igieł poprzez permutacje listy [0 1 2 3 4].

Martin Ender
źródło
3

MATL , 50 bajtów

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

Wypróbuj online!

Krótkie wyjaśnienie

Kod dekompresji pokazany łańcuch ( '!#$...J~v') do łańcucha zawierającego \, |i /; przekształca go w tablicę, w której każda kolumna odpowiada literze; i indeksuje tę tablicę znakiem wejściowym.

Długie wyjaśnienie

Skompresowany ciąg został uzyskany (offline) przy użyciu kodowania od base-3 do base-95. Dane z tego wyzwania zostały ułożone w długi ciąg \, |i /, gdzie każda grupa 5znaków odpowiada literze. Ciąg ten jest interpretowany jako reprezentacja podstawy-3 jakiejś dużej liczby, która jest konwertowana na podstawę-95, używając wszystkich drukowalnych znaków ASCII jako cyfr. Wynikiem jest skompresowany ciąg znaków wyświetlany w kodzie ( '!#$...J~v').

Zostanie uruchomiony program dekompresji ten ciąg, czyli konwersji z bazy do bazy-95-3 z alfabetu \, |, /. Zdekompresowany ciąg znaków jest przekształcany w 5-rzędową tablicę znaków 2D, w której każda kolumna reprezentuje literę. Nazwijmy tę tablicę Λ. Ta tablica będzie indeksowana przy użyciu punktu kodowego ASCII litery wejściowej.

Tablica Λzawiera dwie sztuczki:

  1. Został wypełniony wartościami zastępczymi dla pięciu liter brakujących między Ai Y;
  2. Zaczyna się od L(nie A), a następnie kontynuuje cyklicznie.

Powody tych dwóch lew są następujące:

  1. List Ama punkt kodowy 65. Ostatnią literą, którą należy obsłużyć, jest Yz kodem 89. Musimy więc obsługiwać zakres 25wartości, nawet jeśli niektóre pośrednie (takie jak litera C) nie istnieją. Aby ułatwić indeksowanie, pięć brakujących liter pomiędzy Ai Yzostały wypełnione fikcyjną reprezentacją, więc mają kolumnę Λ. ΛMa więc rozmiar 5 × 25.

  2. Stosowane jest modułowe indeksowanie. Więc litery Alub liczby 65, jest taka sama jak 65 mod 25, że jest 15. Dlatego Amusi być w kolumnie 15z Λ, Bw kolumnie 16, ..., a Yw kolumnie 14.

Skomentowany kod

'!#$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
Luis Mendo
źródło
3

Python 2, 172 152 151 79 bajtów

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

Brak algorytmu, tylko tabela odnośników.

Zaoszczędź 20 bajtów dzięki @LeakyNun!

Zapisano bajt dzięki @TheBikingViking!

Zaoszczędź aż 72 bajty dzięki @Keeta!

Miedź
źródło
Możesz użyć findzamiast index-1 bajtu.
TheBikingViking
2
Jeśli skorzystasz z nakładania się ukośników, możesz zmniejszyć o 72 znaki do czegoś w rodzaju lambda x: r '/ ||| \ / ||| / \ ||| / | \ || / || \ | / || '[„APONM LKIHY GFEWU DBTSR”. Znajdź (x):] [: 5]
Keeta - przywróć Monikę
1

JavaScript (ES6), 97 89 bajtów

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

Edycja: Zapisano 3 bajty, przechodząc do tabeli odnośników, która nie wymaga wypełniania. Zapisano 5 bajtów, ustawiając elementy tablicy zamiast próbować edytować ciąg.

Objaśnienie: Tabela ABEHMDFINRGKOSULPTWYjest zorganizowana w taki sposób, że jeśli podzielisz ją na 5 grup 4 sąsiednich liter, to każda litera w grupie jest na tym samym /skosie na schemacie, a jeśli podzielisz ją na 5 grup, biorąc indeks indeksu 5, to każda litera w grupie jest na tym samym \skosie na schemacie. Te ostatnie grupy są w odwrotnej kolejności, ale łatwo sobie z tym poradzić, odejmując od 4. (Ułożenie tabeli tak, aby poprzednie grupy kosztowały więcej, trzeba było naprawić).

Neil
źródło
1

VBA, 106 bajtów

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

Ostatni bajt jest tym, enterktóry generuje automatycznie End Function. Z podziękowaniami dla projektu opracowanego przez @Dave .

Wywołaj w arkuszu kalkulacyjnym lub w oknie natychmiastowym VBA np. Za pomocą ?v("K")

Joffan
źródło
0

Mathematica, 129 bajtów

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

Funkcja anonimowa. Pobiera ciąg znaków jako dane wejściowe i zwraca ciąg znaków reprezentujący jego kod jako dane wyjściowe. Stosuje stosunkowo prosty schemat kodowania.

LegionMammal978
źródło
0

Pyth, 27 bajtów

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

Wymienić ucieczki \x94, \x18z odpowiednimi bajtów.

Wypróbuj online

Jak to działa

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

Bez użycia zakodowanych tabel odnośników.

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

Wypróbuj online

Jak to działa

@                                    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
Anders Kaseorg
źródło
0

Python 2, 115 111 bajtów

Jest to prosta implementacja, ale przydałoby się trochę golfa. Sugestie mile widziane.

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

Nie golfowany:

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)
Sherlock9
źródło
0

C, 78 bajtów

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

pokazana wersja to wszystkie ASCII do wydruku, 79 bajtów. Drugi \\można zastąpić dowolnym pojedynczym bajtem, który ma te same ostatnie 6 bitów, co \znak 0x5C: 0x1C (jeśli kompilator na to pozwala), 0x9C lub 0xDC.

Znak wejście jest wzrok w ciągu magicznym, który zawiera wartości Ado Y(ze spacjami dla nieobsługiwanych znaków CJQVXpostać z tabeli przeglądowej jest interpretowane jako nakładające się pięć kodów 2-bitowych gdzie.):

01 = /   10 = \    00 or 11 = |

Skomentowany kod w programie testowym

/*
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);
} 
Level River St
źródło
0

Rubin, 159 bajtów

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

Wyjaśnienie:

Pozycje odchylonych igieł są odwzorowane na 0..4 i uważane za liczbę podstawową-5 (2 cyfry). W przypadku AL liczby są „takie, jakie są”; dla MZ dodaj 25 do liczby. Mapa jest od zmiennych ado w.

Biorąc pod uwagę liczbę odpowiadającą literze, użyj jej reprezentacji podstawy-5: cyfra 5s dla pierwszej igły, cyfra 1s dla drugiej igły i cyfra 25s dla kierunków igieł.

Program do kodowania całego łańcucha zamiast jednego znaku jest tylko nieco dłuższy: 172 bajty.

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}
jose_castro_arnaud
źródło