Поміняйте місцями на два наведені показники


31

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

Ви можете використовувати 0-індексацію або 1-індексацію, але наведені нижче тестові вікна будуть 0-індексованими.

array        m n output
[1,2,3,4]    0 1 [2,1,3,4]
[5,8,9]      0 2 [9,8,5]
[11,13,15,3] 1 2 [11,15,13,3]
[11,13,15,3] 2 1 [11,15,13,3]
[11,15,15,3] 2 1 [11,15,15,3]

Це . Найкоротша відповідь у байтах виграє. Застосовуються стандартні лазівки .



1
Так, це може бути завданням, з яким багато мов для гольфу важко, але більшість практичних мов легко знайти. (Списки із змінними елементами не є звичайною річчю для мов для гольфу.) Якщо це так, це буде досить цікаво. (Мови з гольфу, мабуть, все-таки виграють, тому що вони настільки термінові, що вони можуть піти за допомогою більш складного алгоритму.)

7
Дивно, що це, мабуть, не є дурнем, але це завдання насправді творче, оскільки це справжнє завдання для багатьох мов для гри в гольф.
Ерік Аутгольфер

@LeakyNun У мене в минулому такі голоси (і навіть видалити голоси), не хвилюйтесь над цим ...
Ерік Атгольфер

Може mі nприймати як масив?
Оккс

Відповіді:



10

Операція Мова сценарію Flashpoint , 98 95 байт

f={t=_this;a=t select 0;b=+a;m=t select 1;n=t select 2;a set[m,b select n];a set[n,b select m]}

Змінює масив безпосередньо.

Пояснення:

t=_this;                   // Give a shorter name for the array of arguments.

a=t select 0;              // Let 'a' be a pointer to the array that we modify.
                           // (The language doesn't have a concept of pointers really,
                           // yet its array variables are pointers to the actual array.)

b=+a;                      // Make a copy of the original array and save a pointer to it
                           // in the variable 'b'. This saves a few bytes later.

m=t select 1;              // Read the index arguments from the input array and save them
n=t select 2;              // to their respective variables.

a set[m,b select n];       // Do the swapping by reading the values from the copy and
a set[n,b select m]        // writing them to the original array. The last semicolon can
                           // be omitted because there are no more statements following 
                           // the last statement.

Телефонуйте за допомогою:

array = [1,2,3,4];
str = format["%1", array];
[array, 0, 1] call f;
hint format["%1\n%2", str, array];

Вихід:

введіть тут опис зображення


7

JavaScript ES6, 36 32 байти

Дивись, ма, немає тимчасової змінної!

(a,m,n)=>[a[m],a[n]]=[a[n],a[m]]

Спробуй це

Введіть список елементів, розділених комами, aі 2 цілих числа для m& n.

f=
(a,m,n)=>[a[m],a[n]]=[a[n],a[m]]
oninput=_=>o.innerText=(f(b=i.value.split`,`,+j.value,+k.value),b);o.innerText=(f(b=(i.value="5,8,9").split`,`,j.value=0,k.value=2),b)
*{font-family:sans-serif}input{margin:0 5px 0 0;width:100px;}#j,#k{width:50px;}
<label for=i>a: </label><input id=i><label for=j>m: </label><input id=j type=number><label for=k>n: </label><input id=k type=number><pre id=o>


2
Ці інструкції змінюють масив, а це означає, що вам дозволяється не повертати масив, що заощадить вам кілька байтів.
Ніл

@Neil: Ви кажете просто використовувати (a,m,n)=>[a[m],a[n]]=[a[n],a[m]]? Це дозволило б вивести 2 поміняються елементи без решти масиву (наприклад, [5,8,9],0,2-> [9,5]).
Кудлатий

@Neil: Правильно, саме тому нам потрібен aкінець, щоб дати нам повний модифікований масив. Або я повністю пропускаю те, що ти намагаєшся сказати?
Кудлатий

@Neil: Хм ... гаразд, я думаю, я бачу, що ти зараз отримуєш (Вибачте, намагаюся зробити занадто багато справ одночасно). Дякую за пораду. Чи існує консенсус з цього приводу, і якщо так, то чи було б у вас зручне посилання, перш ніж я сам переходжу до нього?
Кудлатий



5

Желе , 7 байт

Ṛ,ḷyJ}ị

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

Як це працює

Ṛ,ḷyJ}ị  Main link. Left argument: [i, j]. Right argument: A (array)

Ṛ        Reverse; yield [j, i].
  ḷ      Left; yield [i, j].
 ,       Pair; yield [[j, i], [i, j]].
    J}   Indices right; yield all indices of A.
   y     Transliterate; replace j with i and i with j.
      ị  Index into A.

tfw обгортка майже до тих пір, як програма ...
Leaky Nun

Я ніколи не знав про існуванняy
Leaky Nun,

Я знав y, але не думав використовувати це тут. Це досить розумна відповідь.

Це змусило мене подумати ... чи Jellyдійсний код Jelly?
М.Герцкам

@ M.Herzkamp Це так. Я сумніваюся, що це надзвичайно корисно.
Денніс

4

Japt , 17 16 байт

hV(A=UgV UgW¹hWA

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

Збережено байт завдяки ETHproductions


2
Приємно. Не думаю, що вам потрібна кома.
ETHproductions

@ETHproductions Спасибі, ви праві.
Том

Альтернативна 16-байтна реалізація, але я все ж переконаний, що існує коротше рішення.
Кудлатий


4

MATL , 7 6 байт

yyP)w(

Індекси засновані на 1 основі.

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

Пояснення

Розглянемо входи [11 13 15 3], [2 3].

yy   % Take two inputs implicitly. Duplicate them
     % STACK: [11 13 15 3], [2 3], [11 13 15 3], [2 3]
P    % Flip
     % STACK: [11 13 15 3], [2 3], [11 13 15 3], [3 2]
)    % Reference indexing (pick indexed entries)
     % STACK: [11 13 15 3], [2 3], [15 13]
w    % Swap
     % STACK: [11 13 15 3], [15 13], [2 3]
(    % Assignment indexing (write values into indexed entries). Implicitly display
     % STACK: [11 15 13 3]

4

C # (.NET Core) , 48 43 31 байт

(a,m,n)=>a[m]+=a[n]-(a[n]=a[m])

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

Замінює номери в вихідному масиві, не використовуються тимчасові змінні. Тим не менш, я не можу взяти на себе відповідальність за цю відповідь, як це було ідеєю Ніла .


@LeakyNun це, здається, не працює, оскільки це залишає [m] зі значенням 0. Спробуйте самі!
Чарлі

(a,m,n)=>a[m]+=a[n]-(a[n]=a[m])Здається, працює.
Ніл

(Ці відповіді справедливі також у JavaScript ES6, ні?)
Ніл


3

Javascript ES6, 36 34 байт

(a,m,n)=>(x=a[m],a[m]=a[n],a[n]=x)
  • -2 байти, оскільки функція змінює масив. Не потрібно повертати масив. Завдяки @Neil

Демо


1
Ці інструкції змінюють масив, а це означає, що вам дозволяється не повертати масив, що заощадить вам кілька байтів.
Ніл


2

Java 8 , 48 байт

(a,b,c)->{int t=a[b];a[b]=a[c];a[c]=t;return a;}

Вхід:

int[] a
int b
int c

Як ви робите лямбда з трьома аргументами на Java?
Leaky Nun

1
Ці інструкції змінюють масив, а це означає, що вам дозволяється не повертати масив, що заощадить вам кілька байтів.
Ніл

1
@LeakyNun Я не Okx , але ось приклад " Спробуйте зараз" із поточною відповіддю Okx та спеціальним інтерфейсом.
Кевін Кройсейсен

1
А виходячи з дивовижної відповіді C # Карлоса Алехо (за допомогою @ Ніла) , ви можете зробити її ще коротшою, позбувшись тимчасової змінної: (a,b,c)->a[b]+=a[c]-(a[c]=a[b])( 31 байт )
Кевін Круїйсен

1
кашель від кашлю Collections::swap становить 17 байт ... принаймні, якщо припустити, що це стосується цього виклику ...
Сократичний Фенікс


2

Октава , 28 байт

@(a,n){a(n)=a(flip(n)),a}{2}

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

Цілком задоволений цим насправді :)

Вводиться на бланку: f([1,2,3,4],[1,2])1, індексований.

Пояснення:

@(a,n)                         % Anonymous function that takes two 1-dimensional
                               % arrays as input
      {               , }      % Create a cell with two elements
       a(n)=a(flip(n))         % One element are the two number at indices given by
                               % the second input array. This will be a 1x2 array
      {a(n)=a(flip(n)),a}      % Place those two in a cell together with the entire array a
                               % a is now updated, thanks to Octave's inline assignment
      {a(n)=a(flip(n)),a}{2}   % Return the second element

2

Медузи , 7 байт

p
ZRi
i

Бере список і пару індексів. Спробуйте в Інтернеті!

Пояснення

Медузи мають функцію "модифікувати предмети за показниками" Z, яка робить саме те, що нам потрібно. Два is захоплюють входи від STDIN. Zприймає в якості аргументів другий вхід, функцію розвороту Rта список. Потім Zвиконує модифікацію та pдрукує результат.


2

R, 38 байт

function(x,a,b){x[c(a,b)]=x[c(b,a)];x}

Відчувається досить довго, але я не можу набагато коротше. На жаль, це вимагає явного повернення x, вимагаючи {}навколо функції функції. pryr::f()не визнає необхідність xаргументу функції, тому не працює: /.


Думаю function(x,i)replace(x,i,rev(i)), спрацювало б навіть із синтаксисом pryr.
Джузеппе

@Giuseppe Ах, я шукав зручну функцію робити своп, але шукав неправильні умови. Сміливо публікуйте це як власну відповідь.
JAD

@Giuseppe Я думаю, що вам потрібно зробити replace(x,i,x[rev(i)]), інакше ви розмістите індекси замість їх значень.
JAD

2

Шеньчжень вводу / виводу, 735 байт

23 ¥, потужність 810, 48 ліній коду

[traces] 
......................
......................
......................
......................
......................
......................
.14.14.14.............
.94.14.14.............
.A........1C..........
.3554..95556..........
.9554.16..............
.A....................
.2....................
......................

[chip] 
[type] UC6
[x] 4
[y] 2
[code] 
  slx x0
  mov x1 acc
  mov x1 dat
  mov acc x3
  mov dat x3
  mov acc x3
  mov dat x3

[chip] 
[type] UC6
[x] 8
[y] 5
[code] 
  slx x2
  mov x2 x1
  mov x0 dat
  mov x2 x1
  mov x0 acc
  mov x2 x1
  mov dat 

[chip] 
[type] UC4X
[x] 2
[y] 6
[code] 
  slx x0
  mov 0 x3
j:  mov x0 acc
  mov acc x2
  teq acc 0
- jmp j
  mov -999 x1

[chip] 
[type] RAM
[x] 5
[y] 6

SIO

ВИСНОВОК: Масиви в цьому завершуються на 0. Масиви - це біль у попці, з якою можна працювати в режимі вводу / виводу Шеньчжень.

Я фактично зробив рівень пари для цієї гри. Ви можете зіграти тут.

EDIT: Aaі я щойно зрозумів, що сказав, що масив у впорядкований. Хек.


Ласкаво просимо на сайт Це дуже здорово! чи вважаєте ви, що ви, можливо, зможете видалити частину пробілів у файлі і все-таки змусити Ihen Shenzhen прийняти файл? Я не знаю, скільки ви посварилися з цим, але варто спробувати і зрозуміти, наскільки гнучким є формат.
Пшеничний майстер

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

1

Свіфт, 111 65 байт (0-індексований)

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

func t(l:[Int],m:Int,n:Int){var r=l;r[m]=l[n];r[n]=l[m];print(r)}

Перевір! - Використання: t(l:[1,2,3],m:0,n:1) .


Використання параметри за замовчуванням для r допоможе вам заощадити байти, а також ви можете просто вимкнути пропущений масив (стрімкий масив AFAIK передається за значенням)
Downgoat

Параметр за замовчуванням у Swift? Як я можу це зробити?
Містер Xcoder

А параметри константи у Свіфті @Downgoat
Містер Xcoder


1

Perl 5 , 32 байти

-3 байти завдяки @Dom Hastings !

30 байт коду + -paпрапори.

@F[pop@p,@p]=@F[@p=<>];$_="@F"

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

Досить прямо вперед, використовуючи фрагменти масиву.


Гей-ей, трохи пограбувавши цим і вдалося врятувати 3 байти! @F[pop@p,@p]=@F[@p=<>];$_="@F".
Дом Гастінгс

@DomHastings Хм, приємно, як завжди! Дякую :)
Дада

1

Математика, 32 байти

(a=#;a[[{##2}]]=a[[{#3,#2}]];a)&

3
a[[{##2}]]==a[[{#3,#2}]]повинен бути a[[{##2}]]=a[[{#3,#2}]](використовуючи Set, не Equals)
JungHwan Min

1

C, 42 байти

Змініть масив на місці зі значенням temp.

f(r,m,n){int*a=r;r=a[m];a[m]=a[n];a[n]=r;}

C, 60 58 байт

Трохи цікавіше, не використовуючи жодного значення temp ...

f(a,m,n)int*a;{a[m]+=a[n];a[n]-=a[m];a[n]*=-1;a[m]-=a[n];}

C, 49 байт

Використання XOR

f(a,m,n)int*a;{a[m]^=a[n];a[n]^=a[m];a[m]^=a[n];}

Хе, я ось-ось збирався дописувати f(x,i,j,t)int*x;{t=x[i];x[i]=x[j];x[j]=t;}.
Денніс

@Денніс ти врятував мені два байти на іншому рішенні, дякую!
клеблан

Чи не було б друге рішення коротшим (і безпечнішим) ^?
Денніс

-1 для версії XOR, використовуючи визначення, а не функцію#define X(x,y,z)x[y]^=x[z],x[z]^=x[y],x[y]^=x[z]
Giacomo Garabello

f(r,m,n){int*a=r;r=a[m];a[m]=a[n];a[n]=r;}порушено: SIGSEGV.
Бодо Тісен

1

Pyth , 17 8 байт

Збережено 9 байт завдяки Leaky Num.

@LQ.rUQE

Перевірте це в Інтернеті!

Це 0 індексовані, а індекси представлені у вигляді кортежу: (n, m).

Пояснення

@LQ.rUQE

     UQ     # Generate [0, 1, 2, ..., len(input)]
       E    # Get the indices as the tuple (1, 2)
   .r       # Translate each element of UQ to its cyclic successor in E
            # Now the indices are permuted (e.g. [0, 2, 1, ..., len(input)]
@LQ         # For each index, get it's value. Implicit print


@LeakyNun Це так різне, я думаю, ви можете опублікувати це для себе!
Джим

Я ОП; Я не розміщую свій власний виклик.
Лина монашка

1

Математика, 20 байт

#~Permute~Cycles@#2&

Чиста функція, що приймає два аргументи в наступному 1-індексованому (і, можливо, образливому) форматі: другий тестовий випадок [5,8,9]; 0 2; [9,8,5]буде називатися як

#~Permute~Cycles@#2& [ {5,8,9} , {{1,3}} ]

(пробіли сторонні і просто для видимого розбору). Permute- це вбудована функція, яка застосовує перестановку до списку, і Cycles[{{a,b}}]являє собою перестановку, яка обмінюється ath і bth елементами списку та ігнорує решту.


Що ~робити?
Cyoce

~є інфіксованим позначенням Mathematica для бінарної функції: x~f~yозначає те саме, що і f[x,y].
Грег Мартін

1

машинний код x86, 10 байт

8B 04 8B 87 04 93 89 04 8B C3

Це функція, записана в 32-розрядному машинному коді x86, яка замінює значення на вказані індекси в заданому масиві. Масив змінюється на місці , і функція не повертає значення.

Використовується спеціальна умова виклику, яка вимагає передачі параметрів функції в регістри :

  • Адреса масиву (вказівник на його перший елемент) передається в EBXрегістр.
  • Нульовий індекс елемента А передається в ECXрегістр.
    (Припустимо, що це дійсний індекс.)
  • Нульовий індекс елемента В передається в EDXрегістр.
    (Припустимо, що це дійсний індекс.)

Це зменшує розмір і відповідає всім формальним вимогам, але це означає, що функцію неможливо легко викликати з інших мов, таких як C. Вам потрібно буде викликати її з іншої програми мови мовлення. (Ви можете переписати його, щоб використовувати будь-які вхідні регістри, хоча, не впливаючи на кількість байтів; немає нічого магічного в тих, які я вибрав.)

Безголовки:

8B 04 8B     mov  eax, DWORD PTR [ebx+ecx*4]   ; get value of element A
87 04 93     xchg eax, DWORD PTR [ebx+edx*4]   ; swap element A and element B
89 04 8B     mov  DWORD PTR [ebx+ecx*4], eax   ; store new value for element A
C3           ret                               ; return, with array modified in-place


1

Java 8 + InverseY , 27 байт

java.util.Collections::swap

Просто викликає функцію swap ... це посилання на метод Consumer3<List, Integer, Integer>.

Спробуйте в Інтернеті! (колонтитул та колонтитул для котла та копія Consumer3інтерфейсу)


Вам не потрібно додавати "+ InverseY". Це дійсно у ванільній Java 8.
Олів'є Грегоар

1

JavaScript (ES2015), 66 57 49 байт

Інший (на жаль, довший) підхід, ніж попередні відповіді на JavaScript

(s,h,o,w=s.splice.bind(s))=>w(h,1,...w(o,1,s[h]))

Джерело

const swap = (arr, a, b, splice) => {
  splice(a, 1, ...splice(arr[b], 1, arr[a]))
}

1
(s,h,o,w=s.splice.bind(s))=>w(h,1,...w(o,1,s[h]))49 байт
Патрік Робертс

Забули про них аргументи за замовчуванням. Спасибі!
sshow

0

awk, 31 байт

{c=$a;$a=$b;$b=c;a=$1;b=$2}NR>1

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

Здійснює введення у форматі

1 2
1 2 3 4

і виводи як

2 1 3 4

(1-індексований).

Пояснення

Уся програма - це відсутній візерунок з дією, за яким слідує візерунок з відсутньою дією.

Оскільки відсутній шаблон працює у кожному рядку, код усередині дужок працює для обох вхідних рядків. c=$a;$a=$b;$b=c;Частина обмінює два значення з індексами aі b(через тимчасову змінну c). Це впливає тільки на другій лінії, так як на першій лінії , aі bще не визначені. У a=$1;b=$2частині визначається , aщоб бути першим полем , і bбуде друге поле, яке встановлює відповідні значення для першої частини для запуску на другій лінії.

Оскільки відсутня дія еквівалентна {print}, шаблон виводить кожний рядок, який відповідає. Зокрема, такий зразок NR>1: тобто друкуйте щоразу, коли номер рядка перевищує 1, що трапляється у рядку 2. Це запускається після того, як відбулася заміна значень, тим самим виконуючи завдання.


0

q / kdb +, 17 байт

Рішення:

{@[x;(|)y;:;x y]}

Приклад:

q){@[x;(|)y;:;x y]}[1 2 3 4;0 1]
2 1 3 4

Пояснення:

Q версія k відповіді Саймона. Застосуйте функцію присвоєння :до x за індексами, зворотними y, зі значенням x, індексованим у. Розбиті вниз ви бачите більш чітко:

q)x:1 2 3 4
q)y:0 1
q)x y
1 2
q)(|)y
1 0
q)x(|)y
2 1
q)@[x;(|)y;:;x y]
2 1 3 4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.