Этот вызов прост. Учитывая число, выведите ascii-art представление числа, используя систему счисления Basean-20 майя.
Что такое система майя?
Майя использовали базу 20 для хранения чисел, поэтому первая позиция была 1
s, следующая 20
s, затем 400
s и т. Д.
Так майя число 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:
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Обратите внимание, что обычно это неверно, потому что is имеет 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
.
Ваша миссия, если вы не захотите или не захотите (это не имеет значения), состоит в том, чтобы вывести ascii art представление числа base-10.
Другие правила:
- Начальное / конечное пространство в порядке, если точки, бары и оболочки не повреждены.
- Столбцы, точки и оболочки должны быть точно такими же, как в тестовых примерах. Без изменения размера.
- «0» - это нормально. (ведущие снаряды на выходе)
- Вам не нужно иметь ровно 3 символа новой строки между каждым значением места или историей, по крайней мере, 3.
Тестовые случаи:
15
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
12
---- ----
| | | |
| | | |
---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
4
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
0
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
24
----
| |
| |
----
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
33
----
| |
| |
----
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
20
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
1: Они также использовали головы богов для символов, но для этого испытания будет использован сундук с ракушками / хлебом / зельдой .
but for this challenge the shell/bread will be used.
, Не скорлупа, не хлеб. ЛОЗ ссылка на прошлый сундук.Ответы:
Рубин,
223180177179 байтАнонимная функция, возвращает многострочную строку.
Забыл добавить дополнительный интервал, который был необходим, а также рекурсию. Также играю в гольф немного больше, перемещая вещи вокруг.
источник
Python 3.5,
404400392312311308290281285281 байт:( Спасибо Аднану за подсказку по экономии 9 байт (
290->281
) и Нейлу за подсказку по экономии 4 байт (285->281
)! )Попробуйте онлайн! (Ideone)
Анализ
Для целей этого анализа мы будем использовать набор символов
0123456789ABCDEFGHIJ
для представления каждой цифры в базе 20.Итак, я мог бы пойти и преобразовать базу 10 в базу 20, используя один из двух моих алгоритмов. Первый алгоритм, который я подумал использовать, это то, что я называю алгоритмом степеней . Это не тот, который я использовал в коде, хотя он сделал бы его длиннее, чем следовало бы, поэтому я не буду говорить об этом. Тем не менее, я создал скрипт Python, который преобразует любое целое число в базе 10 в любую другую базу, предоставленную с использованием этого метода, которую вы можете использовать здесь на repl.it. Вместо этого я использовал для этого испытания то, что я называю алгоритмом деления , которое, я думаю, объясняется здесь довольно хорошо., Но в основном происходит то, что он берет предоставленное число 10 оснований и делит его на основание, в которое нужно преобразовать число, в которое в данном случае равно 20, пока остаток не будет равен 0 или 1. Затем он берет частное и остаток в этом порядке от последней операции деления, а затем все остальные остатки от других операций деления в порядке от последней к первой. Все эти цифры затем соединяются вместе, и эта объединенная последовательность является обратной цифрой 10 в базе 20! Чтобы проиллюстрировать это, предположим, что вы хотите преобразовать число 10
431
в базу 20. Итак, что бы мы сделали, это:Затем, наконец, мы возьмем список, который у нас есть, который в этом случае содержит
B11
, и перевернем его, чтобы мы теперь имели11B
. При этом мы наконец получили наш окончательный ответ! 431 в базе 10 преобразована в базу 20 is11B
, что может быть подтверждено с помощью моего скрипта 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 новые строки, а затем программа переходит к следующей цифре. Итак, взяв базовое число 2011B
, мы переходим к первой цифре. Первая цифра1
, и поэтому она будет печатать 0 баров с тех пор1//5=0
и 1 точку с тех пор1%5=1
. Итак, мы сначала получили бы это:а затем 3 новые строки. Переходя ко второй цифре, мы также видим, что она равна 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'
?401
содержит внутренний ноль.Python 3, 243 байта
обсуждение
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, то печатается символ нуля.
источник
Python, 411 байт
Я создал это для генерации тестовых случаев, вы можете использовать его в качестве эталона. Сорта в гольф.
источник
s=math.sqrt
и позвонивs(s(w))
вместоmath.sqrt(math.sqrt(w))
w**0.25
даже лучше, чемs(s(w))
. Хотя это стало длиннее?JavaScript (ES6), 254 байта
источник
Missing } in template expression
. Я не очень хорошо знаю JS, как я могу это исправить?Python 3, 213 байт
Придумали еще более короткую версию, используя другой подход:
объяснение
Первые 9 строк или около того, строят строки, которые используются для создания символов
Ядром решения является рекурсивная функция
m
, которая создает список строк, по одной строке на каждую строку в выводе. Схематичноm
выглядит так:m
можно переписать так: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]
действует как an,if
чтобы избежать лишних пустых строк в выводе, если нет никаких «выводимых». Это не нужно, но делает вывод лучше.n%20//5
количество символов для пяти, которые необходимы.[c,d,d,c]
строки, чтобы сделать один символ для пяти.[t,w,w,v+h*19+v,y,y,t]
строки для создания нулевого символа[x,x]
ставит как минимум три пустые строки между группами цифр майяисточник