Produkt kartezjański dwóch list

14

Zadanie

Biorąc pod uwagę dwie listy znaków, wypisz ich iloczyn kartezjański, tj. Listę par każdej litery z pierwszej listy z każdą literą z drugiej listy.

Przykład

"123456"i "abcd"podaj:

[["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"]]

Wejście

Dwie listy znaków lub ciągów. Używane znaki będą alfanumeryczne, a-z, A-Z, 0-9a znak może występować zarówno wielokrotnie, jak i na obu wejściach jednocześnie.

Wynik

Iloczyn kartezjański list wejściowych. To jest lista każdej możliwej uporządkowanej pary znaku z pierwszej listy i znaku z drugiej listy. Każda para jest listą lub łańcuchem lub podobnym składającym się z dwóch znaków lub dwóch łańcuchów o długości jeden. Długość wyjściowa będzie równa iloczynowi długości wejściowych.

Pary muszą być wymienione w kolejności; najpierw wyświetla pierwszy znak pierwszej listy z pierwszą z drugiej listy, a następnie wszystkie pary pierwszego znaku z pierwszej listy. Ostatnia para składa się z ostatniego znaku pierwszej listy wraz z ostatnim znakiem drugiej listy.

Wynikiem musi być płaska lista par; nie macierz 2D, w której pary są pogrupowane według pierwszego lub drugiego elementu.

Przypadki testowe

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"]]
alexandros84
źródło
@ Adám Zmieniono. Mam problem z sformułowaniem, że powtarzające się znaki w ciągu wejściowym mogą i powinny powodować powtarzające się pary w wyniku (zakładając, że tak to interpretuje).
xnor
@xnor może łatwiej, jeśli kolejność par jest ustalona?
Adám
Dlaczego tytuł mówi „lista”, a ciało mówi „lista znaków”?
Leaky Nun
Dla pewności: czy jest ["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"]prawidłowy format wyjściowy?
Kudłaty
1
Oznaczono to jako code-golfwygrywającą najkrótszą odpowiedź. W przypadku remisu pierwszą odpowiedzią na osiągnięcie tego wyniku jest zazwyczaj zwycięzca (obecnie ten ). Daj mu jeszcze co najmniej kilka dni, zanim przyjmie odpowiedź, jeśli w ogóle. I zapoznaj się tutaj z wytycznymi dotyczącymi odpowiedzi na własne pytanie.
Kudłaty

Odpowiedzi:

7

Mathematica, 12 bajtów

Tuples@{##}&

Pobiera na wejściu dwie listy znaków.

alephalpha
źródło
1
Ta sama długość: Tuples@*ListAlternatywnie, jeśli dozwolone są dowolne głowy:Tuples@*f
CalculatorFeline
5

APL (Dyalog) , 4 bajty

,∘.,

Wypróbuj online!

, spłaszczyć

∘. kartezjański

, powiązanie

Adám
źródło
Nie wydaje mi się, żeby flattenbył to dobry opis, ponieważ spłaszczanie spowodowałoby niepoprawny wynik, myślę, że „zacieśnij” lub „zmniejsz rangę” albo coś podobnego powinno działać. (Spłaszczony [1,2] x [1,2] to [1,1,1,2,2,1,2,2])
Zacharý 24.09.17
4

Rubinowy , 30 18 bajtów

-12 bajtów z Jordanii, przypominając mi o sposobie wykorzystania specyfikacji na moją korzyść!

Pobiera listy znaków jako dane wejściowe.

->a,b{a.product b}

Wypróbuj online!

Wartość tuszu
źródło
1
Specyfikacja mówi, że dane wejściowe to „Dwie listy znaków lub ciągów”, więc nie sądzę, żebyś potrzebował .chars.
Jordan
1
Szkoda, że ​​przeglądarki nie mówią w języku ruby. Taki przyjazny język ..
alexandros84
4

Perl 6 , 4 bajty

&[X]

Jest to tylko odniesienie do wbudowanego operatora wielu produktów X. Działa na listach wszelkiego rodzaju, nie tylko postaciach.

Sean
źródło
3

Oktawa, 32 bajty

@(a,b)[(a+~b')(:) (b'+~a)(:) '']

Wypróbuj online!

rahnema1
źródło
3

Tcl , 60 bajtów

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

Posługiwać się:

% 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}
avl42
źródło
3

JavaScript (ES6), 45 36 34 33 bajtów

Wymaga przeglądarki Firefox. Pobiera oba dane wejściowe jako ciągi znaków lub tablice poszczególnych znaków.

a=>b=>[for(x of a)for(y of b)x+y]

Spróbuj

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>

Kudłaty
źródło
Destrukturyzacja działa również na łańcuchach.
Neil
Dzięki, @Neil; zapomniałem zaktualizować to po zmianie metody, której używałem.
Kudłaty
Czy x+yjest prawidłowy format wyjściowy?
Neil
@ Neil: Z tym zamierzałem początkowo pójść, ale z przypadków testowych wydaje się, że to nie byłoby poprawne; Jednak ponowne odczytanie wymagań wyjściowych wydaje się wskazywać, że tak może być. Poproszę o wyjaśnienie, aby się upewnić.
Shaggy
1
@ alexandros84: Tak, ES6 (+) jest niezbędny, jeśli masz nawet szansę na bycie konkurencyjnym w golfie - do czasu pisania functionjuż przegrałeś! Rzucę kilka wskazówek na twoją odpowiedź później, ale w międzyczasie spójrz na moje oryginalne rozwiązanie mapowania tablic w historii edycji; powinieneś być w stanie po prostu to zerwać i zastąpić funkcje strzałek funkcjami „prawdziwymi”.
Shaggy
3

Bash, 18 lat

Można to zrobić za pomocą rozszerzeń nawiasów:

eval echo {$1}{$2}

Wypróbuj online .

Cyfrowa trauma
źródło
2

Brachylog , 5 bajtów

{∋ᵐ}ᶠ

Wypróbuj online!

Wyjaśnienie

Dość oczywiste

{  }ᶠ       Find all:
  ᵐ           Map:
 ∋              In
Fatalizować
źródło
2

QBIC , 29 bajtów

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

Drukuje ciągi 2-znakowe ze wszystkimi kombinacjami w jednym wierszu.

Wyjaśnienie

   ;      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
Steenbergh
źródło
2

Pyth , 3 bajty

*ww

Pomnożenie dwóch łańcuchów działa jak produkt kartezjański.

Przetestuj online!

Jim
źródło
Rozwiązanie 2 bajtów *Ewymagałoby zamiany kolejności ciągów wejściowych :( pyth.herokuapp.com/…
KarlKastor
2

MATL , 2 bajty

Z*

*jest ogólnym operatorem produktów, a przedrostek Zoznacza, że ​​jest to produkt kartezjański i może przyjmować dwa ciągi argumentów.

Wypróbuj online!

wada
źródło
1

Clojure, 21 bajtów

#(for[i % j %2][i j])
NikoNyrh
źródło
1

Python 2 , 39 bajtów

lambda x,y:[[i,j]for i in x for j in y]

Wypróbuj online!

Alternatywne rozwiązanie, 34 30 bajtów

-4 bajty dzięki Andersowi Kaseorgowi.

Jest wbudowany w to ...

from itertools import*
product
całkowicie ludzki
źródło
30 bajtów:from itertools import*;product
Anders Kaseorg
1

05AB1E , 10 bajtów

v²NFÀ}¹ø)˜

Wypróbuj online!

Jest to bez wbudowanego i niewątpliwie nie będzie konkurencyjne.

Urna Magicznej Ośmiornicy
źródło
Wyjście Dla wejścia „aba” „aa” wydaje się nieprawidłowe
RosLuP,
1

Siatkówka , 49 bajtów

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

Wypróbuj online! Pobiera dane w osobnych wierszach. Wyjaśnienie:

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

Każdy znak w pierwszym ciągu generuje oddzielną linię poprzedzoną drugim ciągiem.

¶¶.+
¶

Oryginalny drugi ciąg zostaje usunięty.

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

Dla każdego znaku w pierwszym ciągu każdy znak w drugim ciągu generuje osobny wiersz poprzedzony pierwszym znakiem.

¶.¶
¶

Pozostałe znaki z pierwszego ciągu są usuwane.

Neil
źródło
1

q / kdb +, 5 bajtów

Rozwiązanie:

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

Przykład:

q)"123456"cross"abcd"
"1a"
"1b"
"1c"
"1d"
"2a"
"2b"
"2c"
"2d"
"3a"
"3b"
"3c"
"3d"
"4a"
"4b"
...etc
streetster
źródło
1

Węgiel , 8 7 bajtów

FθEη⁺ικ

Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: Zmienne θi ηpośrednio odnoszą się do dwóch ciągów wejściowych. Komenda pętle nad każdym charakterem pierwszego wejścia, natomiast komenda odwzorowuje nad każdym charakterze drugiego wejścia łącząc zmiennej pętli ιa zmienna mapa κ, którego rezultatem jest domyślnie drukowane na oddzielnych liniach.

Neil
źródło
To wydaje się mieć 19 bajtów.
CalculatorFeline
@CalculatorFeline Charcoal ma własną stronę kodową .
Neil,
1

R , 29 bajtów

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

Wypróbuj online!

Zauważ, że macierz R jest wypełniana według kolumn, więc wynik jest w kolejności podanej przez specyfikację.

Jeśli pozwala się factorsna wejście i wyjście, jest wbudowany ... ale trzeba wyodrębnić wynikowe poziomy z czynnika, aby ostatecznie przekroczył 29 bajtów.

R 11 bajtów

interaction

Wypróbuj online!

JayCe
źródło
1

Japt , 5 2 bajty

Japt ma teraz metodę dla produktu kartezjańskiego.

Pobiera dane wejściowe jako 2 tablice ciągów znaków.

ïV

Spróbuj

Kudłaty
źródło
1

C # 7, 78 63 bajtów

(a,b)=>$"({string.Join(",",a.SelectMany(x=>b,(x,y)=>(x,y)))})";
Dennis_E
źródło
nie jest to pełny program ani funkcja
tylko
Powinieneś napisać pełny program lub funkcję, a nie fragment kodu.
Muhammad Salman
Właśnie to zmieniłem. Ale wiele odpowiedzi na tej stronie nie jest pełnymi programami lub funkcjami. Nie jestem pewien, dlaczego ten jest wyróżniony.
Dennis_E
btw, dlatego nie lubię golfa kodowego.
Dennis_E,
Ponieważ jest to funkcja, możesz bezpośrednio zwrócić ciąg wyjściowy zamiast zapisywać go na ekranie, myślę, że oszczędza to ~ 20 bajtów.
Sundar - Przywróć Monikę