Tiges de comptage; compte tes tiges

9

Quelques antécédents

Les tiges de comptage sont de petites barres (3-14 cm de long) qui ont été utilisées par les mathématiciens de nombreuses cultures asiatiques pendant plus de 2000 ans pour représenter un nombre entier ou une fraction. (Dans ce défi, nous nous concentrerons sur les entiers non signés). Il y avait aussi une version écrite, appelée chiffres de tige.

Voici comment ça fonctionne:

(Si à tout moment vous vous trompez, allez voir la représentation ascii de chaque chiffre et quelques exemples que j'ai inclus en bas)

Les chiffres des tiges sont un véritable système de positionnement numérique avec des chiffres pour 1-9 et des blancs pour 0. Les chiffres sont constitués de lignes horizontales et verticales; plus il y a de lignes, plus le chiffre est élevé. Une fois que vous avez dépassé cinq, vous mettez une ligne horizontale en haut pour ajouter 5 au nombre de lignes ci-dessous. Une ligne verticale est 1, deux lignes verticales 2, cinq lignes verticales est 5, une ligne verticale avec une ligne horizontale en haut est 6, quatre lignes verticales avec une ligne horizontale en haut est 9 (le chiffre le plus élevé).

Un vertical à 3 chiffres:

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

Pour faciliter la lecture des chiffres des bâtonnets, ils ont utilisé une notation différente pour chaque chiffre alterné. La deuxième notation permute le rôle des lignes horizontales et verticales. de sorte que 3 est représenté par trois lignes horizontales et 8 par trois lignes horizontales avec une ligne verticale en haut.

Un 8 chiffres horizontal:

  |  
  |  
__|__
_____
_____

Savoir quelle notation utiliser est facile, comme dit précédemment, ils sont utilisés en alternance et Sun Tzu a écrit que "un est vertical, dix est horizontal". Donc, le chiffre le plus à droite est vertical et nous alternons à partir de là.

Le défi

Ces tiges ont été utilisées pour représenter des nombres et des fractions négatifs (comme expliqué dans l' article de wikipedia à leur sujet . Aux fins de ce défi, nous ne nous concentrerons que sur les nombres entiers positifs. L'objectif est simple:

Écrivez une fonction ou un programme complet qui prend une valeur entière en entrée de quelque façon que ce soit et imprime la représentation numérique de la tige de cet entier dans STDOUT (vous pouvez également écrire dans un fichier si cela fonctionne mieux). Le code le plus court en octets gagne.

Chaque chiffre sera représenté par 5x5 caractères ascii et séparés par deux colonnes de 5 espaces. La représentation exacte que vous utiliserez pour chaque chiffre est la suivante:

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

Les chiffres doivent être imprimés côte à côte. Les espaces de fin au-delà de la zone de délimitation du dernier chiffre ne sont pas autorisés. Des espaces de fin pour compléter la zone de délimitation du ou des derniers chiffres sont requis. Vous devez terminer la sortie avec une seule nouvelle ligne de fin. Les espaces de tête qui n'appartiennent pas à la zone de délimitation du premier chiffre sont également interdits.

Des échappatoires standard s'appliquent.

Exemple de sortie

Les lignes commençant par >doivent être interprétées comme des entrées.

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

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

>950
_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
suracteur
la source
par "espaces de fin", entendez-vous uniquement ceux qui dépassent le cadre de délimitation du dernier chiffre, ou également ceux qui se trouvent à la fin du dernier chiffre?
John Dvorak du
@JanDvorak uniquement ceux qui dépassent la zone de délimitation du dernier chiffre. Si des espaces de suivi sont nécessaires pour représenter la totalité du cadre de sélection d'un chiffre, ils sont requis.
suracteur
En regardant les exemples, les espaces de début sont également interdits. Sont-ils?
edc65
@ edc65 oui, merci de l'avoir signalé.
suracteur

Réponses:

3

Python 2 - 216

Mon premier coup, peut-être quelque chose à retirer, mais mon cerveau me fait mal, donc c'est assez bon pour l'instant

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
la source
2

JavaScript (ES6) 223

Fonction avec paramètre numérique, sortie sur console. NB Si le paramètre d'entrée pouvait être une chaîne, le code serait 5 caractères plus court et sans limite de 17 chiffres significatifs de nombres 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)
}

Tester

Testez dans la console Firefox.

F(12)

Production

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Production

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

F(950)

Production

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

Non 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
la source
1

PowerShell , 229 octets

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

Essayez-le en ligne!

Où cette chaîne présente des chiffres:

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

tiges verticales:

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

tiges horizontales:

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

Script déroulé:

$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
la source
Qu'est-ce que "n'importe quelle manière" dans la règle Écrivez une fonction ou un programme complet qui prend une valeur entière en entrée de quelque façon que ce soit ? Je n'ai pas osé interpréter «un entier» comme «une chaîne». :)
mazzy
Ouais, c'est un peu vague et probablement pas ce que l'OP voulait, mais je pense que je soulignerais le golf facile.
Veskah