Tauschen Sie die beiden angegebenen Indizes


31

Wenn Sie ein Array mit positiven Ganzzahlen und zwei unterschiedlichen gültigen Indizes angeben, geben Sie das Array mit den beiden Elementen zurück, die den beiden getauschten Indizes entsprechen.

Sie können zwischen 0-Indizierung und 1-Indizierung wählen, die folgenden Testfälle werden jedoch mit 0-Indizierung behandelt.

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]

Das ist . Kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken .



1
Huh, das mag eine Aufgabe sein, mit der sich viele Golfsprachen schwer tun, aber die meisten praktischen Sprachen finden es einfach. (Listen mit veränderlichen Elementen sind für Golfsprachen nicht üblich.) Wenn dies der Fall ist, wird es sehr interessant. (Die Golfsprachen werden wahrscheinlich trotzdem gewinnen, weil sie so viel knapper sind, dass sie mit einem komplexeren Algorithmus davonkommen können.)

7
Überrascht, dass dies wahrscheinlich kein Betrug ist, aber diese Herausforderung ist tatsächlich kreativ, da sie für viele Golfsprachen eine echte Herausforderung darstellt.
Erik der Outgolfer

@LeakyNun Ich habe in der Vergangenheit Downvotes (und lösche sogar Stimmen), mach dir keine Sorgen ...
Erik the Outgolfer

Kann mund nkann als Array genommen werden?
Okx

Antworten:



10

Operation Flashpoint- Skriptsprache, 98 bis 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]}

Ändert das Array direkt.

Erläuterung:

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.

Rufen Sie an mit:

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

Ausgabe:

Bildbeschreibung hier eingeben


7

JavaScript ES6, 36 32 Bytes

Schau, Ma, keine temporäre Variable!

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

Versuch es

Geben Sie eine durch Kommas getrennte Liste von Elementen für aund 2 Ganzzahlen für m& ein 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
Diese Anweisungen ändern das Array, dh, Sie dürfen das Array nicht zurückgeben, wodurch Sie einige Bytes sparen.
Neil

@Neil: Du sagst nur zu benutzen (a,m,n)=>[a[m],a[n]]=[a[n],a[m]]? Das würde nur die 2 getauschten Elemente ohne den Rest des Arrays ausgeben (zB [5,8,9],0,2-> [9,5]).
Shaggy

@Neil: Richtig, deshalb brauchen wir das aam Ende, um uns das komplette, modifizierte Array zu geben. Oder fehle ich völlig, was Sie sagen wollen?
Shaggy

@Neil: Hmm ... OK, ich glaube ich sehe, was du gerade machst (Entschuldigung, versuche heute zu viele Dinge gleichzeitig zu machen). Danke für den Tipp. Gibt es einen Konsens darüber und wenn ja, hätten Sie einen Link parat, bevor ich selbst danach suche?
Shaggy



5

Gelee , 7 Bytes

Ṛ,ḷyJ}ị

Probieren Sie es online!

Wie es funktioniert

Ṛ,ḷ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 der Wrapper ist fast so lang wie das Programm ...
Undichte Nonne

Ich wusste nie von der Existenz vony
Leaky Nun

Ich wusste davon y, dachte aber nicht daran, es hier zu verwenden. Das ist eine ziemlich clevere Antwort.

Das brachte mich zum Nachdenken ... ist Jellygültiger Jelly-Code?
M.Herzkamp

@ M.Herzkamp Es ist. Ich bezweifle, dass es außerordentlich nützlich ist.
Dennis


4

MATL , 7 6 Bytes

yyP)w(

Indizes sind 1-basiert.

Probieren Sie es online!

Erläuterung

Betrachten Sie Eingänge [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 Bytes

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

Probieren Sie es online!

Tauscht die Zahlen im ursprünglichen Array aus, ohne dass temporäre Variablen verwendet werden. Trotzdem kann ich diese Antwort nicht würdigen, da es Neils Idee war .


@LeakyNun es scheint nicht zu funktionieren, da dies ein [m] mit einem Wert von 0 hinterlässt. Probieren Sie es selbst aus!
Charlie

(a,m,n)=>a[m]+=a[n]-(a[n]=a[m])scheint aber zu funktionieren.
Neil

(Diese Antworten sind alle auch in ES6-JavaScript gültig, nein?)
Neil


3

Javascript ES6, 36 34 Bytes

(a,m,n)=>(x=a[m],a[m]=a[n],a[n]=x)
  • -2 Bytes, da die Funktion das Array ändert. Sie müssen das Array nicht zurückgeben. Vielen Dank an @Neil

Demo


1
Diese Anweisungen ändern das Array, dh, Sie dürfen das Array nicht zurückgeben, wodurch Sie einige Bytes sparen.
Neil


2

Java 8 , 48 Bytes

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

Eingang:

int[] a
int b
int c

Wie macht man Lambdas mit drei Argumenten in Java?
Undichte Nonne

1
Diese Anweisungen ändern das Array, dh, Sie dürfen das Array nicht zurückgeben, wodurch Sie einige Bytes sparen.
Neil

1
@LeakyNun Ich bin kein Okx , aber hier ist ein Try it now-Beispiel mit der aktuellen Antwort und der benutzerdefinierten Benutzeroberfläche von Okx .
Kevin Cruijssen

1
Und basierend auf Carlos Alejos erstaunlicher C # - Antwort (mit Hilfe von @ Neil) können Sie diese sogar noch kürzer machen, indem Sie die temporäre Variable (a,b,c)->a[b]+=a[c]-(a[c]=a[b])( 31 Byte )
Kevin Cruijssen,

1
Husten Husten Collections::swap ist 17 Bytes ... zumindest unter der Annahme, dass dies für diese Herausforderung gilt ...
Socratic Phoenix


2

Oktave , 28 Bytes

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

Probieren Sie es online!

Sehr zufrieden damit :)

Übernimmt Eingaben in das Formular f([1,2,3,4],[1,2]):, 1-indiziert.

Erläuterung:

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

Qualle , 7 Bytes

p
ZRi
i

Nimmt eine Liste und ein Paar Indizes auf. Probieren Sie es online!

Erläuterung

Qualle hat zufällig die Funktion "Elemente an Indizes ändern" Z, die genau das tut, was wir brauchen. Die beiden nehmen idie Eingänge von STDIN auf. ZNimmt als Argumente die zweite Eingabe, die Umkehrfunktion Rund die Liste. Dann Zführt die Modifikation und pdruckt das Ergebnis aus .


2

R, 38 Bytes

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

Fühlt sich ziemlich lang an, aber ich kann es nicht viel kürzer machen. Leider erfordert es das explizite Zurückkehren durch das xErfordernis {}um den Funktionskörper herum. pryr::f()erkennt die Notwendigkeit von xals Funktionsargument nicht und funktioniert nicht: /.


Ich denke, function(x,i)replace(x,i,rev(i))würde auch mit Pryr-Syntax funktionieren.
Giuseppe

@ Giuseppe Ah, ich habe nach einer praktischen Funktion für den Tausch gesucht, aber mit den falschen Begriffen gesucht. Fühlen Sie sich frei, dies als eigene Antwort zu posten.
JAD

@ Giuseppe Ich denke, Sie müssen tun replace(x,i,x[rev(i)]), sonst platzieren Sie die Indizes anstelle ihrer Werte.
JAD

2

Shenzhen I / O, 735 Bytes

23 ¥, 810 Leistung, 48 Codezeilen

[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

HAFTUNGSAUSSCHLUSS: Arrays sind in diesem Fall 0-terminiert. Arrays sind ein Problem, mit dem man sonst nur in Shenzhen I / O arbeiten kann.

Ich habe tatsächlich eine Dampfstufe für dieses Spiel gemacht. Du kannst es hier spielen.

EDIT: Und mir ist gerade aufgefallen, dass ich gesagt habe, dass das Array bestellt wurde. Teufel.


Willkommen auf der Seite Das ist wirklich cool! Denken Sie, dass Sie möglicherweise einen Teil des Leerzeichens in der Datei entfernen können und Shenzhen IO die Datei trotzdem akzeptieren muss? Ich weiß nicht, wie viel Sie damit gespielt haben, aber Sie sollten versuchen, zu sehen, wie flexibel das Format ist.
Weizen-Assistent

Ich habe nicht damit herumgespielt! Andererseits spreche ich die Überschrift für das Puzzle an, die den Namen des Puzzles und den Namen der Lösung enthält. Ich weiß nicht, ob ich mich darum kümmern soll.
junkmail

1

Swift, 111 65 Bytes (0-indiziert)

Swift ist bereits dafür berüchtigt, eine der schlechtesten Code-Golf-Sprachen zu sein, aber hier ist eine Funktion , die ternäre Ausdrücke verwendet :

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

Hör zu! - Verbrauch: t(l:[1,2,3],m:0,n:1) .


Die Verwendung eines Standardparameters für r würde Ihnen Bytes ersparen und Sie können auch einfach das übergebene Array mutieren (AFAIK Swift Arrays werden nach Wert übergeben)
Downgoat

Standardparameter in Swift? Wie kann ich das machen?
Mr. Xcoder

Und Parameter sind Konstanten in Swift @ Downgoat
Mr. Xcoder

1

k ( kona ), 13 Bytes

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

Ziemlich einfach, aber es funktioniert. Ex:

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


1

Mathematica, 32 Bytes

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

3
a[[{##2}]]==a[[{#3,#2}]]sollte sein a[[{##2}]]=a[[{#3,#2}]](mit Set, nicht Equals)
JungHwan Min

1

C, 42 Bytes

Ändern Sie das Array mit einem temporären Wert.

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

C, 60 58 Bytes

Ein bisschen interessanter, ohne einen temporären Wert zu verwenden ...

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

C 49 Bytes

Verwendung von XOR

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

He, ich wollte gerade etwas posten f(x,i,j,t)int*x;{t=x[i];x[i]=x[j];x[j]=t;}.
Dennis

@ Tennis du hast mir zwei Bytes auf der anderen Lösung gespart, danke!
Cleblanc

Wäre die zweite Lösung nicht kürzer (und sicherer) ^?
Dennis

-1 für die XOR-Version mit einem Define anstelle einer Funktion#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;}ist kaputt: SIGSEGV.
Bodo Thiesen

1

Pyth , 17 8 Bytes

9 Bytes dank Leaky Num eingespart.

@LQ.rUQE

Online testen!

Dies ist 0-indiziert, und die Indizes werden als Tupel vorgesehen: (n, m).

Erklärungen

@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 Es ist so anders, ich denke, du kannst es selbst posten!
Jim

Ich bin der OP; Ich poste nicht auf meiner eigenen Herausforderung.
Undichte Nonne

1

Mathematica, 20 Bytes

#~Permute~Cycles@#2&

Reine Funktion, die zwei Argumente im folgenden 1-indizierten (und möglicherweise missbräuchlichen) Format verwendet: Der zweite Testfall [5,8,9]; 0 2; [9,8,5]würde als aufgerufen

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

(Leerzeichen sind irrelevant und nur zum sichtbaren Parsen). Permuteist die eingebaute Funktion, die eine Permutation auf eine Liste anwendet und Cycles[{{a,b}}]die Permutation darstellt, die das ath- und bth-Element einer Liste austauscht und den Rest ignoriert.


Was machen die ~?
Cyoce

~ist die Infixnotation von Mathematica für eine binäre Funktion: x~f~ybedeutet dasselbe wie f[x,y].
Greg Martin

1

x86-Maschinencode, 10 Byte

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

Dies ist eine Funktion, die in 32-Bit-x86-Maschinencode geschrieben ist und die Werte an den angegebenen Indizes in einem bestimmten Array austauscht. Das Array wird direkt geändert und die Funktion gibt keinen Wert zurück.

Es wird eine benutzerdefinierte Aufrufkonvention verwendet, bei der die Parameter der Funktion in Registern übergeben werden müssen :

  • Die Adresse des Arrays (Zeiger auf sein erstes Element) wird im EBXRegister übergeben.
  • Der auf Null basierende Index von Element A wird im ECXRegister übergeben.
    (Wird als gültiger Index angenommen.)
  • Der auf Null basierende Index des Elements B wird im EDXRegister übergeben.
    (Wird als gültiger Index angenommen.)

Dies hält die Größe niedrig und erfüllt alle formalen Anforderungen, bedeutet jedoch, dass die Funktion nicht einfach aus anderen Sprachen wie C aufgerufen werden kann. Sie müssten sie aus einem anderen Assembler-Programm aufrufen. (Sie können es jedoch umschreiben, um alle Eingaberegister zu verwenden , ohne die Anzahl der Bytes zu beeinflussen. An den ausgewählten Registern ist nichts Magisches.)

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

JavaScript (ES2015), 66 57 49 Byte

Ein anderer (leider längerer) Ansatz als frühere JavaScript-Antworten

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

Quelle

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

Sie haben die Standardargumente vergessen. Vielen Dank!
sshow

0

awk, 31 bytes

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

Probieren Sie es online!

Übernimmt Eingaben im Format

1 2
1 2 3 4

und Ausgänge als

2 1 3 4

(1-indiziert).

Erläuterung

Das gesamte Programm ist ein fehlendes Muster mit einer Aktion, gefolgt von einem Muster mit einer fehlenden Aktion.

Da in jeder Zeile ein fehlendes Muster ausgeführt wird, wird der Code in den geschweiften Klammern für beide Eingabezeilen ausgeführt. Der c=$a;$a=$b;$b=c;Teil tauscht die beiden Werte bei Indizes aund b(über die temporäre Variable c) aus. Dies wirkt sich nur auf die zweite Zeile aus, da in der ersten Zeile aund bnoch nicht definiert. Das a=$1;b=$2Teil wird aals erstes Feld und bals zweites Feld definiert, wodurch die entsprechenden Werte für das erste Teil festgelegt werden, das in der zweiten Zeile ausgeführt werden soll.

Da eine fehlende Aktion der entspricht {print}, druckt das Muster jede Zeile, mit der es übereinstimmt. Dieses Muster lautet insbesondere NR>1: Das heißt, es wird gedruckt, wenn die Zeilennummer größer als 1 ist, was zufällig Zeile 2 ist. Dies wird ausgeführt, nachdem das Austauschen von Werten stattgefunden hat, wodurch die Aufgabe abgeschlossen wird.


0

q / kdb + 17 Bytes

Lösung:

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

Beispiel:

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

Erläuterung:

Eine q-Version der k-Antwort von Simon. Wenden Sie die Zuweisungsfunktion :auf x bei Indizes mit dem umgekehrten Wert y an, wobei x bei y indiziert ist. Aufgeschlüsselt sehen Sie deutlicher:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.