Счетные стержни; сосчитать ваши удочки


9

Некоторый фон

Счетные палочки - это маленькие столбики (длиной 3-14 см), которые использовались математиками из многих азиатских культур в течение более 2000 лет для представления любого целого числа или дроби. (В этом chqllenge мы сосредоточимся на целых числах без знака). Была также письменная версия, называемая цифрами стержня.

Вот как это работает:

(Если в какой-то момент вы запутались, посмотрите представление ascii каждой цифры и некоторые примеры, которые я включил внизу)

Цифры стержня представляют собой систему истинных позиционных цифр с цифрами для 1-9 и пробелом для 0. Цифры состоят из горизонтальных и вертикальных линий; чем больше строк, тем выше цифра. Как только вы дойдете до пяти, вы положите горизонтальную линию сверху, чтобы добавить 5 к числу линий ниже. Одна вертикальная линия равна 1, две вертикальные линии 2, пять вертикальных линий - 5, одна вертикальная линия с горизонтальной линией сверху - 6, четыре вертикальные линии с горизонтальной линией сверху - 9 (самая высокая цифра).

Вертикальная 3 цифра:

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

Чтобы упростить чтение чисел стержней, они использовали разные обозначения для каждой чередующейся цифры. Второе обозначение меняет роль горизонтальных и вертикальных линий. так что 3 представлен тремя горизонтальными линиями, а 8 - тремя горизонтальными линиями с вертикальной линией сверху.

Горизонтальная 8 цифра:

  |  
  |  
__|__
_____
_____

Зная, какую нотацию использовать легко, как уже говорилось ранее, они используются поочередно, и Сунь Цзы писал, что «один вертикальный, десять горизонтальный». Таким образом, самая правая цифра является вертикальной, и мы чередуем с этого момента.

Соревнование

Эти стержни использовались для представления отрицательных чисел и дробей (как описано в статье в Википедии о них . Для целей этого задания мы сосредоточимся только на положительных целых числах. Цель проста:

Напишите функцию или полную программу, которая каким-либо образом принимает целочисленное значение в качестве входных данных и печатает числовое представление стержня этого целого числа в STDOUT (вы также можете записать в файл, если это сработает лучше). Самый короткий код в байтах побеждает.

Каждая цифра будет представлена ​​5x5 символами ascii и разделена двумя столбцами из 5 пробелов. Точное представление, которое вы будете использовать для каждой цифры, выглядит следующим образом:

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

Цифры должны быть напечатаны рядом друг с другом. Конечные пробелы за ограничительной рамкой последней цифры не допускаются. Необходимы пробелы для заполнения ограничительной рамки последней цифры (цифр). Вы должны завершить вывод одной новой конечной строкой. Пробелы, не принадлежащие ограничительной рамке первой цифры, также запрещены.

Применяются стандартные лазейки.

Пример вывода

Строки, начинающиеся с >, должны интерпретироваться как ввод.

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

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

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

Под "пробелами в конце" вы подразумеваете только те, которые находятся за ограничительной рамкой последней цифры, или также те, которые находятся в конце последней цифры?
Джон Дворжак

@JanDvorak только те, которые выходят за рамки последней цифры. Если для обозначения всей ограничивающей рамки цифры необходимы пробелы, они необходимы.
overactor

Глядя на примеры, ведущие пробелы тоже запрещены. Они?
edc65

@ edc65 да, спасибо за указание на это.
'40

Ответы:


3

Python 2 - 216

Мой первый выстрел может быть кое-что, что нужно взять, но мой мозг болит, так что пока достаточно

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

Функция с числовым параметром, вывод на консоль. Примечание: если входным параметром может быть строка, код будет на 5 символов короче и без ограничения в 17 значащих цифр чисел 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)
}

Тестовое задание

Тест в консоли Firefox.

F(12)

Вывод

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

Вывод

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

F(950)

Вывод

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

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 байт

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

Попробуйте онлайн!

Где эта строка представляет цифры:

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

вертикальные стержни:

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

горизонтальные стержни:

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

Развернутый скрипт:

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


Что такое «любой способ» в правиле. Напишите функцию или полную программу, которая каким-либо образом принимает целочисленное значение в качестве входных данных ? Я не осмеливался интерпретировать «целое число» как «строку». :)
Мази

Да, это немного расплывчато и, вероятно, не то, что намеревался OP, но решил, что я бы указал на легкий гольф.
Веска
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.