쿡과 휘트 스톤 전신, 5 바늘


20

정의

Wikipedia 에 따르면 :

Cooke and Wheatstone 전신은 영국 발명가 William Fothergill Cooke과 영국 과학자 Charles Wheatstone이 발명 한 1830 년대의 전기 전신 시스템이었습니다. 상용 서비스에 도입 된 최초의 전신 시스템이었습니다. 수신기는 전자 바늘로 움직여 보드의 글자를 가리킬 수있는 여러 바늘로 구성되었습니다. 이 기능은 코드를 배우고 싶지 않은 초기 사용자와 직원 교육에 투자하고 싶지 않은 고용주가 선호했습니다.

다음과 같이 작동합니다.

쿡과 휘트 스톤 전신 계획, 5 침

가운데에는 5 개의 바늘이 있으며, 바늘은 시계 방향 (중간 바늘의 경우) 또는 시계 반대 방향 (마지막 바늘의 경우)으로 편향 될 수 있습니다.

위의 그림에서 두 개의 편향 바늘은 문자를 가리키며 G, 이는 송수신되는 문자가 문자임을 의미합니다.G .

문자가 있습니다 C, J, Q, V, X, Z, 따라서 누락되어 다른 문자로 대체되어야한다.

태스크

문자 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

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

보너스 : Wikipedia 페이지의 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

여기에서 테스트

출력에는 많은 구조가 있지만 아직 확실하지는 않지만 결과를 바이트 단위로 효율적으로 계산할 수 있습니다. 따라서 이것은 여전히 ​​룩업 테이블이지만 list의 순열을 통해 가능한 바늘 구성 목록을 생성하고 [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 문자를 숫자로 사용하여 base-95로 변환 된 일부 큰 숫자의 3 진 표현으로 해석됩니다. 결과는 코드에 나타나는 압축 문자열입니다 ('!#$...J~v' )에 .

알파벳을베이스 (3)에베이스 (95)로 변환된다 문자열을 압축 해제하는 프로그램 시작 \, |, /. 압축 해제 된 문자열은 5 행 2D 문자 배열로 재구성되며 각 열은 문자를 나타냅니다. 이 배열을 호출하자 Λ. 이 배열은 입력 문자의 ASCII 코드 포인트를 사용하여 색인됩니다.

배열 Λ에는 두 가지 트릭이 포함됩니다.

  1. 다섯 글자 사이에 누락 된 더미 값으로 채워져 있습니다. AY;
  2. 로 시작 L (안 A) 다음 원형으로 진행된다.

이 두 가지 트릭의 이유는 다음과 같습니다.

  1. 문자 A코드 포인트가 65있습니다. 처리해야 할 마지막 문자는 Y코드 포인트 89입니다. 따라서 25일부 중간 값 (예 : letter 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]

알고리즘이없고 조회 테이블 일뿐입니다.

@LeakyNun 덕분에 20 바이트를 절약했습니다!

@TheBikingViking 덕분에 바이트를 절약했습니다!

@Keeta 덕분에 무려 72 바이트를 절약했습니다!


-1 바이트 find대신 사용할 수 있습니다 index.
TheBikingViking

2
슬래시의 겹침을 이용하면 람다 x : r '/ ||| \ / ||| / \ ||| / | \ || / || \ | /와 같은 문자로 72자를 줄일 수 있습니다. || '['APONM LKIHY GFEWU DBTSR'.find (x) :] [: 5]
Keeta-Monica Monica 복원


1

자바 스크립트 (ES6), 97 89 바이트

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

편집 : 패딩이 필요없는 조회 테이블로 전환하여 3 바이트를 절약했습니다. 문자열을 편집하는 대신 배열 요소를 설정하여 5 바이트를 절약했습니다.

설명 : 테이블 ABEHMDFINRGKOSULPTWY을 4 개의 인접 문자 5 개 그룹으로 분할하면 그룹의 각 문자가 /다이어그램에서 동일한 경사에있는 반면, 색인 모듈로 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

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

파이썬 2, 115 바이트

이것은 간단한 구현이지만 골프를 사용할 수 있습니다. 제안을 환영합니다.

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 바이트)입니다. 두 번째 \\\0x5C : 0x1C (컴파일러가 허용하는 경우), 0x9C 또는 0xDC 와 같은 마지막 6 비트를 가진 단일 바이트로 대체 될 수 있습니다 .

입력 된 문자의 값이 포함 된 문자열 마법에서 룩업되는 AY(지원되지 않는 공백 문자를 포함한 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 표현을 사용하십시오. 첫 번째 바늘의 5 자리 숫자, 두 번째 바늘의 1 자리 숫자, 바늘 방향의 25 자리 숫자.

한 문자 대신 전체 문자열을 인코딩하는 프로그램은 조금 더 길어집니다 : 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.