Допустим, у нас есть определенный набор функций для строк. Эти функции похожи на заполнение пробелов или madlibs, за исключением того, что они принимают только один ввод и используют его для заполнения всех пробелов. Например, у нас может быть функция, которая выглядит как
I went to the ____ store and bought ____ today.
Если бы мы применили эту функцию к строке, cheese
результат был бы:
I went to the cheese store and bought cheese today.
Мы можем представить эти функции в виде непустого списка строк, где пробелы - это просто промежутки между строками. Например, наша функция выше будет:
["I went to the ", " store and bought ", " today."]
С этим представлением есть только одно представление для каждой функции такого рода и только одна функция для каждого представления.
По-настоящему изящно то, что множество таких функций замкнуто по композиции. То есть композиция двух наших функций всегда является другой из этих функций. Например, если я сочиню нашу функцию выше с
["blue ", ""]
(функция, которая предшествует blue
вводу) Мы получаем функцию:
["I went to the blue ", " store and bought blue ", " today."]
Это может быть немного сложнее, хотя. Например, если мы сочиняем первую функцию с
["big ", " and ", ""]
Результат
["I went to the big ", " and ", " store and bought big ", "and", " today."]
задача
Ваша задача - взять две функции, описанные как непустые списки строк, и вывести их композицию в виде непустого списка строк.
Для этой задачи список может быть любым упорядоченным контейнером, который допускает дублирование, а строка может быть собственным типом строки, списком символов или списком целых чисел.
Это код-гольф ответы будут оцениваться в байтах с меньшим количеством байтов, тем лучше.
Контрольные примеры
["","xy"] ["ab",""] -> ["ab","xy"]
["x","y","z"] ["a","b"] -> ["xa","bya","bz"]
["xy"] ["ab"] -> ["xy"]
["","",""] ["a",""] -> ["a","a",""]
["x",""] ["","",""] -> ["x","",""]
["x","y","z"] ["a","b","c"] -> ["xa","b","cya","b","cz"]
["x","x","x"] ["a"] -> ["xaxax"]
["w","x","y","z"] ["ab","cd","e"] -> ["wab","cd","exab","cd","eyab","cd","ez"]
Ответы:
Желе , 6 байт
Диадическая ссылка, принимающая первое представление функции справа и второе представление функции слева, что дает результирующее представление функции. Каждое представление функции представляет собой список списков символов (у Jelly нет других строк).
Попробуйте онлайн! (аргументы полной программы даны в нотации Python; строки становятся списками. Нижний колонтитул показывает представление Python для вывода Link.)
Вот набор тестов, который форматирует выходные данные Link как входные данные.
Как?
Использует списки смешанного типа Jelly, чтобы разрешить весь домен представлений (любой список списков символов), используя целое число ноль в качестве заполнителя:
Если бы нам нужно было иметь дело с любым из смешанных списков Jelly (включая списки любой глубины или формы), мы могли бы использовать этот восемь байтов:
j,©⁹jœṣ®
который использует парные аргументы в качестве заполнителя.источник
Haskell , 78 байт
Попробуйте онлайн!
источник
Python 3.8 (предварительная версия) ,
6058 байтБезымянная функция, принимающая два списка строк,
a
иb
, которая возвращает список строк.Попробуйте онлайн! Или посмотрите набор тестов .
Как?
Сначала формируется строка-разделитель
v
, которую нельзя найти внутриa
илиb
. Затем формирует строку, соединяя строкиb
с копиямиv
. Затем формирует строку, объединяя строкиa
с копиями этого. Наконец, разделяет эту строку на экземпляры,v
чтобы получить список строк.Хотя обеспечение
v
не входит,a
илиb
мы должны также гарантировать, что неv
заставит нас разделиться рано в случае, когда все строки вa
иb
равны. Для этого мы формируемv
, объединяя все строки в обоих списках с экземплярами строки (здесь'&'
) и добавляем дополнительный, другой символ (здесь'$'
). Обратите внимание, что одного из этих действий недостаточно, поскольку все строки на входах могут быть равны выбранному символу.источник
&
требуется? а использования''.join(a+b)+'$'
недостаточно?['$','$'] ['$','$']
будет одним.'$'
символу, и результатом будет более одной строки, нам нужен другой символ, чтобы избежать раннего разделения.05AB1E ,
41519911 байтВ отличие от ответа Jelly, строка 05AB1E
"0"
, целое число0
и число с плавающей точкой0.0
все (несколько) равны, поэтому я не могу разделить / объединить целым числом. Вот почему у нас было +15 байт в качестве обходного пути, хотя я сейчас вернул его до 9 байт. Спасибо @JonathanAllan за то, что нашли 2 ошибки.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Wolfram Language (Mathematica) ,
6261 байтПопробуйте онлайн!
-1 спасибо Роману
Хотя это неверный вывод, он возвращает функцию, которая на самом деле выполняет работу .. (34 байта)
Попробуйте онлайн!
источник
Riffle
.Japt , 8 байт
Адаптирует подход Джонатана .
Попытайся
источник
N
в этом случае? Если я правильно понимаю (используя функцию поиска по ссылке TryIt), это повторяетсяN
два раза (N²
). Затем он использует это для присоединения ко второму inputV
(VqN²
), а затем использует всю эту строку для присоединения к первому (неявному) inputU
(q...)
). И, наконец, разбивает полученную строку наN
(qN
). Но чтоN
в этом случае?p(...)
метод в поиске. Это добавляет2
к обоим входам, соединенным вместе, не так ли. ТолькоN²
результаты[["w","x","y","z"],["ab","cd","e"],2]
, и он использует весь этот список, чтобы присоединиться. Почему финалqN
не оставляет2
список результатов в этом случае? ИлиN²
изменить оригиналN
?push
добавление элементов в массив в JS изменяет исходный массив.Haskell , 62 байта
Попробуйте онлайн!
Вот мой ответ на Haskell. Это работает на любой тип списка.
источник
J ,
44434229 байтПопробуйте онлайн!
-13 байт благодаря милям!
Этот подход использует целые числа и обусловлен милями.
оригинальный подход со строками
Попробуйте онлайн!
Примечание: я настроил -3 от TIO для учета
f=.
Использует метод Джонатана Аллена, адаптированный для Дж.
Это было удивительно сложно для гольфа, поскольку у J нет встроенного метода «соединения», и мне было бы любопытно посмотреть, можно ли его значительно улучшить.
g
это вспомогательный глагол, который дает нам «присоединиться»источник
_<;._1@,(;@}:@,@,.(,_&,)&.>/)
использующее бесконечность_
в качестве значения часового, чтобы знать, где делить<;._1
. Соединение сначала выполняется с использованием метода Reduce,/
чтобы сформировать один большой блок, а затем - просто формирование массива.g&.:(a.&i.&.>)
считаться с байтами или я что-то упустил?JavaScript (Node.js) ,
8579 байтПопробуйте онлайн!
источник
JavaScript, 37 байт
Также адаптирует подход Джонатана .
Попробуйте онлайн
источник
Perl 5 (
-lp
), 20 байтКак прокомментировал @JonathanAllan, это полная программа, использующая для ввода-вывода вкладку в качестве разделителя списка и новую строку для разделения двух списков.
TIO
Вкладка и новая строка были выбраны, потому что удобнее проверять контрольные примеры, в противном случае их можно изменить на непечатные символы
\1
и\2
.(
-02l012p
)TIO
Как это устроено,
-02
: установить разделитель входной записи на\2
-l
: удалить входной разделитель из аргумента по умолчанию$_
и добавить выходной разделитель записей в вывод по умолчанию-012
: установить разделитель выходной записи на\012
(\n
), чтобы легче было проверить вывод-p
: напечатать аргумент по умолчанию$n=<>;
: прочитать следующую запись и назначить$n
chop$n;
: снять разделитель с$n
s/\x1/$n/g
: заменить все случаи\1
с$n
источник
JavaScript (ES6),
6259 байтСохранено 3 байта благодаря @Shaggy
Это исправленная версия ответа Луиса (теперь удалена) для поддержки всех персонажей.
Попробуйте онлайн!
источник