Декартово произведение двух списков


14

задача

Учитывая два списка символов, выведите их декартово произведение, то есть список пар каждой буквы из первого списка с каждой буквой из второго списка.

пример

"123456"и "abcd"дать:

[["1","a"],["1","b"],["1","c"],["1","d"],["2","a"],["2","b"],["2","c"],["2","d"],["3","a"],["3","b"],["3","c"],["3","d"],["4","a"],["4","b"],["4","c"],["4","d"],["5","a"],["5","b"],["5","c"],["5","d"],["6","a"],["6","b"],["6","c"],["6","d"]]

вход

Два списка символов или строк. Используемые символы будут буквенно-цифровыми, a-z, A-Z, 0-9и символ может встречаться как несколько раз, так и на обоих входах одновременно.

Выход

Декартово произведение входных списков. То есть список каждой возможной упорядоченной пары символов из первого списка и символа из второго списка. Каждая пара представляет собой список или строку или аналог из двух символов или из двух строк длиной одна. Длина выхода будет равна произведению длин входов.

Пары должны быть перечислены в порядке; первый список первого символа первого списка с первым из второго списка, за которым следуют все пары первого символа первого списка. Последняя пара состоит из последнего символа первого списка вместе с последним символом второго списка.

На выходе должен быть плоский список пар; не 2D матрица, где пары сгруппированы по их первому или второму элементу.

Контрольные примеры

inputs               output

"123456", "abcd"     [["1","a"],["1","b"],["1","c"],["1","d"],["2","a"],["2","b"],["2","c"],["2","d"],["3","a"],["3","b"],["3","c"],["3","d"],["4","a"],["4","b"],["4","c"],["4","d"],["5","a"],["5","b"],["5","c"],["5","d"],["6","a"],["6","b"],["6","c"],["6","d"]]
"abc", "123"         [["a","1"],["a","2"],["a","3"],["b","1"],["b","2"],["b","3"],["c","1"],["c","2"],["c","3"]]
"aa", "aba"          [["a","a"],["a","b"],["a","a"],["a","a"],["a","b"],["a","a"]]

@ Adám изменен. У меня возникли проблемы, хотя формулировка о том, что повторяющиеся символы во входной строке могут и должны вызывать повторяющиеся пары в выводе (при условии, что именно так это интерпретировать).
xnor

@xnor может быть проще, если порядок пар фиксирован?
Адам

Почему в заголовке написано «список», а в теле - «список символов»?
Утренняя монахиня

Просто чтобы быть уверенным: ["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"]правильный формат вывода?
Shaggy

1
Вы пометили это как code-golfкороткий ответ. В случае ничьей первым ответом на этот счет обычно является победитель (в настоящее время этот ). Дайте ему еще несколько дней, по крайней мере, прежде чем принять ответ, хотя, если вообще. И здесь вы найдете рекомендации по ответу на свой вопрос.
Лохматый

Ответы:




7

Mathematica, 12 байт

Tuples@{##}&

Принимает два списка символов в качестве входных данных.


1
Та же длина: в Tuples@*Listкачестве альтернативы, если разрешены произвольные головы:Tuples@*f
CalculatorFeline

5

APL (Дьялог) , 4 байта

,∘.,

Попробуйте онлайн!

, расплющить

∘. декартов

, конкатенация


Я не думаю, что flattenэто хорошее описание здесь, так как сглаживание дало бы неправильный результат, я думаю, что «затянуть» или «понизить рейтинг» или что-то подобное должно работать. (Сглаженный [1,2] x [1,2] равен [1,1,1,2,2,1,2,2])
Захари

4

Рубин , 30 18 байт

-12 байтов от Джордана, напоминающих мне о способе использования спецификации в моих интересах!

Принимает списки символов в качестве входных данных.

->a,b{a.product b}

Попробуйте онлайн!


1
В спецификации говорится, что ввод «Два списка символов или строк», поэтому я не думаю, что вам нужно .chars.
Джордан

1
Обидно, что браузеры не говорят на рубине. Такой дружелюбный язык ..
alexandros84

4

Perl 6 , 4 байта

&[X]

Это просто ссылка на встроенный оператор кросс-продукта X. Он работает со списками любого рода, а не только с персонажами.




3

Tcl , 60 байт

proc p x\ y {lmap X $x {lmap Y $y {lappend l $X\ $Y}};set l}

Использование:

% p {1 2 3} {a 2 2}
{1 a} {1 2} {1 2} {2 a} {2 2} {2 2} {3 a} {3 2} {3 2}

3

JavaScript (ES6), 45 36 34 33 байта

Требуется Firefox. Принимает оба ввода в виде строк или массивов отдельных символов.

a=>b=>[for(x of a)for(y of b)x+y]
  • -1 байт благодаря CalculatorFeline, обнаружившему ошибочность <space>.

Попытайся

f=
a=>b=>[for(x of a)for(y of b)x+y]
oninput=_=>console.clear()&console.log(f(i.value)(j.value))
console.log(f(i.value="123456")(j.value="abcd"))
<input id=i><input id=j>


Деструктурирование тоже работает на струнах.
Нил

Спасибо, @Neil; забыл обновить, что после того, как я изменил метод, который я использовал.
Лохматый

Является ли x+yдопустимый формат вывода?
Нил

@Neil: Это то, с чем я изначально собирался пойти, но из тестовых случаев оказалось, что это не будет правильным; Перечитывая требования к выходным данным, они, похоже, указывают на то, что это может быть так. Я попрошу разъяснений, чтобы быть уверенным.
Shaggy

1
@ alexandros84: Да, ES6 (+) важен, если у вас есть хоть какой-то маловероятный шанс быть конкурентоспособным в гольфе - к тому времени, как вы набрали function, вы уже проиграли! Позже я добавлю несколько указателей на ваш ответ, но пока взгляну на мое оригинальное решение для отображения массивов в истории редактирования; Вы должны быть в состоянии просто сорвать это и заменить функции стрелок на «настоящие» функции.
Лохматый



2

QBIC , 29 байт

[_l;||[_l;||?_sA,a,1|+_sB,b,1

Это печатает 2-символьные строки со всеми комбинациями в одной строке каждая.

объяснение

   ;      Read in string A$
 _l |     Get its length as b
[    |    and kick off a FOR-loop from 1 to that
[_l;||    Do the same for B$
          Note that, while the FOR-loop may pass this code several times, the
          'read-from cmd line' is done only once.
?_sA,a,1| PRINT the character from A$ at the position of the 'a' loop counter
+_sB,a,1   concatenated with the char from B$ at the pos of the 'b' loop counter


2

MATL , 2 байта

Z*

*является общим оператором для продуктов, а префикс Zделает его декартовым произведением и может принимать две строки в качестве аргументов.

Попробуйте онлайн!











1

Сетчатка , 49 байт

.(?=.*¶(.+))
$1$&¶
¶¶.+
¶
.(?=.*(.)¶)
$1$&¶
¶.¶
¶

Попробуйте онлайн! Принимает ввод в отдельных строках. Объяснение:

.(?=.*¶(.+))
$1$&¶

Каждый символ в первой строке генерирует отдельную строку с префиксом второй строки.

¶¶.+
¶

Исходная вторая строка удалена.

.(?=.*(.)¶)
$1$&¶

Для каждого символа в первой строке каждый символ во второй строке генерирует отдельную строку с префиксом первого символа.

¶.¶
¶

Остатки от первой строки удаляются.


1

q / kdb +, 5 байт

Решение:

cross           / yup, there's a built-in to do exactly this

Пример:

q)"123456"cross"abcd"
"1a"
"1b"
"1c"
"1d"
"2a"
"2b"
"2c"
"2d"
"3a"
"3b"
"3c"
"3d"
"4a"
"4b"
...etc

1

Древесный уголь , 8 7 байт

FθEη⁺ικ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение: Переменные θи ηнеявно ссылаются на две входные строки. Команда зацикливается на каждом символе первого ввода, в то время как команда отображает каждый символ на втором входе, объединяя переменную цикла и переменную ιmap κ, результат которой неявно печатается в отдельных строках.


Кажется, это 19 байтов.
CalculatorFeline

@CalculatorFeline Charcoal имеет свою собственную кодовую страницу .
Нил

1

R , 29 байт

function(x,y)outer(x,y,paste)

Попробуйте онлайн!

Обратите внимание, что матрица R заполняется столбцом, поэтому результат находится в порядке, определяемом спецификацией.

Если разрешено иметь factorsдля ввода и вывода, есть встроенный ... но нужно извлечь результирующие уровни из фактора, так что в итоге это будет более 29 байтов.

R 11 байт

interaction

Попробуйте онлайн!



1

C # 7, 78 63 байта

(a,b)=>$"({string.Join(",",a.SelectMany(x=>b,(x,y)=>(x,y)))})";

это не полная программа и не функция
только ASCII

Вы должны написать полную программу или функцию, а не фрагмент.
Мухаммед Салман

Я просто изменил это. Но многие ответы на этой странице не являются полными программами или функциями. Не уверен, почему это выделено.
Dennis_E

Кстати, именно поэтому я не люблю код гольф.
Dennis_E

Поскольку это функция, вы можете напрямую возвращать выходную строку вместо того, чтобы записывать ее на экран, я думаю, что это экономит вам ~ 20 байт.
sundar - Восстановить Монику
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.