Bir dizinin tek swapları


19

Esinlenerek Alındığı yığın taşması bir soruya .

Meydan okuma

Bir tamsayı verildiğinde n>1, dizideki tam iki girdiyi değiştirerek elde edilebilen tüm dizileri çıktılar [1, 2, ..., n].

Diziler herhangi bir sırada üretilebilir.

(1 [0, 1, ..., n-1]tabanlı) yerine sürekli olarak (0 [1, 2, ..., n]tabanlı) kullanabilirsiniz.

Ek kurallar

Test senaryoları

Girdi 2çıktı verir (1 tabanlı olduğu varsayılır)

2 1

Girdi 3çıktı verir (üç dizinin herhangi bir sırada olabileceğini unutmayın)

1 3 2
2 1 3
3 2 1

Girdi 4çıktı verir

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

Girdi 7çıktı verir

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

N uzunlukunun tüm permütasyonlarının sözlükbilimsel olarak sıralanmış listesinde oeis.org/A211369 artı bir (veya 0-indeksleme durumunda iki) tarafından verilen dizinlerdeki girdiler .
Jonathan Allan

5
Ben [0 ... n-1]vs esnekliğini takdir [1 ... n]! 1+Çünkü bir J sıfır endeksleri tack zorunda zaman her zaman biraz rahatsız hissediyorum .
cole

Yanıtlar:


3

Jöle , 11 8 bayt

ŒcżU$y€R

Çevrimiçi deneyin!

Nasıl çalışı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. 

Tam olarak ne yapar y? Benim için her zaman bir gizemdi.
22

Değiştirme yapar. Örneğin, [1,2],[4,3]y1,2,3her biri yerine 1 içinde [1, 2, 3] ile 4 ve her 2 ile 3 .
Dennis

8

R , 54 bayt

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

Çevrimiçi deneyin!

Her sütunun bir permütasyon olduğu bir matris döndürür.

combn(n,k)boyutta tüm kombinasyonlarını üretir klisteden nile veya 1:neğer ntek bir tamsayıdır. Ayrıca isteğe bağlı FUNolarak, sonuçtaki kombinasyonlara uygulanacak bir fonksiyon alır . Bu yüzden takas yapan ve takas edilen listeyi döndüren bir fonksiyon yazıyoruz. Sonuçların hepsi daha sonra arraybu durumda 2 boyutlu ve dolayısıyla bir matris olan bir haline toplanır .





5

Wolfram Dili (Mathematica) , 43 bayt

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

Çevrimiçi deneyin!

Açıklama: 2 boyutlu Subsets[Range@#,{2}]tüm alt kümeleri oluşturur {1,2,...,n}, ardından her alt küme için /.bu iki şeyi listede değiştirir {1,2,...,n}.

Bu yaklaşım hayal kırıklığı yaratan diğer gönderilerin çoğuna benziyor, ancak burada 3 ekstra bayt için Mathematica için daha benzersiz olan bir yaklaşım var:

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

Çevrimiçi deneyin!


2
Daha da deyimsel bir Mathematica çözümü olurdu ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&. Ne kadar basit (ya da doğrudan sorunu kodlar) gibi, ama ne yazık ki desen eşleştirme sözdizimi o kadar ayrıntılı ki bu 57 bayt sonuçlanır.
Martin Ender

5

Haskell, 62 bayt

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

Çevrimiçi deneyin!

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

Haskell , 71 bayt

f 0=[]
f x=map(++[x])(f$x-1)++[[1..y-1]++x:[y+1..x-1]++[y]|y<-[1..x-1]]

Çevrimiçi deneyin!


Bu, geçerli sayıyı sondaki tüm permütasyonların sonuna ekler ve ardından yeni sayıyı içeren tüm takasları hesaplar.


4

MATL , 12 bayt

:2XN!"G:@tP(

Çevrimiçi deneyin!

            %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
Test senaryolarını oluşturmak için kullandığım koddan 2 bayt daha kısa ve çok daha etkili :-)
Luis Mendo

@LuisMendo Test senaryolarını nasıl oluşturdunuz? Sipariş aynı olmadığından benimki daha uzun olduğu için endişelendim!
Giuseppe

1
Ben kullandım :tY@wy=~!s2=Y). Rahnema1'in Octave cevabı ile aynı yaklaşım, sanırım
Luis Mendo


3

Oktav, 38 bayt

@(n)(p=perms(k=1:n))(sum(p~=k,2)==2,:)

Çevrimiçi deneyin!

1: n'nin tüm permütasyonlarını oluşturur ve 1: n'den farklı iki elemanı olanları seçer.


2

JavaScript (ES6), 81 bayt

0 dizinli diziler yazdırır.

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

gösteri

alert()console.log()kullanıcı dostu olması için bu snippet'te ile değiştirilir .



2

Temiz , 90 82 bayt

import StdEnv
$n#n=[1..n]
=tl(removeDup[[if(c<>b)if(c<>a)c b a\\c<-n]\\b<-n,a<-n])

80 baytta yapılabilir, ancak Haskell cevaplarının doğrudan çevirisine dönüşür.

Çevrimiçi deneyin!


2

05AB1E , 15 9 bayt

LœʒD{αĀO<

Çevrimiçi deneyin!

açıklama

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

Kabuk , 9 bayt

!2§kδ#≠Pḣ

Çevrimiçi deneyin!

açıklama

!2§kδ#≠Pḣ  Input is an integer n.
        ḣ  Range: r=[1,2,..,n]
       P   Permutations of r.
   k       Classify by
     #     number of elements
      ≠    that are different from
  § δ      the corresponding element of r.
!2         Take the second class.

2

Yakut , 55 53 bayt

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

Çevrimiçi deneyin!

0 tabanlı çözüm

Buradaki hile, iç döngünün her zaman bir yinelemeyi "atlaması" dır: ilk kez çalıştırılmadığında, daha sonra ikinci geçişte sadece bir kez, vb.

R'nin 54'e kadar golf oynayabileceğini görene kadar 55 bayt ile mutluydum , bu yüzden 53'e almak zorunda kaldım.


Esnek çıkış kısıtlamalarının çok akıllıca kullanılması.
Unihedron


1

Pyth, 9 bayt

t{.rLQ*=U

gösteri

İki değeri değiştirmenin en kolay yolu .r, Pyth'in döner çeviri işlevi olan kullanmaktır. ve içindeki .r<list>[A, B]tüm tekrarları değiştirir .ABlist

Bu nedenle, çeviri fonksiyonu uygulayarak UQlisteye, 0için n-1listesinde farklı sayılar, her iki eleman bir liste ile istenen çıktı üretecektir. Qgirdi n, veU aralık işlevidir.

Bunu yapmanın kolay yolu:

.rLUQ.cUQ2

.cUQ2aralıktaki farklı öğelerin 2 öğe kombinasyonunun tümünü oluşturur .rLUQve .rişlevi bunlar ve liste üzerinde eşlerUQ .

Ancak, bu 10 bayt olur.

.cUQ2Farklı çiftler yapmak yerine, tüm çiftleri yapabiliriz *=U. Bu dolaylı olarak eşdeğerdir *=UQQ. Bu üzerine yazarak başlar Qile UQdaha sonra Kartezyen ürün alarak, UQve UQ. Bu, aralıktaki tüm sayı çiftlerini verir, mutlaka sıralı veya farklı değildir.

.rLQher listeyi kullanarak takas. Geri çağırma Qgelen listeye artık eşittir 0için n-1değil,n .

Çiftler sipariş edilmediğinden kopyalar var. {kopyaları kaldırır. Çiftler farklı olmadığından, değiştirilmemiş liste mevcuttur. Bu liste, tekilleştirmeden sonra her zaman ilk olacaktır, çünkü {ilk görünümün sırasını korur ve değişmeyen liste döndürülerek üretilir [0,0]. tistenen swap listesini vererek ilk elemanı kaldırır.


1

Pyth, 11 bayt

fq2snVTUQ.p

Çevrimiçi deneyin
isaacg'ın yaklaşımı kadar kısa değil, ancak gönderilecek kadar farklı.

açıklama

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

Yakut , 80 bayt

Unihedron sayesinde -12 bayt.

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

Çevrimiçi deneyin!

Aklıma yaklaşan bir yaklaşım vardı, en iyi nedense Ruby'ye ...



Özre gerek yok! Sanırım çoğu PPCG kullanıcısı için rekabetin PPCG'yi serinleten şey olduğunu söylediğimde konuşuyorum.
totallyhuman

1
1..nKodunuza gelince, 1. tek karakterlik bir değişkene atayabilir ve yeniden kullanabilirsiniz (satırsonu veya noktalı virgülle ayrı ifadeler), 2. terim ifadelerinde parantez olmadan yapın: i==x ?y:i==y ?x:i(potansiyel sapmayı ayırmak için boşluklara sahip olduğum yere dikkat edin ) ve 3. uniq[1,n]yerine uniq[1..-1].
Unihedron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.