Liczenie prętów; policz swoje pręty

9

Trochę tła

Pręty liczące to małe słupki (o długości 3-14 cm), które były używane przez matematyków z wielu kultur azjatyckich przez ponad 2000 lat do reprezentowania dowolnej liczby całkowitej lub ułamka. (W tym zadaniu skupimy się jednak na liczbach całkowitych bez znaku). Była też wersja napisana, zwana liczbami prętowymi.

Oto jak to działa:

(Jeśli w którymkolwiek momencie się pomylisz, sprawdź reprezentację ascii każdej cyfry i kilka przykładów, które zamieściłem na dole)

Liczby prętowe to prawdziwy system liczb pozycyjnych z cyframi dla 1-9 i pustymi dla 0. Cyfry składają się z linii poziomych i pionowych; im więcej linii, tym wyższa cyfra. Po przekroczeniu piątej umieścisz poziomą linię na górze, aby dodać 5 do liczby linii poniżej. Jedna pionowa linia to 1, dwie pionowe linie 2, pięć pionowych linii to 5, jedna pionowa linia z poziomą linią na górze to 6, cztery pionowe linie z poziomą linią na górze to 9 (najwyższa cyfra).

3-cyfrowa pionowa:

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

Aby ułatwić odczytanie liczb prętów, zastosowano inną notację dla każdej cyfry na przemian. Drugi zapis zamienia rolę linii poziomych i pionowych. tak że 3 jest reprezentowane przez trzy poziome linie, a 8 przez trzy poziome linie z pionową linią na górze.

Pozioma 8 cyfr:

  |  
  |  
__|__
_____
_____

Wiedząc, która notacja jest łatwa, jak wspomniano wcześniej, tehy są używane na przemian, a Sun Tzu napisał, że „jeden jest pionowy, a dziesięć jest poziomy”. Tak więc najbardziej wysunięta na prawo cyfra jest pionowa i od tego momentu zmieniamy naprzemiennie.

Wyzwanie

Pręty te były używane do reprezentowania liczb ujemnych i ułamków (jak wyjaśniono w artykule na ich temat w Wikipedii . Na potrzeby tego wyzwania skupimy się tylko na dodatnich liczbach całkowitych. Cel jest prosty:

Napisz funkcję lub pełny program, który pobiera wartość całkowitą jako dane wejściowe w dowolny sposób i wypisuje liczbową reprezentację tej liczby całkowitej na STDOUT (możesz również zapisać do pliku, jeśli to się lepiej sprawdzi). Najkrótszy kod w bajtach wygrywa.

Każda cyfra będzie reprezentowana przez 5x5 znaków ascii i oddzielona dwoma kolumnami po 5 spacji. Dokładna reprezentacja, której użyjesz dla każdej cyfry, jest następująca:

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

Cyfry należy wydrukować obok siebie. Końcowe spacje poza obwiednią ostatniej cyfry są niedozwolone. Wymagane są końcowe spacje do wypełnienia ramki granicznej ostatnich cyfr. Powinieneś zakończyć wynik pojedynczym znakiem nowej linii. Spacje wiodące, które nie należą do ramki granicznej pierwszej cyfry, są również zabronione.

Obowiązują standardowe luki.

Przykładowe dane wyjściowe

Linie zaczynające >się od należy interpretować jako dane wejściowe.

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

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

>950
_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
overactor
źródło
przez „końcowe spacje”, czy masz na myśli tylko te, które znajdują się poza obwiednią ostatniej cyfry, czy też te na końcu ostatniej cyfry?
John Dvorak
@JanDvorak tylko te za ramką graniczną ostatniej cyfry. Jeśli potrzebne są spacje dla reprezentowania całej ramki granicznej cyfry, są one wymagane.
overactor
Patrząc na przykłady, spacje wiodące są również zabronione. Czy oni są?
edc65
@ edc65 tak, dziękuję za zwrócenie na to uwagi.
overactor

Odpowiedzi:

3

Python 2 - 216

Mój pierwszy strzał może być czymś do wyjęcia, ale mój mózg boli, więc na razie jest wystarczająco dobry

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)))
Biżuteria
źródło
2

JavaScript (ES6) 223

Funkcja z parametrem numerycznym, wyjście na konsolę. Uwaga: Jeśli parametr wejściowy może być łańcuchem, kod będzie o 5 znaków krótszy i bez ograniczenia 17 cyfr znaczących liczb 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

Przetestuj w konsoli Firefox.

F(12)

Wynik

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Wynik

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

F(950)

Wynik

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

Nie golfił

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
źródło
1

PowerShell , 229 bajtów

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

Wypróbuj online!

Gdzie ciąg zawiera cyfry:

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

pręty pionowe:

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

pręty poziome:

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

Rozwinięty skrypt:

$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
źródło
Co to jest „jakikolwiek sposób” w regule Napisz funkcję lub pełny program, który w jakikolwiek sposób przyjmuje wartość całkowitą jako dane wejściowe ? Nie odważyłem się interpretować „liczby całkowitej” jako „ciągu”. :)
mazzy
Tak, to trochę niejasne i prawdopodobnie nie to, co zamierzał OP, ale pomyślałem, że zwrócę uwagę na łatwy golf.
Veskah