Cheela (из книги Яйцо дракона Роберт Л. вперед) существа , которые живут на поверхности нейтронной звезды. Их тело плоское и круглое с двенадцатью глазами по периметру, поэтому они, естественно, используют систему нумерации Base-12.
Среди чил, забота о детенышах и воспитание молодёжи - это задачи, выполняемые древними. Поскольку молодого Чилу нужно научить умножать, Древние могли использовать таблицу умножения.
Ваша задача - создать в базе 12
x 12
таблицу умножения 12
, как показано ниже. Прописные буквы A
и B
используются для цифр, соответствующих десятичной 10
и 11
соответственно.
1 2 3 4 5 6 7 8 9 A B 10
2 4 6 8 A 10 12 14 16 18 1A 20
3 6 9 10 13 16 19 20 23 26 29 30
4 8 10 14 18 20 24 28 30 34 38 40
5 A 13 18 21 26 2B 34 39 42 47 50
6 10 16 20 26 30 36 40 46 50 56 60
7 12 19 24 2B 36 41 48 53 5A 65 70
8 14 20 28 34 40 48 54 60 68 74 80
9 16 23 30 39 46 53 60 69 76 83 90
A 18 26 34 42 50 5A 68 76 84 92 A0
B 1A 29 38 47 56 65 74 83 92 A1 B0
10 20 30 40 50 60 70 80 90 A0 B0 100
Вывод должен быть напечатан на экране. Формат должен быть следующим:
- Числа должны быть выровнены вправо в каждом столбце.
- Допускаются начальные пробелы перед первым столбцом, конечные пробелы после последнего столбца или завершающая новая строка после последней строки.
Разделение между столбцами может состоять из одного пробела (как показано выше) или нескольких пробелов, но количество пробелов должно быть одинаковым между столбцами. Чтобы измерить разделение столбцов, учтите, что отображаемые числа включают любые начальные пробелы, которые могли быть необходимы для выполнения требования 1 (поэтому каждое число занимает три символа, первый из которых может быть пробелом). Например, таблица с разделением двумя пробелами будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 A B 10 2 4 6 8 A 10 12 14 16 18 1A 20 3 6 9 10 13 16 19 20 23 26 29 30 4 8 10 14 18 20 24 28 30 34 38 40 5 A 13 18 21 26 2B 34 39 42 47 50 6 10 16 20 26 30 36 40 46 50 56 60 7 12 19 24 2B 36 41 48 53 5A 65 70 8 14 20 28 34 40 48 54 60 68 74 80 9 16 23 30 39 46 53 60 69 76 83 90 A 18 26 34 42 50 5A 68 76 84 92 A0 B 1A 29 38 47 56 65 74 83 92 A1 B0 10 20 30 40 50 60 70 80 90 A0 B0 100
Компьютерное хранилище на нейтронной звезде действительно дорого, поэтому ваш код должен использовать как можно меньше байтов.
Расширенный вызов и бонус
В идеале ваш код должен быть повторно использован в других частях вселенной, где могут использоваться другие системы нумерации. С этой целью задача дополнительно может быть расширена следующим образом: Ваш код принимает число в N
качестве входных данных и генерирует таблицу умножения N
x N
в базе N
с указанным выше форматом.
Ввод может быть с клавиатуры или в качестве аргумента функции. Программа или функция должна работать & 2
le ; & N
le ; 36
, используя в качестве цифр первых N
символов последовательности 0
, 1
, ..., 9
, A
, B
, ..., Z
(прописные буквы)
Этот расширенный вызов не является обязательным. Если вы следуете по этому маршруту, снимите с байта 20% (нет необходимости округлять до целого числа).
источник
Because they have twelve eyes, they naturally use a base-12 numbering system.
Ну естественно. Вот почему мы используем двоичный файл, в конце концов ... ;-)Ответы:
Pyth, 27 * 0,8 = 21,6
Попробуйте онлайн: демонстрация
Объяснение:
источник
CJam, 33 * 0,8 = 26,4 байта
Проверьте это здесь.
Это использует минимально необходимое разделение.
объяснение
Таблица для ввода
22
(самая большая, которая умещается в записи без горизонтальной полосы прокрутки):источник
MATL , 42 * .8 = 33,6
отказ
Поскольку создатель языка и автор задания одинаковы, этот ответ не имеет права на победу .
Для обсуждения того, является ли это ограничение необходимым или нет, см. Этот мета-вопрос .
Код
Это использует минимальное разделение.
пример
Восьмеричная таблица умножения
объяснение
Изменить: попробуйте онлайн!
Для запуска в онлайн-компиляторе (по состоянию на 19 февраля 2016 г.) измените
Y)
наX:
и удалите[]
. Это делается для того, чтобы адаптироваться к изменениям, которые были внесены в язык с момента публикации этого запроса.источник
Утилиты Bash + BSD, 36
Работает "из коробки" на OS X.
rs
Возможно, потребуется установить на системы Linux.Co{1..12}d{1..12}*p
доCo1d1*p Co1d2*p Co1d3*p ... Co1d12*p ... Co12d12*p
.dc
выражение, которое генерирует необходимые термины.Co
устанавливает выходное основание равным 12.d
Используется в качестве разделителя между числами вместо пробела, поэтому в расширении фигурных скобок не требуется экранирования.d
фактически дублирует вершину стека, но это фактически игнорируется и отбрасывается.dc
- это одна строка, разделенная пробелом.rs
изменяет это в массив 12x12.-j
оправдывает каждый термин.источник
Pyth, 36 байт
Попробуй это здесь.
источник
Km+1dUJ12
наKSJ12
.S
создает диапазон[1, 2, ..., 12]
. Вы можете заменить какj""
иjk
сs
, так как ваши соединительные строки. И еще один байт: изменитьrjbm...K1
наjmr...1K
. С этими изменениями вы получите 28 байтов:KSJ12jmrsm.[\ 4sm.Hbj*dkJK1K
Python,
153147132 байта * 0,8 = 105,6До 132 байтов благодаря совету Тима Педерика! :)
источник
rjust
('%4s'%f(...)
). Посмотрите, короче ли печать каждого значения с помощьюprint ...,
(а затем одногоprint
для новой строки)join
. Если это так, попробуйте свернуть петли .and
Aor
B) внутри функцииf
, используяn>=b
. Я делал это до тех пор, пока не понял, что он не короче того, что у меня было раньшеn//b
... но вы используете Python 2! Вы можете сохранить байт с помощьюn/b
.CJam,
38333238 * (.8) = 30,4 байтаПопробуй это здесь.
(Выглядит очень похоже на Мартина сейчас.)
источник
Perl 6 , 60 байт -20% = 48 байт
(Это почти точно так, как я бы написал это, даже если бы я не пытался сделать это так коротко, как мог)
Использование:
источник
for(
началом вызова подпрограммы с именемfor
вместо конструкции цикла модификатораfor
. Что может привести к ошибке компиляции.JavaScript (ES6) 84 (105-20%)
Очевидный способ, для начала.
Заметки
alert
это не лучший способ вывести таблицу, но она короче, так как существует явный запрос «показать на экране»Меньше гольфа
источник
Python 3, 126 - 20% = 100,8 байта
Внешняя функция,
t
это та, которая на самом деле печатает таблицу умножения. Внутренняя функция,i
выполняет преобразование числа в базу от 2 до 36.Шляпный наконечник Бумерангу за их решение и за наконечник для игры в гольф. Я избегал копировать что-либо из решения Бумеранга, но позволил себе взглянуть на него, чтобы увидеть, где я мог бы урезать больше. И даже до этого я обнаружил, что чем больше я играю в гольф, тем больше мое становится похожим на бумеранг!
источник
print(i(15,12),i(120,12),i(144,12),i(150,12))
ваш код возвращается13 A0 00 06
вместо13 A0 100 106
. К сожалению, задача требует распечатать одно трехзначное основание номер n (100). Это не должно быть слишком сложно исправить, но это может добавить несколько байтов ...n>=b
, нетn>b
.def t(b): i=lambda n:(n>=b and i(n//b)or'')+chr(n%b+[48,55][n%b>9]) R=range(b) for r in R:print(*('%3s'%i(~r*~c)for c in R))
я хотел бы сделать это в своем решении, но теперь оба наших решения довольно близки, с таким же успехом можно улучшить и лучший ^^Javascript (ES6)
96,893,6 байт (20% из 117)объяснение
- сэкономлено 4 байта благодаря @ edc65
источник
alert(b)
безeval
- короче. И, по крайней мере, избегайте переменныхa
, это бесполезноb+=' '.repeat(4-a.length)+(i*j).toString(n).toUpperCase()
a
как ты тогда вычисляешь...repeat(4-a.length)...
?MATLAB,
111 * 0,8 = 88,8110 * 0,8 = 88 байтМой дебют здесь:
Объяснение:
[1:N]'*[1:N]
сделать таблицу умножения в базе 10dec2base([1:N]'*[1:N],N)
преобразовать в базу 12. Выходные данные - массив char с начальными 0-сstrjoin(cellstr(dec2base(___)))
преобразовать в ячейку и обратно в символ, соединяющий строки с пробелом, дающим строку 1x575[' ',strjoin(___)]
добавить пространство для 576 элементовstrrep(___,' 0',' ')
удалить один ведущий ноль. Мы делаем это дважды, потому что у нас есть строки с двумя ведущими нулямиreshape(___,4*N,N)'
преобразовать массив символов 1x576 в массив символов 48x12disp(___)
отобразить результат безans =
Выход:
Если мы не считаем оператор
N=12;
,5*.8=4
байты сохраняются. Кроме того, еслиans =
вывод допустим, то мы можем удалитьdisp()
сохранение других6*0.8=4.8
байтов. Конечно, могут быть и другие способы сохранения байтов :)источник
ans
вывод допускается, если вывод является аргументом функции. Но в этом случае задание говорит: «вывод должен быть напечатан на экране», поэтомуans
не допускается. Кроме того,N
следует принять за вход в расширенный вызов. Вы можете решить это, используя анонимную функцию:,@(n)disp(reshape(strrep(strrep([' ',strjoin(cellstr(dec2base([1:N]'*[1:N],N)))],' 0',' '),' 0',' '),4*N,N)')
которую вы бы назвали, используяans(12)
Python 3:
166161152 - 20% = 121,6 байтаЯ знаю, что он уступает существующим ответам Python, но я решил попробовать. Я впервые публикую на этом сайте…
источник
APL,
3231 × 0,8 = 24,8 байтаПо происхождению 0. На английском:
∘.×⍨1+⍳⍵
: Таблица умножения⍵⊥⍣¯1¨
: выразить в базе ⍵ каждый элемент таблицы умножения⊃∘(⎕D,⎕A)¨¨
: преобразовать таблицу векторов чисел в таблицу векторов символов¯4↑¨
: выровнять вправо по длине 4 каждого элемента результатаСтандартная процедура печати APL делает правильные вещи.
источник
{¯4↑¨⊃∘(⎕D,⎕A)¨¨⍵⊥⍣¯1¨∘.×⍨1+⍳⍵}
Рубин,
6966 символов - 20% = 52,8Образец прогона:
источник
ksh93, 51 * 0,8 == 40,8 байта
Это должно работать до базы 64 (самый большой радиус поддержки, поддерживаемый ksh). Примеры:
источник
Пайк, 14 байтов * 0,8 = 11,2 байта, неконкурентоспособен
Попробуй это здесь!
Объяснение:
Или 12 байт без бонуса
источник