Tukar dua indeks yang diberikan

31

Diberikan array bilangan bulat positif dan dua indeks valid berbeda, kembalikan array dengan dua elemen yang sesuai dengan dua indeks yang ditukar.

Anda dapat memilih untuk menggunakan pengindeksan 0 atau pengindeksan 1, tetapi testcases di bawah ini akan diindeks 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]

Ini adalah . Jawaban terpendek dalam byte menang. Celah standar berlaku.

Biarawati Bocor
sumber
Terkait , terkait .
Leaky Nun
1
Huh, ini mungkin tugas yang sulit dilakukan oleh banyak bahasa golf tetapi kebanyakan bahasa praktis terasa mudah. (Daftar dengan elemen yang bisa berubah-ubah bukan hal yang umum untuk dimiliki oleh bahasa golf.) Jika itu masalahnya, itu akan sangat menarik. (Bahasa golf mungkin masih akan menang, karena mereka jauh lebih sulit sehingga mereka bisa lolos dengan algoritma yang lebih kompleks.)
7
Terkejut ini mungkin bukan penipuan, tetapi tantangan ini sebenarnya kreatif, karena ini adalah tantangan nyata bagi banyak bahasa golf di luar sana.
Erik the Outgolfer
@ LeakyNun Saya punya downvotes (dan bahkan menghapus suara) seperti itu di masa lalu, jangan terlalu khawatir tentang hal itu ...
Erik the Outgolfer
Bisakah mdan ndiambil sebagai array?
Okx

Jawaban:

17

C/ C ++, 53 50 39 byte

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

Cobalah online

Disimpan 11 byte berkat @Dennis

Ra8
sumber
10

Pengoperasian Bahasa skrip Flashpoint , 98 95 byte

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

Memodifikasi array secara langsung.

Penjelasan:

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.

Telepon dengan:

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

Keluaran:

masukkan deskripsi gambar di sini

Steadybox
sumber
7

JavaScript ES6, 36 32 byte

Lihat, Bu, tidak ada variabel sementara!

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

Cobalah

Masukkan daftar elemen yang dipisahkan koma untuk adan 2 bilangan bulat untuk 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>

Shaggy
sumber
2
Instruksi tersebut memodifikasi array, yang berarti Anda diizinkan untuk tidak mengembalikan array, yang akan menghemat beberapa byte.
Neil
@ Neil: Anda mengatakan untuk hanya menggunakan (a,m,n)=>[a[m],a[n]]=[a[n],a[m]]? Itu hanya akan menampilkan 2 elemen yang ditukar tanpa sisa array (misalnya, [5,8,9],0,2-> [9,5]).
Shaggy
@ Neil: Benar, itulah sebabnya kita perlu adi akhir untuk memberi kita array yang lengkap dan dimodifikasi. Atau apakah saya benar-benar kehilangan apa yang ingin Anda katakan?
Shaggy
@Neil: Hmm ... OK, saya pikir saya melihat apa yang Anda dapatkan sekarang (Maaf, mencoba melakukan terlalu banyak hal pada saat yang sama hari ini). Terima kasih atas tipnya. Apakah ada konsensus tentang itu dan, jika demikian, apakah Anda memiliki tautan yang berguna sebelum saya mencarinya sendiri?
Shaggy
5

Python 3 , 41 32 byte

-9 byte terima kasih kepada @notjagan

def f(a,m,n):a[m],a[n]=a[n],a[m]

Cobalah online!

Mengubah argumennya, yang merupakan format output yang valid .

ovs
sumber
3
Lucu juga tidak main golf dibandingkan kode python idiomatik.
Łukasz Rogalski
5

Jelly , 7 byte

Ṛ,ḷyJ}ị

Cobalah online!

Bagaimana itu bekerja

Ṛ,ḷ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.
Dennis
sumber
tfw bungkusnya hampir sepanjang program ...
Leaky Nun
Saya tidak pernah tahu tentang keberadaany
Leaky Nun
Saya tahu y, tetapi tidak berpikir untuk menggunakannya di sini. Itu jawaban yang cukup pintar.
Ini membuat saya berpikir ... apakah Jellykode Jelly itu valid?
M.Herzkamp
@ M.Herzkamp Yaitu. Saya ragu itu sangat berguna.
Dennis
4

Japt , 17 16 byte

hV(A=UgV UgW¹hWA

Cobalah online!

Disimpan satu byte berkat produk ETH

Tom
sumber
2
Bagus. Jangan berpikir Anda membutuhkan koma.
ETHproduk
@ ETHproductions Terima kasih, Anda benar.
Tom
Alternatif implementasi 16 byte tetapi saya masih yakin ada solusi yang lebih pendek.
Shaggy
2
15 byte
ETHproduk
4

MATL , 7 6 byte

yyP)w(

Indeks berbasis 1.

Cobalah online!

Penjelasan

Pertimbangkan input [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]
Luis Mendo
sumber
4

C # (.NET Core) , 48 43 31 byte

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

Cobalah online!

Tukar angka dalam array asli, tidak ada variabel sementara yang digunakan. Meskipun demikian saya tidak dapat menerima pujian atas jawaban ini karena sudah menjadi ide Neil .

Charlie
sumber
@ LeakyNun sepertinya tidak berfungsi, karena meninggalkan [m] dengan nilai 0. Cobalah sendiri!
Charlie
(a,m,n)=>a[m]+=a[n]-(a[n]=a[m])tampaknya bekerja.
Neil
(Semua jawaban ini juga valid dalam JavaScript ES6, bukan?)
Neil
4

Gangguan Umum , 42 byte

-2 byte berkat @coredump .

(lambda(a i j)(rotatef(elt a i)(elt a j)))

Cobalah online!

Cukup lurus ke depan, karena ada makro Common Lisp untuk swap: rotatef.

Dada
sumber
Anda bisa menggunakan ELT alih-alih AREF
coredump
1
@coredump Benar, terima kasih!
Dada
3

Javascript ES6, 36 34 byte

(a,m,n)=>(x=a[m],a[m]=a[n],a[n]=x)
  • -2 Bytes karena fungsinya mengubah array. Tidak perlu mengembalikan array. Terima kasih kepada @Neil

Demo

Weedoze
sumber
1
Instruksi tersebut memodifikasi array, yang berarti Anda diizinkan untuk tidak mengembalikan array, yang akan menghemat beberapa byte.
Neil
2

Java 8 , 48 byte

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

Memasukkan:

int[] a
int b
int c
Okx
sumber
Bagaimana Anda melakukan lambdas dengan tiga argumen di Jawa?
Leaky Nun
1
Instruksi tersebut memodifikasi array, yang berarti Anda diizinkan untuk tidak mengembalikan array, yang akan menghemat beberapa byte.
Neil
1
@ LeakyNun Saya bukan Okx , tapi ini adalah contoh Coba sekarang dengan jawaban Okx saat ini dan antarmuka khusus.
Kevin Cruijssen
1
Dan berdasarkan jawaban C # yang luar biasa dari Carlos Alejo (dengan bantuan @ Neil) , Anda dapat membuatnya lebih pendek dengan menyingkirkan variabel sementara: (a,b,c)->a[b]+=a[c]-(a[c]=a[b])( 31 byte )
Kevin Cruijssen
1
batuk batuk Collections::swap adalah 17 byte ... setidaknya asumsi ini berlaku untuk tantangan ini ...
Socrates Phoenix
2

Oktaf , 28 byte

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

Cobalah online!

Cukup puas dengan yang satu ini sebenarnya :)

Mengambil input pada formulir f([1,2,3,4],[1,2]):, 1-diindeks.

Penjelasan:

@(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
Stewie Griffin
sumber
2

Jellyfish, 7 bytes

p
ZRi
i

Takes a list and a pair of indices. Try it online!

Explanation

Jellyfish happens to have a "modify items at indices" function, Z, which does exactly what we need. The two is grab the inputs from STDIN. Z takes as arguments the second input, the reversal function R, and the list. Then Z performs the modification, and p prints the result.

Zgarb
sumber
2

R, 38 bytes

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

Feels rather long, but I can't get it much shorter. Sadly it requires the explicit returning through x, requiring {} around the function body. pryr::f() doesn't recognise the need for x as function argument so doesn't work :/.

JAD
sumber
I think function(x,i)replace(x,i,rev(i)) would work, even with pryr syntax.
Giuseppe
@ Giuseppe Ah, saya mencari fungsi yang nyaman untuk melakukan swap, tetapi mencari dengan istilah yang salah. Jangan ragu untuk memposting itu sebagai jawaban sendiri.
JAD
@ Giuseppe Saya pikir perlu Anda lakukan replace(x,i,x[rev(i)]), kalau tidak Anda akan menempatkan indeks bukan nilai-nilai mereka.
JAD
2

Shenzhen I / O, 735 Bytes

23 ¥, 810 Kekuatan, 48 Baris Kode

[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

PENOLAKAN: Array diakhiri 0 dalam hal ini. Array adalah rasa sakit di pantat untuk bekerja dengan di Shenzhen I / O sebaliknya.

Saya sebenarnya membuat level uap untuk game ini. Anda bisa memainkannya di sini.

EDIT: Aaand saya baru sadar saya mengatakan bahwa array di diperintahkan. Heck.

junkmail
sumber
Selamat datang di situs Ini keren sekali! apakah Anda berpikir bahwa Anda mungkin dapat menghapus beberapa spasi putih di file dan masih memiliki Shenzhen IO menerima file? Saya tidak tahu seberapa banyak Anda memainkannya, tetapi Anda harus mencoba dan melihat seberapa fleksibel formatnya.
Wheat Wizard
Saya belum bermain-main dengannya! Di sisi lain, saya mengarahkan header untuk puzzle yang berisi nama puzzle dan nama solusi, jadi saya tidak tahu apakah saya harus repot-repot.
junkmail
1

Swift, 111 65 byte (0-diindeks)

Swift is already notorious for being one of the worst code-golf languages, but here is a function that makes use of ternary expressions:

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

Check it out! - Usage: t(l:[1,2,3],m:0,n:1).

Mr. Xcoder
sumber
Using a default param for r would save you bytes and you can also just mutate the passed array (AFAIK swift array are pass by value)
Downgoat
Default parameter in Swift? How can I do that?
Mr. Xcoder
And parameters are constants in Swift @Downgoat
Mr. Xcoder
1

k (kona), 13 bytes

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

Pretty basic, but it works. Ex:

k){x[y]:x@|y;x}[1 2 3 4; 0 1]
2 1 3 4
Simon Major
sumber
1

Perl 5, 32 bytes

-3 bytes thanks to @Dom Hastings!

30 bytes of code + -pa flags.

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

Try it online!

Quite straight forward, using array slices.

Dada
sumber
Hey hey, tinkered with this a little and managed to save 3 bytes! @F[pop@p,@p]=@F[@p=<>];$_="@F".
Dom Hastings
@DomHastings Hmm, nice, as always! Thanks :)
Dada
1

Mathematica, 32 bytes

(a=#;a[[{##2}]]=a[[{#3,#2}]];a)&
alephalpha
sumber
3
a[[{##2}]]==a[[{#3,#2}]] should be a[[{##2}]]=a[[{#3,#2}]] (using Set, not Equals)
JungHwan Min
1

C, 42 bytes

Modify the array in place with a temp value.

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

C, 60 58 bytes

A little more interesting, not using any temp value...

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

C, 49 bytes

Using XOR

f(a,m,n)int*a;{a[m]^=a[n];a[n]^=a[m];a[m]^=a[n];}
cleblanc
sumber
Heh, I was just about to post f(x,i,j,t)int*x;{t=x[i];x[i]=x[j];x[j]=t;}.
Dennis
@Dennis you saved me two bytes on the other solution, thanks!
cleblanc
Wouldn't the second solution be shorter (and safer) with ^?
Dennis
-1 for the XOR version using a define instead of a function #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;} is broken: SIGSEGV.
Bodo Thiesen
1

Pyth, 17 8 bytes

Saved 9 bytes thanks to Leaky Num.

@LQ.rUQE

Test it online!

This is 0-indexed, and the indices are provided as a tuple: (n, m).

Explanations

@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
Jim
sumber
8 bytes: @LQ.rUQE
Leaky Nun
@LeakyNun It's so different I think you can post it for yourself!
Jim
I'm the OP; I don't post on my own challenge.
Leaky Nun
1

Mathematica, 20 bytes

#~Permute~Cycles@#2&

Pure function taking two arguments in the following 1-indexed (and possibly abusive) format: the second test case [5,8,9]; 0 2; [9,8,5] would be called as

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

(spaces are extraneous and just for visible parsing). Permute is the builtin function that applies a permutation to a list, and Cycles[{{a,b}}] represents the permutation that exchanges the ath and bth elements of a list and ignores the rest.

Greg Martin
sumber
What do the ~ do?
Cyoce
~ is Mathematica's infix notation for a binary function: x~f~y means the same thing as f[x,y].
Greg Martin
1

x86 Machine Code, 10 bytes

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

This is a function written in 32-bit x86 machine code that swaps the values at the specified indices in a given array. The array is modified in-place, and the function does not return a value.

A custom calling convention is used, requiring the function's parameters to be passed in registers:

  • The address of the array (pointer to its first element) is passed in the EBX register.
  • Indeks elemen A berbasis nol dilewatkan dalam ECXregister.
    (Diasumsikan sebagai indeks yang valid.)
  • Indeks elemen B berbasis nol dilewatkan dalam EDXregister.
    (Diasumsikan sebagai indeks yang valid.)

Ini menjaga ukurannya turun dan mematuhi semua persyaratan formal, tetapi berarti bahwa fungsi tersebut tidak dapat dengan mudah dipanggil dari bahasa lain seperti C. Anda harus memanggilnya dari program bahasa assembly lainnya. (Anda dapat menulis ulang untuk menggunakan register input apa pun , tanpa mempengaruhi jumlah byte; tidak ada yang ajaib tentang yang saya pilih.)

Tidak Disatukan:

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
Cody Grey
sumber
1

R, 34 bytes

pryr::f(`[<-`(a,c(m,n),a[c(n,m)]))
Sven Hohenstein
sumber
1

Java 8 + InverseY, 27 bytes

java.util.Collections::swap

Just calls the swap function... this is a method reference of the type Consumer3<List, Integer, Integer>.

Try it online! (header and footer for boilerplate & copy of Consumer3 interface)

Socratic Phoenix
sumber
You don't need to add " + InverseY". It's valid in vanilla Java 8.
Olivier Grégoire
1

JavaScript (ES2015), 66 57 49 bytes

A different (alas, longer) approach than previous JavaScript answers

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

Source

const swap = (arr, a, b, splice) => {
  splice(a, 1, ...splice(arr[b], 1, arr[a]))
}
sshow
sumber
1
(s,h,o,w=s.splice.bind(s))=>w(h,1,...w(o,1,s[h])) 49 bytes
Patrick Roberts
Forgot about them default args. Thanks!
sshow
0

awk, 31 bytes

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

Try it online!

Takes input in the format

1 2
1 2 3 4

and outputs as

2 1 3 4

(1-indexed).

Explanation

The entire program is a missing pattern with an action followed by a pattern with a missing action.

Since a missing pattern runs on each line, the code inside the braces runs for both input lines. The c=$a;$a=$b;$b=c; part swaps the two values at indices a and b (through the temporary variable c). This only has an effect on the second line, since on the first line a and b are not yet defined. The a=$1;b=$2 part defines a to be the first field and b to be the second field, which sets the appropriate values for the first part to run on the second line.

Since a missing action is equivalent to {print}, the pattern prints every line it matches. This pattern in particular is NR>1: that is, print whenever the line number is greater than 1, which happens to be line 2. This runs after the swapping of values has taken place, thus completing the task.

Doorknob
sumber
0

q/kdb+, 17 bytes

Solution:

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

Example:

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

Explanation:

A q version of the k answer by Simon. Apply the assign : function to x at indices reverse-y with value of x indexed at y. Broken down you can see more clearly:

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
streetster
sumber