Телеграф Кука і Пшеничного каменю, п'ятиголовий


20

Визначення

За даними Вікіпедії :

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

Це працює так:

Схема телеграфа Кука та Пшеничного каменю, п'ятиголок

В середині знаходяться п'ять голок, які можна відхилити за годинниковою стрілкою (як це стосується середньої голки) або проти годинникової стрілки (як це стосується останньої голки).

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

Зверніть увагу , що букви C, J, Q, V, X, Zвідсутні і , отже , повинні бути замінені іншими буквами.

Завдання

Ви отримаєте символ в 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

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Відповіді:


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

Перевірте це тут

Незважаючи на те, що для виходів є багато структури, я не зовсім впевнений, що я можу ефективно обчислити результати (у байтах). Отже, це все ще таблиця пошуку, але я генерую список можливих конфігурацій голок за допомогою перестановок списку [0 1 2 3 4].


3

MATL , 50 байт

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

Спробуйте в Інтернеті!

Коротке пояснення

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

Довге пояснення

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

Програма починається розпакуванням цього рядка, тобто перетворення з бази-95 на базу-3 з алфавітом \, |, /. Декомпресований рядок перебудовується в 5-рядовий 2D-масив знаків, в якому кожен стовпець представляє букву. Назвемо цей масив Λ. Цей масив буде індексовано за допомогою кодової точки 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

Пітон 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

Математика, 129 байт

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

Анонімна функція. Бере рядок як вхідний і повертає рядок, що представляє його код як вихід. Використовується відносно проста схема кодування.


0

Піт, 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

Пітон 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 байт. Другий \\може бути замінений будь-яким одним байтом, який має ті ж останні 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.

Враховуючи число, відповідне букві, використовуйте її базове представлення 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.