태그 보관물: ascii-art

ascii-art

세븐 슬래시 디스플레이 /\ /\

0에서 9까지의 숫자가 아닌 빈 문자열을 사용하고 슬래시 ( , )를 사용하여 7 세그먼트 디스플레이에 표시 되는 방식을 인쇄하는 프로그램을 작성하십시오 ./\

정확한 숫자 모양은 다음과 같습니다.

/\
\ \
 \/

 \
  \


/\
 /
 \/

/\
 /\
  /

 \
\/\

/
\/\
  /

/
\/\
 \/

/\
  \

/\
\/\
 \/

/\
\/\
  /

한 자릿수가 다른 숫자 다음에 나타날 때, 대각선 간격이 사이에있는 대각선 위아래로 연결됩니다. 예를 들어 다음과 203같이됩니다.

    /\
     /\
  /\  /
  \ \
/\ \/
 /
 \/

1캐릭터는 다른 캐릭터와 동일한 공간을 차지합니다. 의 두 줄은 1왼쪽이 아니라 디스플레이의 오른쪽에 있습니다.

그래서 159114이것이 될 것입니다 :

           \
          \/\
         \
          \
       \
        \
    /\
    \/\
  /   /
  \/\
 \  /
  \

숫자가 서로에 대해 올바른 위치에있는 한 출력에 선행 / 후행 줄 바꿈 또는 공백의 양과 조합이있을 수 있습니다.

따라서 159114이것도 유효합니다.



          \
         \/\
        \
         \
      \
       \
   /\
   \/\
 /   /
 \/\
\  /
 \


stdin 또는 명령 행에서 입력을 받거나 문자열을받는 함수를 작성하십시오. 결과를 stdout에 인쇄하거나 함수를 작성하면 문자열로 리턴 할 수 있습니다.

9 숫자 0의 비어 있지 않은 문자열은 단일 숫자 문자열 (예를 포함하여 작동합니다 8)와 0이 붙는 문자열 (예에서는 007, 0을가 않습니다 인쇄 할 필요가있다).

바이트 단위의 가장 짧은 코드가 이깁니다.



답변

CJam, 77 71 70 69 63 62 바이트

r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*

모든 문자를 인쇄 할 수 있으므로 복사 및 붙여 넣기가 제대로 작동합니다.

CJam 통역사 에서 온라인으로 사용해보십시오 .

생각

입력 의 자릿수 n 을 조사 하고 출력을 덮을 수있을만큼 큰 제곱 공간을 밀어서 시작합니다. 구현시이 사각형은 1 문자 문자열의 2 차원 배열로 인코딩됩니다.

2n + 1 길이의 제곱은 간단한 구현에 적합하지만 (즉, 주변 공백이 없음) 5n 길이 중 하나를 사용 하여 몇 바이트를 절약합니다. 고맙게도 주변 공백이 허용됩니다.

8 슬래시 표현의 줄을 뒤집 으면 다음과 같은 결과를 얻습니다.

 \/
\/\
/\

모든 숫자의 표현은 8 비트 정수로 인코딩 될 수 있으며, i 번째 비트가 0 이면 i 번째 문자가 공백으로 대체되어야합니다. 숫자 0 ~ 9 의 경우 결과 정수는

247 208 235 250 220 190 191 240 255 254

다음 ISO-8559-1 문자에 해당합니다.

÷Ðëúܾ¿ðÿþ

입력의 각 숫자에 해당 8 비트 정수를 선택한 후, 우리는 I를 반복 번째 의 문자 표현 8 정확하게 나는제가 상기 I이다 번째 정수 비트. 이것은 1 또는 0 문자의 문자열 배열을 푸시합니다. 이 배열을 길이 3의 청크로 나누면 각 요소가 표현의 선에 해당하는 배열을 얻습니다.

이제 사각형을 나타내는 문자열과 숫자를 나타내는 문자열의 벡터화 된 최대 값을 계산합니다. 문자열 /과 문자열 \보다 크기  때문에 정사각형의 공백을 대체합니다. 그러나 빈 문자열은 string보다 작으므로  숫자 표현의 빈 문자열은 사각형의 공백을 유지합니다.

이제 행과 열을 두 단위로 회전하여 사각형의 적절한 부분에 다음 숫자 표시를 배치하고 입력의 나머지 숫자에 대한 프로세스를 반복합니다.

마지막으로 각 행을 뒤집고 개별 행 사이에 줄 바꿈을 삽입합니다.

암호

r_,      e# Read a token from STDIN and push the length of a copy.
5*_      e# Multiply the length by 5 and push a copy.
Sa*      e# Repeat the array [" "] that many times.
a*       e# Repeat the array [[" " ... " "]] that many times.
\{       e# For each character C in the input:
  ~      e#   Push eval(C), i.e., the digit the character represents.

  "÷Ðëúܾ¿ðÿþ"

         e#   Push the encodings of all 10 seven slash representations.

  =      e#   Select the proper one.
  i2b    e#   Push the resulting characters code point in base 2, i.e., its bits.
  S      e#   Push " ".
  "\/"4* e#   Push "\/\/\/\/".
  +W<    e#   Concatenate and eliminate the last character.
  .*     e#   Vectorized repetition.

         e#   For the digit 5, e.g., we have [1 0 1 1 1 1 1 0] and  " \/\/\/\" on
         e#   the stack, so .* yields [" " "" "/" "\" "/" "\" "/" ""].

  3/     e#   Divide the representation into chunks of length 3, i.e., its lines.
  ..e>   e#   Compute the twofold vectorized maximum, as explained above.
  2fm>   e#   Rotate each line to characters to the right.
  2m>    e#   Rotate the lines two units down.
}/
Wf%      e# Reverse each line.
N*       e# Place linefeeds between them.

정사각형의 측면 길이가 2n + 3 보다 작 으면 마지막 회전으로 출력이 엉망이됩니다 . 이후 5N ≥의 2N + 3 모든 양의 정수에 대한 N , 사각형은이를 방지하기에 충분히 큽니다.


답변

Python 3, 189 183 174 바이트

s="a%sa"%input()
while s[1:]:b,a,c,d,e,f,g=[c*(ord(n)>>int(s[~(n>"Ͱ")],16)&1)or" "for c,n in zip("\/"*4,"ΟϭŅͭͱͼϻ")];S=len(s)*"  ";print(S+a+b,c+d+"\n"+S+e+f+g);*s,_=s

압축은 괜찮아 보이지만 7 가지 변수를 버리는 좋은 방법을 찾는 데 어려움을 겪고 있습니다 …

고맙게도 공백에는 많은 공백이 있기 때문에 공백 규칙에서는 사양이 상당히 완화됩니다.

넓히는:

s="a%sa"%input()
while s[1:]:
  b,a,c,d,e,f,g=[c*(ord(n)>>int(s[~(n>"Ͱ")],16)&1)or" "
                 for c,n in zip("\/"*4,"ΟϭŅͭͱͼϻ")]
  S=len(s)*"  "
  print(S+a+b,c+d+"\n"+S+e+f+g)
  *s,_=s

설명

변수로 표시되는 세그먼트 위치는 다음과 같습니다.

    ab               /\
    efg               /\
  ab cd            /\  /
  efg              \ \
ab cd            /\ \/
efg               /
 cd               \/

각 세그먼트는 단일 2 바이트 유니 코드 문자로 인코딩됩니다. 예를 들어 의 세그먼트를 다음과 같이 ϻ인코딩합니다 g.

bin(ord("ϻ")) = bin(1019) = "0b1111111011"
                               ^^^^^^^^^^
                               9876543210

실제로, 27- 세그먼트 디스플레이의 오른쪽 아래 세그먼트를 사용하지 않는 유일한 숫자입니다.


답변

C, 1,098 345 323 319 바이트

번째 두 번째 세 번째 시도. 마지막으로 화면 버퍼를 버리고 몇 바이트를 절약하기로 결정했습니다. 이 프로그램은 자릿수 매개 변수를 사용하여 7 세그먼트 형식으로 자릿수를 인쇄합니다.

처음 참가자. 재미로. 조심해

a[]={100489,2056,98569,67849,2440,67969,100737,2057,100745,67977},i,j,k,n,m;char*c=" /\\";
#define f(q,r) for(q=0;q<(r);q++)
#define P(w) putchar(w)
#define Q(d,i,j) P(c[a[v[1][d]-48]>>(i*3+j)*2&3])
main(w,char**v){f(i,n=strlen(v[1]))f(k,(m=n-i-1)?2:3){f(j,m*2)P(32);f(w,3)Q(m,k,w);if(!k&&i)f(w,2)Q(m+1,2,w+1);P(10);}}

확장, 경고 없음 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int a[]={100489,2056,98569,67849,2440,67969,100737,2057,100745,67977};
char *c=" /\\";
#define f(q,r) for(q=0;q<(r);q++)
#define P(w) putchar(w)
#define Q(d,i,j) P(c[a[v[1][d]-48]>>(i*3+j)*2&3])
int main(int w, char **v)
{
    int i,j,k,n,m;
    f(i,n=strlen(v[1])) {
        m=n-i-1;
        f(k,m?2:3) {
            f(j,m*2) P(32);
            f(w,3) Q(m,k,w);
            if (!k&&i) f(w,2) Q(m+1,2,w+1);
            P(10);
        }
    }
}


답변

자바 스크립트, 192 178 167 162 바이트

f=x=>{n=b="\n";for(k in x)for(i=0;i<8;)b+=("î\xA0Öô¸|~àþü".charCodeAt(x[k])>>i++&1?i%2?"/":"\\":" ")+(i%3?"":n+"  ".repeat(k));return b.split(n).reverse().join(n)}

사용법 : f("1337");반환

      /\
        \
    /\
     /\
  /\  /
   /\
 \  /
  \

ES6의 기능을 사용하며 세미콜론 및 괄호 등이 누락되어 구현에 따라 일부 동작이 발생할 수 있지만 Firefox에서는 작동합니다.

넓히는:

f=x=>
{
    n = b = "\n";

    for (k in x)
        for (i=0; i<8;)
            b += ("î\xA0Öô¸|~àþü".charCodeAt(x[k]) >> i++ & 1? i%2? "/" : "\\" : " ") + (i%3? "" : n+"  ".repeat(k));

    return b.split(n).reverse().join(n)
}

설명:

l각 숫자의 모양에 해당하는 10 개의 1 바이트 문자를 포함하는 배열입니다. 예를 들어 숫자 0은 문자로 표시됩니다 î.

/\        11
\ \  -->  101  --> 11 101 110 = î
 \/       011

입력 문자는 대응하는 비트를 나타내는 모양을 유지하는 배열의 키로 사용되며 비트 단위로 읽습니다.


답변

펄-103 바이트

#!perl -n
print$i+$%2?U^(u,$i--%2?v9:z)[$i<4+$%2&vec$_,4*$-3-$i,1]:$/.!($i=$--)
while$+=2*y/0-9/wPkz\\>?p~/

위의 내용은 6 개의 인쇄 할 수없는 문자 (소스는 Ideone 에서 다운로드 할 수 있음 )를 포함하며 다음과 같습니다.

#!perl -n
print$i+$^F%2?U^(u,$i--%2?v9:z)[$i<4+$^F%2&vec$_,4*$^F-3-$i,1]:$/.!($i=$^F--)
while$^F+=2*y/0-9/wPkz\\>?p\177~/

각각 ^F은 리터럴 문자 6 (ACK)으로 \177대체되고 문자 127 (DEL) 로 대체 될 수 있습니다 .

shebang은 1로 계산되며 두 번째 줄 바꿈은 불필요합니다. 입력은 stdin에서 가져옵니다.


샘플 사용법

$ echo 0123 | perl seven-slash.pl

      /\
       /\
    /\  /
     /
   \ \/
    \
/\
\ \
 \/

$ echo 456789 | perl seven-slash.pl

          /\
          \/\
        /\  /
        \/\
      /\ \/
        \
    /
    \/\
  /  \/
  \/\
 \  /
\/\

설명

출력은 한 번에 1 바이트 씩 생성됩니다. 각 문자는 음역되며,이를 사용하여 비트 배열로 해석됩니다 vec. 비트는 다음과 같은 방식으로 저장됩니다.

   /\           56
   \/\          234
 /\ \/   ->   56 01
 \/\          234
  \/           01

출력은 3에서 5 사이의 슬래시를 번갈아 가며 비트 가 다음 자리 56로 넘치 도록합니다 01. 비트 7는 사용되지 않습니다.


답변

C #을 360 355 331 바이트

안녕하세요, 먼저 코드 골프를 시도하십시오. 이것이 C # 항목에 대해 너무 나쁘지 않기를 바랍니다.

string p(string n){var l=new string[n.Length*2+1];var i=l.Length-1;for(;i>0;){var x=@"/\\ \\/ \  \  /\ / \//\ /\ / \\/\  / \/\ // \/\\//\  \  /\\/\\//\\/\ /".Substring((n[0]-48)*7,7);for(var j=i-3;j>=0;){l[j--]+="  ";}l[i--]+=" "+x[5]+x[6];l[i--]+=""+x[2]+x[3]+x[4];l[i]+=""+x[0]+x[1];n=n.Remove(0, 1);}return string.Join("\n",l);}

사용법 : p("159114");반환

          \
         \/\
        \
         \
      \
       \
   /\
   \/\
 /   /
 \/\
\  /
 \

넓히는:

string p(string n)
    {
        var l = new string[n.Length * 2 + 1];
        var i = l.Length - 1;
        for (; i > 0; )
        {
            var x = @"/\\ \\/ \  \  /\ / \//\ /\ / \\/\  / \/\ // \/\\//\  \  /\\/\\//\\/\ /".Substring((n[0] - 48) * 7, 7);

            for (var j = i - 3; j >= 0; )
            {
                l[j--] += "  ";
            }
            l[i--] += " " + x[5] + x[6];
            l[i--] += "" + x[2] + x[3] + x[4];
            l[i] += "" + x[0] + x[1];

            n = n.Remove(0, 1);
        }

        return string.Join("\n", l);
    }


답변

파이썬 2 317 298 278 273.15

def f(s):
    r=range;n=len(s)*2;l=[[' ']*-~n for x in r(-~n)]
    for x in r(0,n,2):
        for i,[d,y,c]in enumerate(zip('0112012','1021012',r'\\\\///')):l[n-2-x+int(y)][x+int(d)]=[' ',c][('%7s'%(bin(ord('}(7/jO_,\x7fo'[map(int,s)[x/2]])))[2:])[i]=='1']
    for x in l:print''.join(x)

계산하는 동안 4 개의 공백을 탭으로 간주했습니다.
비 압축 및 읽기 가능 :

def f(s):
    r=['1111101','0101000','0110111','0101111','1101010','1001111','1011111','0101100','1111111','1101111']
    ''.join(map(lambda x:chr(eval('0b'+x)),r))
    n=len(s)*2
    l=[[' ']*(n+1) for x in xrange(n+1)]
    shifts=[(0,1,'\\'),(1,0,'\\'),(1,2,'\\'),(2,1,'\\'),(0,0,'/'),(1,1,'/'),(2,2,'/')]
    for x in xrange(0,n,2):
        y=n-2-x
        for i,[dx,dy,c] in enumerate(shifts):
            l[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' '
    return '\n'.join(''.join(x) for x in l)