配列の単一スワップ


19

触発さから撮影スタックオーバーフローの問題

チャレンジ

整数n>1を指定すると、配列内の正確に2つのエントリをスワップすることで取得できるすべての配列を出力します[1, 2, ..., n]

配列は任意の順序で作成できます。

(1 [0, 1, ..., n-1]ベース)の代わりに一貫して(0ベース)を使用でき[1, 2, ..., n]ます。

追加のルール

テストケース

入力2は出力を与えます(1ベースと仮定)

2 1

入力3により出力が得られます(3つの配列の順序は任意です)

1 3 2
2 1 3
3 2 1

入力4は出力を与えます

1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1

入力7は出力を与えます

1 2 3 4 5 7 6
1 2 3 4 6 5 7
1 2 3 4 7 6 5
1 2 3 5 4 6 7
1 2 3 6 5 4 7
1 2 3 7 5 6 4
1 2 4 3 5 6 7
1 2 5 4 3 6 7
1 2 6 4 5 3 7
1 2 7 4 5 6 3
1 3 2 4 5 6 7
1 4 3 2 5 6 7
1 5 3 4 2 6 7
1 6 3 4 5 2 7
1 7 3 4 5 6 2
2 1 3 4 5 6 7
3 2 1 4 5 6 7
4 2 3 1 5 6 7
5 2 3 4 1 6 7
6 2 3 4 5 1 7
7 2 3 4 5 6 1

oeis.org/A211369で指定されたインデックスのエントリと、長さnのすべての順列の辞書式にソートされたリストの1つ(または0インデックスの場合は2つ)。
ジョナサンアラン

5
[0 ... n-1]vs の柔軟性に感謝します[1 ... n]1+Jがゼロインデックスであるため、私が取り組む必要があるとき、私は常に少しイライラします。
コール

回答:


3

ゼリー11 8バイト

ŒcżU$y€R

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

使い方

ŒcżU$y€R  Main link. Argument: n

Œc        Take all 2-combinations of [1, ..., n].
  żU$     Zip the result with the reversed pairs.
       R  Range; yield [1, ..., n].
     y€   For each [[i, j], [j, i]] in the result to the left, yield the result to
          the right, with i replaced by j and vice versa. 

正確には何をしyますか?私にはいつもちょっとした謎がありました。
コメアリンガーアーイング

置換を実行します。たとえば、[1、2、3]の[1,2],[4,3]y1,2,314に、各23に置き換えます。
デニス

8

R、54バイト

function(n)combn(n,2,function(x){z=1:n
z[x]=rev(x)
z})

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

各列が順列である行列を返します。

combn(n,k)klist nから、または1:nif nが単一の整数である場合、サイズのすべての組み合わせを生成します。また、オプションでFUN、結果の組み合わせに適用される関数を取ります。そこで、スワップを実行し、スワップされたリストを返す関数を作成します。結果はすべてに蓄積されarrayます。この場合は2次元であり、したがって行列です。





5

Wolfram言語(Mathematica)、43バイト

r/.{#->#2,#2->#}&@@@Subsets[r=Range@#,{2}]&

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

説明:のSubsets[Range@#,{2}]すべてのサブセットを生成します{1,2,...,n}サイズ2の、各サブセットごと/.に、リスト内のこれら2つのものを交換します{1,2,...,n}

このアプローチは、他の多くの提出物と残念なことに似ていますが、3バイト余分に追加されているMathematicaに固有のものです。

r~Permute~Cycles@{#}&/@Subsets[r=Range@#,{2}]&

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


2
さらに慣用的なMathematicaソリューションはになりますReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&。私はそれがいかに簡単か(または問題をどのように直接エンコードするか)が好きですが、残念ながらパターンマッチング構文は非常に冗長であるため、最終的に57バイトになります。
マーティンエンダー

5

Haskell、62バイト

g n|b<-[1..n]=[[last$k:[j|k==i]++[i|k==j]|k<-b]|i<-b,j<-b,j<i]

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

i<-b                -- loop 'i' through [1..n]
     j<-b           -- loop 'j' through [1..n]
          j<i       -- consider only cases where j<i 
 [            k<-b] -- make a list by looping 'k' through [1..n] 
  last              -- pick
          [i|k==j]  -- 'i' if k==j
       [j|k==i]     -- 'j' if k==i
     k              -- 'k' else   


4

MATL、12バイト

:2XN!"G:@tP(

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

            %implicit input, say, 4
:           %range, stack is {[1,2,3,4]}
2           %push 2
XN          %nchoosek, compute all combinations of [1,2,3,4] taken 2 at a time
            %this results in a matrix where each row is a combination, i.e.,
            %[1, 2;
              1, 3;
              1, 4;
              2, 3;
              2, 4;
              3, 4]
!           %transpose, because "for" iterates over columns
"           %begin for loop
G:          %push input and range, stack is now [1,2,3,4]
@t          %push "for" index (the column), say, [1;2], twice
P           %flip array, so stack is now: {[1,2,3,4],[1;2],[2;1]}
(           %assignment index, sets [1,2,3,4]([1;2])=[2;1],
            %resulting in [2,1,3,4]
            %implicit end of loop, implicit end of program, print the stack implicitly.


1
テストケースの生成に使用したコードよりも2バイト短く、効率的です:-)
ルイスメンドー

@LuisMendoテストケースをどのように生成しましたか?私は私の順序が同じではなかったのでもっと長いのが心配でした!
ジュゼッペ

1
使用しました:tY@wy=~!s2=Y)。rahnema1のオクターブの答えと同じアプローチ、私は思う
ルイスメンドー



2

JavaScript(ES6)、81バイト

0インデックスの配列を出力します。

n=>(a=[...Array(n).keys()]).map(i=>a.map(j=>i>j&&alert(a.map(k=>k-i?k-j?k:i:j))))

デモ

alert()console.log()このスニペットでは、使いやすいように置き換えられています。




2

05AB1E15 9バイト

LœʒD{αĀO<

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

説明

L            # push range [1 ... input]
 œ           # get all permutations
  ʒ          # filter, keep only elements that are true when
     α       # absolute value is taken with
   D{        # a sorted copy
      Ā      # each non-zero value in the resulting array is converted to 1
       O     # the array is summed
        <    # and the sum is decremented


2

ルビー55 53バイト

->n{n.times{|x|x.times{|y|(w=*0...n)[w[x]=y]=x;p w}}}

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

0ベースのソリューション

ここでのコツは、内側のループが常に反復を「スキップ」することです。最初のループはまったく実行されず、2回目のパスでは1回だけというように続きます。

Rが54までゴルフできることを確認するまで55バイトに満足していたので、53まで増やす必要がありました。


柔軟な出力制約の非常に巧妙な使用。
ユニヘドロン


1

Pyth、9バイト

t{.rLQ*=U

デモンストレーション

2つの値を交換する最も簡単な方法.rは、Pythの回転変換機能であるを使用することです。.r<list>[A, B]すべての出現を交換しますAと、B中をlist

したがって、変換関数をUQリストから0に適用して、n-1リスト内の異なる番号の各2つの要素リストを使用して、目的の出力を生成します。Q入力です。nあり、U範囲関数です。

これを行う簡単な方法は次のとおりです。

.rLUQ.cUQ2

.cUQ2範囲内の異なる要素の2つの要素の組み合わせをすべて生成し.rLUQ.rそれらとリストに関数をますUQ

ただし、これは10バイトになります。

.cUQ2順序付けられた個別のペアを作成する代わりに、を使用してすべてのペアを作成でき*=Uます。これは暗黙的にと同等*=UQQです。これは、上書きして起動するQUQ、その後のデカルト積をとる、UQUQ。これにより、範囲内のすべての数字のペアが得られますが、必ずしも順序付けられているわけではありません。

.rLQ各リストを使用してスワップします。リコールQ今からリストに等しく0するn-1、ではありませんn

ペアは注文されていないため、重複があります。{重複を削除します。ペアは区別されなかったため、変更されていないリストが存在します。このリストは、重複排除後は常に最初になります。これ{は、最初の外観の順序が保持され、変更前のリストがで回転することにより作成されるため[0,0]です。t最初の要素を削除して、目的のスワップのリストを提供します。


1

Pyth、11バイト

fq2snVTUQ.p

オンライン
試してみてください isaacgのアプローチほど短くはありませんが、投稿するには十分に違います。

説明

fq2snVTUQ.p
         .pQ  Take the permutations of the (implicit) range [0,...,input].
f     T       Filter to get the permutations...
   snV UQ     ... where the number of differences with [0,...,input]...
 q2           ... is 2.



1

ルビー、80バイト

Unihedronのおかげで-12バイト。

->n{(r=1..n).map{|x|r.map{|y|r.map{|i|i==x ?y:i==y ?x:i}}}.flatten(1).uniq[1,n]}

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

なんらかの理由でRubyに翻訳するのが最善のアプローチを考えていたので... Rubyのことすら知らない...


codegolf.stackexchange.com/a/152652/21830をアウトゴルフしました。ごめんなさい!
単面体

謝る必要はありません!競争がPPCGをクールにするものであると言ったとき、私はほとんどのPPCGユーザーのために話すと思います。
完全に人間の

1
コードに関して1..nは、1。1文字の変数に割り当てて再利用することができます(改行またはセミコロンでステートメントを分離します)、2。期間ステートメントで角括弧なしで行います:(i==x ?y:i==y ?x:i潜在的なシバンを区切るスペースがあることに注意してください) )と3 uniq[1,n]の代わりにuniq[1..-1]
ユニヘドロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.