Підрахунок стрижнів; порахуйте свої прути


9

Якесь тло

Підрахункові стрижні - це невеликі бруски (довжиною 3-14 см), які використовувались математиками з багатьох азіатських культур більше 2000 років для представлення будь-якого цілого числа чи дробу. (Хоча в цьому chqllenge ми зосередимось на непідписаних цілих числах) Існувала також письмова версія, яка називається стрижневими цифрами.

Ось як це працює:

(Якщо в будь-який момент ви заплуталися, перегляньте подання кожної цифри та деякі приклади, які я включив внизу)

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

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

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

Щоб полегшити читання цифр стрижня, вони використовували різні позначення для кожної змінної цифри. Друга позначення замінює роль горизонтальної та вертикальної ліній. так що 3 представлені трьома горизонтальними лініями і 8 трьома горизонтальними лініями з вертикальною лінією зверху.

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

  |  
  |  
__|__
_____
_____

Знаючи, яку нотацію використовувати легко, як було сказано раніше, вони використовуються по черзі, і Сунь Цзи написав, що "один вертикальний, десять - горизонтальний". Отже, найправіша цифра є вертикальною, і ми чергуємо звідти далі.

Змагання

Ці стрижні використовувались для відображення від'ємних чисел і дробів (як це пояснено у статті у Вікіпедії про них . Для цього завдання викличемо лише позитивні цілі числа. Ціль проста:

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

Кожна цифра буде представлена ​​5х5 символами 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 лише ті, хто минув обмежувальне поле останньої цифри. Якщо проміжки трейлігу потрібні для відображення всього обмежувального поля цифри, вони потрібні.
суперектор

Переглядаючи приклади, також заборонені провідні пробіли. Чи вони?
edc65

@ edc65 так, дякую, що вказали на це.
суперактор

Відповіді:


3

Пітон 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)

Вихідні дані

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

Безумовно

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


Що таке "будь-який спосіб" у правилі Написати функцію або повну програму, яка будь-яким чином приймає ціле значення як вхід ? Я не наважувався інтерпретувати "ціле число" як "рядок". :)
mazzy

Так, це трохи розпливчасто і, мабуть, не те, що ОП задумав, але подумав, що я зазначу легкий гольф.
Веська
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.