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

@ 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.


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


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!


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.




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}

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>


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



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


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!











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.


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

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.


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!


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


1

C # 7, 78 63 bajtów

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

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ę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.