Troque os dois índices dados


31

Dada uma matriz de números inteiros positivos e dois índices válidos distintos, retorne a matriz com os dois elementos correspondentes aos dois índices trocados.

Você pode optar por usar a indexação 0 ou a indexação 1, mas os casos de teste abaixo serão indexados em 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]

Isso é . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .



1
Bem, isso pode ser uma tarefa que muitas línguas do golfe enfrentam dificuldades, mas a maioria das linguagens práticas acham fácil. (Listas com elementos mutáveis ​​não são comuns para os idiomas do golfe.) Se for esse o caso, será bastante interessante. (As línguas de golfe provavelmente ainda ganhar, no entanto, porque eles são muito terser eles podem fugir com um algoritmo mais complexo.)

7
Surpreendido, isso provavelmente não é um engodo, mas esse desafio é realmente criativo, pois é um desafio real para muitas línguas de golfe por aí.
Erik the Outgolfer

@LeakyNun Tenho downvotes (e até mesmo excluir votos) como essa no passado, não se preocupe muito com isso ...
Erik o Outgolfer

Pode me pode nser tomado como uma matriz?
Okx,

Respostas:



10

Linguagem de script da operação 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 a matriz diretamente.

Explicação:

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.

Ligue para:

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

Saída:

insira a descrição da imagem aqui


7

JavaScript ES6, 36 32 bytes

Olha, mãe, nenhuma variável temporária!

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

Tente

Digite uma lista de elementos separados por vírgula ae 2 números inteiros 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>


2
Essas instruções modificam a matriz, o que significa que você não pode retornar a matriz, o que economizará alguns bytes.
22417 Neil

@ Neil: Você está dizendo apenas para usar (a,m,n)=>[a[m],a[n]]=[a[n],a[m]]? Isso produziria apenas os 2 elementos trocados sem o restante da matriz (por exemplo, [5,8,9],0,2-> [9,5]).
Shaggy #

@ Neil: Certo, é por isso que precisamos ano final para nos fornecer a matriz completa e modificada. Ou estou perdendo completamente o que você está tentando dizer?
Shaggy

@ Neil: Hmm ... OK, acho que vejo o que você está recebendo agora (desculpe, tentando fazer muitas coisas ao mesmo tempo hoje). Obrigado pela dica. Existe um consenso sobre isso e, em caso afirmativo, você teria um link à mão antes de eu procurar por mim mesmo?
Shaggy



5

Geléia , 7 bytes

Ṛ,ḷyJ}ị

Experimente online!

Como 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.

tfw o invólucro é quase tão longo quanto o programa ...
Leaky Nun

Eu nunca soube da existência dey
Leaky Nun

Eu sabia y, mas não pensei em usá-lo aqui. Essa é uma resposta bastante inteligente.

Isso me fez pensar ... o Jellycódigo Jelly é válido?
M.Herzkamp

@ M.Herzkamp É. Duvido que seja excepcionalmente útil.
Dennis


4

MATL , 7 6 bytes

yyP)w(

Os índices são baseados em 1.

Experimente online!

Explicação

Considere entradas [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])

Experimente online!

Troca os números na matriz original, sem variáveis ​​temporárias usadas. No entanto, não posso me responsabilizar por essa resposta, pois foi idéia de Neil .


@LeakyNun parece não funcionar, pois isso deixa um [m] com um valor de 0. Tente você mesmo!
Charlie

(a,m,n)=>a[m]+=a[n]-(a[n]=a[m])parece funcionar embora.
Neil

(Estas respostas são todas igualmente válidas em ES6 JavaScript, não?)
Neil


3

Javascript ES6, 36 34 bytes

(a,m,n)=>(x=a[m],a[m]=a[n],a[n]=x)
  • -2 bytes porque a função está alterando a matriz. Não há necessidade de retornar a matriz. Graças a @Neil

Demo


1
Essas instruções modificam a matriz, o que significa que você não pode retornar a matriz, o que economizará alguns bytes.
22417 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

Como você faz lambdas com três argumentos em Java?
precisa

1
Essas instruções modificam a matriz, o que significa que você não pode retornar a matriz, o que economizará alguns bytes.
Neil

1
@LeakyNun Eu não sou Okx , mas aqui está um exemplo Experimente agora com a resposta atual e a interface personalizada do Okx .
Kevin Cruijssen

1
E com base em Carlos Alejo resposta C # incrível 's (com @ a ajuda de Neil) , você pode torná-lo ainda mais curto por se livrar da variável temporária: (a,b,c)->a[b]+=a[c]-(a[c]=a[b])( 31 bytes )
Kevin Cruijssen

1
tosse tosse Collections::swap é de 17 bytes ... pelo menos assumindo que isso se aplica a este desafio ...
Phoenix socrático


2

Oitava , 28 bytes

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

Experimente online!

Bastante satisfeito com este realmente :)

Recebe entrada no formulário f([1,2,3,4],[1,2]):, 1 indexado.

Explicação:

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

Água-viva , 7 bytes

p
ZRi
i

Leva uma lista e um par de índices. Experimente online!

Explicação

A água-viva tem uma função "modificar itens nos índices" Z, que faz exatamente o que precisamos. Os dois is pegam as entradas do STDIN. Ztoma como argumentos a segunda entrada, a função de reversão Re a lista. Em seguida, Zrealiza a modificação e pimprime o resultado.


2

R, 38 bytes

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

Parece um pouco longo, mas não posso ficar muito mais curto. Infelizmente, isso requer o retorno explícito x, exigindo {}o corpo da função. pryr::f()não reconhece a necessidade de xcomo argumento de função, portanto não funciona: /.


Eu acho function(x,i)replace(x,i,rev(i))que funcionaria, mesmo com sintaxe pryr.
Giuseppe

@ Giuseppe Ah, eu estava procurando uma função conveniente para fazer a troca, mas estava pesquisando com os termos errados. Sinta-se livre para postar isso como uma resposta própria.
JAD

@ Giuseppe Acho que você precisa fazer replace(x,i,x[rev(i)]), senão você colocará os índices em vez de seus valores.
JAD

2

E / S de Shenzhen, 735 bytes

23 ¥, 810 Potência, 48 Linhas 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

AVISO LEGAL: As matrizes são 0 terminadas neste. Matrizes são um pé no saco para trabalhar com E / S de Shenzhen, caso contrário.

Na verdade, eu fiz um nível de vapor para este jogo. Você pode jogar aqui.

EDIT: Aaand eu acabei de perceber que eu disse que a matriz foi ordenada. Heck.


Bem-vindo ao site Isso é muito legal! você acha que poderá remover parte do espaço em branco no arquivo e ainda assim o Shenzhen IO aceitar o arquivo? Não sei o quanto você brincou com isso, mas tente ver como o formato é flexível.
Wheat Wizard

Eu não brinquei com isso! Por outro lado, estou cortando o cabeçalho do quebra-cabeça que contém o nome do quebra-cabeça e o nome da solução, então não sei se devo me preocupar.
Junkmail

1

Swift, 111 65 bytes (indexado 0)

O Swift já é notório por ser uma das piores linguagens de código-golfe, mas aqui está uma função que faz uso de expressões ternárias :

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

Confira! - Uso: t(l:[1,2,3],m:0,n:1) .


Usando um param padrão para r iria salvá-lo bytes e você também pode simplesmente transformar a matriz passada (array rápida AFAIK são passagem por valor)
Downgoat

Parâmetro padrão no Swift? Como eu posso fazer isso?
Mr. Xcoder

E os parâmetros são constantes em Swift @Downgoat
Mr. Xcoder

1

k ( kona ), 13 bytes

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

Bastante básico, mas funciona. Ex:

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

1

Perl 5 , 32 bytes

-3 bytes graças a @Dom Hastings !

30 bytes de código + -pasinalizadores.

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

Experimente online!

Para a frente, usando fatias de matriz.


Ei, ei, mexi um pouco com isso e consegui economizar 3 bytes! @F[pop@p,@p]=@F[@p=<>];$_="@F".
Dom Hastings

@DomHastings Hmm, legal, como sempre! Obrigado :)
Dada

1

Mathematica, 32 bytes

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

3
a[[{##2}]]==a[[{#3,#2}]]deve ser a[[{##2}]]=a[[{#3,#2}]](usando Set, não Equals) #
7897 JungHwan Min

1

C, 42 bytes

Modifique a matriz no local com um valor temporário.

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

C, 60 58 bytes

Um pouco mais interessante, sem usar nenhum valor temporário ...

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

Heh, eu estava prestes a postar f(x,i,j,t)int*x;{t=x[i];x[i]=x[j];x[j]=t;}.
Dennis

@ Dennis você me salvou dois bytes na outra solução, obrigado!
Cleblanc 22/06

A segunda solução não seria mais curta (e mais segura) ^?
Dennis

-1 para a versão XOR usando uma definem em vez de uma função de#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á quebrado: SIGSEGV.
Bodo Thiesen

1

Pitão , 17 8 bytes

Economizou 9 bytes graças a Leaky Num.

@LQ.rUQE

Teste online!

Esta é 0-indexados, e os índices são fornecidos como uma tupla: (n, m).

Explicações

@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 É tão diferente que eu acho que você pode postar por si mesmo!
Jim

Eu sou o OP; Eu não posto no meu próprio desafio.
Leaky Nun

1

Mathematica, 20 bytes

#~Permute~Cycles@#2&

Função pura usando dois argumentos no seguinte formato indexado em 1 (e possivelmente abusivo): o segundo caso de teste [5,8,9]; 0 2; [9,8,5]seria chamado como

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

(os espaços são estranhos e apenas para análise visível). Permuteé a função interna que aplica uma permutação a uma lista e Cycles[{{a,b}}]representa a permutação que troca os ath e bth th elementos de uma lista e ignora o restante.


O que ~fazem?
Cyoce

~é a notação de infixo do Mathematica para uma função binária: x~f~ysignifica a mesma coisa que f[x,y].
Greg Martin

1

Código da máquina x86, 10 bytes

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

Essa é uma função escrita no código de máquina x86 de 32 bits que troca os valores nos índices especificados em uma determinada matriz. A matriz é modificada no local e a função não retorna um valor.

Uma convenção de chamada personalizada é usada, exigindo que os parâmetros da função sejam passados ​​nos registradores :

  • O endereço da matriz (ponteiro para seu primeiro elemento) é passado no EBXregistro.
  • O índice baseado em zero do elemento A é passado no ECXregistro.
    (Supõe-se que seja um índice válido.)
  • O índice baseado em zero do elemento B é passado no EDXregistro.
    (Supõe-se que seja um índice válido.)

Isso mantém o tamanho baixo e está em conformidade com todos os requisitos formais, mas significa que a função não pode ser facilmente chamada de outros idiomas como C. Você precisaria chamá-lo de outro programa em linguagem assembly. (Você pode reescrevê-lo para usar qualquer registrador de entrada, sem afetar a contagem de bytes; não há nada de mágico nos que eu escolhi.)

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

Apenas chama a função swap ... esta é uma referência método do tipo Consumer3<List, Integer, Integer>.

Experimente online! (cabeçalho e rodapé para clichê e cópia da Consumer3interface)


Você não precisa adicionar "+ Inversão". É válido no Java 8. de baunilha.
Olivier Grégoire

1

JavaScript (ES2015), 66 57 49 bytes

Uma abordagem diferente (infelizmente, mais longa) do que as respostas JavaScript anteriores

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

Fonte

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

Esqueceu-se deles args padrão. Obrigado!
Sshow

0

awk, 31 bytes

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

Experimente online!

Recebe entrada no formato

1 2
1 2 3 4

e saídas como

2 1 3 4

(Indexado 1).

Explicação

O programa inteiro é um padrão ausente com uma ação seguida por um padrão com uma ação ausente.

Como um padrão ausente é executado em cada linha, o código dentro das chaves é executado nas duas linhas de entrada. A c=$a;$a=$b;$b=c;peça troca os dois valores nos índices ae b(através da variável temporária c). Isso só tem efeito na segunda linha, pois na primeira linha ae bainda não está definido. A a=$1;b=$2parte define acomo o primeiro campo e bo segundo campo, que define os valores apropriados para que a primeira parte seja executada na segunda linha.

Como uma ação ausente é equivalente a {print}, o padrão imprime todas as linhas correspondentes. Esse padrão em particular é NR>1: isto é, imprima sempre que o número da linha for maior que 1, que passa a ser a linha 2. Isso é executado após a troca de valores, ocorrendo a conclusão da tarefa.


0

q / kdb +, 17 bytes

Solução:

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

Exemplo:

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

Explicação:

Uma versão q da resposta k de Simon. Aplique a :função de atribuição a x nos índices reversos-y com o valor de x indexado em y. Dividido, você pode ver mais 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.