Декартовий твір двох списків


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і символ може виникати як багаторазово, так і на обох входах одночасно.

Вихідні дані

Декартовий добуток вхідних списків. Тобто, список кожної можливої ​​впорядкованої пари символів з першого списку та символу з другого списку. Кожна пара - це список або рядок або схожий з двох символів, або з двох рядків довжиною-однією. Довжина виходу буде дорівнює добутку довжин входів.

Пари повинні бути вказані в порядку; спочатку перераховується перший символ першого списку з першим з другого списку, далі всі пари першого символу першого списку. Остання пара складається з останнього символу першого списку разом з останнім символом другого списку.

Вихід повинен бути плоским списком пар; не є двовимірною матрицею, де пари групуються за своїм першим або другим елементом.

Тестові справи

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 може бути простіше, якщо порядок пар встановлений?
Adám

Чому в заголовку написано "список", а в тілі написано "список символів"?
Leaky Nun

Просто для впевненості: чи ["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"]допустимий вихідний формат?
Кудлатий

1
Ви позначили це, code-golfтому виграє найкоротша відповідь. У разі вирівнювання, перша відповідь, яка досягне цього балу, зазвичай є переможцем (зараз ця ). Дайте ще кілька днів, принаймні, перш ніж приймати відповідь, хоча, якщо взагалі. І тут дивіться рекомендації щодо відповіді на власне запитання.
Кудлатий

Відповіді:





5

APL (Dyalog) , 4 байти

,∘.,

Спробуйте в Інтернеті!

, сплющити

∘. декартовий

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


Я не думаю, що flattenце є гарним описом, оскільки вирівнювання призведе до неправильного результату, я думаю, що "підтягнути" або "зменшити ранг" або щось подібне повинно працювати. (Згладжено [1,2] x [1,2] є [1,1,1,2,2,1,2,2])
Zacharý

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: Це те, що я спочатку збирався піти, але, з тестових випадків, виявляється, що це було б невірно; перечитуючи вимоги до виходу, хоча, схоже, вони вказують на те, що це може бути. Попрошу роз’яснення, щоб бути впевненим.
Кудлатий

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












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η⁺ικ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення: Змінні θта ηнеявно відносяться до двох вхідних рядків. Команда перебирає кожен символ першого входу, в той час як команда відображає над кожним символом другого входу конкатенація змінну циклуι і змінної картою κ, результат якого неявно надрукований на окремих рядках.


Здається, це 19 байт.
CalculatorFeline

@CalculatorFeline Деревне вугілля має власну кодову сторінку .
Ніл

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

btw, саме тому мені не подобається кодовий гольф.
Dennis_E

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