Reflexão intermediária da matriz de cadeias


16

Vamos começar redefinindo o reflexo de um caractere em uma matriz 2D de caracteres:

Dada uma matriz quadrada de caracteres em 2-d com letras alfabéticas minúsculas distintas, defina o reflexo de uma letra na matriz como trocando-a pelo caractere diretamente à frente, através do centro do quadrado.

Assim, um reflexo da carta cem

abcde
fghij
klmno
pqrst
uvwxy

resultaria na configuração

abwde
fghij
klmno
pqrst
uvcxy

porque o ce o wforam trocados.

Mais alguns exemplos (com a mesma configuração original como acima):

Refletir o personagem eformaria

 abcdu
 fghij
 klmno
 pqrst
 evwxy

Refletir o personagem mfaria

 abcde
 fghij
 klmno
 pqrst
 uvwxy

Refletir o personagem bformaria

 axcde
 fghij
 klmno
 pqrst
 uvwby

O desafio

Dada uma matriz bidimensional de caracteres com letras minúsculas distintas, passe por cada caractere em uma determinada sequência e "reflita" na matriz.

Esclarecimentos: As letras da sequência são de a-z, as letras são únicas e a matriz é de pelo menos 1x1 e no máximo 5x5 (obviamente, como existem apenas 26 caracteres no alfabeto inglês). É garantido que os caracteres da sequência sejam na matriz 2-d. A cadeia tem no máximo 100 caracteres.

Entrada

Uma sequência s, um número inteiro Ne, em seguida, uma NxNmatriz de caracteres.

Exemplo

Entrada:

ac
2
ab
cd

Resultado:

dc
ba

* Motivo: primeiro, reflita o acom o d. Em seguida, reflita o ccom o bporque cé a segunda letra na sequência de entrada.


Pontuação

  • A saída pode ser fornecida por qualquer método conveniente .
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.

Vencedor Atual


9
Meia hora não é realmente tempo suficiente para tirar qualquer uso significativo da caixa de areia.
Post Rock Garf Hunter

3
Não tem problema, parece bom.
user202729

1
(também temos um cabeçalho de snippet de pilha )
user202729

6
50 horas é muito pouco para aceitar um vencedor; normalmente você gostaria de esperar uma semana ou mais. No entanto, no PPCG, é prática comum não aceitar respostas, porque isso desencoraja respostas futuras e queremos manter os desafios abertos para sempre.
HyperNeutrino

2
Todos os seus exemplos têm os caracteres em ordem alfabética. Presumo que não é uma suposição que possamos fazer? Além disso, temos que tomar Ncomo entrada se não precisarmos disso?
Stewie Griffin

Respostas:


3

Oitava , 85 68 66 bytes

Usando eval, com um loop dentro, economizamos muitos bytes! Eu me inspirei nesta resposta 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"

Experimente online!

Explicação:

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'

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

Experimente online!

Toma entrada:

  • s: corda
  • N: ignorado
  • a: sequência de caracteres unida

Retorna uma lista simples de caracteres


Se eu tiver que pegar a matriz como uma 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)]

Experimente online!

Toma entrada:

  • s: corda
  • n: int
  • a: Listas 2D de caracteres

Retorna uma lista 2D de caracteres


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 a matriz de caracteres de entrada em vez de retornar uma nova para salvar bytes.

Experimente online.

Explicação:

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

Dang, codificação em 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)]

Experimente online!

Retorna uma matriz 2D de caracteres.


Você deve conseguir isso ainda mais .. Não há como modificar a matriz de entrada mais curta em Java do que em Python ..; p Para começar (e torná-lo 1 byte mais curto em vez de 1 byte mais do que minha resposta Java): Removendo o ae be utilizando n+~xe n+~yeconomiza directamente 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 graças a Giuseppe.

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

Experimente online!

Insere um vetor de caracteres para pesquisar como s, tamanho da matriz como ne própria matriz como m. Se for absolutamente necessário considerar o primeiro argumento como string , isso estragaria a diversão.


Usando índices lógicos ao invés de numéricos, eu golfed até 61 bytes
Giuseppe

Uau, isso é uma grande melhoria, muito obrigado.
precisa

0

Geléia , 15 14 bytes

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

Experimente online!

Programa completo.

Explicação:

FW; Ṛi, C $ ¥ ¦ / ṁḷY Link principal. Entrada: ['ab', 'cd'] (esquerda), 'ac' (direita).
FW                    F latten e W rap em uma lista. Valor atual = ['abcd'].
  ; Concatene-o com o argumento correto. ['abcd', 'a', 'c']
          / Reduzir a partir da esquerda:
   Apply ¦ Aplicar  everse em ...
    i ¥ o índice (do argumento da direita no argumento da esquerda) ...
     , C $ e seu índice de complemento.

A última operação precisa de mais explicações. Denote f = Ṛi,C$¥¦, em seguida, para o valor ['abcd','a','c']que calcula ('abcd' f 'a') f 'c', que se expande para:

Ṛi, C $ ¥ ¦ Função f . Suponha que o argumento esquerdo = 'abcd' e o argumento direito = 'a'
Primeiro, calcule o inverso. Obtenha 'dcba'.
 i ¥ Para calcular os índices aos quais aplicar, primeiro o índice de 'a' em 'abcd'
             is ('abcd' i 'a') = 1. (primeiro índice)
  , C $ Em seguida, emparelhe com (1 C) = 0. (último índice)
      ¦ Aplique 'dcba' em 'abcd' nos índices 0 e 1:

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

0

Retina 0.8.2 , 96 bytes

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

Experimente online! Pega a sequência se a matriz de caracteres como uma sequência delimitada por nova linha sem o número inteiro N. Explicação: Cada caractere cde sé processado por sua vez. O regex corresponde a duas posições equidistantes das extremidades da matriz, das quais uma é ce a outra é seu espelho m. Esses caracteres são trocados e cremovidos de s.

+`

Processa cada caractere spor vez.

^(.)

$1capturas c.

(.*¶(.|¶)*)

$3captura uma pilha de caracteres na matriz que prefixa um de cou m. $2captura o restante de smais todos esses caracteres.

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

Se mpreceder c, $4tiver um valor, $5captura me $6captura os caracteres entre me c. $7captura $6como uma pilha, mas seu valor não é usado.

\1

c agora é correspondido na própria matriz.

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

Se mainda não foi correspondido, $8opcionalmente captura um valor; nesse caso, $9captura os caracteres de cpara m, $10captura $9como uma pilha que não é usada e $11captura m. O valor é opcional no caso ce mtem o mesmo caractere.

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

$12captura os caracteres com o sufixo outro de ce m. Um grupo de balanceamento é usado para garantir que ele $12seja $3profundo, ou seja, o prefixo e o sufixo tenham o mesmo comprimento.

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

As peças são reunidas novamente - primeiro o restante se o prefixo da matriz, se cprecedido me mdepois para o meio e, em seguida c, se mprecedido cpara o meio e m, em seguida, o sufixo.

1A`

Agora que sestá vazio, ele é excluído.


0

JavaScript, 85 bytes

Toma uma string Se uma matriz Acomo string unida.

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


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.