ASCII Число мистецтв майя


14

Цей виклик простий. Надавши число, виведіть ascii-art зображення числа, використовуючи систему числення Бази-Майя 20.

Що таке система майя?

Майї використовували базу 20 для зберігання номерів, тому першою позицією було 1місце s, наступне 20s, потім 400s і т.д.

Отже, число майя 1знаходиться 1в базі 10, але 10насправді 20в базі 10, 207знаходиться 807в базі 10 тощо.

І вони представляли свої номери як піктограми, із спеціальним символом для 0.

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

Це був їхній нуль. (принаймні, половина picascii половина моєї артистичності ascii art версія)

Це реальна картина символу нуля майя. 1

Це було їх п’ять:

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

І 4:

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

Нарешті, щоб скласти це:

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

Таким чином, у них є x//5бруски, і x%5крапки вгорі брусків. І якщо x=0вони використовують оболонку / батон замість порожнього місця.

Для отримання додаткових зображень спробуйте сторінку Wikimedia Commons із зображеннями номерів майя .

Але це лише для чисел до 19. Нам заборонено мати більше 4барів і 4крапок в одній «історії» ... Тож ми піднімаємось!

Вихід для 20 становить:

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



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

Зверніть увагу, це, як правило, недійсне, оскільки є одночасно 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.

Ваша місія, якщо ви не хочете чи не хочете (це не має значення), полягає в тому, щоб вивести художнє зображення ascii числа базового 10.

Інші правила:

  • Простір для провідних / трейлінгів добре, якщо точки, бруски та оболонки є цілими.
  • Штрихи, крапки та оболонки повинні бути саме такими, якими є тестові випадки. Без зміни розміру
  • Провідні "0" все в порядку. (провідні оболонки на виході)
  • У вас не повинно бути рівно 3 нових рядків між кожним значенням місця або історією, принаймні 3.

Випробування:

15

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

12

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



4

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


0

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


24

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




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



33



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




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



20



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




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

1: Вони також використовували голови богів для символів, але для цього виклику буде використана оболонка / хліб / скриня із зельдою .


but for this challenge the shell/bread will be used.. Не шкаралупа, не хліб. Посилання ЛОЗ на минулий скриню.
Лисий Банта


@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 байт ( 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, використовуючи один із двох алгоритмів, які є у мене. Перший алгоритм, який я думав використовувати, - це те, що я називаю алгоритмом повноважень . Це не той, який я використовував у коді, хоча, як би це зробив довше, ніж це було, тому я не збираюся говорити про це. Однак я створив скрипт python, який перетворює будь-яке ціле число в базі 10 в будь-яку іншу базу, надану за допомогою цього методу, яку ви можете використовувати тут на repl.it. Я замість цього використовував для цього завдання те, що я називаю алгоритмом поділу , який я думаю , пояснюється досить добре тут. Але в основному те, що трапляється, це те, що він бере подане базове число 10 і ділить його на базове, для чого потрібно перетворити число, яке в даному випадку дорівнює 20, поки решта не дорівнює 0 або 1. Потім він приймає коефіцієнт і залишок , у тому порядку від останньої операції поділу, а потім усі інші залишки від інших операцій поділу в порядку від останнього до першого. Всі ці цифри потім з'єднуються разом, і ця послідовність, що з'єдналася, обернена, це ваше базове число 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. Роблячи це, ми нарешті отримали остаточну відповідь! 431 в базі 10 перетворений на базу 20 є 11B, що можна підтвердити, використовуючи мій скрипт Python, який використовує алгоритм повноважень, на який я вже поділив посилання вище, але я знову це зроблю тут . Ось такий, який також використовує алгоритм поділу, описаний у цій відповіді, і повертає ту саму відповідь, що і повноваження.

Весь цей процес, по суті , що відбувається в моєму сценарії в цьому whileциклі: while not p or z:p+=[z%20];z=z//20. Єдина відмінність полягає в тому , що цифри >9будуть НЕ представлені в вигляді букв , але замість того, щоб, як вони самі.

Переходимо після того, як число базового 10 було перетворене в базове 20, для кожної цифри базового цілого числа, яку ми будемо називати g, g mod 5точки роздруковуються, а потім g//5роздруковуються смуги. Потім програма виводить 3 пусті рядки і переходить до наступної цифри. Однак якщо цифра є 0, то надрукується один «батон» з наступними 3 новими рядками, а потім програма переходить на наступну цифру. Отже, взявши базове число 20 11B, переходимо до першої цифри. Перша цифра є 1, і тому вона надрукувала б з 0 барів і з тих пір 1//5=0- 1 крапка 1%5=1. Отже, ми спочатку отримаємо це:

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

а потім 3 нові рядки. Переходячи до другої цифри, ми також бачимо, що вона дорівнює 1, тому вона виводить те саме:

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

а також 3 нові рядки. Нарешті, переходячи до останньої цифри, ми бачимо, що це a 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 Дійсно? Нічого собі, я цього не знав. Спасибі!
Р. Кап

401містить внутрішній нуль.
Ніл

@Neil О, так. Дякую за голову. Це зараз виправлено.
Р. Кап

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 друкує одиниці, а потім п'ять. a- це перший / четвертий ряд і bє другий / третій ряд. Трюк в тому print(*((a,b,b,a)*f),sep=x). Для одиниць виходить f = 1 print(*(a,b,b,a),sep=x), який друкує 4 рядки, що складають символи одиниць (x - це '\ n'). Для п'яти, f = кількість п'яти для друку (r // 5), тому кортеж (a, b, b, a) множиться (тобто повторюється) на кількість п'яти для друку. Якщо f = 2, отримаємо print(*(a,b,b,a,a,b,b,a),sep=x), який друкує два символи на п’ять.

Якщо поточне значення місця дорівнює 0, то нульовий символ друкується.


Мені довелося винагороджувати винагороду Р. Капу, але це, можливо, заслуговує на те, що це власна винагорода! Хороша робота!
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та s(s(w))замість ньогоmath.sqrt(math.sqrt(w))
Джеймс

@DrGreenEggsandHamDJ дякую. Я не думаю, що у мене не було 26 байт з пробілу?
Rɪᴋᴇʀ

О, вибачте, порахувавши помилку, я мав на увазі 25. Також w**0.25навіть краще, ніж s(s(w)). Хоча стало більше?
Джеймс

@DrGreenEggsandHamDJ Так, я якось втратив нульовий рядок оболонки під час переходу з файлу до відповіді.
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' - рядок для 2-го (і 3-го) рядів.

Вираз [:n%5*4]діє як ifуникнення зайвих порожніх рядків у висновку, якщо немає жодних «тих» для виведення. Це не потрібно, але робить вигляд краще.

n%20//5- кількість символів для п’яти, які потрібні. [c,d,d,c]це рядки, щоб зробити один символ на п’ять.

[t,w,w,v+h*19+v,y,y,t] - це рядки для створення нульового символу

[x,x] ставить щонайменше три порожні рядки між групами цифр майя


Чи можете ви дати пояснення, як це працює?
Rɪᴋᴇʀ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.