Intercambia los dos índices dados

31

Dada una matriz de enteros positivos y dos índices válidos distintos, devuelva la matriz con los dos elementos correspondientes a los dos índices intercambiados.

Puede optar por usar 0-indexing o 1-indexing, pero los siguientes casos de prueba serán 0-indexados.

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]

Este es el . La respuesta más corta en bytes gana. Se aplican lagunas estándar .

Monja permeable
fuente
Relacionado , relacionado .
Leaky Nun
1
Huh, esta puede ser una tarea con la que muchos idiomas de golf tienen dificultades, pero la mayoría de los idiomas prácticos les resulta fácil. (Las listas con elementos mutables no son algo común en los idiomas de golf). Si ese es el caso, será bastante interesante. (Las lenguas de golf es probable que aún así ganar, sin embargo, porque son mucho más concisa que pueden salirse con un algoritmo más complejo.)
77
Sorprende que esto probablemente no sea un engaño, pero este desafío es realmente creativo, ya que es un verdadero desafío para muchos idiomas de golf.
Erik the Outgolfer
@LeakyNun Tengo votos negativos (e incluso elimino votos) así en el pasado, no te preocupes demasiado por eso ...
Erik the Outgolfer
Puede my ndebe tomarse como una matriz?
Okx

Respuestas:

17

do/ C ++, 53 50 39 bytes

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

Pruébalo en línea

Guardado 11 bytes gracias a @Dennis

Ra8
fuente
10

Lenguaje de script Operation Flashpoint , 98 95 bytes

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

Modifica la matriz directamente.

Explicación:

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.

Llamar con:

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

Salida:

ingrese la descripción de la imagen aquí

Steadybox
fuente
7

JavaScript ES6, 36 32 bytes

¡Mira, mamá, no hay variable temporal!

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

Intentalo

Ingrese una lista de elementos separados por comas para ay 2 enteros para 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>

Lanudo
fuente
2
Esas instrucciones modifican la matriz, lo que significa que se le permite no devolver la matriz, lo que le ahorrará algunos bytes.
Neil
@Neil: ¿Estás diciendo simplemente usar (a,m,n)=>[a[m],a[n]]=[a[n],a[m]]? Eso solo generaría los 2 elementos intercambiados sin el resto de la matriz (por ejemplo, [5,8,9],0,2-> [9,5]).
Shaggy
@Neil: Correcto, es por eso que necesitamos aal final para darnos la matriz completa y modificada. ¿O me estoy perdiendo por completo lo que intentas decir?
Shaggy
@Neil: Hmm ... OK, creo que veo lo que estás haciendo ahora (lo siento, tratando de hacer muchas cosas al mismo tiempo hoy). Gracias por el consejo. ¿Existe un consenso al respecto y, de ser así, tendrías un enlace a mano antes de que yo mismo lo busque?
Shaggy
5

Pitón 3 , 41 32 bytes

-9 bytes gracias a @notjagan

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

Pruébalo en línea!

Modifica su argumento, que es un formato de salida válido .

ovs
fuente
3
Es curioso cómo ni siquiera se juega tanto al golf en comparación con el código idiomático de Python.
Łukasz Rogalski
5

Jalea , 7 bytes

Ṛ,ḷyJ}ị

Pruébalo en línea!

Cómo funciona

Ṛ,ḷ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
fuente
tfw el contenedor es casi tan largo como el programa ...
Leaky Nun
Nunca supe de la existencia dey
Leaky Nun
Lo sabía y, pero no pensé en usarlo aquí. Esa es una respuesta bastante inteligente.
Esto me hizo pensar ... ¿es Jellyun código Jelly válido?
M.Herzkamp
@ M.Herzkamp lo es. Sin embargo, dudo que sea excepcionalmente útil.
Dennis
4

MATL , 7 6 bytes

yyP)w(

Los índices están basados ​​en 1.

Pruébalo en línea!

Explicación

Considere insumos [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
fuente
4

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

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

Pruébalo en línea!

Intercambia los números en la matriz original, no se utilizan variables temporales. Sin embargo, no puedo tomar el crédito por esta respuesta, ya que ha sido idea de Neil .

Charlie
fuente
@LeakyNun no parece funcionar, ya que eso deja un [m] con un valor de 0. ¡ Pruébelo usted mismo!
Charlie
(a,m,n)=>a[m]+=a[n]-(a[n]=a[m])parece funcionar sin embargo.
Neil
(Estas respuestas también son válidas en ES6 JavaScript, ¿no?)
Neil
4

Lisp común , 42 bytes

-2 bytes gracias a @coredump .

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

Pruébalo en línea!

Muy sencillo, ya que hay una macro Common Lisp a swap: rotatef.

Dada
fuente
Podrías usar ELT en lugar de AREF
coredump
1
@coredump Correcto, gracias!
Dada
3

Javascript ES6, 36 34 bytes

(a,m,n)=>(x=a[m],a[m]=a[n],a[n]=x)
  • -2 Bytes porque la función está alterando la matriz. No es necesario devolver la matriz. Gracias a @Neil

Manifestación

Weedoze
fuente
1
Esas instrucciones modifican la matriz, lo que significa que se le permite no devolver la matriz, lo que le ahorrará algunos bytes.
Neil
2

Java 8 , 48 bytes

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

Entrada:

int[] a
int b
int c
Okx
fuente
¿Cómo haces lambdas con tres argumentos en Java?
Leaky Nun
1
Esas instrucciones modifican la matriz, lo que significa que se le permite no devolver la matriz, lo que le ahorrará algunos bytes.
Neil
1
@LeakyNun No soy Okx , pero aquí hay un ejemplo Pruébalo ahora con la respuesta actual de Okx y su interfaz personalizada.
Kevin Cruijssen
1
Y según la sorprendente respuesta de C # de Carlos Alejo (con la ayuda de @ Neil) , puede hacerlo aún más corto al deshacerse de la variable temporal: (a,b,c)->a[b]+=a[c]-(a[c]=a[b])( 31 bytes )
Kevin Cruijssen
1
tos Collections::swap es de 17 bytes ... al menos suponiendo que esto sea válido para este desafío ...
Socratic Phoenix
2

Octava , 28 bytes

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

Pruébalo en línea!

Bastante satisfecho con este en realidad :)

Toma entrada en el formulario: f([1,2,3,4],[1,2])1 indexado.

Explicación:

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

Medusa , 7 bytes

p
ZRi
i

Toma una lista y un par de índices. Pruébalo en línea!

Explicación

Jellyfish tiene una función de "modificar elementos en índices" Z, que hace exactamente lo que necesitamos. Los dos is toman las entradas de STDIN. Ztoma como argumentos la segunda entrada, la función de inversión Ry la lista. Luego Zrealiza la modificación e pimprime el resultado.

Zgarb
fuente
2

R, 38 bytes

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

Se siente bastante largo, pero no puedo hacerlo mucho más corto. Lamentablemente, requiere el retorno explícito x, que requiere {}alrededor del cuerpo de la función. pryr::f()no reconoce la necesidad de xcomo argumento de función, por lo que no funciona: /.

JAD
fuente
Creo function(x,i)replace(x,i,rev(i))que funcionaría, incluso con la sintaxis de pryr.
Giuseppe
@Giuseppe Ah, estaba buscando una función conveniente para hacer el intercambio, pero estaba buscando con los términos incorrectos. Siéntase libre de publicar eso como una respuesta propia.
JAD
@Giuseppe creo que debes hacer replace(x,i,x[rev(i)]) , de lo contrario, colocarás los índices en lugar de sus valores.
JAD
2

E / S de Shenzhen, 735 bytes

23 ¥, 810 de potencia, 48 líneas de código

[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

DESCARGO DE RESPONSABILIDAD: Las matrices tienen terminación 0 en esto. Las matrices son un fastidio para trabajar en Shenzhen I / O de lo contrario.

Realmente hice un nivel de vapor para este juego. Puedes jugarlo aquí.

EDITAR: Aa y me acabo de dar cuenta de que dije que se ordenó la matriz Infierno.

correo basura
fuente
Bienvenido al sitio ¡Esto es realmente genial! ¿cree que podría eliminar parte del espacio en blanco del archivo y aún así Shenzhen IO acepta el archivo? No sé cuánto has jugado con él, pero debes intentar ver qué tan flexible es el formato.
Wheat Wizard
¡No he jugado con eso! Por otro lado, estoy eliminando el encabezado del rompecabezas que contiene el nombre del rompecabezas y el nombre de la solución, por lo que no sé si debería molestarme.
correo basura
1

Swift, 111 65 bytes (indexado 0)

Swift ya es conocido por ser uno de los peores lenguajes de código de golf, pero aquí hay una función que utiliza expresiones ternarias :

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

¡Echale un vistazo! - Uso: t(l:[1,2,3],m:0,n:1) .

Sr. Xcoder
fuente
El uso de un parámetro predeterminado para r le ahorraría bytes y también puede mutar la matriz aprobada (la matriz rápida AFAIK se pasa por valor)
Downgoat
Parámetro predeterminado en Swift? ¿Cómo puedo hacer eso?
Sr. Xcoder
Y los parámetros son constantes en Swift @Downgoat
Mr. Xcoder
1

k ( kona ), 13 bytes

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

Bastante básico, pero funciona. Ex:

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

Perl 5 , 32 bytes

-3 bytes gracias a @Dom Hastings !

30 bytes de código + -pabanderas.

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

Pruébalo en línea!

Muy sencillo, utilizando cortes de matriz.

Dada
fuente
¡Hola, he jugado un poco con esto y he logrado ahorrar 3 bytes! @F[pop@p,@p]=@F[@p=<>];$_="@F".
Dom Hastings
@DomHastings Hmm, bien, como siempre! Gracias :)
Dada
1

Mathematica, 32 bytes

(a=#;a[[{##2}]]=a[[{#3,#2}]];a)&
alephalpha
fuente
3
a[[{##2}]]==a[[{#3,#2}]]debería estar a[[{##2}]]=a[[{#3,#2}]](usando Set, no Equals)
JungHwan Min
1

C, 42 bytes

Modifique la matriz en su lugar con un valor temporal.

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

C, 60 58 bytes

Un poco más interesante, sin usar ningún valor temporal ...

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

C, 49 bytes

Usando XOR

f(a,m,n)int*a;{a[m]^=a[n];a[n]^=a[m];a[m]^=a[n];}
cleblanc
fuente
Je, estaba a punto de publicar f(x,i,j,t)int*x;{t=x[i];x[i]=x[j];x[j]=t;}.
Dennis
@ Dennis, me salvaste dos bytes en la otra solución, ¡gracias!
cleblanc
¿No sería la segunda solución más corta (y más segura) ^?
Dennis
-1 para la versión XOR usando una definición en lugar de una función#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;}está roto: SIGSEGV.
Bodo Thiesen
1

Pyth , 17 8 bytes

Guardado 9 bytes gracias a Leaky Num.

@LQ.rUQE

¡Pruébelo en línea!

Esto está indexado en 0, y los índices se proporcionan como una tupla: (n, m) .

Explicaciones

@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
fuente
8 bytes:@LQ.rUQE
Leaky Nun
@LeakyNun ¡Es tan diferente que creo que puedes publicarlo tú mismo!
Jim
Soy el OP; No publico en mi propio desafío.
Leaky Nun
1

Mathematica, 20 bytes

#~Permute~Cycles@#2&

Función pura que toma dos argumentos en el siguiente formato 1 indexado (y posiblemente abusivo): el segundo caso de prueba [5,8,9]; 0 2; [9,8,5]se llamaría como

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

(los espacios son extraños y solo para el análisis visible). Permutees la función incorporada que aplica una permutación a una lista y Cycles[{{a,b}}]representa la permutación que intercambia los elementos ath y bth de una lista e ignora el resto.

Greg Martin
fuente
Lo que hace el ~Do?
Cyoce
~ es la notación infija de Mathematica para una función binaria: x~f~y significa lo mismo que f[x,y].
Greg Martin
1

Código de máquina x86, 10 bytes

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

Esta es una función escrita en código de máquina x86 de 32 bits que intercambia los valores en los índices especificados en una matriz dada. La matriz se modifica en el lugar y la función no devuelve un valor.

Se utiliza una convención de llamada personalizada, que requiere que los parámetros de la función se pasen en los registros :

  • La dirección de la matriz (puntero a su primer elemento) se pasa en el EBXregistro.
  • El índice de base cero del elemento A se pasa en el ECXregistro.
    (Se supone que es un índice válido).
  • El índice de base cero del elemento B se pasa en el EDXregistro.
    (Se supone que es un índice válido).

Esto mantiene el tamaño bajo y cumple con todos los requisitos formales, pero significa que la función no se puede llamar fácilmente desde otros idiomas como C. Debería llamarlo desde otro programa en lenguaje ensamblador. (Puedes reescribirlo para usar cualquier registro de entrada, sin afectar el conteo de bytes; no hay nada mágico en los que elegí).

Sin golf:

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 Gray
fuente
1

R, 34 bytes

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

Java 8 + InversoY , 27 bytes

java.util.Collections::swap

Solo llama a la función de intercambio ... esta es una referencia de método del tipo Consumer3<List, Integer, Integer> .

Pruébalo en línea! (encabezado y pie de página para repetitivo y copia de la Consumer3interfaz)

Fénix Socrático
fuente
No necesita agregar "+ InverseY". Es válido en Java 8 vainilla.
Olivier Grégoire
1

JavaScript (ES2015), 66 57 49 bytes

Un enfoque diferente (por desgracia, más largo) que las respuestas anteriores de JavaScript

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

Fuente

const swap = (arr, a, b, splice) => {
  splice(a, 1, ...splice(arr[b], 1, arr[a]))
}
sshow
fuente
1
(s,h,o,w=s.splice.bind(s))=>w(h,1,...w(o,1,s[h]))49 bytes
Patrick Roberts
Olvidé de ellos args por defecto. ¡Gracias!
show
0

awk, 31 bytes

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

Pruébalo en línea!

Toma entrada en el formato

1 2
1 2 3 4

y salidas como

2 1 3 4

(1 indexado).

Explicación

El programa completo es un patrón faltante con una acción seguida de un patrón con una acción faltante.

Como se ejecuta un patrón faltante en cada línea, el código dentro de las llaves se ejecuta para ambas líneas de entrada. La c=$a;$a=$b;$b=c;parte intercambia los dos valores en los índices ay b(a través de la variable temporal c). Esto solo tiene un efecto en la segunda línea, ya que en la primera línea ay baún no están definidos. La a=$1;b=$2parte se define acomo el primer campo yb el segundo campo, que establece los valores apropiados para que la primera parte se ejecute en la segunda línea.

Como una acción que falta es equivalente a {print}, el patrón imprime cada línea que coincide. Este patrón en particular es NR>1: es decir, imprimir siempre que el número de línea sea mayor que 1, que resulta ser la línea 2. Esto se ejecuta después del intercambio de valores, completando así la tarea.

Pomo de la puerta
fuente
0

q / kdb +, 17 bytes

Solución:

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

Ejemplo:

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

Explicación:

Una versión q de la k respuesta de Simon. Aplicar la asignación: función de a x en índices inversa-y con el valor de x indexado en y. Desglosado puedes ver más claramente:

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
callejero
fuente