ASCII 아트 마야 숫자


14

이 도전은 간단합니다. 숫자가 주어지면 Mayan Base-20 숫자 시스템을 사용하여 숫자의 ASCII 표현을 출력하십시오.

마야 제도는 무엇입니까?

마야인은 기본 20을 사용하여 숫자를 저장 했으므로 첫 번째 위치는 1s 장소, 다음은 20s 장소, 400s 등 이었습니다 .

그래서 마야 수 1있습니다 1기본 10 만, 10실제로 20베이스 (10)에, 207이다 807등 기본 10에 ..

그리고 그들은 숫자를 그림 문자로 나타내 었으며에 대한 특수 기호가 0있습니다.

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

그것은 그들의 제로였습니다. (적어도 반 피카시 반 내 예술성 아스키 아트 버전)

이것은 마야 제로 기호 의 실제 그림입니다. 1

이것은 그들의 다섯이었다 :

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

그리고 4 :

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

마지막으로 다음과 같이 정리하십시오.

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

따라서 x//5막대 x%5위에 점 과 점이 있습니다. 그리고이면 x=0공백 대신 쉘 / 로프를 사용합니다.

더 많은 이미지를 보려면 Maya number images의 Wikimedia Commons 페이지를 사용해보십시오 .

그러나 이것은 최대 숫자 19입니다. 우리는 하나의 '이야기'에4 막대와 4점 이상을 가질 수 없습니다 ... 그래서 우리는 위로 올라갑니다!

20의 출력은 다음과 같습니다.

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



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

은 a 1와 a 0를 동시에 갖기 때문에 일반적으로 유효하지 않습니다 . 그러나 새 장소 값을 의미 3하기 전에 (답에 3 개 이상) 줄 바꿈이 필요 0합니다.

하단 스토리에는 점, 의미 1및 막대 의미가 5있습니다. 그러나 실제로 점 의미 20^0와 막대 의미가 20^0 * 5있습니다.

각 이야기는 힘을 얻습니다. 두 번째 이야기 점은 20( 20^1) 및 100( 20^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'은 괜찮습니다. (출력의 주요 쉘)
  • 각 장소의 가치 나 이야기 사이에 정확히 3 줄짜리 줄이 없어도됩니다 (최소 3).

테스트 사례 :

15

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

12

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



4

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


0

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


24

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




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



33



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




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



20



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




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

1 : 그들은 또한 상징을 위해 신들의 머리를 사용했지만이 도전에는 껍질 / 빵 / 젤다 상자 가 사용될 것입니다.


but for this challenge the shell/bread will be used.. 껍질이 아니라 빵이 아닙니다. 과거 가슴에 LOZ 링크.
대머리 Bantha


@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

파이썬 3.5 404 400 392 312 311 308 290 268 285 268 바이트 :

( 덕분에 아드 난 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을 10으로 변환 할 수있었습니다. 내가 생각한 첫 번째 알고리즘은 powers algorithm 이라고하는 것 입니다. 이것은 코드에서 사용했던 것보다 오래 걸리지 않았으므로 코드에서 사용한 것이 아니므로 이에 대해서는 이야기하지 않겠습니다. 그러나, 나는 당신이 사용할 수있는이 방법을 사용하여 제공 다른 기지로베이스 (10)의 정수를 변환하는 파이썬 스크립트를 작성했다 여기 repl.it.에를 나는이 도전을 대신 한 내가 부르는 분할 알고리즘 내가 꽤 좋은 설명 생각, 여기를. 그러나 기본적으로 발생하는 것은 제공된 기본 10 숫자를 가져 와서 숫자로 변환해야합니다.이 경우 나머지는 0 또는 1이 될 때까지 숫자를 변환해야합니다.이 경우 20입니다. 순서대로 마지막 나눗셈 작업에서 나머지 나눗셈 작업에서 나머지 모든 나머지는 마지막에서 첫 번째 순서로 정렬됩니다. 그런 다음이 모든 자릿수가 함께 결합되고 결합 된 순서가 반대로 되어 20 진의 10 진 수입니다! 이것을 설명하기 위해 밑 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. 이렇게하면서 마침내 최종 답변을 얻었습니다! 기본 10의 431은 기본 20으로 변환되어 있으며 11B, 위의 링크를 이미 공유 한 powers 알고리즘을 사용하는 Python 스크립트를 사용하여 확인할 수 있지만 여기서 다시 수행합니다 . 여기 이 대답에 기재된 분할 알고리즘을 사용하여 전력과 동일한 대답을 반환 한 것이다.

이 전체 프로세스는 본질적 으로이 while루프 에서 내 스크립트에서 발생합니다 while not p or z:p+=[z%20];z=z//20. 유일한 차이점은 숫자 >9그렇지 않다는 것입니다 않고 대신 자신과 같은 글자로 표현.

베이스 (10) 수는 우리가 호출베이스 20의 정수이고, 각각의 숫자에,베이스 (20)로 변환 된 후, 전진 g, g mod 5도트가 인쇄 된 후 g//5막대가 출력된다. 그런 다음 프로그램은 3 개의 빈 줄을 인쇄하고 다음 숫자로 넘어갑니다. 그러나 숫자가 0이면 단일 "로프"가 인쇄되고 3 개의 새 줄이 인쇄 된 다음 프로그램이 다음 숫자로 이동합니다. 따라서 기본 20을 취 11B하면 첫 번째 숫자로 이동합니다. 첫 번째 숫자는 1이므로 0부터 1//5=0, 1 이후부터 1 점을 인쇄 1%5=1합니다. 그래서 우리는 먼저 이것을 얻을 것입니다 :

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

그런 다음 3 줄 바꿈. 두 번째 숫자로 넘어 가면 1이라는 것을 알 수 있으므로 동일한 것을 출력합니다.

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

또한 3 줄의 새로운 줄. 마지막으로 마지막 숫자로 이동하면이 숫자가 B입니다. B=11밑이 20 이므로 프로그램은 이후 1 도트 11%5=1와 2 막대를 출력 11//5=2합니다. 이제 우리는 이것을 얻습니다.

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

마지막으로,이 모든 것을 합치면 다음과 같이됩니다.

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




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




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

그리고 그것은 431의 마야 숫자입니다! 마지막으로 기본 20 숫자는 기본 20 Mayan 숫자로 표시됩니다.

참고 :lambda 내 코드에서 해당 기능을 발견했을 수도 있고 아닐 수도 있습니다 . 그럼에도 불구하고이 기능은 여러 개의 도트가 나란히 출력되어야하므로 도트를 만드는 데 사용됩니다.


그것이 가능한지 확실하지 않지만 S,N,M,X=' -|\n'대신에 할 수 S,N,M,X=' ','-','|','\n'있습니까?
Adnan

@Adnan 가능합니다.
Rɪᴋᴇʀ

@Adnan 정말요? 와우, 나는 몰랐다. 감사!
R. Kap

401내부 0을 포함합니다.
Neil

@ 닐 아, 맞아. 헤드 업 주셔서 감사합니다. 이제 수정되었습니다.
R. Kap

3

파이썬 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의 높은 거듭 제곱이 있으면 재귀 적으로 호출 합니다. 재귀는 현재 장소 값을 인쇄하기 전에 수행되므로 더 높은 출력이 먼저 인쇄됩니다.

현재 장소 값이 0이 아닌 경우 (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) 는 5를 위해 2 개의 기호를 인쇄합니다.

현재 장소 값이 0이면 0 기호가 인쇄됩니다.


나는 현상금을 R. Kap에게 보상해야했지만 이것은 자신의 현상금이 될만한 가치가 있습니다! 좋은 작업!
Rɪᴋᴇʀ

2

파이썬, 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호출 하여 다른 4 바이트를 제거 할 수 있습니다.s(s(w))math.sqrt(math.sqrt(w))
James

@DrGreenEggsandHamDJ 감사합니다. 그래도 공백에서 26 바이트를 벗어난 것으로 생각하지 않습니까?
Rɪᴋᴇʀ

아, 죄송합니다, 계산 오류가 나는 25이 또한 의미가 w**0.25더 나은보다 s(s(w)). 더 길어졌지만?
James

@DrGreenEggsandHamDJ 예, 어떻게 든 파일에서 응답으로 전달되는 쉘 제로 문자열을 잃어 버렸습니다.
Rɪᴋᴇʀ

2

자바 스크립트 (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ʀᴋ 내 나쁜, 나는 코드를 옮겨서 실수로 잘못된 장소에 붙여 넣었습니다. 이제 수정되었습니다.
Neil

1

파이썬 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]ones 기호의 문자열입니다. a단일 기호의 맨 위 행입니다. n%5이 숫자에 대한 하나의 기호 수입니다. 따라서 n%5*a맨 위 (아래) 행의 문자열 n%5입니다. 마찬가지로 'n % 5 * b`는 두 번째 (및 세 번째) 행의 문자열입니다.

표현 [:n%5*4]if 출력 할 '모두'가없는 경우 출력에서 ​​빈 줄을 추가로 피하는 을합니다. 필요하지 않지만 출력이 더 좋아 보입니다.

n%20//5필요한 5의 기호 수입니다. [c,d,d,c]하나의 기호를 5 개로 만드는 문자열입니다.

[t,w,w,v+h*19+v,y,y,t] 제로 기호를 만드는 문자열입니다

[x,x] 마야 숫자 그룹 사이에 최소 3 개의 빈 줄을 넣습니다.


이것이 어떻게 작동하는지 설명 할 수 있습니까?
Rɪᴋᴇʀ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.