Zamień dwa podane wskaźniki


31

Biorąc pod uwagę tablicę dodatnich liczb całkowitych i dwa różne poprawne indeksy, zwróć tablicę z dwoma elementami odpowiadającymi zamianie dwóch indeksów.

Możesz wybrać indeksowanie 0 lub indeksowanie 1, ale poniższe przypadki testowe będą indeksowane jako 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]

To jest . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .



1
To może być zadanie, z którym wiele języków golfa ma trudności, ale większość praktycznych języków jest łatwa. (Listy ze zmiennymi elementami nie są powszechną cechą języków golfowych.) W takim przypadku będzie to całkiem interesujące. (Języki gry w golfa prawdopodobnie nadal będą wygrywać, ponieważ są o wiele bardziej rozbudowane, dzięki czemu mogą uciec się do bardziej złożonego algorytmu.)

7
Zaskoczony, to prawdopodobnie nie jest dupek, ale to wyzwanie jest w rzeczywistości kreatywne, ponieważ jest prawdziwym wyzwaniem dla wielu języków golfowych.
Erik the Outgolfer

@LeakyNun W przeszłości miałem takie głosy (a nawet usuwam głosy), nie przejmuj się tym zbytnio ...
Erik the Outgolfer

Można mi nnależy podjąć jako tablica?
Okx

Odpowiedzi:



10

Operacyjny język skryptowy Flashpoint , 98 95 bajtów

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

Modyfikuje tablicę bezpośrednio.

Wyjaśnienie:

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.

Zadzwoń z:

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

Wydajność:

enter image description here


7

JavaScript ES6, 36 32 bajtów

Spójrz, Ma, nie ma zmiennej tymczasowej!

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

Spróbuj

Wpisz listę elementów oddzielonych przecinkami ai 2 liczby całkowite dla 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
Te instrukcje modyfikują tablicę, co oznacza, że ​​możesz nie zwracać tablicy, co pozwoli ci zaoszczędzić kilka bajtów.
Neil

@ Neil: Mówisz, żeby po prostu użyć (a,m,n)=>[a[m],a[n]]=[a[n],a[m]]? Wywołałoby to tylko 2 zamienione elementy bez reszty tablicy (np. [5,8,9],0,2-> [9,5]).
Shaggy

@ Neil: Racja, dlatego potrzebujemy ana końcu, aby dać nam kompletną, zmodyfikowaną tablicę. A może kompletnie brakuje mi tego, co próbujesz powiedzieć?
Shaggy

@ Neil: Hmm ... OK, myślę, że rozumiem, co teraz masz (przepraszam, próbuję dziś robić zbyt wiele rzeczy w tym samym czasie). Dzięki za wskazówkę. Czy istnieje konsensus w tej sprawie, a jeśli tak, to czy miałbyś przydatny link, zanim sami go poszukam?
Kudłaty



5

Galaretka , 7 bajtów

Ṛ,ḷyJ}ị

Wypróbuj online!

Jak to działa

Ṛ,ḷ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 otoki jest prawie tak długo, jak program ...
Leaky Nun

Nigdy nie wiedziałem o istnieniuy
Leaky Nun

Wiedziałem o tym y, ale nie pomyślałem o użyciu go tutaj. To całkiem sprytna odpowiedź.

To sprawiło, że pomyślałem ... czy jest Jellyprawidłowy kod Jelly?
M.Herzkamp

@ M.Herzkamp It is. Wątpię jednak, aby była wyjątkowo przydatna.
Dennis


4

MATL , 7 6 bajtów

yyP)w(

Wskaźniki są oparte na 1.

Wypróbuj online!

Wyjaśnienie

Rozważmy wejść [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 bajtów

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

Wypróbuj online!

Zamienia liczby w oryginalnej tablicy, bez zmiennych tymczasowych. Niemniej jednak nie mogę uwierzyć w tę odpowiedź, ponieważ taki był pomysł Neila .


@LeakyNun nie działa, ponieważ pozostawia to [m] o wartości 0. Wypróbuj sam!
Charlie

(a,m,n)=>a[m]+=a[n]-(a[n]=a[m])wydaje się jednak działać.
Neil

(Wszystkie te odpowiedzi są również ważne w ES6 JavaScript, nie?)
Neil


3

JavaScript ES6, 36 34 bajtów

(a,m,n)=>(x=a[m],a[m]=a[n],a[n]=x)
  • -2 bajty, ponieważ funkcja zmienia tablicę. Nie trzeba zwracać tablicy. Dzięki @Neil

Próbny


1
Te instrukcje modyfikują tablicę, co oznacza, że ​​możesz nie zwracać tablicy, co pozwoli ci zaoszczędzić kilka bajtów.
Neil


2

Java 8 , 48 bajtów

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

Wkład:

int[] a
int b
int c

Jak radzisz sobie z lambdami z trzema argumentami w Javie?
Leaky Nun

1
Te instrukcje modyfikują tablicę, co oznacza, że ​​możesz nie zwracać tablicy, co pozwoli ci zaoszczędzić kilka bajtów.
Neil

1
@LeakyNun Nie jestem Okx , ale oto przykład Wypróbuj teraz z bieżącą odpowiedzią Okx i niestandardowym interfejsem.
Kevin Cruijssen

1
W oparciu o niesamowitą odpowiedź C # Carlosa Alejo (z pomocą @ Neila) możesz ją jeszcze skrócić, pozbywając się zmiennej tymczasowej: (a,b,c)->a[b]+=a[c]-(a[c]=a[b])( 31 bajtów )
Kevin Cruijssen

1
kaszel kaszel Collections::swap ma 17 bajtów ... przynajmniej zakładając, że tak się stanie w tym wyzwaniu ...
Socratic Phoenix


2

Oktawa , 28 bajtów

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

Wypróbuj online!

Zadowolony z tego faktycznie :)

Pobiera dane z formularza f([1,2,3,4],[1,2]):, 1-indeksowane.

Wyjaśnienie:

@(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

Meduza , 7 bajtów

p
ZRi
i

Pobiera listę i parę wskaźników. Wypróbuj online!

Wyjaśnienie

Meduza ma funkcję „modyfikowania przedmiotów według indeksów” Z, która robi dokładnie to, czego potrzebujemy. Oba is pobierają dane wejściowe ze STDIN. Zprzyjmuje za argumenty drugie wejście, funkcję odwracania Ri listę. Następnie Zwykonuje modyfikację i pdrukuje wynik.


2

R, 38 bajtów

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

Wydaje się dość długi, ale nie mogę go skrócić. Niestety wymaga to wyraźnego powrotu x, wymagając {}od ciała funkcji. pryr::f()nie rozpoznaje potrzeby xjako argumentu funkcji, więc nie działa: /.


Myślę, function(x,i)replace(x,i,rev(i))że zadziałałoby, nawet przy składni pryr.
Giuseppe

@Giuseppe Ah, szukałem wygodnej funkcji do zamiany, ale szukałem niewłaściwych terminów. Możesz to opublikować jako własną odpowiedź.
JAD

@Giuseppe Myślę, że musisz to zrobić replace(x,i,x[rev(i)]), inaczej umieścisz indeksy zamiast ich wartości.
JAD

2

Shenzhen I / O, 735 bajtów

23 ¥, moc 810, 48 linii kodu

[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

ZASTRZEŻENIE: Tablice są w tym przypadku zakończone na 0. W przeciwnym razie tablice stanowią problem w pracy z we / wy w Shenzhen.

Właściwie zrobiłem poziom pary dla tej gry. Możesz zagrać tutaj.

EDYCJA: Aa i właśnie zdałem sobie sprawę, że powiedziałem, że tablica została zamówiona. Heck.


Witamy na stronie To jest naprawdę świetne! czy sądzisz, że możesz usunąć niektóre białe znaki w pliku i nadal akceptować plik przez Shenzhen IO? Nie wiem, jak się z tym bawiłeś, ale powinieneś spróbować przekonać się, jak elastyczny jest ten format.
Wheat Wizard

Nie bawiłem się tym! Z drugiej strony tworzę nagłówek układanki, który zawiera nazwę układanki i nazwę rozwiązania, więc nie wiem, czy powinienem zawracać sobie głowę.
śmieciowy

1

Swift, 111 65 bajtów (indeksowane 0)

Swift jest już znany z tego, że jest jednym z najgorszych języków kod-golfowych, ale oto funkcja, która korzysta z wyrażeń trójskładnikowych :

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

Sprawdź to! - Zastosowanie: t(l:[1,2,3],m:0,n:1) .


Użycie domyślnego parametru dla r pozwoli ci zaoszczędzić bajty, a także możesz po prostu mutować przekazaną tablicę (szybkie tablice AFAIK są przekazywane według wartości)
Downgoat

Domyślny parametr w Swift? Jak mogę to zrobić?
Pan Xcoder,

A parametry są stałe w Swift @Downgoat
Mr. Xcoder

1

k ( kona ), 13 bajtów

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

Całkiem proste, ale działa. Dawny:

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

1

Perl 5 , 32 bajty

-3 bajty dzięki @Dom Hastings !

30 bajtów kodu + -paflagi.

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

Wypróbuj online!

Całkiem prosto, używając plasterków tablic.


Hej, hej, majstrowałem przy tym trochę i udało mi się zaoszczędzić 3 bajty! @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)&

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

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

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.


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.
  • The zero-based index of element A is passed in the ECX register.
    (Assumed to be a valid index.)
  • The zero-based index of element B is passed in the EDX register.
    (Assumed to be a valid index.)

This keeps the size down and complies with all formal requirements, but does mean that the function cannot be easily called from other languages like C. You'd need to call it from another assembly-language program. (You could rewrite it to use any input registers, though, without affecting the byte count; there's nothing magical about the ones I chose.)

Ungolfed:

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 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)


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.