クックアンドウィートストーンテレグラフ、5本針


20

定義

ウィキペディアによると:

Cooke and Wheatstone電信は、イギリスの発明家William Fothergill Cookeとイギリスの科学者Charles Wheatstoneによって発明された1830年代の初期の電気電信システムでした。これは、商用サービスに導入された最初の電信システムでした。レシーバーは、ボード上の文字を指すように電磁コイルによって移動できる多数の針で構成されていました。この機能は、コードを学習したくない初期ユーザーや、スタッフのトレーニングに投資したくない雇用主に好まれていました。

それはこのように動作します:

クックとホイートストンの電信のスキーム、5本針

中央には5本の針があり、時計回り(中針の場合)または反時計回り(最後の針の場合)に偏向できます。

上の図では、2本の偏向した針が文字を指しています。これGは、送受信されている文字が文字であることを意味しGます。

注手紙ことをCJQVXZ不足しているため、他の文字に置換する必要があります。

仕事

ABDEFGHIKLMNOPRSTUWY入力として文字を受け取り、5本の針の対応する構成を出力します。これは、として|偏向せずに、として時計回りに偏向し/、として反時計回りに偏向し\ます。

テストケース

これはすべての可能な入力をカバーています

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# 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からbase-95エンコーディングを使用して、圧縮された文字列が取得されました(オフライン)。チャレンジからのデータは\|との長い文字列に配置されています/。ここで、各5文字グループは文字に対応しています。この文字列は、すべての印刷可能なASCII文字を数字として使用して、基数95に変換される大きな数の基数3表現として解釈されます。結果は、コードに表示される圧縮された文字列です('!#$...J~v')。

アルファベットとベース3と、ベース95からの変換であり、この文字列を、解凍プログラムが起動\|/。圧縮解除された文字列は、各行が文字を表す5行の2D char配列に再形成されます。この配列を呼び出しましょうΛ。この配列は、入力文字のASCIIコードポイントを使用してインデックス付けされます。

配列にΛは2つのトリックが含まれます。

  1. これは、間行方不明の5つの文字のためのダミーの値で満たされているAY
  2. L(ではなく A)で始まり、循環的に進みます。

これら2つのトリックの理由は次のとおりです。

  1. 文字にAはコードポイントがあり65ます。処理する必要がある最後の文字はY、コードポイント付きです89。そのため25、中間の値(レターなどC)が存在しない場合でも、値の範囲を処理する必要があります。インデックス作成を容易にするために、間にある5つの欠落文字AYダミー表現で埋められているため、に列がありますΛ。したがって、Λサイズは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のおかげで1バイト節約できました!

@Keetaのおかげで、なんと72バイトも節約できました!


-1バイトのfind代わりに使用できindexます。
TheBikingViking

2
スラッシュの重なりを利用する場合、72文字分、ラムダx:r '/ ||| \ / ||| / \ ||| / | \ || / || \ | /のように減らすことができます。 || '[' APONM LKIHY GFEWU DBTSR'.find(x):] [:5]
キータ-モニカの復活


1

JavaScript(ES6)、97 89バイト

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

編集:パディングを必要としないルックアップテーブルに切り替えることで3バイトを保存しました。文字列を編集するのではなく、配列要素を設定することで5バイトを節約しました。

説明:テーブルABEHMDFINRGKOSULPTWYは、4つの隣接する文字の5つのグループに分割する場合、グループ内の各文字が/ダイアグラムの同じ傾斜にあるように編成されます。グループ内の文字は、\図の同じ傾斜上にあります。これらの後者のグループは逆順ですが、4を引くことで簡単に処理できます(前のグループが逆順になるようにテーブルを配置すると、修正にさらにコストがかかります)。



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)

ゴルフをしていない:

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バイトです。2番目\\は、最後の6ビットと同じ1バイトで置き換えることができます。\文字文字0x5C:0x1C(コンパイラが許可する場合)、0x9Cまたは0xDC。

入力文字は、Ato Y(サポートされていない文字のスペースを含む)の値を含むマジックストリングで検索されますCJQVX。ルックアップテーブルの文字は、5つの重複する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表現を使用します。最初の針に5桁、2番目の針に1桁、針の方向に25桁を使用します。

1文字ではなく、文字列全体をエンコードするプログラムは、わずかに長い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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.