ロッドを数える; ロッドを数える


9

いくつかの背景

カウンティングロッドは小さな棒(長さ3〜14 cm)で、2000年以上にわたって多くのアジアの文化の数学者が整数または分数を表すために使用していました。(ただし、このchqllengeでは、符号なし整数に焦点を当てています)ロッド番号と呼ばれるバージョンも作成されました。

仕組みは次のとおりです。

(いつか混乱した場合は、各桁のASCII表記と、下部に含めたいくつかの例を確認してください)

ロッド数字は、1〜9の数字と0の空白を持つ真の位置数字システムです。数字は水平線と垂直線で構成されます。行が多いほど、桁が高くなります。5を超えたら、水平線を上に配置して、下の行数に5を追加します。1本の垂直線は1、2本の垂直線2、5本の垂直線は5、5本の垂直線は上部に水平線があり、4本の垂直線は上部に水平線が9(最上位桁)です。

縦3桁:

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

ただし、ロッドの数字を読みやすくするために、交互の数字ごとに異なる表記法を使用しています。2番目の表記は、水平線と垂直線の役割を入れ替えます。したがって、3は3本の水平線で、8は垂直線が上にある3本の水平線で表されます。

横8桁:

  |  
  |  
__|__
_____
_____

先に述べたように、どちらの表記を使用するかは簡単ですが、これらは交互に使用され、Sun Tzuは「1つは垂直、10つは水平」と書いています。したがって、右端の数字は垂直であり、そこから交互になります。

チャレンジ

これらの棒は、負の数と分数を表すために使用されました(それらに関するウィキペディアの記事で説明されています)。この課題では、正の整数のみに焦点を当てますが、目的は単純です:

何らかの方法で整数値を入力として受け取り、この整数のロッド数値表現をSTDOUTに出力する関数または完全なプログラムを記述します(うまくいく場合は、ファイルに書き込むこともできます)。バイト単位の最短コードが優先されます。

すべての数字は5x5のASCII文字で表され、5つのスペースで構成される2つの列で区切られます。各桁に使用する正確な表現は次のとおりです。

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

「末尾のスペース」とは、最後の桁のバウンディングボックスを通過したものだけですか、それとも最後の桁の最後にあるものですか?
John Dvorak 14

@JanDvorakは、最後の桁の境界ボックスを過ぎたもののみ。数字の境界ボックス全体を表すために後続スペースが必要な場合は、それらが必要です。
オーバーアクター2014

例を見ると、先行スペースも禁止されています。彼らは?
edc65

@ edc65はい、指摘していただきありがとうございます。
オーバーアクター2014

回答:


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文字短くなり、JS番号の有効数字17桁の制限はありません。

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


ルールの「任意の方法」とは何ですか入力に整数値を使用する関数または完全なプログラムを何らかの方法で記述しますか?あえて「整数」を「文字列」として解釈することはしませんでした。:)
マジー

ええ、それは少しあいまいで、おそらくOPが意図したものではありませんが、簡単なゴルフを指摘すると思いました。
ベスカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.