Chữ số nghệ thuật của người Maya ASCII


14

Thử thách này rất đơn giản. Cho một số, xuất ra một đại diện nghệ thuật của số đó, sử dụng hệ thống chữ số Maya-20.

Hệ thống của người Maya là gì?

Người Maya đã sử dụng cơ sở 20 để lưu trữ số, vì vậy vị trí đầu tiên là vị trí 1s, vị trí tiếp theo 20, sau đó là 400s, v.v.

Số Vì vậy, người Maya 11ở cơ sở 10, nhưng 10thực sự là 20cơ số 10, 207807cơ số 10, vv ..

Và họ đại diện cho số của họ dưới dạng chữ tượng hình, với một biểu tượng đặc biệt cho 0.

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

Đó là con số không của họ. (ít nhất là một nửa picascii một nửa phiên bản nghệ thuật ascii của tôi)

Đó là một hình ảnh thực sự của biểu tượng số 0 của người Maya. 1

Đây là năm của họ:

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

Và 4:

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

Cuối cùng, để đặt nó lại với nhau:

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

Vì vậy, họ có x//5thanh, và x%5dấu chấm trên đầu của thanh. Và nếu x=0, họ sử dụng vỏ / ổ thay vì một khoảng trống.

Để biết thêm hình ảnh, hãy thử trang Wikimedia Commons của hình ảnh số Maya .

Nhưng điều này chỉ dành cho số lên đến 19. Chúng tôi không được phép có nhiều hơn 4các thanh và 4dấu chấm trong một "câu chuyện" ... Vì vậy, chúng tôi đi lên!

Đầu ra cho 20 là:

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



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

Lưu ý điều này thường không hợp lệ, bởi vì có một 1và một 0cùng một lúc. Nhưng 3(lưu ý rằng, câu trả lời của bạn cần ít nhất 3) dòng mới trước 0giá trị địa điểm mới.

Câu chuyện dưới cùng có dấu chấm, ý nghĩa 1và thanh nghĩa 5. Nhưng nó thực sự có ý nghĩa dấu chấm 20^0và thanh 20^0 * 5.

Mỗi câu chuyện đi lên một sức mạnh. Các chấm câu chuyện thứ hai có nghĩa là 20( 20^1) và 100( 20^1 * 5).

Vì vậy, số 506có thể được đại diện là:

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




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




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

Đây là (20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506.

Nhiệm vụ của bạn, nếu bạn chọn không hoặc chọn (không thành vấn đề), là xuất ra một đại diện nghệ thuật ascii của số cơ sở 10.

Các quy tắc khác:

  • Không gian hàng đầu / dấu là ổn, miễn là các dấu chấm, thanh và vỏ còn nguyên vẹn.
  • Các thanh, dấu chấm và vỏ phải chính xác là những gì các trường hợp thử nghiệm có. Không thay đổi kích thước.
  • Dẫn đầu '0 là được. (vỏ hàng đầu trên đầu ra)
  • Bạn không cần phải có chính xác 3 dòng mới giữa mỗi giá trị địa điểm hoặc câu chuyện, chỉ cần ít nhất 3 dòng.

Các trường hợp thử nghiệm:

15

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

12

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



4

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


0

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


24

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




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



33



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




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



20



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




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

1: Họ cũng đã sử dụng đầu của các vị thần cho các biểu tượng, nhưng đối với thử thách này, vỏ / bánh mì / zelda sẽ được sử dụng.


but for this challenge the shell/bread will be used.. Không vỏ, không bánh mì. LOZ liên kết đến ngực quá khứ.
Hói Bantha


@epicTCK .... điều đó thực sự rất đáng chú ý ...
Rɪᴋᴇʀ

Câu trả lời:


4

Hồng ngọc 223 180 177 179 byte

Hàm ẩn danh, trả về một chuỗi nhiều dòng.

Quên để thêm một số khoảng cách cần thiết, và cả đệ quy. Cũng chơi golf thêm một chút bằng cách thay đổi mọi thứ xung quanh.

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

Bạn là người chơi gôn nhất. Chúc mừng!
Rɪᴋᴇʀ

6

Python 3.5, 404 400 392 312 311 308 290 281 285 281 byte:

( Cảm ơn Adnan về mẹo tiết kiệm 9 byte ( 290->281) và Neil cho mẹo về tiết kiệm 4 byte ( 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]]

Hãy thử trực tuyến! (Ý)

Phân tích

Đối với mục đích phân tích này, chúng tôi sẽ sử dụng bộ ký tự 0123456789ABCDEFGHIJ để thể hiện từng chữ số trong cơ sở 20.

Vì vậy, tôi có thể đã chuyển đổi cơ sở 10 thành cơ sở 20 bằng một trong hai thuật toán tôi có. Thuật toán đầu tiên tôi nghĩ đến sử dụng là cái mà tôi gọi là thuật toán lũy thừa . Đây không phải là cái mà tôi đã sử dụng trong mã mặc dù nó sẽ làm cho nó dài hơn nó nên, vì vậy tôi sẽ không nói về cái này. Tuy nhiên, tôi đã tạo một tập lệnh python chuyển đổi bất kỳ số nguyên nào trong cơ sở 10 thành bất kỳ cơ sở nào khác được cung cấp bằng phương thức này, mà bạn có thể sử dụng ở đây trên repl.it. Cái mà tôi đã sử dụng thay cho thử thách này là cái mà tôi gọi là thuật toán chia , mà tôi nghĩ được giải thích khá tốt ở đây. Nhưng về cơ bản, điều xảy ra là nó lấy số cơ sở 10 được cung cấp và chia cho số cơ sở mà nó cần để chuyển đổi số thành, trong trường hợp này là 20, cho đến khi phần còn lại là 0 hoặc 1. Sau đó, nó sẽ lấy số dư và phần còn lại , theo thứ tự đó, từ hoạt động phân chia cuối cùng , và sau đó tất cả các phần còn lại từ các hoạt động phân chia khác theo thứ tự từ cuối đến trước. Tất cả các chữ số này sau đó được nối với nhau và chuỗi đã tham gia đảo ngược là số 10 cơ sở của bạn trong cơ sở 20! Để minh họa điều này, giả sử bạn muốn chuyển đổi số 10 431cơ sở thành cơ sở 20. Vì vậy, những gì chúng ta sẽ làm là:

[]=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]

Sau đó, cuối cùng chúng tôi sẽ lấy danh sách mà chúng tôi có, trong trường hợp này có chứa B11, và đảo ngược nó để bây giờ chúng tôi có 11B. Khi làm điều này, cuối cùng chúng ta đã có câu trả lời cuối cùng! 431 trong cơ sở 10 được chuyển đổi thành cơ sở 20 11B, có thể được xác nhận bằng tập lệnh Python của tôi sử dụng thuật toán lũy thừa mà tôi đã chia sẻ một liên kết đến ở trên, nhưng tôi sẽ làm lại ở đây . Đây là một thuật toán cũng sử dụng thuật toán chia được mô tả trong câu trả lời này và trả về cùng một câu trả lời như quyền hạn.

Toàn bộ quá trình này về cơ bản là những gì xảy ra trong kịch bản của tôi trong whilevòng lặp này : while not p or z:p+=[z%20];z=z//20. Sự khác biệt duy nhất là số >9đang không thể hiện dưới dạng chữ cái, nhưng thay vào đó là bản thân họ.

Tiếp tục, sau khi số 10 cơ sở đã được chuyển đổi thành cơ sở 20, với mỗi chữ số trong số nguyên cơ sở 20, chúng ta sẽ gọi g, g mod 5các dấu chấm được in ra và sau đó g//5các thanh được in ra. Sau đó chương trình in 3 dòng trống và chuyển sang chữ số tiếp theo. Tuy nhiên, nếu chữ số là 0, thì một "ổ" duy nhất được in ra theo sau bởi 3 dòng mới, và sau đó chương trình chuyển sang chữ số tiếp theo. Vì vậy, lấy số cơ sở 20 11B, chúng ta đi đến chữ số đầu tiên. Chữ số đầu tiên là 1, và do đó nó sẽ in 0 thanh kể từ 1//5=0và 1 chấm kể từ đó 1%5=1. Vì vậy, trước tiên chúng ta sẽ có được điều này:

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

và sau đó 3 dòng mới. Chuyển sang chữ số thứ hai, chúng ta cũng thấy rằng nó là 1, vì vậy nó sẽ xuất ra điều tương tự:

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

và 3 dòng mới. Cuối cùng, chuyển sang chữ số cuối cùng, chúng ta thấy rằng đó là một B. Vì B=11trong cơ sở 20, chương trình sẽ xuất 1 chấm kể từ 11%5=1và 2 vạch kể từ đó 11//5=2. Vì vậy, bây giờ, chúng tôi nhận được điều này:

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

Cuối cùng, đặt tất cả những thứ này lại với nhau, chúng ta có được điều này:

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




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




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

Và, đó là con số của người Maya cho 431! Cuối cùng, bạn có 10 số cơ sở của mình được biểu thị bằng số 20 của người Maya.

Lưu ý: Bạn có thể hoặc không thể nhận thấy lambdachức năng đó trong mã của tôi. Bất kể, chức năng này được sử dụng để tạo các dấu chấm vì nhiều dấu chấm phải được xuất ra cạnh nhau.


Tôi không chắc là nó có thể không, nhưng bạn có thể làm S,N,M,X=' -|\n'thay S,N,M,X=' ','-','|','\n'không?
Ad Nam

@Ad Nam đó là có thể.
Rɪᴋᴇʀ

@Ad Nam thật sao? Ồ, tôi không biết điều đó. Cảm ơn!
R. Kap

401chứa một số không bên trong.
Neil

@Neil ơi, đúng rồi. Cảm ơn cho những người đứng đầu lên. Bây giờ nó đã được sửa.
R. Kap

3

Python 3, 243 byte

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)

Thảo luận

n//20and m(n//20)gọi m()đệ quy nếu có quyền hạn cao hơn 20 sẽ được xử lý. Việc đệ quy được thực hiện trước khi in giá trị địa điểm hiện tại, để các quyền hạn cao hơn được in trước.

Nếu giá trị địa điểm hiện tại là khác không (r! = 0), for a,b,f-loop sẽ in các đơn vị và sau đó là số. alà hàng đầu tiên / thứ tư và blà hàng thứ hai / thứ ba. Bí quyết là trong print(*((a,b,b,a)*f),sep=x). Đối với các đơn vị, f = 1 dẫn đến print(*(a,b,b,a),sep=x), trong đó in 4 hàng tạo thành các ký hiệu đơn vị (x là '\ n'). Đối với các fives, f = số lượng fives để in (r // 5), do đó, tuple (a, b, b, a) được nhân (số lần lặp lại) với số lượng fives để in. Nếu f = 2, chúng tôi nhận được print(*(a,b,b,a,a,b,b,a),sep=x), trong đó in hai biểu tượng cho năm.

Nếu giá trị địa điểm hiện tại là 0, thì biểu tượng số 0 được in.


Tôi đã phải thưởng tiền thưởng cho R. Kap, nhưng điều này có thể xứng đáng với tiền thưởng của riêng nó! Công việc tốt!
Rɪᴋᴇʀ

2

Python, 411 byte

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'

Tôi đã tạo ra điều này để tạo ra các trường hợp thử nghiệm, bạn có thể sử dụng nó làm điểm chuẩn. Sắp xếp chơi gôn.


Bạn có thể loại bỏ 26 byte bằng cách xóa khoảng trắng và 4 byte khác bằng cách thực hiện s=math.sqrtvà gọi s(s(w))thay vìmath.sqrt(math.sqrt(w))
DJMcMayhem

@DrGreenEggsandoutDJ cảm ơn. Tôi không nghĩ rằng tôi đã nhận được 26 byte từ khoảng trắng?
Rɪᴋᴇʀ

Ồ, xin lỗi, đếm lỗi tôi có nghĩa là 25. Ngoài ra, w**0.25thậm chí còn tốt hơn s(s(w)). Mặc dù nó đã dài hơn?
DJMcMayhem

@DrGreenEggsandoutDJ yeah, bằng cách nào đó tôi đã mất chuỗi zero shell trong quá trình chuyển đổi từ tệp để trả lời.
Rɪᴋᴇʀ

2

JavaScript (ES6), 254 byte

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}
`)

Tôi không thể làm việc này? Nó lỗi với Missing } in template expression. Tôi không biết nhiều js, làm thế nào tôi có thể sửa nó?
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ Thật tệ, tôi đã di chuyển một số mã xung quanh và vô tình dán nó sai chỗ. Bây giờ nó đã được sửa.
Neil

1

Python 3, 213 byte

Đến với một phiên bản thậm chí ngắn hơn bằng cách sử dụng một cách tiếp cận khác:

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[]

giải trình

9 dòng đầu tiên hoặc lâu hơn, xây dựng các chuỗi được sử dụng để tạo các ký hiệu

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

Cốt lõi của giải pháp là hàm đệ quy m, xây dựng danh sách các chuỗi, một chuỗi cho mỗi dòng trong đầu ra. Sơ đồ, mtrông giống như:

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

m có thể được viết lại như:

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

Cuộc gọi đệ quy m(n//20)đến trước để các chữ số có ý nghĩa nhất được thực hiện trước.

[n%5*a,n%5*b,n%5*b,n%5*a]là chuỗi cho những biểu tượng. alà hàng trên cùng cho một biểu tượng duy nhất. n%5là số lượng một ký hiệu cho chữ số này. Vì vậy, n%5*alà một chuỗi cho hàng trên cùng (và dưới cùng) n%5. Tương tự, 'n% 5 * b` là một chuỗi cho hàng thứ 2 (và thứ 3).

Biểu thức [:n%5*4]hoạt động như một ifđể tránh thêm các dòng trống trong đầu ra nếu không có bất kỳ 'cái nào' cho đầu ra. Nó không cần thiết, nhưng làm cho đầu ra trông tốt hơn.

n%20//5là số lượng biểu tượng cho năm cần thiết. [c,d,d,c]là các chuỗi để tạo một biểu tượng cho năm.

[t,w,w,v+h*19+v,y,y,t] là các chuỗi để làm cho biểu tượng số không

[x,x] đặt ít nhất ba dòng trống giữa các nhóm chữ số Maya


Bạn có thể đưa ra một lời giải thích về cách thức này hoạt động?
Rɪᴋᴇʀ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.