ASCII艺术玛雅数字


14

这个挑战很简单。给定一个数字,请使用Mayan Base-20数字系统输出该数字的科学表示形式。

什么是玛雅系统?

玛雅人以20为底来存储数字,因此第一个位置是1s位置,第二个位置是20s位置,然后是400s,依此类推。

因此,玛雅编号以10 11底,但10实际上20以10 207807底,以10 为底,依此类推。

他们用象形文字表示数字,并用特殊符号表示0

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

那是他们的零。(至少一半的picascii一半我的艺术性ascii艺术版本)

那是玛雅零符号的真实图片。1个

这是他们的五个:

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

还有一个4:

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

最后,将其放在一起:

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

因此,它们有x//5条形图,并且x%5在条形图上有圆点。如果为x=0,则使用外壳/面包代替空格。

有关更多图像,请尝试Maya数字图像的Wikimedia Commons页面

但这仅适用于不超过的数字19。我们不允许在一个“故事”中包含超过4条和4点的东西。

20的输出是:

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



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

请注意,这通常是无效的,因为同时具有10。但是3(请注意,您的答案至少需要3条)换行符,然后才是0新位置值的均值。

最底层的故事有点,含义1和条形含义5。但是它实际上有点的意思20^0和条的意思20^0 * 5

每个故事都有力量。第二个故事点表示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为底的数字的ascii艺术表示形式。

其他规则:

  • 只要点,条和壳完整无缺,前导/尾随空间就可以。
  • 条形,点形和壳形必须与测试用例完全相同。不调整大小。
  • 前导0可以。(输出中的前导shell)
  • 您不必在每个地方价值或故事之间有3条换行符,只需至少3条。

测试用例:

15

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

12

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



4

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


0

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


24

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




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



33



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




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



20



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




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

1:他们也使用众神的头像作为符号,但是对于这一挑战,将使用贝壳/面包/ 塞尔达胸部


but for this challenge the shell/bread will be used.。没有壳,没有面包。LOZ链接到过去的箱子。
Bald Bantha


@epicTCK ....这其实是非常喜欢它...
Rɪᴋᴇʀ

Answers:


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

蟒3.5,404 400 392 312 311 308 290 281 285 281字节:

由于阿德南为尖端上节省9个字节(290->281)和尼尔为尖端上保存4个字节(285->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为基数的每个数字。

因此,我本可以使用我拥有的两种算法之一将10进制转换为20进制。我想到的第一个算法就是所谓的幂算法。这不是我在代码中使用的那个,因为它会使它变得比原本应该更长的时间,所以我将不再讨论这个。不过,我确实创造了在基地10的整数转换成任何其他基地使用这种方法,你可以用它提供了一个python脚本在这里上repl.it. 我用来应对这一挑战的是我所说的除法算法,我认为在这里可以很好地解释它。但是基本上发生的是,它使用提供的基数10并将其除以转换该数字所需的基数(在这种情况下为20),直到余数为0或1。然后取商和余数,从最后一个除法运算开始,然后按从最后到第一个的顺序从其他除法运算得到的所有其他余数。然后将所有这些数字连接在一起,然后按相反的顺序连接以20为底的10 进制数字!为了说明这一点,假设您想431将以10 为底的数字转换为以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。这样,我们终于得到了最终答案!基准10中的431转换为基准20是11B,可以使用我的Python脚本进行确认,该脚本使用了我已经共享到上面的链接的powers算法,但是我将在此处再次进行操作。是一种也使用此答案中描述的除法算法并返回与幂次方相同的答案的答案。

本质上,整个过程就是此while循环中我的脚本中发生的事情while not p or z:p+=[z%20];z=z//20。唯一的区别是,数字>9不是表示为字母,而是为自己。

接下来g,将以10为底的数字转换为以20为底的数字,对于以20为底的整数(我们称为)中的每个数字,将g mod 5打印出点,然后g//5打印出小节。然后,程序将打印3行空白行并移至下一位。但是,如果数字为0,则将打印出一个“面包”,然后打印3行,然后程序将移至下一个数字。因此,以20为底数11B,我们转到第一个数字。第一位为1,因此自以来将打印0个小节1//5=0,并自开始一个点1%5=1。所以,我们首先要得到这个:

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

然后3行。移至第二个数字,我们还看到它是1,因此它将输出相同的内容:

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

还有3条新线 最后,移至最后一位,我们看到它是B。由于B=11在基数为20的情况下,程序将输出1点以来的值11%5=1和2 点以来的值11//5=2。所以现在,我们得到了:

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

最后,将所有这些放在一起,我们得到:

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




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




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

而且,这就是431的玛雅数字!您终于有了以20个基数的玛雅数字表示的10个基数。

注意:您可能已经注意到lambda我的代码中的那个功能,也可能没有注意到。无论如何,此功能都用于创建点,因为必须将多个点彼此相邻地输出。


我不确定是否可以,但是您能S,N,M,X=' -|\n'代替S,N,M,X=' ','-','|','\n'吗?
阿德南

@Adnan是可能的。
Rɪᴋᴇʀ

@Adnan真的吗?哇,我不知道。谢谢!
R. Kap

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是第一b/第四行,是第二/第三行。诀窍在于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),它将打印两个符号五个。

如果当前位置值为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'

我创建此程序是为了生成测试用例,您可以将其用作基准。Sorta打高尔夫球。


您可以通过删除空格来删除26个字节,而通过执行s=math.sqrt和调用s(s(w))来代替另外4个字节,而不是math.sqrt(math.sqrt(w))
James

@DrGreenEg​​gsandHamDJ谢谢。我不认为我可以从空白中减去26个字节吗?
Rɪᴋᴇʀ

哦,抱歉,计算错误的意思是25。而且,w**0.25甚至比还要好s(s(w))。虽然更长了?
詹姆斯

@DrGreenEg​​gsandHamDJ是的,我以某种方式丢失了从文件传输到答案的shell零字符串。
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,该函数构建一个字符串列表,输出中的每一行一个字符串。示意图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]是一个用于符号的字符串。 a是单个符号的第一行。 n%5是该数字的一个符号数。因此,n%5*a是最上面一行(和最后一行)的字符串n%5。同样,“ n%5 * b”是第二行(和第三行)的字符串。

该表达式的[:n%5*4]作用类似于,if如果没有要输出的“ 1”,则可以避免输出中多余的空行。不需要,但是可以使输出看起来更好。

n%20//5是所需的五个符号的数量。 [c,d,d,c]是用来代表五个符号的字符串。

[t,w,w,v+h*19+v,y,y,t] 是零符号的字符串

[x,x] 在玛雅数字组之间放置至少三行空行


您能解释一下它是如何工作的吗?
Rɪᴋᴇʀ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.