Телеграф Кука и Уитстона, пятиигольный


20

Определение

Согласно Википедии :

Телеграф Кука и Уитстона был ранней электрической телеграфной системой, датируемой 1830-ми годами, изобретенной английским изобретателем Уильямом Фотергиллом Куком и английским ученым Чарльзом Уитстоном. Это была первая телеграфная система, введенная в коммерческую эксплуатацию. Приемник состоял из нескольких игл, которые могли перемещаться электромагнитными катушками, чтобы указывать на буквы на доске. Эта функция понравилась ранним пользователям, которые не желали изучать коды, и работодателям, которые не хотели вкладывать средства в обучение персонала.

Это работает так:

Схема телеграфа Кука и Уитстона, пятиигольная

В середине находятся пять игл, которые могут быть отклонены по часовой стрелке (как в случае средней иглы) или против часовой стрелки (как в случае последней иглы).

На рисунке выше две отклоненные иглы указывают на букву G, что означает, что передаваемое / полученное письмо является буквой G.

Обратите внимание , что буквы C, J, Q, V, X, Zотсутствуют и , следовательно , должны быть заменены другими буквами.

задача

Вы получите символ в ABDEFGHIKLMNOPRSTUWYкачестве входных данных и выведите соответствующую конфигурацию из пяти игл с неотклоненным как |, отклоненным по часовой стрелке как /и отклоненным против часовой стрелки как \.

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ответ с наименьшим количеством байтов выиграет.

Материалы

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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

Leaderboard

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Ответы:


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

Альтернативный полный исполняемый файл: (тот же bytecount, но принимает ввод из стандартного ввода и включает перевод строки после вывода)

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

Попробуйте онлайн!

Краткое объяснение

Код распаковывает показанную строку ( '!#$...J~v') в строку, содержащую \, |и /; преобразовывает его в массив, где каждый столбец соответствует букве; и индексирует этот массив с помощью входного символа.

Длинное объяснение

Сжатая строка была получена (в автономном режиме) с использованием кодировки от base-3 до base-95. Данные из задачи были организованы в длинной череде \, |и /, где каждая группа 5символов соответствует букве. Эта строка интерпретируется как представление base-3 некоторого большого числа, которое преобразуется в base-95, используя все печатные символы ASCII в качестве цифр. Результатом является сжатая строка, которая появляется в коде ( '!#$...J~v').

Программа начинается распаковкой этой строки, то есть преобразование из базы-95 на базу-3 с алфавитом \, |, /. Распакованная строка преобразуется в 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, ..., и 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!

Сохраненный колоссальные 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 Immediate окно, например, с ?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)

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 к числу. Карта из переменных aв w.

Учитывая число, соответствующее букве, используйте представление base-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}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.