Zählstangen; Zähle deine Stangen


9

Einige Hintergrundinformationen

Zählstäbe sind kleine Balken (3 bis 14 cm lang), die von Mathematikern aus vielen asiatischen Kulturen mehr als 2000 Jahre lang verwendet wurden, um eine ganze Zahl oder einen ganzen Bruch darzustellen. (In dieser Tabelle konzentrieren wir uns jedoch auf vorzeichenlose Ganzzahlen.) Es gab auch eine schriftliche Version, die Stabnummern genannt wurde.

So funktioniert das:

(Wenn Sie zu irgendeinem Zeitpunkt verwirrt sind, sehen Sie sich die ASCII-Darstellung jeder Ziffer und einige Beispiele an, die ich unten aufgeführt habe.)

Stabziffern sind ein echtes Positionszahlensystem mit Ziffern für 1-9 und Leerzeichen für 0. Die Ziffern bestehen aus horizontalen und vertikalen Linien; Je mehr Zeilen, desto höher die Ziffer. Sobald Sie fünf erreicht haben, setzen Sie eine horizontale Linie oben, um 5 zur Anzahl der Zeilen darunter hinzuzufügen. Eine vertikale Linie ist 1, zwei vertikale Linien 2, fünf vertikale Linien sind 5, eine vertikale Linie mit einer horizontalen Linie oben ist 6, vier vertikale Linien mit einer horizontalen Linie oben sind 9 (die höchste Ziffer).

Eine vertikale 3-stellige:

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

Um das Lesen der Stabnummern zu vereinfachen, verwendeten sie für jede alternierende Ziffer eine andere Notation. Die zweite Notation vertauscht die Rolle der horizontalen und vertikalen Linien. so dass 3 durch drei horizontale Linien und 8 durch drei horizontale Linien mit einer vertikalen Linie oben dargestellt wird.

Eine horizontale 8-stellige:

  |  
  |  
__|__
_____
_____

Zu wissen, welche Notation zu verwenden ist, ist einfach, wie bereits gesagt, sie werden abwechselnd verwendet, und Sun Tzu schrieb, dass "eins vertikal ist, zehn horizontal ist". Die Ziffer ganz rechts ist also vertikal und wir wechseln von da an.

Die Herausforderung

Diese Stäbe wurden verwendet, um negative Zahlen und Brüche darzustellen (wie im Wikipedia-Artikel erläutert) . Für diese Herausforderung konzentrieren wir uns jedoch nur auf positive ganze Zahlen. Das Ziel ist einfach:

Schreiben Sie eine Funktion oder ein vollständiges Programm, das in irgendeiner Weise einen ganzzahligen Wert als Eingabe verwendet und die Darstellung der Stabzahl dieser Ganzzahl in STDOUT druckt (Sie können auch in eine Datei schreiben, wenn dies besser funktioniert). Der kürzeste Code in Bytes gewinnt.

Jede Ziffer wird durch 5x5 ASCII-Zeichen dargestellt und durch zwei Spalten mit 5 Leerzeichen getrennt. Die genaue Darstellung, die Sie für jede Ziffer verwenden, lautet wie folgt:

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

Die Ziffern sind nebeneinander zu drucken. Nachgestellte Leerzeichen hinter dem Begrenzungsrahmen der letzten Ziffer sind nicht zulässig. Nachfolgende Leerzeichen zum Vervollständigen des Begrenzungsrahmens der letzten Ziffer (n) sind erforderlich. Sie sollten die Ausgabe mit einem einzelnen nachgestellten Zeilenumbruch beenden. Führende Leerzeichen, die nicht zum Begrenzungsrahmen der ersten Ziffer gehören, sind ebenfalls verboten.

Es gelten Standardlücken.

Beispielausgabe

Zeilen, die mit beginnen, >sind als Eingabe zu interpretieren.

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

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

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

Mit "nachgestellten Leerzeichen" meinen Sie nur diejenigen, die hinter dem Begrenzungsrahmen der letzten Ziffer stehen, oder auch diejenigen am Ende der letzten Ziffer?
John Dvorak

@JanDvorak nur diejenigen, die hinter dem Begrenzungsrahmen der letzten Ziffer stehen. Wenn hintergeordnete Leerzeichen benötigt werden, um den gesamten Begrenzungsrahmen einer Ziffer darzustellen, sind sie erforderlich.
Overactor

In den Beispielen sind auch führende Leerzeichen verboten. Sind sie?
edc65

@ edc65 ja, danke für den Hinweis.
Overactor

Antworten:


3

Python 2 - 216

Mein erster Schuss könnte ein paar Sachen zum Herausnehmen sein, aber mein Gehirn tut weh, also ist es für den Moment gut genug

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

Funktion mit numerischem Parameter, Ausgabe an die Konsole. NB Wenn der Eingabeparameter eine Zeichenfolge sein könnte, wäre der Code 5 Zeichen kürzer und ohne die Begrenzung auf 17 signifikante Stellen von JS-Zahlen.

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

Prüfung

In der Firefox-Konsole testen.

F(12)

Ausgabe

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Ausgabe

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

F(950)

Ausgabe

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

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

Probieren Sie es online aus!

Wo diese Zeichenfolge Ziffern enthält:

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

vertikale Stangen:

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

horizontale Stangen:

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

Abgerolltes Skript:

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


Was ist 'irgendwie' in der Regel ? Schreiben Sie eine Funktion oder ein vollständiges Programm, das in irgendeiner Weise einen ganzzahligen Wert als Eingabe verwendet ? Ich habe es nicht gewagt, "eine ganze Zahl" als "eine Zeichenfolge" zu interpretieren. :)
mazzy

Ja, es ist ein bisschen vage und wahrscheinlich nicht das, was OP beabsichtigt hat, aber ich dachte, ich würde auf das einfache Golfspiel hinweisen.
Veskah
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.