일부 배경
카운팅로드 는 2000 년 이상 많은 아시아 문화권의 수학자들이 정수 또는 분수를 나타내는 작은 막대 (길이 3-14cm)입니다. (이 chqllenge에서 우리는 부호없는 정수에 중점을 둡니다.) 막대 숫자라는 서면 버전도있었습니다.
작동 방식은 다음과 같습니다.
(어떤 시점에서 혼란 스러우면 각 숫자의 ASCII 표현과 하단에 포함 된 일부 예를 확인하십시오.)
막대 숫자는 1-9의 숫자와 0의 공백이있는 실제 위치 숫자 시스템입니다. 숫자는 가로 및 세로 선으로 구성됩니다. 줄이 많을수록 숫자가 높아집니다. 5 개가 지나면 수평선을 맨 아래에 놓고 아래의 숫자에 5를 더합니다. 1 개의 수직선은 1, 2 개의 수직선 2, 5 개의 수직선은 5, 상단에 수평선이있는 1 개의 수직선은 6, 상단에 수평선이있는 4 개의 수직선은 9 (가장 큰 숫자)입니다.
세로 3 자리 :
|||
|||
|||
|||
|||
그럼에도 불구하고 막대 숫자를 쉽게 읽을 수 있도록 각 교호 자리마다 다른 표기법을 사용했습니다. 두 번째 표기법은 가로선과 세로선의 역할을 바꿉니다. 따라서 3은 3 개의 수평선으로 표시되고 8은 3 개의 수평선으로 표시되며 수직선은 맨 위에 표시됩니다.
가로 8 자리 :
|
|
__|__
_____
_____
앞에서 언급했듯이 어떤 표기법을 사용하는 것이 쉬운 지 아는 것은 tehy가 교대로 사용되며 Sun Tzu 는 “하나는 수직이고 10은 수평”이라고 썼다. 그래서 가장 오른쪽 자리는 수직이며 우리는 그 자리에서 번갈아 가며 나타납니다.
도전
이 막대는 음수와 분수를 나타내는 데 사용되었습니다 (위의 위키 백과 기사에 설명되어 있음) .이 문제를 해결하기 위해 양의 정수에만 초점을 맞출 것입니다. 목표는 간단합니다.
어떤 식 으로든 정수 값을 입력으로 사용하는 함수 또는 전체 프로그램을 작성하고이 정수의 막대 숫자 표시를 STDOUT에 인쇄하십시오 (더 잘 작동하면 파일에 쓸 수도 있음). 바이트 단위의 최단 코드가 이깁니다.
모든 숫자는 5×5 ASCII 문자로 표시되며 5 개의 공백으로 구성된 두 개의 열로 구분됩니다. 각 숫자에 사용할 정확한 표현은 다음과 같습니다.
space between two digits (two colums):
0 digit, both vertical and horizontal (five columns):
1 digit, vertical:
|
|
|
|
|
2 digit, vertical:
| |
| |
| |
| |
| |
3 digit, vertical:
|||
|||
|||
|||
|||
4 digit, vertical:
|| ||
|| ||
|| ||
|| ||
|| ||
5 digit, vertical:
|||||
|||||
|||||
|||||
|||||
6 digit, vertical:
_____
|
|
|
|
7 digit, vertical:
_____
| |
| |
| |
| |
8 digit, vertical:
_____
|||
|||
|||
|||
9 digit, vertical:
_____
|| ||
|| ||
|| ||
|| ||
1 digit, horizontal:
_____
2 digit, horizontal:
_____
_____
3 digit, horizontal:
_____
_____
_____
4 digit, horizontal:
_____
_____
_____
_____
5 digit, horizontal:
_____
_____
_____
_____
_____
6 digit, horizontal:
|
|
|
|
__|__
7 digit, horizontal:
|
|
|
__|__
_____
8 digit, horizontal:
|
|
__|__
_____
_____
9 digit, horizontal:
|
__|__
_____
_____
_____
숫자는 서로 옆에 인쇄됩니다. 마지막 숫자의 경계 상자 너머의 후행 공백은 허용되지 않습니다. 마지막 숫자의 경계 상자를 완성하기위한 후행 공백이 필요합니다. 단일 후행 줄 바꿈으로 출력을 끝내야합니다. 첫 번째 숫자의 경계 상자에 속하지 않는 선행 공백도 금지됩니다.
출력 예
로 시작하는 줄 >
은 입력으로 해석됩니다.
>12
| |
| |
| |
| |
_____ | |
>8037
| _____
| | |
__|__ _____ | |
_____ _____ | |
_____ _____ | |
>950
_____ _____
|| || _____
|| || _____
|| || _____
|| || _____
답변
파이썬 2-216
내 첫 번째 장면, 꺼내야 할 물건이있을 수 있지만 뇌가 아프므로 지금은 충분합니다.
x=raw_input()
for l in range(5):print' '.join((' '*7+'| | | ||| || '+'|'*7+'__|'+'_'*7)[[7*(4-l<n%6+n/6)+(n>5)*(l<10-n)-(l==10-n),n%6+n/6+(l<1)*(n>5)*(12-n)][(len(x)-i)%2]*5:][:5]for i,n in enumerate(map(int,x)))
답변
자바 스크립트 (ES6) 223
숫자 매개 변수 기능, 콘솔로 출력. NB 입력 매개 변수가 문자열 일 수있는 경우 코드는 5 자리 더 짧으며 17 자리의 JS 숫자 제한이 없습니다.
F=n=>{
for(r=s='',n+=s;r<5;r++,s+=q)
for(f=q='\n',p=n.length;f=!f,p--;q=(p?' ':'')+' 1 | 1 | | 1 ||| 1|| ||1|||||1_____1__|__'.split(1)[d]+q)
if(d=~~n[p])e=d+r,d=d>5?f?e<10?1:e>10?6:7:r?d-5:6:f?e>4?6:0:d;
console.log(s)
}
테스트
Firefox 콘솔에서 테스트하십시오.
F(12)
산출
| |
| |
| |
| |
_____ | |
F(8037)
산출
| _____
| | |
__|__ _____ | |
_____ _____ | |
_____ _____ | |
F(950)
산출
_____ _____
|| || _____
|| || _____
|| || _____
|| || _____
언 골프
F=n=>{
z=' 1 | 1 | | 1 ||| 1|| ||1|||||1_____1__|__'.split(1);
s='';
n+=s;
for (r = 0; r < 5; r++)
{
for(q='\n',f=1,p=n.length;f=!f,p--;)
{
d = ~~n[p];
if (d)
{
e=d+r;
if (d > 5)
{
if (f)
{
d = e < 10 ? 1 : e >10 ? 6 : 7;
}
else
{
d = r ? d-5 : 6;
}
}
else
{
if (f)
d = e > 4 ? 6 : 0;
}
}
q = (p ? ' ' : '') + z[d] + q;
}
s+=q
}
console.log(s)
}
답변
PowerShell , 229 바이트
$n="$args"
0..4|%{$l=$_;$h=$n.Length%2
($n|% t*y|%{(' '*7+'| | | ||| || '+'|'*7+'_'*7+'|__')|% S*g(5*(('0123456666'+'0123451234'*4+'00000611110000661117000666117600666617660666667666')[50*($h=!$h)+10*$l+"$_"]-48))5})-join' '}
이 문자열에 숫자가있는 경우 :
# 0 1 2 3 4 5 6 7
# ' '.' | ',' | | ',' ||| ','|| ||','|||||','_____','__|__'
수직 막대 :
" | | | ||| || |||||||____________________"+ # 0123456666
" | | | ||| || ||||||| | | | ||| || ||"+ # 0123451234
" | | | ||| || ||||||| | | | ||| || ||"+ # 0123451234
" | | | ||| || ||||||| | | | ||| || ||"+ # 0123451234
" | | | ||| || ||||||| | | | ||| || ||" # 0123451234
수평 막대 :
" _____ | | | | "+ # 0000061111
" __________ | | | __|__"+ # 0000661117
" _______________ | | __|_______"+ # 0006661176
" ____________________ | __|____________"+ # 0066661766
" ___________________________|_________________" # 0666667666
풀린 스크립트 :
$digits=' '*7+'| | | ||| || '+'|'*7+'_'*7+'|__'
$positions = '0123456666'+'0123451234'*4+'00000611110000661117000666117600666617660666667666'
$n="$args"
0..4|%{
$line=$_
$horizontal=$n.Length%2
$chunks=$n|% toCharArray|%{
$horizontal=!$horizontal
$startFrom = 5*($positions[50*$horizontal+10*$line+"$_"]-48)
$digits|% Substring $startFrom 5
}
$chunks-join' '
}