Reflexión de matriz de cadena intermedia

16

Comencemos redefiniendo un reflejo de un personaje en una matriz de caracteres en 2-d:

Dada una matriz cuadrada de caracteres en 2-d con letras alfabéticas en minúsculas distintas, defina un reflejo de una letra en la matriz como intercambiándola con el carácter directamente enfrente del centro del cuadrado.

Por lo tanto, un reflejo de la letra cen

abcde
fghij
klmno
pqrst
uvwxy

daría lugar a la configuración

abwde
fghij
klmno
pqrst
uvcxy

porque el cy el whan sido cambiados.

Algunos ejemplos más (con la misma configuración original que la anterior):

Reflejando el personaje ese formaría

 abcdu
 fghij
 klmno
 pqrst
 evwxy

Reflejar el personaje mharía

 abcde
 fghij
 klmno
 pqrst
 uvwxy

Reflejando el personaje bse formaría

 axcde
 fghij
 klmno
 pqrst
 uvwby

El reto

Dada una matriz de caracteres en 2-d con letras minúsculas distintas, revise cada carácter en una cadena dada y "refleje" en la matriz.

Aclaraciones: las letras de la cadena son de a-z, las letras son únicas y la matriz es de al menos 1x1 y como máximo 5x5 (obviamente, ya que solo hay 26 caracteres en el alfabeto inglés). Se garantiza que los caracteres de la cadena serán en la matriz de 2-d. La cadena tiene como máximo 100 caracteres de longitud.

Entrada

Una cadena s, un número entero Ny luego una NxNserie de caracteres.

Ejemplo

Entrada:

ac
2
ab
cd

Salida:

dc
ba

* Motivo: Primero, refleje acon el d. Luego, refleja el ccon el bporque ces la segunda letra en la cadena de entrada.


Puntuación

  • La salida se puede dar por cualquier método conveniente .
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

Ganador actual

NL628
fuente
99
Media hora no es realmente el tiempo suficiente para obtener un uso significativo de la caja de arena.
Post Rock Garf Hunter
3
No hay problema, se ve bien.
user202729
1
(también tenemos una tabla de clasificación de fragmentos de pila )
user202729
66
50 horas es demasiado corto para aceptar un ganador; normalmente querrías esperar una semana más o menos. Sin embargo, en PPCG, es una práctica común no aceptar ninguna respuesta porque eso desalienta las respuestas futuras, y queremos mantener los desafíos abiertos para siempre.
HyperNeutrino el
2
Todos sus ejemplos tienen los caracteres en orden alfabético. ¿Asumo que no es una suposición que podemos hacer? Además, no nos tenemos que tomar Ncomo entrada si no lo necesitamos?
Stewie Griffin

Respuestas:

3

Octava , 85 68 66 bytes

¡Usando eval, con un bucle dentro, ahorró muchos bytes! ¡Recibí la inspiración de esta respuesta de Luis Mendo !

@(c,N,A)eval"for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A"

Pruébalo en línea!

Explicación:

f=@(c,N,A)          % Anonymous function that takes the three input variables
eval"...          % Evaluate the string and run it:
 for C=c,          % Loop over the character list 'c'
  .. x=find(A==C)   % Find the index where the character C is in A, and store it as 'x'
  .. k=[x,N^2+1-x]  % Create a vector with the index of C, and the index of its reflection
   A(flip(k))=A(k)  % Swap the elements in these positions
  end               % End loop
  A"                % Display the new 'A'
Stewie Griffin
fuente
2

Python 2 , 76 bytes

lambda s,a:[a[[i,~i][(s.count(c)+s.count(a[~i]))%2]]for i,c in enumerate(a)]

Pruébalo en línea!

Toma entrada:

  • s: cuerda
  • N: ignorado
  • a: cadena de caracteres unida

Devuelve una lista plana de caracteres


Si tengo que tomar la matriz como una lista:

Python 2 , 111 108 107 104 bytes

lambda s,n,a:[[x[sum(map(s.count,x))%2]for i in range(n)for x in[[a[j][i],a[~j][~i]]]]for j in range(n)]

Pruébalo en línea!

Toma entrada:

  • s: cuerda
  • n: En t
  • a: Listas 2D de caracteres

Devuelve una lista 2D de caracteres

TFeld
fuente
1

Java 10, 126 123 116 bytes

(s,n,m)->{for(var c:s)for(int N=n*n,i,j;N-->0;)if(m[i=N/n][j=N%n]==c){m[i][j]=m[n+~i][n+~j];m[n+~i][n+~j]=c;break;}}

Modifica la matriz de caracteres de entrada en lugar de devolver una nueva para guardar bytes.

Pruébalo en línea.

Explicación:

(s,n,m)->{        // Method with the three parameters and no return-type
  for(var c:s)    //  Loop over the characters given
    for(int N=n*n,i,j;N-->0;)
                  //   Inner loop over the matrix
      if(m[i=N/n][j=N%n]==c){
                  //    If the current character and matrix-value are equals:
        m[i][j]=m[n+~i][n+~j];m[n+~i][n+~j]=c;
                  //     Swap the values in the matrix at indices [i, j] and [n-i-1, n-j-1]
        break;}}  //     Stop the inner loop (go to next iteration of the outer loop)
Kevin Cruijssen
fuente
Dang, codificando en java! ??!?! +1 Def
NL628
1

Python 3 , 122 111 bytes

lambda l,n,A:[[[A[a][b],A[~b][~a]][sum(map(l.count,[A[a][b],A[~b][~a]]))%2]for b in range(n)]for a in range(n)]

Pruébalo en línea!

Devuelve una matriz 2D de caracteres.

Jo King
fuente
Debería poder seguir jugando al golf ... No hay forma de modificar la matriz de entrada es más corta en Java que en Python ...; p Para comenzar (y hacerlo 1 byte más corto en lugar de 1 byte más largo que mi respuesta Java): Eliminar the aand band using n+~xy n+~ydirectamente ahorra 2 bytes: a,b=n+~x,n+~y;A[x][y],A[a][b]=A[a][b],A[x][y]aA[x][y],A[n+~x][n+~y]=A[n+~x][n+~y],A[x][y]
Kevin Cruijssen
1

R , 74 61 bytes

-13 bytes gracias a Giuseppe.

function(s,n,m){for(x in s)m[v]=rev(m[v<-(i=x==m)|rev(i)]);m}

Pruébalo en línea!

Introduce un vector de caracteres para buscar como s, tamaño de la matriz como ny matriz como m. Si es absolutamente necesario tomar el primer argumento como una cadena , eso arruinaría la diversión.

Kirill L.
fuente
Utilizando índices lógicos en lugar de índices numéricos, bajé a 61 bytes
Giuseppe
Wow, esa es una mejora considerable, muchas gracias.
Kirill L.
0

Jalea , 15 14 bytes

FW;Ṛi,C$¥¦/ṁḷY

Pruébalo en línea!

Programa completo

Explicación:

FW; Ṛi, C $ ¥ ¦ / ṁḷY Enlace principal. Entrada: ['ab', 'cd'] (izquierda), 'ac' (derecha).
FW                    F latten y W rap en una lista. Valor actual = ['abcd'].
  ; Concatenarlo con el argumento correcto. ['abcd', 'a', 'c']
          / Reducir desde la izquierda:
   Ṛ ¦ Aplicar  everse en ...
    i ¥ el índice (del argumento derecho en el argumento izquierdo) ...
     , C $ y su índice de complemento.

La última operación necesita más explicación. Denote f = Ṛi,C$¥¦, luego, para el valor ['abcd','a','c']que calcula ('abcd' f 'a') f 'c', que se expande a:

Ṛi, C $ ¥ ¦ Función f . Asumir argumento izquierdo = 'abcd' y argumento derecho = 'a'
Ṛ Primero, calcule el reverso. Obtenga 'dcba'.
 i ¥ Para calcular los índices a aplicar, primero el índice de 'a' en 'abcd'
             is ('abcd' i 'a') = 1. (primer índice)
  , C $ Luego emparejar con (1 C) = 0. (último índice)
      ¦ Aplicar 'dcba' a 'abcd' en los índices 0 y 1:

              a bc d
               d cb a
              ^ 1 ^ 0
              ====
              dbca
usuario202729
fuente
0

Retina 0.8.2 , 96 bytes

+`^(.)(.*¶(.|¶)*)((.)((.|¶)*))?\1(?(4)|(((.|¶)*)(.))?)((?<-3>.|¶)*$(?(3).))
$2$11$9$1$6$5$12
1A`

Pruébalo en línea! Toma la cadena sy la matriz de caracteres como una cadena delimitada por una nueva línea sin el entero N. Explicación: Cada carácter cde sse procesa a su vez. La expresión regular coincide con dos posiciones equidistantes de los extremos de la matriz, de las cuales una es cy la otra es su espejo m. Estos caracteres se intercambian y cse eliminan de s.

+`

Procesa cada personaje de sa su vez.

^(.)

$1capturas c.

(.*¶(.|¶)*)

$3captura una pila de caracteres en la matriz con el prefijo uno de co m. $2captura el resto de smás todos estos personajes.

((.)((.|¶)*))?

Si mprecede c, $4tiene un valor, $5captura my $6captura los caracteres entre my c. $7captura $6como una pila pero su valor no se utiliza.

\1

c ahora coincide en la matriz misma.

(?(4)|(((.|¶)*)(.))?)

Si aún mno coincidía, entonces $8opcionalmente captura un valor, en cuyo caso $9captura los caracteres de ca m, $10captura $9como una pila que no se utiliza y $11captura m. El valor es opcional en el caso cy mson del mismo carácter.

((?<-3>.|¶)*$(?(3).))

$12captura los personajes sufijando el otro de cy m. Se utiliza un grupo de equilibrio para garantizar que $12sea ​​tan largo como $3profundo, es decir, el prefijo y el sufijo tienen la misma longitud.

$2$11$9$1$6$5$12

Luego, las piezas se vuelven a unir: primero el resto sy el prefijo de la matriz, luego si está cprecedido m, mluego el medio, luego c, si está mprecedido, cluego el medio y mluego el sufijo.

1A`

Ahora que sestá vacío, se elimina.

Neil
fuente
0

JavaScript, 85 bytes

Toma una cadena Sy una matriz Acomo una cadena unida.

([...S],[...A])=>S.map(c=>[A[j],A[i]]=[A[i=A.indexOf(c)],A[j=A.length+~i]])&&A.join``

Darrylyeo
fuente