Cooke ve Wheatstone telgrafı, beş iğneli


20

Tanım

Wikipedia'ya göre :

Cooke ve Wheatstone telgrafı, İngiliz mucit William Fothergill Cooke ve İngiliz bilim adamı Charles Wheatstone tarafından icat edilen 1830'lardan kalma erken bir elektrikli telgraf sistemiydi. Ticari hizmete sunulan ilk telgraf sistemiydi. Alıcı, elektromanyetik bobinler tarafından bir tahta üzerindeki harfleri gösterecek şekilde hareket ettirilebilen bir dizi iğneden oluşuyordu. Bu özellik, kod öğrenmek istemeyen erken kullanıcılar ve personel eğitimine yatırım yapmak istemeyen işverenler tarafından beğenildi.

Şöyle çalışır:

Cooke ve Wheatstone telgraf şeması, beş iğneli

Ortada, saat yönünde (orta iğnede olduğu gibi) veya saat yönünün tersinde (son iğnede olduğu gibi) saptırılabilen beş iğne vardır.

Yukarıdaki resimde, saptırılmış iki iğne mektubu gösterir G, yani iletilen / alınan harf harftir G.

Harfler o Not C, J, Q, V, X, Zböylece eksik olduğu ve diğer harfler ile ikame edilmelidir.

Görev

Sen bir karakter alacak ABDEFGHIKLMNOPRSTUWYgirdi olarak ve çıkış olarak sapmadan ile beş iğne gelen yapılandırma olacak |, saat yönünde saptırılması /ve aynı saat yönünün tersine bükülmesi \.

testcases

Bu, tüm olası girdileri kapsar

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

Kurallar / Gereksinimler

  • Her başvuru tam bir program veya işlev olmalıdır. Bir işlevse, yalnızca işlev çağrısını programın altına eklemeye gerek duyularak çalıştırılabilir olmalıdır. Başka herhangi bir şey (örn. C'deki başlıklar) dahil edilmelidir.
  • Mümkünse, programınızın test edilebileceği bir siteye bağlantı verin.
  • Programınız hiçbir şey yazmamalıdır STDERR.
  • Standart Loopholes yasaktır.
  • Programınız her durumda çıktı alabilir, ancak yazdırılmalıdır (dizi veya benzeri değil).

puanlama

Programlar varsayılan olarak baytlara göre, UTF-8'de veya seçtiğiniz farklı bir karakter kümesinde puanlanır.

Eventually, en az bayt ile cevap kazanacaktır.

gönderimler

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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

Liderler Sıralaması

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.

Yanıtlar:


6

C 124 107 98 bayt

İşlev olarak:

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

Bu, ızgarayı 45 derece döndürerek ve elde edilen bloktan satır / sütuna bakarak çalışır.


Tam yürütülebilir bir dosya olarak (107 bayt):

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

Alternatif bir tam yürütülebilir dosya: (aynı bayt sayımı ancak stdin'den girdi alır ve çıktıdan sonra yeni satır içerir)

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

Yıkmak:

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
}

Alternatif arıza:

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: wikipedia sayfasından 0-9 uzantı:

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 bonusu: hem kodlama hem de kod çözme mesajları için eksiksiz (dağınıksa) bir program:

#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 bayt

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

Burada test edin

Çıktılarda çok fazla yapı olmasına rağmen henüz tam olarak emin değilim (sonuçları bayt cinsinden). Bu hala bir arama tablosu, ancak listenin permütasyonları aracılığıyla olası iğne yapılandırmaları listesini oluşturuyorum [0 1 2 3 4].


3

MATL , 50 bayt

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

Çevrimiçi deneyin!

Kısa açıklama

Kod gösterilen dizi (açar '!#$...J~v'bir dizeye) ihtiva eden \, |ve /; her sütunun bir harfe karşılık geldiği bir diziye yeniden biçimlendirir; ve bu diziyi giriş karakteriyle dizine ekler.

Uzun açıklama

Sıkıştırılan dize, base-3 - base-95 kodlaması kullanılarak (çevrimdışı) elde edilmiştir. Meydan gelen veri uzun bir dizeye tanzim edilmiştir \, |ve /, burada her bir grup,5 mektuba karakterler karşılık gelir. Bu dize, yazdırılabilir tüm ASCII karakterlerini rakam olarak kullanarak base-95'e dönüştürülen bazı büyük sayıların base-3 temsili olarak yorumlanır. Sonuç, kodda ( '!#$...J~v') görünen sıkıştırılmış dizedir .

Alfabe ile tabana-3'e tabanından-95 dönüştürme, bu dize, açıldıktan programı başlar \, |, /. Sıkıştırılmış dize, her sütunun bir harfi temsil ettiği 5 satırlı bir 2D karakter dizisine yeniden şekillendirilir. Bu diziyi arayalım Λ. Bu dizi, giriş harfinin ASCII kod noktası kullanılarak dizine eklenir.

Dizi Λiki numara içerir:

  1. AVe arasında eksik olan beş harf için kukla değerlerle doldurulmuştur Y;
  2. İle başlar L(değil A) ve sonra dairesel olarak ilerler.

Bu iki hilenin nedenleri şunlardır:

  1. Harf Akod noktasına sahiptir 65. İşlenmesi gereken son harf Ykod noktasıdır 89. Bu nedenle 25, bazı ara değerler (mektup gibi C) olmasa bile, bir dizi değeri ele almamız gerekir . İndekslemeyi kolaylaştırmak için, aralarında eksik olan Ave eksik olan beş harf Ybir kukla temsil ile doldurulmuştur, bu nedenle içinde bir sütun vardır Λ. Böylece, Λ5 × 25 boyutuna sahiptir.

  2. Modüler indeksleme kullanılır. Yani harf Aveya sayı 65, aynıdır 65 mod 25, yani 15. Dolayısıyla Asütunda olması gerekiyor 15arasında Λ, Bsütununda 16, ..., ve Ysütunda 14.

Yorumlanan 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

3

Piton 2, 172 152 151 79 bayt

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

Algoritma yok, sadece bir arama tablosu.

@LeakyNun sayesinde 20 bayt kaydedildi!

@TheBikingViking sayesinde byte tasarruf etti!

Kaydedilen bir kuyruklu 72 @Keeta sayesinde bayt!


-1 bayt findyerine kullanabilirsiniz index.
TheBikingViking

2
Eğik çizgilerin örtüşmesinden yararlanırsanız lambda x gibi bir karaktere 72 karakter azaltabilirsiniz: r '/ ||| \ / ||| / \ ||| / | \ || / || \ | / || '[' APONM LKIHY GFEWU DBTSR'.find (x):] [: 5]
Keeta - Monica'yı


1

JavaScript (ES6), 97 89 bayt

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

Düzenleme: Dolgu gerektirmeyen bir arama tablosuna geçerek 3 bayt kaydedildi. Bir dizeyi düzenlemeye çalışmak yerine dizi öğelerini ayarlayarak 5 bayt kaydedildi.

Açıklama: Tablo ABEHMDFINRGKOSULPTWY, 4 bitişik harften oluşan 5 gruba ayırırsanız, gruptaki her harf /diyagramdaki aynı eğimli olacak şekilde düzenlenirken, modulo 5 dizinini alarak 5 gruba bölerseniz, her biri gruptaki harf \şemada aynı eğimdedir. Bu sonuncu gruplar ters sıradadır, ancak 4'ten çıkarılarak kolayca halledilir.


1

VBA, 106 bayt

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

Son bayt enterotomatik olarak üretilir End Function. İçin alındı bildirimleri ile şeması @Dave tasarladı .

Elektronik tabloya veya VBA Anında penceresine çağırın. ?v("K")


0

Mathematica, 129 bayt

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

Anonim işlev. Bir dizeyi girdi olarak alır ve kodunu çıktı olarak temsil eden bir dize döndürür. Nispeten basit bir kodlama şeması kullanır.


0

Pyth, 27 bayt

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

Kaçışları değiştirin \x94,\x18 karşılık gelen bayt ile.

Çevrimiçi deneyin

Nasıl çalışır

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

Herhangi bir sabit kodlu arama tablosu kullanmadan.

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

Çevrimiçi deneyin

Nasıl çalışır

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

Bu basit bir uygulama, ancak bazı golf kullanabilirsiniz. Öneriler hoş geldiniz.

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 bayt

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

gösterilen sürüm tüm yazdırılabilir ASCII, 79 bayt. İkincisi \\, son 6 bit ile aynı olan tek bir bayt ile değiştirilebilir.\ 0x5C: 0x1C (derleyiciniz izin veriyorsa), 0x9C veya 0xDC karakteriyle .

Girdi karakteri için değerleri içeren sihirli dizesinde aranır Aiçin Ydesteklenmeyen karakterler için boşluklar dahil (CJQVX arama tablosundan karakter 2-bitlik kodlarını nereye örtüşen beş olarak yorumlanır.):

01 = /   10 = \    00 or 11 = |

Test programında yorumlanmış kod

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

Yakut, 159 bayt

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

Açıklama:

Saptırılmış iğnelerin pozisyonları 0..4'e eşlenir ve bir baz-5 sayısı (2 basamak) olarak düşünülür. AL için sayılar "olduğu gibi"; MZ için sayıya 25 ekleyin. Harita değişkenlerden olduğu aiçinw .

Harfe karşılık gelen sayı göz önüne alındığında, taban-5 temsilini kullanın: ilk iğne için 5s basamağı, ikinci iğne için 1s basamağı ve iğnelerin yönleri için 25s basamağı.

Bir karakter yerine tüm dizeyi kodlamak için kullanılan program sadece biraz daha uzundur: 172 bayt.

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}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.