2つのリストのデカルト積


14

仕事

文字の2つのリストが与えられたら、デカルト積、つまり最初のリストの各文字と2番目のリストの各文字のペアのリストを出力します。

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

入力

文字または文字列の2つのリスト。使用される文字は英数字でa-z, A-Z, 0-9あり、文字は複数回、両方の入力で同時に発生する可能性があります。

出力

入力リストのデカルト積。つまり、最初のリストからの文字と2番目のリストからの文字の可能な各順序ペアのリスト。各ペアは、2つの文字、または2つの長さ1の文字列のリスト、文字列、または類似物です。出力の長さは、入力の長さの積に等しくなります。

ペアは順番にリストする必要があります。最初に最初のリストの最初の文字と2番目のリストの最初の文字をリストし、その後に最初のリストの最初の文字のすべてのペアが続きます。最後のペアは、最初のリストの最後の文字と2番目のリストの最後の文字で構成されます。

出力は、ペアのフラットリストである必要があります。ペアが最初または2番目の要素でグループ化されている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"]有効な出力形式ですか?
シャギー

1
このcode-golfため、最短回答が勝ったとタグ付けしました。同点の場合、そのスコアに到達する最初の答えは通常勝者です(現在はこれです)。ただし、回答を受け入れる前に、少なくとも数日は与えてください。そして、あなた自身の質問に答えるガイドラインについてはこちらをご覧ください。
シャギー

回答:




7

Mathematica、12バイト

Tuples@{##}&

入力として2つの文字リストを受け取ります。


1
同じ長さ:Tuples@*Listあるいは、任意のヘッドが許可されている場合:Tuples@*f
CalculatorFeline


4

ルビー30 18バイト

ヨルダンからの-12バイトは、仕様を有利に使用する方法を思い出させてくれます!

入力として文字のリストを受け取ります。

->a,b{a.product b}

オンラインでお試しください!


1
仕様では、入力は「文字または文字列の2つのリスト」であるため、必要とは思わない.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]

それを試してみてください

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有効な出力フォーマットは?
ニール

@ニール:それは私がもともと行っていたものですが、テストケースから、それは有効ではないようです。ただし、出力要件を読み直すと、そうなる可能性があることを示しているようです。確実にするために明確化をお願いします。
シャギー

1
@ alexandros84:ええ、ES6(+)は、ゴルフで競争するチャンスがわずかでもある場合に不可欠です-入力functionするまでに、すでに負けています!後であなたの答えにいくつかのポインタを投げますが、その間に、編集履歴で元の配列マッピングソリューションを見てみましょう。あなたはそれを剥ぎ取り、矢印関数を「実際の」関数に置き換えることができるはずです。
シャギー



2

QBIC、29バイト

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

これにより、2行の文字列がすべて1行にすべての組み合わせで出力されます。

説明

   ;      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$&¶

最初の文字列の各文字は、2番目の文字列が前に付いた個別の行を生成します。

¶¶.+
¶

元の2番目の文字列が削除されます。

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

最初の文字列の各文字について、2番目の文字列の各文字は、最初の文字をプレフィックスとする個別の行を生成します。

¶.¶
¶

最初の文字列の残りの文字は削除されます。


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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:変数θおよびηは、2つの入力ストリングを暗黙的に参照します。このコマンドは最初の入力の各文字をループしますが、コマンドはループ変数ιとマップ変数を連結する2番目の入力の各文字をマップしますκ。その結果は暗黙的に別々の行に出力されます。


これは19バイトのようです。
電卓

@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のみ

スニペットではなく、完全なプログラムまたは関数を作成することになっています。
ムハンマドサルマン

I just changed it. But many answers on this page aren't full programs or functions. Not sure why this one is singled out.
Dennis_E

btw, this is why I don't like code golf.
Dennis_E

Since this is a function, you can directly return the output string instead of writing it to the screen, I think that saves you ~20 bytes.
sundar - Reinstate Monica
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.