ASCIIアートマヤの数字


14

この挑戦は簡単です。数値を指定して、Mayan Base-20数字システムを使用して、数値のascii-art表現を出力します。

マヤシステムとは何ですか?

マヤ人は20を基数を格納するため、最初の位置は1sプレイス、次は20sプレイス、そして400 sなど。

したがって、マヤの数1110を底にしています10が、実際に20は10を底にしてい207ます807等のベース10、中...

そして、彼らは数字を絵文字として表し、特別な記号を付けました0

 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 

それは彼らのゼロでした。(少なくともpicascii半分私の芸術のアスキーアート版の半分)

これはマヤのゼロ記号の実際の図です。1

これは彼らの5つでした:

--------------------------------
|                              |
--------------------------------

そして4:

 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  

最後に、それをまとめるには:

 ----   ----   ----  
|    | |    | |    | 
|    | |    | |    | 
 ----   ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

そこで、彼らは持っているx//5バー、x%5バーの上にドットを。で、もしx=0、空白スペースの代わりにシェル/パンを使用します。

その他の画像については、Maya番号画像のWikimedia Commonsページをお試しください

しかし、これはまでの数字のみです19単一の「ストーリー」に4バーと4ドット以上を含めることは許可されません...それで、上に行きます!

20の出力は次のとおりです。

 ----
|    |
|    |
 ----



 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 

は同時に1a 0を持っているため、これは通常無効です。ただし、新しい場所の値を意味する3前の改行(少なくとも3つの答えが必要0です)。

一番下のストーリーには、ドット、意味1、バーの意味があり5ます。しかし、実際にはドットの意味20^0とバーの意味があり20^0 * 5ます。

それぞれの物語は力を発揮します。2番目のストーリーのドットは2020^1)と10020^1 * 5)を意味します。

したがって、番号506は次のように表すことができます。

 ----  
|    | 
|    | 
 ----  




--------------------------------
|                              |
--------------------------------




 ----  
|    | 
|    | 
 ----  
--------------------------------
|                              |
--------------------------------

これがあります(20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506

あなたの使命は、あなたが選択しない場合、または選択する場合(重要ではありません)、10進数のアスキーアート表現を出力することです。

その他の規則:

  • ドット、バー、シェルが無傷である限り、前後のスペースは問題ありません。
  • バー、ドット、およびシェルは、テストケースのとおりでなければなりません。サイズ変更なし。
  • 先頭の「0」は問題ありません。(出力の主要なシェル)
  • 各場所の値またはストーリーの間に正確に3つの改行を入れる必要はありません。少なくとも3つだけです。

テストケース:

15

--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------  

12

 ----   ----  
|    | |    | 
|    | |    | 
 ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------



4

 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  


0

 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 


24

 ----  
|    | 
|    | 
 ----  




 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  



33



 ----  
|    |  
|    | 
 ----  




 ----   ----   ----  
|    | |    | |    | 
|    | |    | |    | 
 ----   ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------



20



 ----  
|    | 
|    | 
 ----  




 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------| 
|                   |
|                   |
 -------------------  

1:彼らはまた、シンボルに神の頭を使用しましたが、この挑戦​​のためにシェル/パン/ ゼルダの胸が使用されます。


but for this challenge the shell/bread will be used.。シェルではなく、パンでもありません。過去のチェストへのLOZリンク。
ハゲバンタ


それのように非常に実際にある@epicTCK .... ...
Rɪᴋᴇʀ

回答:


4

ルビー、223の 180 177 179バイト

無名関数。複数行の文字列を返します。

必要な余分なスペースを追加するのを忘れ、再帰も追加しました。また、物事をシフトすることでもう少しゴルフをしました。

f=->n{s=?|;e=' ';n<20?(n<1?[t=e+d=?-*19,a=s+(e*4+s)*4,a,s+d+s,b=s+e*19+s,b,t]:((r=n%5)>0?[t=" ----  "*r,m="|    | "*r,m,t]:[])+[a=?-*32,s+e*30+s,a]*(n/5))*$/:f[n/20]+$/*5+f[n%20]}

あなたは最もゴルフ好きです。おめでとうございます!
Rɪᴋᴇʀ

6

Python 3.5、404 400 392 312 311 308 290 281 285 281バイト。

9バイトの保存に関するヒントについてはAdnan感謝します()4バイトの保存に関するヒントについてはNeilに感謝します()!290->281285->281

def u(z):
 p=[];P=print;S,N,M,X=' -|\n'
 while not p or z:p+=[z%20];z=z//20
 E=lambda i:(S+N*4+S)*i+X+((M+S*4+M)*i+X)*2+(S+N*4+S)*i+X;F=N*32+X+M+S*30+M+X+N*32+X;[P(S+N*19+S+X+M+((S*4+M)*4+X+M)*2+N*19+M+X+(M+S*19+M+X)*2+S+N*19+S+X*3)if y<1else P(E(y%5)+F*(y//5)+X*3)for y in p[::-1]]

オンラインでお試しください!(イデオン)

分析

この分析のために、文字セットを使用します 0123456789ABCDEFGHIJをして基数20の各桁を表します。

したがって、2つのアルゴリズムのいずれかを使用して、ベース10をベース20に変換して変換することができます。私が使用することを考えた最初のアルゴリズムは、私がべき乗アルゴリズムと呼ぶものです。これは私がコードで使用したものではありませんが、本来あるべきよりもずっと長くなっていたので、これについては説明しません。しかし、私はあなたが使用できる、このメソッドを使用して提供される任意の他のベースにベース10内の任意の整数に変換するPythonスクリプトを作成しましたここ repl.it.に このチャレンジに代わりに使用したのは、除算アルゴリズムと呼ばれるものです私はかなり良いと説明されていると思いますが、ここを。しかし基本的に何が起こるかは、提供された基数10を取得し、それを数値の変換に必要な基数で除算することです。この場合、剰余は0または1になるまで20です。 、その順序で、最後の除算操作から、そして最後から最初の順序で他の除算操作からの他のすべての剰余。これらの数字はすべて結合され、結合された順序がになり、ベース10のベース番号が20になります!これを説明するために、基数10の数値431を基数20 に変換するとします。したがって、次のようにします。

[]=list we will put all remainders and the last quotient in
R = Remainder

1. 431/20 = 21 R11 [B (B=11 in base 20)]
2. 21/20 = 1 R1 [Add the remainder and quotient: B11]

そして、最後に、持っているリストを取得します。この場合、リストにはが含まれておりB11、それをにして現在のを取得します11B。これを行うことで、最終的な答えがついに得られました!基数20に変換された基数10の431は11B、既に上記へのリンクを共有したべき乗アルゴリズムを使用するPythonスクリプトを使用して確認できますが、ここでもう一度行いますここに、この回答に記載された分割アルゴリズムを使用し、電力と同じ回答を返すものです。

このプロセス全体は、基本的にこのwhileループのスクリプトで行われていることですwhile not p or z:p+=[z%20];z=z//20。唯一の違いは、数字がということです>9ありませんが、代わりに自分自身のように文字として表現します。

次に、基数10の数値が基数20に変換された後、基数20の整数の各桁(これを呼び出します)についてgg mod 5ドットが印刷され、次にg//5バーが印刷されます。次に、プログラムは3つの空白行を出力し、次の桁に移動します。ただし、数字がの場合、1 0つの「ローフ」が出力され、その後に3つの新しい行が続き、プログラムは次の数字に移動します。したがって、基数20の数字を取得し11Bて、最初の桁に移動します。最初の桁はです1。したがって、以降0バーを印刷し1//5=0、以降1ドットを印刷します1%5=1。したがって、最初にこれを取得します。

 ---- 
|    |
|    |
 ---- 

そして、3つの新しい行。2桁目に移動すると、1であることがわかります。したがって、同じ結果が出力されます。

 ---- 
|    |
|    |
 ---- 

また、3つの新しい行。最後に、最後の桁に移動すると、それがであることがわかりBます。以来、B=11ベース20には、プログラムは出力1が以降ドットなる11%5=1ので2つのバー11//5=2。だから、今、これを取得します:

 ---- 
|    |
|    |
 ---- 
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

最後に、これらすべてをまとめると、次のようになります。

 ---- 
|    |
|    |
 ---- 




 ---- 
|    |
|    |
 ---- 




 ---- 
|    |
|    |
 ---- 
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

そして、それは431のマヤの数字です!最終的に、ベース10の数字がベース20のマヤの数字で表されます。

注:あなたはlambda私のコードでその機能に気づいたかもしれないし、気づいていないかもしれない。とにかく、複数のドットを隣接して出力する必要があるため、この関数はドットの作成に使用されます。


可能かどうかはわかりませんが、S,N,M,X=' -|\n'代わりにできますS,N,M,X=' ','-','|','\n'か?
アドナン

@Adnanは可能です。
Rɪᴋᴇʀ

@Adnan本当に?うわー、私はそれを知りませんでした。ありがとう!
R.ガプス

401内部ゼロが含まれています。
ニール

@ニールああ、そう。ヘッドアップをありがとう。現在修正されています。
R. Kap

3

Python 3、243バイト

s,v,h,x=' |-\n';P=print
t=s+h*19+s+x
def m(n):
 n//20and m(n//20);r=n%20
 if r:
  for a,b,f in[(r%5*' ----  ',r%5*'|    | ',1),('-'*32,'|'+' '*30+'|',r//5)]:P(*((a,b,b,a)*f),sep=x)
 else:P(t+2*(v+(4*s+v)*4+x)+v+h*19+v+x+2*(v+s*19+v+x)+t)
 P(x)

討論

n//20and m(n//20)m()処理する20のべき乗が大きい場合、再帰的に呼び出します。再帰は現在の場所の値を印刷する前に行われるため、より高いパワーが最初に印刷されます。

現在の場所の値がゼロ以外(r!= 0)の場合、for a,b,f-loopは単位を出力し、次に5を出力します。 aは1行b目/ 4行目であり、2行目/ 3行目です。その秘trickはにありprint(*((a,b,b,a)*f),sep=x)ます。ユニットの場合、f = 1の結果print(*(a,b,b,a),sep=x)、ユニットシンボルを構成する4行を出力します(xは '\ n'です)。5の場合、f =印刷する5の数(r // 5)であるため、タプル(a、b、b、a)は印刷する5の数で乗算(繰り返し)されます。f = 2の場合print(*(a,b,b,a,a,b,b,a),sep=x)、5の2つのシンボルを出力するを取得します。

現在の場所の値が0の場合、ゼロ記号が印刷されます。


私はR. Kapへの報奨金に報いる必要がありましたが、これはそれ自身の報奨に値するかもしれません!良くやった!
Rɪᴋᴇʀ

2

Python、411バイト

w,m=input(),[]
for i in[20**i for i in range(int(w**0.25))][::-1]:m.append(w/i);w=w%i
for i in m or[0]:print(lambda x,y='\n',w=' ----  ',z='|    | ':w*(x%5)+y+z*(x%5)+y+z*(x%5)+y+w*(x%5)+y+('-'*32+'\n|'+' '*30+'|\n'+'-'*32+y)*(x/5)if x else''' -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- ''')(i),'\n\n\n'

テストケースを生成するためにこれを作成しました。ベンチマークとして使用できます。ゴルファー。


あなたは行って、空白を除去することによって、26のバイトを脱いで、そして他の4可能性s=math.sqrtや呼び出しs(s(w))の代わりにmath.sqrt(math.sqrt(w))
DJMcMayhem

@DrGreenEg​​gsandHamDJありがとう。私はホワイトスペースから26バイトを得たとは思わないのですか?
Rɪᴋᴇʀ

ああ、申し訳ありませんが、カウントエラーは25を意味していました。また、w**0.25よりも優れていs(s(w))ます。長くなりましたが?
DJMcMayhem

@DrGreenEg​​gsandHamDJええ、ファイルから応答への転送中にシェルゼロ文字列をどうにかして失いました。
Rɪᴋᴇʀ

2

JavaScript(ES6)、254バイト

f=(n,r=(s,n=19)=>s.repeat(n))=>(n>19?f(n/5>>2)+`


`:``)+(n%5?`${r(s=` ----  `,n%5)}
${t=r(`|    | `,n%5)}
${t}
${s}
`:``)+r(`${s=r(`-`,32)}
|${r(` `,30)}|
${s}
`,n/5&3)+(n%20?``:` ${s=r(`-`)}
${t=r(`|    `,4)}|
${t}|
|${s}|
|${t=r(` `)}|
|${t}|
 ${s}
`)

これを動作させることができませんか?でエラーが発生しMissing } in template expressionます。jsがあまりわからないのですが、どうすれば修正できますか?
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ悪いのは、コードを移動して誤って間違った場所に貼り付けてしまったことです。現在修正されています。
ニール

1

Python 3、213バイト

別のアプローチを使用して、さらに短いバージョンを見つけました。

s,v,h,x=' |-\n'
t=s+h*19+s
k=4*s+v
w=v+4*k
y=v+s*19+v
a=' ----  '
b=v+k+s
c=h*32
d=v+s*30+v
m=lambda n:m(n//20)+([n%5*a,n%5*b,n%5*b,n%5*a][:n%5*4]+n%20//5*[c,d,d,c]if n%20else[t,w,w,v+h*19+v,y,y,t])+[x,x]if n else[]

説明

最初の9行程度で、シンボルを作成するために使用される文字列を作成します

s,v,h,x = ' |-\n'
k = '    |'

    # parts for a unit
a = ' ----  '
b = '|    | '

    # parts for a five
c = '--------------------------------'
d = '|                              |'

    # parts for a zero
t = ' ------------------- '
w = '|    |    |    |    |'
y = '|                   |'

ソリューションの核となるのはm、出力の各行に1つの文字列を含む文字列のリストを作成する再帰関数です。概略的には、m次のようになります。

m(n//20) + (ones + fives if n%20 else zero) + [x,x] if n else []

m 次のように書き換えることができます。

def m(n):
  if n:
    ans = m(n//20)                             # process high digits first

    if n%20:                                   # if there is a base-20 digit
      ans += [n%5*a,n%5*b,n%5*b,n%5*a][:n%5*4] # add strings for the 'ones' if any
      ans += n%20//5 * [c, d, d, c]            # add strings for the 'fives' if any

    else:
      ans += [t,w,w,v+h*19+v,y,y,t]            # otherwise, add strings for a `zero`

    ans += [x,x]                               # blank lines between digit groups

  else:
    ans = []                                   # base case

  return ans

再帰呼び出しm(n//20)が最初になり、最上位の数字が最初に行われます。

[n%5*a,n%5*b,n%5*b,n%5*a]1記号の文字列です。 a単一のシンボルの最上行です。 n%5は、この数字の1つのシンボルの数です。ですから、n%5*a1の上(および下)の行の文字列ですn%5。同様に、「n%5 * b」は2番目(および3番目)の行の文字列です。

この式は、出力する「1」がない場合に出力の余分な空白行を回避[:n%5*4]するように機能ifします。必要ありませんが、出力の見栄えは良くなります。

n%20//5必要な5つのシンボルの数です。 [c,d,d,c]5つのシンボルを1つ作成する文字列です。

[t,w,w,v+h*19+v,y,y,t] ゼロ記号を作成する文字列です

[x,x] マヤの数字のグループ間に少なくとも3行の空白行を挿入します


これがどのように機能するかについて説明してもらえますか?
Rɪᴋᴇʀ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.