Ну, подведи итог.
Напишите программу или функцию, которая принимает непустой список десятичных целых чисел (0-9) и выводит «треугольник» цифр, указывающий вниз, со списком ввода вверху, где каждая цифра после первой строки является суммой двух цифр выше по модулю 10.
Например, вход [7, 5, 0, 9]
имеет выход
7 5 0 9
2 5 9
7 4
1
потому что 2
есть (7 + 5) mod 10
, 5
есть (5 + 0) mod 10
, 9
есть (0 + 9) mod 10
и т. д. весь путь к 1
бытию (7 + 4) mod 10
.
Если в списке есть только один элемент, то выходные данные соответствуют входным данным; например, ввод [4]
даст
4
Вот несколько дополнительных примеров:
[0]
0
[1, 2]
1 2
3
[8, 7]
8 7
5
[0, 0]
0 0
0
[1, 4, 2]
1 4 2
5 6
1
[0, 1, 0]
0 1 0
1 1
2
[1, 0, 0, 0]
1 0 0 0
1 0 0
1 0
1
[1, 2, 3, 4]
1 2 3 4
3 5 7
8 2
0
[1, 2, 3, 5, 8]
1 2 3 5 8
3 5 8 3
8 3 1
1 4
5
[9, 2, 4, 5, 3, 2, 2]
9 2 4 5 3 2 2
1 6 9 8 5 4
7 5 7 3 9
2 2 0 2
4 2 2
6 4
0
Обратите внимание, что в выводе:
- Первая строка не имеет начальных пробелов.
- Каждая последующая строка имеет на один пробел больше, чем предыдущая.
- Цифры разделены одним пробелом.
- Каждая строка может иметь до одного пробела.
- Там может быть один необязательный трейлинг новой строки.
- Вы должны использовать символы для нормальных десятичных цифр (от 0 до 9).
Самый короткий код в байтах побеждает. Tiebreaker - более ранний ответ.
Ответы:
BrainF ** k,
396391 байтЯ не мог устоять перед искушением сделать это. По крайней мере, треугольник остроконечной стороной вниз.
Ввод осуществляется в виде строки числовых символов, за которой следует одна новая строка.
Выходные данные будут содержать один завершающий пробел в каждой строке.
Примеры:
объяснение
Поскольку объяснить код довольно сложно с функциональной точки зрения, мы можем вместо этого взглянуть на него с точки зрения состояния ленты в разное время. Основная идея заключается в том, что треугольник, который мы выводим, инициализируется как плотно упакованный (для BF, в любом случае) массив, размер которого уменьшается на 1 при каждой итерации цикла. Другая важная мысль заключается в том, что мы используем
255
для обозначения «заполнителя», который мы можем искать на ленте.инициализация
Это самый простой шаг. В начале программы мы выполняем следующее:
Это переводит ленту в следующее состояние (где
>N<
указывается расположение указателя на ленте)Первый номер здесь - это «буфер». Мы не собираемся использовать его на долгосрочной основе, но это полезно для упрощения небольших операций и для копирования данных.
Второе число этого количество мест , которые мы будем Выведение в начале каждой строки, начиная после первой строки. В первой строке не будет пробелов.
Третье число - это пробел, который мы выводим.
Четвертое число - это заполнитель 255, так что мы можем относительно легко вернуться к этой позиции.
вход
С этой позиции мы будем читать все символы. В конце этого шага мы надеемся оказаться в следующей ситуации:
Где
a b c d e f ...
указывает строку числовых символов, которые были введены (не перевод строки).Мы осуществляем это с помощью следующего:
В этом есть некоторые нюансы. Прежде всего, мы будем выводить каждый символ по мере его получения, а затем выводить пробел после него. Во-вторых, мы не хотим копировать значение ASCII на ленту, мы хотим скопировать действительную цифровую цифру. В-третьих, мы хотим остановиться, когда выйдем на новую строку, и оставить себя в то время в хорошем месте.
Скажите, что наш вклад
6723
. Затем, после прочтения первого6
, наша лента выглядит так:Мы проверяем, что это значение не равно
10
(новая строка ASCII) с,----------[++++++++++
. Затем мы выводим значение и продолжаем, одновременно вычитая 48 из входного значения и добавляя 32 к значению рядом с ним (>>++++++++[-<++++<------>>]<
), оставляя нас здесь:Обратите внимание, что на протяжении всего этого процесса мы можем предполагать, что все цифры справа от нашего ввода равны 0 - это означает, что мы не рискуем испортить любое предыдущее состояние, если мы будем использовать значения справа для вычисления
6 * 8
и4 * 8
.Теперь мы выводим только что сгенерированный символ пробела и вводим новый ввод, удаляя вычисленное там пространство. В конце концов, ввод будет завершен новой строкой, и цикл завершится, оставив там,
255
где была бы новая строка (,----------]-
). Это второй символ-заполнитель, который мы будем использовать для навигации по ленте. На данный момент в нашем сценарии наша лента точно такая:расчет
Это работает так, что список цифр между нашими
255
заполнителями будет сокращаться на одну итерацию цикла. Когда в нем осталась только 1 цифра, мы закончили и должны немедленно остановиться (обратите внимание, что на данный момент каждая цифра в этом списке уже выведена, поэтому нам не нужно беспокоиться о ее выводе снова).Теперь мы используем этот трюк , чтобы перейти к первому
255
заполнителя:<+[-<+]-
. Это эффективно ищет ленту слева255
, ничего не меняя между ними. Теперь, когда мы переместили указатель, мы можем проверить наше условие выхода: если в списке только одна цифра, то ячейка будет содержать два пробела справа255
. Таким образом, мы проверяем это и запускаем цикл:>>+[-<<
Первым шагом в нашем цикле является вывод новой строки. Итак, мы переходим к первой ячейке (нашей буферной ячейке), добавляем к ней 10 и выводим. Следующим шагом является вывод всех начальных пробелов. После их вывода мы увеличиваем наш счетчик на число ведущих пробелов. Эти шаги выполняются следующим образом:
Что оставляет нас в таком состоянии:
Наш следующий шаг - скопировать первое значение в списке после второго заполнителя
255
:По сути, мы делаем это, прыгая туда-сюда между нашими заполнителями
255
, оставляя нас здесь:Теперь мы начинаем цикл, перебирая остальную часть списка, останавливаясь, когда мы нажимаем
255
:>+[-<
На этом этапе цифра слева от нас всегда равна 0. Поэтому, поскольку мы любим их, мы вставляем
255
туда заполнитель, чтобы мы могли вернуться к нашему месту в списке. Следующий шаг - переместить второе место в списке в те места, где мы переместились на первое место, после второго заполнителя255
. Эти шаги выполняются следующим образом:Оставив нас здесь:
[ 0 2 32 255 255 >0< 2 3 255 7 6 7 0 ]
Теперь, и6
и7
были перемещены в место, где могут произойти вычисления. Нам нужны две копии,7
потому что это понадобится и следующему номеру в списке.7
Сразу же после255
этой цели служит, тогда как другой7
будет потребляться расчета.Сначала добавим две цифры:
Оставив нас здесь:
Следующая комбинация шагов является самой сложной. Нам нужно посмотреть, больше ли число, на которое мы указываем, больше 10, и если это так, мы вычтем
10
. На самом деле мы вычитаем из него 10 и видим, попадет ли он0
в какой-либо момент вычитания. Если это произойдет, мы добавим10
позже. В конце этого у нас должна быть сумма по модулю 10.На данный момент мы достигли цели. У нас есть сумма по модулю 10! Кроме того, было ли число больше 10, мы в конечном итоге здесь:
Наши следующие цели - вывести эту новую сумму, добавить за ней пробел и вставить ее обратно в наш список. Мы делаем все это с помощью наших предыдущих приемов
255
прыжка и добавления48
к нашей сумме, поэтому я не буду подробно останавливаться на этом.И мы здесь:
[ 0 2 32 255 3 255 2 3 255 7 0 0 51 >32< ]
обратите внимание, как мы помещаем дополнительный255
заполнитель после нашей новой инъекции,3
чтобы не потерять место в списке. На этом этапе мы вывели нашу сумму и ее пространство, поэтому нам нужно очистить и вернуться в состояние, в котором будет работать следующая итерация этого цикла. Нам нужно очистить ячейки51
и32
ячейки, переместить7
один раз вправо и перейти к заполнителю нашего списка, чтобы мы могли начать все сначала.Теперь мы здесь:
[ 0 2 32 255 3 >0< 2 3 255 0 7 0 ... ]
это именно то место, где мы хотим быть для нашей следующей итерации. Так что проверяйте на 255 и двигайтесь дальше! (
>+]
)Когда мы выпадем из цикла, у нас будет целый новый список, состоящий из сумм из предыдущего списка. В первый раз это будет выглядеть так:
Теперь мы хотим повторить весь этот процесс в нашем новом списке, поэтому мы швыряемся
255
вниз влево и начинаем все сначала! Нам нужно сделать небольшую очистку>>[-]<<
, а затем оставить наш заполнитель<-
. После этого мы находимся точно в том же месте, что и после ввода, поэтому мы можем выполнить те же проверки:<+[-<+]->>+
и бум! У нас есть полный цикл! Все , что нам нужно это закрывающая скобка, и когда он заканчивается , мы уже на выходе все, поэтому мы сделали:]
.источник
Желе ,
201918 байтПопробуйте онлайн!
Задний план
Генерация чисел в желе проста. Вывод немного сложнее.
В желе есть встроенная сетка atom (
G
), которая отображает 2D-список с новыми строками между строками и пробелами между столбцами. Мы берем двумерный массив чисел (сгенерированный с каждой перевернутой строкой) и транспонируем его со значением заполнения@
. После обращения полученного массива и повторной транспонирования, применяетсяG
следующее.Чтобы получить желаемую треугольную форму, все, что нам нужно сделать, это удалить значение заливки.
Как это работает
источник
Pyth - 18 байт
Тестовый пакет .
источник
Python 3.5,
747271 байтВвод - это список целых чисел (например
f([1,2,3,5,8])
), вывод в STDOUT. И%10
тот факт, что объект Python 3map
возвращаетmap
объект, немного раздражает, а это означает, что мы не можем сделать этоmap(lambda*x:sum(x)%10,L,L[1:])
или подобное.Функция выдает ошибку, но к тому времени вывод завершится. Спасибо @xsot за -1 байт, найдя хорошее место для вставки
print
.источник
f=lambda L,*S:f([sum(x)%10for x in zip(L,L[1:print(*S,*L)]or 1)],'',*S)
None
!print
вернуть что-то? Я не знаю оprint
возвращении функции.print
возвращение функции Python - да, она возвращаетсяNone
по завершенииNone
нарезка?05AB1E ,
201917 байтКод:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
MATL,
3230292827262524 байта1 байт сохранен благодаря @Luis
Попробуйте онлайн!
Модифицированная версия для всех тестовых случаев
объяснение
источник
V
позволяет формат спецификации. Вы можете сохранить 1 байт, используяZ"
вместоO
: см. Эту ссылку (у меня проблемы с форматом в комментарии)D
которой по умолчанию используются числа с одним пробелом.На самом деле, 43 байта
Попробуйте онлайн!
Эта программа печатает один завершающий символ новой строки после вывода.
Объяснение:
источник
Mathematica, 67 байт
Пример:
источник
CJam, 25 байтов
Попробуйте онлайн!
объяснение
Это использует довольно аккуратный трюк для генерации макета треугольника.
источник
JavaScript (ES6) 147 байт
источник
Юлия,
6059 байтОсновано на ответе @ Sp3000 . Функция
\
принимает массив в качестве входных данных и возвращает строку.Попробуйте онлайн!
источник
Пайк, 21 байт
Попробуй это здесь!
Я хотел бы думать, что этот метод немного отличается.
источник
Perl 6 ,
65 63 6261 байтОбъяснение:
Пример:
источник
TSQL,
198194191 байтИспользуя GOTO вместо одного из WHILE, я смог сыграть в гольф 3 персонажами
Golfed
Попробуйте онлайн (используя старый скрипт с 2 * WHILE)
источник
Java 7,
230215213 байтЭто оказалось немного длиннее, чем я думал .. Может быть, это может быть немного больше, хотя, так как я вроде испортил, я думаю ..
Некоторые байты сохранены благодаря @GiacomoGarabello .
Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
void p(String s){System.out.print(s);}
и замените стандартную печать. Дляprintln
использованияp("\n")
. Переместитеint i
иint j
рядом сint c=0;
(int c=0,i,j;
) и переместитеprint(a[i]+" ")
внутрьfor
условия, чтобы вы могли снять скобки в общей сложности -11<T>void p(T s){System.out.print(s);}
вместоvoid p(String s){System.out.print(s);}
.C # 6,
125 + 31,125 + 18 = 143 байта+18 для
using System.Linq;
Спасибо @TheLethalCoder за сохранение 13 байт, указав на ненужный оператор использования
источник
JavaScript (ES6), 77 байт
источник
C, 138 байтов
Golfed
Ungolfed
источник
C #, 167 байт
Я на самом деле очень горжусь этим решением, лямбда-выражения становятся такими забавными, когда вы освоите
здесь разгулялись для дальнейших улучшений
попробуйте здесь
источник
List<int> a
->int[] a
,int x=a.Count
->int x=a.Length
,.ToList()
->ToArray()
Haskell, 139 байт
Принимает ввод в качестве аргумента, выводит в STDOUT.
Безголовая версия:
источник
Python 3, 97 байт
Печатает один завершающий перевод строки.
Как это работает
Попробуйте это на Ideone
источник
J, 44 байта
На основании этого решения .
источник
Javascript (с использованием внешней библиотеки) (198 байт)
Ссылка на lib: https://github.com/mvegh1/Enumerable/
Объяснение кода: это было легко с помощью библиотеки! Не выигрывает в байтах, но код не слишком многословен и легко читается. Итак, вход «n» является массивом целых чисел. Загрузите его в библиотеку, хранящуюся в переменной «a». «B» - возвращаемая строка, сохраните объединенную строку с «» в качестве разделителя в b. C - это текущей итерации, используйте это, чтобы определить количество пробелов для вставки. ПРИМЕЧАНИЕ: Кажется, что это работает хорошо только когда ввод от 0 до 9. Затем, при true, повторите определенный набор кода. Этот код должен создать соседний пакет наборы текущего перечисляемого «а», т.е. если у нас есть [1,2,3,4,5,6], мы получаем [1,2], [2,3], [3,4], ... [ 6] ... затем отфильтруйте, чтобы у нас были только партии размером 2. Затем мы сопоставим это с набором сумм партий% 10. Если a пусто, мы закончили, иначе мы добавим новую строку к нашему возвращению. Наконец-то вернусь ...
Изображение приходит через несколько минут.
источник