Varillas de conteo; cuenta tus barras

9

Algunos antecedentes

Las barras de conteo son pequeñas barras (3-14 cm de largo) que fueron utilizadas por matemáticos de muchas culturas asiáticas durante más de 2000 años para representar cualquier número entero o fracción. (En este desafío nos centraremos en enteros sin signo). También había una versión escrita, llamada números de barra.

Así es como funciona:

(Si en algún momento te confundes, revisa la representación ascii de cada dígito y algunos ejemplos que he incluido en la parte inferior)

Los números de barra son un verdadero sistema de numeración posicional con dígitos para 1-9 y en blanco para 0. Los dígitos consisten en líneas horizontales y verticales; Cuantas más líneas, mayor será el dígito. Una vez que pasas las cinco, pones una línea horizontal en la parte superior para agregar 5 al número de líneas a continuación. Una línea vertical es 1, dos líneas verticales 2, cinco líneas verticales son 5, una línea vertical con una línea horizontal en la parte superior es 6, cuatro líneas verticales con una línea horizontal en la parte superior son 9 (el dígito más alto).

Un vertical de 3 dígitos:

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

Sin embargo, para facilitar la lectura de los números de barra, utilizaron notación diferente para cada dígito alterno. La segunda notación intercambia el papel de las líneas horizontales y verticales. de modo que 3 está representado por tres líneas horizontales y 8 por tres líneas horizontales con una línea vertical en la parte superior.

Un dígito horizontal de 8:

  |  
  |  
__|__
_____
_____

Saber qué notación usar es fácil, como se dijo anteriormente, se usan alternativamente y Sun Tzu escribió que "uno es vertical, diez es horizontal". Entonces, el dígito más a la derecha es vertical y alternamos a partir de ahí.

El reto

Estas barras se usaron para representar números y fracciones negativos (como se explica en el artículo de Wikipedia sobre ellos . Sin embargo, para este desafío solo nos enfocaremos en enteros positivos. El objetivo es simple:

Escriba una función o un programa completo que tome un valor entero como entrada de cualquier manera e imprima la representación numérica de la barra de este entero en STDOUT (también puede escribir en un archivo si eso funciona mejor). El código más corto en bytes gana.

Cada dígito estará representado por 5x5 caracteres ascii y separados por dos columnas de 5 espacios. La representación exacta que usará para cada dígito es la siguiente:

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

Los dígitos deben imprimirse uno al lado del otro. Los espacios finales más allá del cuadro delimitador del último dígito no están permitidos. Se requieren espacios finales para completar el cuadro delimitador de los últimos dígitos. Debe finalizar la salida con una nueva línea final. Los espacios iniciales que no pertenecen al cuadro delimitador del primer dígito también están prohibidos.

Se aplican lagunas estándar.

Salida de ejemplo

Las líneas que comienzan con >deben interpretarse como entrada.

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

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

>950
_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
overactor
fuente
por "espacios finales", ¿se refiere solo a aquellos que están más allá del cuadro delimitador del último dígito, o también aquellos al final del último dígito?
John Dvorak
@ JanDvorak solo aquellos que pasaron el cuadro delimitador del último dígito. Si se necesitan espacios de rastreo para representar el cuadro delimitador completo de un dígito, se requieren.
overactor
Mirando los ejemplos, los espacios principales también están prohibidos. ¿Son ellos?
edc65
@ edc65 sí, gracias por señalarlo.
overactor

Respuestas:

3

Python 2 - 216

Mi primer disparo, podría ser algo para sacar, pero me duele el cerebro, así que es lo suficientemente bueno por ahora

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
fuente
2

JavaScript (ES6) 223

Función con parámetro numérico, salida a la consola. NB Si el parámetro de entrada podría ser una cadena, el código sería 5 caracteres más corto y sin el límite de 17 dígitos significativos de 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)
}

Prueba

Prueba en la consola de Firefox.

F(12)

Salida

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Salida

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

F(950)

Salida

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

Sin golf

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

Pruébalo en línea!

Donde esta cadena presenta dígitos:

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

varillas verticales:

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

varillas horizontales:

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

Script desenrollado:

$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'  '
}
mazzy
fuente
¿Qué es 'de alguna manera' en la regla Escriba una función o un programa completo que tome un valor entero como entrada de alguna manera ? No me atreví a interpretar 'un entero' como 'una cadena'. :)
mazzy
Sí, es un poco vago y probablemente no sea lo que OP pretendía, pero pensé que señalaría el golf fácil.
Veskah