кредит
Я благодарю основанный на письме вопрос Рэнда Аль'Тора за вдохновение для этого соревнования по коду-гольфу.
Фон
Природа этого вызова основана на алгоритме, упомянутом Рэндом в его «Треугольнике, составленном из трех букв»:
- Начните с последовательности из 10 букв, каждая из которых X, Y или Z.
- Под каждым рядом постройте следующий ряд следующим образом. Если две соседние буквы совпадают, напишите одну и ту же букву под ними; если они разные, напишите третье письмо под ними.
Затем вы повторяете предыдущий шаг, пока в десятой строке не появится одна буква.
Вызов
Мы собираемся поместить математический спин в вышеупомянутый алгоритм:
- Давайте начнем с последовательности из 10 цифр, каждая из которых разделена пробелом, и каждая из которых равна 1, 2 или 3.
- Под каждым рядом постройте следующий ряд следующим образом. Если две соседние цифры совпадают, напишите одну и ту же цифру под ними; если они разные, напишите третью цифру под ними.
- Повторяйте предыдущий шаг, пока не получите одно окончательное число.
Итак, следуя этому алгоритму, если 1 2 3 3 1 3 1 3 1 2
, например, начиная со строки , генерируется следующий треугольник:
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1 2 3 3 1 3 1 3 1 2
3 1 3 2 2 2 2 2 3
2 2 1 2 2 2 2 1
2 3 3 2 2 2 3
1 3 1 2 2 1
2 2 3 2 3
2 1 1 1
3 1 1
2 1
3
Мне также любопытно узнать сумму всех цифр в треугольнике чисел, поэтому добавьте все эти цифры и поместите эту сумму в одиннадцатый ряд, выровненный по правому краю до последней цифры в первом ряду. Итак, наш числовой треугольник будет выглядеть примерно так (пробелы в моем примере представлены .
символом для отображения форматирования).
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109
Ваша задача - написать код, который может начинаться с введенной строки / массива / и т. Д. из десяти цифр, как в моем примере, а затем примените алгоритм для генерации десяти строк, которые бы создали числовой треугольник, за которым следует 11-я строка, которая будет отображать сумму всех цифр с выравниванием по правому краю.
тестирование
Тестирование этой строки может быть выполнено со случайно сгенерированной строкой из десяти цифр по вашему выбору или сгенерированной из фрагмента ниже ...
c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");
$("#btn").click(function(){
$("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.
правила
- Применяются правила Code-Golf, поэтому наименьшее количество байтов выигрывает. В случае, если есть две записи с одинаковым низким баллом, победитель будет награжден в зависимости от количества голосов "за".
- То, что мы в основном получаем, это 11 строк по 19 символов в длину ... То, как вы будете выводить окончательный результат, полностью зависит от вас: массив, консоль, вывод файла, STDOUT и т. Д., Поэтому, пожалуйста, используйте любой метод вывода, который вам нравится. работать в ваших интересах. Единственное правило в выводе - у нас 11 строк по 19 символов в каждой строке в формате, аналогичном приведенному выше ...
- Если это помогает вашему коду, используйте любой разделитель для цифр ... Просто помните, что удобочитаемость может быть фактором.
- Никаких глупых лазеек .
- Жесткое кодирование ввода не допускается. Цели этого кода таковы, что его можно использовать для получения разных результатов каждый раз с различными данными. Жесткое кодирование,
1 1 1 1 1 1 1 1 1 1
например, полностью сводит на нет весь смысл алгоритма.
С нетерпением ждем, что вы все можете придумать!
Ответы:
05AB1E ,
3226 байтобъяснение
Попробуйте онлайн!
источник
Mathematica,
104979094 байтаобъяснение
Разбивает входные данные на длину 2, смещенные на 1.
Берет каждый раздел и вычисляет соответствующий вывод.
Прикол здесь Я сложил два числа, взял мод 3 и вычел результат из 3. Это дает желаемое число. (например, 3 - ((2 + 1) мод 3) = 3)
Повторяет вышеописанный процесс девять раз, давая все итерации в качестве вывода.
Отформатируйте каждую итерацию в строки и поместите все это в один столбец (по центру), создав треугольник.
Взять общее количество всех чисел.
Объедините треугольник и сумму, и выровняйте все по правому краю (треугольник уже выровнен, поэтому его выравнивание не затронуто).
источник
JavaScript (ES6),
143142 байтаСохранено 1 байт благодаря @Neil
Я попытался объединить различные части, но это оказалось на 5 байт длиннее:
источник
3-((x+y)%3)
помочь уменьшить этот код?p^c||p
уже немного короче :-)i?p^(p=c)||p:c
вы можете использоватьi&&p^(p=c)||c
?Рубин,
134101 байтИспользуя трюк по модулю JHM.
Смотрите это на eval.in: https://eval.in/649993
источник
CJam ,
4440 байтПопробуйте онлайн!
объяснение
источник
Python 2, 164 байта
Относительно простое итеративное решение.
Попробуйте онлайн
источник
PHP, 143 байта
источник
JavaScript (ES6),
11210096 байтПринимает массив в качестве входных данных и рекурсивно строит разделенный запятыми треугольник.
источник