카운팅로드; 당신의 막대를 계산 분수를 나타내는 데 사용되었습니다 (위의 위키

일부 배경

카운팅로드 는 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'  '
}


답변