Contando varas; conte suas varas

9

Alguma experiência

As barras de contagem são pequenas barras (3-14 cm de comprimento) que foram usadas por matemáticos de muitas culturas asiáticas por mais de 2000 anos para representar qualquer número ou fração inteira. (Neste desafio, nos concentraremos em números inteiros não assinados). Havia também uma versão escrita, chamada numerais de barras.

Veja como funciona:

(Se em algum momento você ficar confuso, verifique a representação ascii de cada dígito e alguns exemplos que incluí na parte inferior)

Os números de barra são um sistema numérico posicional verdadeiro, com dígitos de 1 a 9 e em branco, a 0. Os dígitos consistem em linhas horizontais e verticais; quanto mais linhas, maior o dígito. Depois de passar das cinco, coloque uma linha horizontal em cima para adicionar 5 ao número de linhas abaixo. Uma linha vertical é 1, duas linhas verticais 2, cinco linhas verticais são 5, uma linha vertical com uma linha horizontal no topo é 6, quatro linhas verticais com uma linha horizontal no topo são 9 (o dígito mais alto).

Um dígito vertical de 3:

 ||| 
 ||| 
 ||| 
 ||| 
 ||| 

Para facilitar a leitura dos números das barras, eles usaram notação diferente para cada dígito alternado. A segunda notação troca o papel das linhas horizontais e verticais. de modo que 3 é representado por três linhas horizontais e 8 por três linhas horizontais com uma linha vertical no topo.

Um dígito horizontal de 8:

  |  
  |  
__|__
_____
_____

Sabendo que notação usar é fácil, como dito anteriormente, eles são usados ​​alternadamente e Sun Tzu escreveu que "um é vertical, dez é horizontal". Portanto, o dígito mais à direita é vertical e alternamos a partir daí.

O desafio

Essas hastes foram usadas para representar números e frações negativas (conforme explicado no artigo da wikipedia sobre elas . Para o objetivo deste desafio, focaremos apenas números inteiros positivos. O objetivo é simples:

Escreva uma função ou programa completo que aceite um valor inteiro como entrada e imprima a representação numérica da haste desse número inteiro em STDOUT (você também pode gravar em um arquivo se isso funcionar melhor). O menor código em bytes vence.

Cada dígito será representado por caracteres ASCII 5x5 e separados por duas colunas de 5 espaços. A representação exata que você usará para cada dígito é a seguinte:

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:
  |  
__|__
_____
_____
_____

Os dígitos devem ser impressos um ao lado do outro. Não são permitidos espaços à direita além da caixa delimitadora do último dígito. São necessários espaços à direita para completar a caixa delimitadora do (s) último (s) dígito (s). Você deve finalizar a saída com uma única nova linha à direita. Os espaços iniciais que não pertencem à caixa delimitadora do primeiro dígito também são proibidos.

Aplicam-se brechas padrão.

Saída de exemplo

As linhas que começam com >devem ser interpretadas como entrada.

>12
        | | 
        | | 
        | | 
        | | 
_____   | | 

>8037
  |                  _____
  |                   | | 
__|__         _____   | | 
_____         _____   | | 
_____         _____   | | 

>950
_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
overactor
fonte
por "espaços finais", você quer dizer apenas aqueles que passaram pela caixa delimitadora do último dígito ou também aqueles que estão no final do último dígito?
John Dvorak
@JanDvorak apenas aqueles que passaram pela caixa delimitadora do último dígito. Se forem necessários espaços iniciais para representar a caixa delimitadora inteira de um dígito, eles serão necessários.
overactor
Olhando para os exemplos, os espaços à esquerda também são proibidos. São eles?
edc65
@ edc65 sim, obrigado por apontar isso.
overactor

Respostas:

3

Python 2 - 216

Meu primeiro tiro, pode ser algumas coisas para tirar, mas meu cérebro dói, então é bom o suficiente por enquanto

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)))
Bizangles
fonte
2

JavaScript (ES6) 223

Função com parâmetro numérico, saída para o console. NB Se o parâmetro de entrada pudesse ser uma string, o código seria 5 caracteres mais curto e sem o limite de 17 dígitos significativos dos números 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)
}

Teste

Teste no console do Firefox.

F(12)

Resultado

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Resultado

  |                  _____
  |                   | | 
__|__         _____   | | 
_____         _____   | | 
_____         _____   | | 

F(950)

Resultado

_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       

Ungolfed

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)
}
edc65
fonte
1

PowerShell , 229 bytes

$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'  '}

Experimente online!

Onde esta sequência apresenta dígitos:

# 0       1       2       3       4       5       6       7
# '     '.'  |  ',' | | ',' ||| ','|| ||','|||||','_____','__|__'

hastes verticais:

"       |   | |  ||| || |||||||____________________"+   # 0123456666
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"    # 0123451234

hastes horizontais:

"                         _____  |    |    |    |  "+   # 0000061111
"                    __________  |    |    |  __|__"+   # 0000661117
"               _______________  |    |  __|_______"+   # 0006661176
"          ____________________  |  __|____________"+   # 0066661766
"     ___________________________|_________________"    # 0666667666

Script desenrolado:

$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'  '
}
confuso
fonte
O que é 'qualquer maneira' na regra Escreva uma função ou programa completo que aceite um valor inteiro como entrada de alguma maneira ? Não ousei interpretar 'um número inteiro' como 'uma string'. :)
Mazzy
Sim, é um pouco vago e provavelmente não é o que o OP pretendia, mas achei que eu apontaria o golfe fácil.
Veskah