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
실제로, 2
7- 세그먼트 디스플레이의 오른쪽 아래 세그먼트를 사용하지 않는 유일한 숫자입니다.
답변
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)