Canne da conteggio; conta le tue canne


9

Qualche sfondo

Le aste di conteggio sono piccole barre (lunghe 3-14 cm) che sono state utilizzate da matematici di molte culture asiatiche per oltre 2000 anni per rappresentare qualsiasi numero intero o frazione. (In questo chqllenge ci concentreremo su numeri interi senza segno) C'era anche una versione scritta, chiamata numeri di barre.

Ecco come funziona:

(Se in qualsiasi momento ti confondi, vai a controllare la rappresentazione ASCII di ogni cifra e alcuni esempi che ho incluso in fondo)

I numeri di asta sono un vero sistema numerico posizionale con cifre per 1-9 e spazi vuoti per 0. Le cifre sono costituite da linee orizzontali e verticali; più righe, più alta è la cifra. Dopo aver superato le cinque, metti una linea orizzontale in cima per aggiungere 5 al numero di linee in basso. Una linea verticale è 1, due linee verticali 2, cinque linee verticali è 5, una linea verticale con una linea orizzontale in alto è 6, quattro linee verticali con una linea orizzontale in alto è 9 (la cifra più alta).

Una cifra verticale di 3 cifre:

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

Per rendere più semplici i numeri delle aste di lettura, hanno usato una notazione diversa per ogni cifra alternata. La seconda notazione scambia il ruolo delle linee orizzontali e verticali. in modo che 3 sia rappresentato da tre linee orizzontali e 8 da tre linee orizzontali con una linea verticale in alto.

Una cifra orizzontale 8:

  |  
  |  
__|__
_____
_____

Sapere quale notazione usare è facile, come detto in precedenza, vengono usati alternativamente e Sun Tzu scrisse che "uno è verticale, dieci è orizzontale". Quindi la cifra più a destra è verticale e alterniamo da lì in poi.

La sfida

Queste aste sono state usate per rappresentare numeri e frazioni negative (come spiegato nell'articolo di Wikipedia su di loro . Ai fini di questa sfida ci concentreremo solo su numeri interi positivi. L'obiettivo è semplice:

Scrivi una funzione o un programma completo che accetta in qualunque modo un valore intero come input e stampa la rappresentazione numerica dell'asta di questo numero intero su STDOUT (puoi anche scrivere su un file se funziona meglio). Vince il codice più breve in byte.

Ogni cifra sarà rappresentata da 5x5 caratteri ASCII e separata da due colonne di 5 spazi. La rappresentazione esatta che utilizzerai per ogni cifra è la seguente:

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

Le cifre devono essere stampate una accanto all'altra. Gli spazi finali oltre il rettangolo di selezione dell'ultima cifra non sono consentiti. Sono richiesti spazi finali per completare il rettangolo di selezione delle ultime cifre. È necessario terminare l'output con una nuova riga finale finale. Anche gli spazi iniziali che non appartengono al rettangolo di selezione della prima cifra sono vietati.

Si applicano scappatoie standard.

Esempio di output

Le righe che iniziano con >devono essere interpretate come input.

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

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

>950
_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       

per "spazi finali", intendi solo quelli oltre il rettangolo di selezione dell'ultima cifra o anche quelli alla fine dell'ultima cifra?
John Dvorak,

@JanDvorak solo quelli oltre il rettangolo di selezione dell'ultima cifra. Se sono necessari spazi trailig per rappresentare l'intero rettangolo di selezione di una cifra, sono necessari.
overactor

Guardando gli esempi, anche gli spazi iniziali sono vietati. Sono loro?
edc65,

@ edc65 sì, grazie per averlo segnalato.
overactor

Risposte:


3

Python 2 - 216

Il mio primo colpo, potrebbe essere un po 'di roba da eliminare, ma il mio cervello fa male, quindi per ora è abbastanza buono

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)))

2

JavaScript (ES6) 223

Funzione con parametro numerico, output su console. NB Se il parametro di input potrebbe essere una stringa, il codice sarebbe 5 caratteri più corto e senza il limite di 17 cifre significative di numeri 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)
}

Test

Test nella console di Firefox.

F(12)

Produzione

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Produzione

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

F(950)

Produzione

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

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)
}

1

PowerShell , 229 byte

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

Provalo online!

Dove questa stringa presenta cifre:

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

aste verticali:

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

aste orizzontali:

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

Script non srotolato:

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


Che cosa è 'any way' nella regola Scrivi una funzione o un programma completo che accetta in qualunque modo un valore intero come input ? Non ho osato interpretare "un numero intero" come "una stringa". :)
mazzy,

Sì, è un po 'vago e probabilmente non era quello che OP intendeva, ma ho pensato che avrei sottolineato il golf facile.
Veskah,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.