Поодинокі підкачки масиву


19

Натхненний узятим із запитання в Stack Overflow .

Змагання

Враховуючи ціле число n>1, виведіть усі масиви, які можна отримати, замінивши рівно два записи в масиві [1, 2, ..., n].

Масиви можна виготовити в будь-якому порядку.

Ви можете послідовно використовувати [0, 1, ..., n-1](на основі 0) замість [1, 2, ..., n](на основі 1).

Додаткові правила

Тестові справи

Вхід 2дає вихід (на основі 1)

2 1

Введення 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 плюс один (або два, якщо 0-індексація) в лексикографічно відсортованому списку всіх перестановок довжиною n.
Джонатан Аллан

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? Це завжди було для мене трохи загадкою.
caird coinheringaahing

Він виконує заміни. Наприклад, [1,2],[4,3]y1,2,3замінює кожен 1 у [1, 2, 3] на 4 , а кожен 2 на 3 .
Денніс

8

R , 54 байти

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

Спробуйте в Інтернеті!

Повертає матрицю, де кожен стовпець є перестановкою.

combn(n,k)генерує всі комбінації розмірів kзі списку nабо з, 1:nякщо nце єдине ціле число. Він також необов'язково приймає функцію, FUNяку слід застосувати до результативних комбінацій. Таким чином, ми пишемо функцію, яка виконує своп і повертає замінений список. Потім усі результати накопичуються в arrayвеличину, яка в даному випадку є двовимірною і, отже, матрицею.





5

Мова Вольфрама (Mathematica) , 43 байти

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

Спробуйте в Інтернеті!

Пояснення: Subsets[Range@#,{2}]генерує всі підмножини {1,2,...,n}розміром 2, потім для кожного підмножини /.підміняє ці дві речі у списку {1,2,...,n}.

Цей підхід розчаровує подібний до багатьох інших матеріалів, але ось один, більш унікальний для Mathematica, на 3 додаткові байти:

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

Спробуйте в Інтернеті!


2
Ще більш ідіоматичним було б рішення Mathematica ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&. Мені подобається, як це просто (або як безпосередньо він кодує проблему), але, на жаль, синтаксис відповідності шаблону настільки багатослівний, що це в кінцевому рахунку становить 57 байт.
Мартін Ендер

5

Хаскелл, 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

05AB1E , 15 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

Ruby , 55 53 байти

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

Спробуйте в Інтернеті!

Розчин на основі 0

Хитрість тут полягає в тому, що внутрішня петля завжди "пропускає" ітерацію: перший раз вона взагалі не виконується, потім лише один раз на другий прохід і так далі.

Я був задоволений 55 байтами, поки не побачив, що R може бути в гольф до 54, тому мені довелося дістати його до 53.


Дуже розумне використання гнучких вихідних обмежень.
Уніхедрон


1

Pyth, 9 байт

t{.rLQ*=U

Демонстрація

Найпростіший спосіб змінити два значення - це використання .r, яке є функцією обертового перекладу Pyth. .r<list>[A, B]буде поміняти місцями всі події Aта Bвlist .

Тому, застосувавши функцію перекладу до UQсписку від 0до n-1кожного зі списку двох елементів різних чисел у списку, ми створимо потрібний вихід. Qє входом, nі Uє функцією діапазону.

Найпростіший спосіб зробити це:

.rLUQ.cUQ2

.cUQ2генерує всі 2 комбінації елементів різних елементів у діапазоні та .rLUQвідображає .rфункцію над ними та списком UQ.

Однак це було б 10 байт.

Замість того, щоб робити .cUQ2різні впорядковані пари, ми можемо зробити всі пари за допомогою *=U. Це неявно рівнозначно *=UQQ. Вона починається перезапис Qз UQ, а потім приймати декартовій твір UQі UQ. Це дає всі пари чисел у діапазоні, не обов'язково впорядковані чи розрізнені.

.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

Java 8, 109 105 байт

n->{String r="";for(int i=0,j,k;i++<n;)for(j=i;j++<n;r+="\n")for(k=0;k++<n;)r+=k!=i?k!=j?k:i:j;return r;}

Я іржавий .. Не мав коду в гольф за місяці .. Закінчився перенесенням відповіді на @Steadybox 'C .. Можливо, можливо, ще можна пограти в гольф.

Спробуйте тут.



1

Рубін , 80 байт

-12 байт завдяки Unihedron.

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

Спробуйте в Інтернеті!

Я мав на увазі підхід, який найкраще чомусь переклав на Рубі, тому я навіть не знаю Рубі ...


Я перевершив це: codegolf.stackexchange.com/a/152652/21830 . Вибачте!
Уніхедрон

Не потрібно вибачатися! Я думаю, що я виступаю за більшість користувачів PPCG, коли кажу, що конкуренція - це те, що робить PPCG крутим.
повністюлюдський

1
Що стосується вашого коду, 1. ви можете призначити 1..nзмінну з одним знаком і повторно використовувати її (окремі оператори з новим рядком або крапкою з комою), 2. робити без дужок у термінальних операторах: i==x ?y:i==y ?x:i(зверніть увагу, де у мене є пробіли для відокремлення потенційного шебангу ) і 3. uniq[1,n]замість uniq[1..-1].
Уніхедрон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.