Réflexion de tableau de chaînes intermédiaire

16

Commençons par redéfinir la réflexion d'un personnage dans un tableau 2D de caractères:

Étant donné un tableau carré de caractères 2D avec des lettres alphabétiques en minuscules distinctes, définissez le reflet d'une lettre dans la matrice en l'échangeant avec le caractère directement en face à travers le centre du carré.

Ainsi, un reflet de la lettre c dans

abcde
fghij
klmno
pqrst
uvwxy

entraînerait la configuration

abwde
fghij
klmno
pqrst
uvcxy

parce que le c et le wont été commutés.

Quelques exemples supplémentaires (avec la même configuration d'origine que ci-dessus):

Refléter le personnage ese formerait

 abcdu
 fghij
 klmno
 pqrst
 evwxy

Refléter le personnage mferait

 abcde
 fghij
 klmno
 pqrst
 uvwxy

Refléter le personnage bse formerait

 axcde
 fghij
 klmno
 pqrst
 uvwby

Le défi

Étant donné un tableau 2D de caractères avec des lettres minuscules distinctes, parcourez chaque caractère d'une chaîne donnée et "réfléchissez" la matrice.

Clarifications: les lettres de la chaîne proviennent de a-z, les lettres sont uniques et le tableau est au moins 1x1 et au plus 5x5 (évidemment, car il n'y a que 26 caractères dans l'alphabet anglais.) Les caractères de la chaîne sont garantis pour être dans le tableau 2D. La chaîne comporte au maximum 100 caractères.

Contribution

Une chaîne s, un entier N, puis unNxN tableau de caractères.

Exemple

Contribution:

ac
2
ab
cd

Production:

dc
ba

* Raison: Tout d'abord, reflétez le aavec le d. Ensuite, reflétez le cavec le bcar cest la deuxième lettre de la chaîne d'entrée.


Notation

  • La sortie peut être donnée par n'importe quelle méthode pratique .
  • Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
  • Failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.

Gagnant actuel

NL628
la source
9
Une demi-heure n'est pas vraiment assez de temps pour obtenir une utilisation significative du bac à sable.
Post Rock Garf Hunter
3
Pas de problème, ça a l'air bien.
user202729
1
(nous avons également un classement d' extrait de pile )
user202729
6
50 heures, c'est un peu trop court pour accepter un gagnant; généralement, vous voudriez attendre environ une semaine. Cependant, sur PPCG, il est courant de n'accepter aucune réponse car cela décourage les réponses futures, et nous voulons garder les défis ouverts pour toujours.
HyperNeutrino
2
Tous vos exemples ont les caractères dans l'ordre alphabétique. Je suppose que ce n'est pas une hypothèse que nous pouvons faire? Aussi, ne nous devons prendre Ncomme une entrée si nous ne avons pas besoin?
Stewie Griffin

Réponses:

3

Octave , 85 68 66 octets

L'utilisation eval, avec une boucle à l'intérieur, a permis d'économiser beaucoup d'octets! Je me suis inspiré de cette réponse 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"

Essayez-le en ligne!

Explication:

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
la source
2

Python 2 , 76 octets

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

Essayez-le en ligne!

Prend entrée:

  • s: chaîne
  • N: ignoré
  • a: chaîne de caractères jointe

Renvoie une liste plate de caractères


Si je dois prendre le tableau comme une liste:

Python 2 , 111 108 107 104 104 octets

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

Essayez-le en ligne!

Prend entrée:

  • s: chaîne
  • n: int
  • a: Listes 2D de caractères

Renvoie une liste 2D de caractères

TFeld
la source
1

Java 10, 126 123 116 116 octets

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

Modifie la matrice de caractères d'entrée au lieu d'en renvoyer une nouvelle pour enregistrer les octets.

Essayez-le en ligne.

Explication:

(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
la source
Dang, codage en java! ??!?! +1 Déf
NL628
1

Python 3 , 122 111 octets

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

Essayez-le en ligne!

Renvoie un tableau 2D de caractères.

Jo King
la source
Vous devriez pouvoir jouer au golf plus loin. Aucune modification de la matrice d'entrée n'est plus courte en Java qu'en Python ..; p le aet bet l' utilisation n+~xet n+~yenregistre directement 2 octets: a,b=n+~x,n+~y;A[x][y],A[a][b]=A[a][b],A[x][y]àA[x][y],A[n+~x][n+~y]=A[n+~x][n+~y],A[x][y]
Kevin Cruijssen
1

R , 74 61 octets

-13 octets grâce à Giuseppe.

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

Essayez-le en ligne!

Saisit un vecteur de caractères à rechercher s, la taille de la matrice net la matrice elle-même m. S'il est absolument nécessaire de prendre le premier argument comme chaîne , cela gâcherait à peu près le plaisir.

Kirill L.
la source
En utilisant des indices logiques plutôt que numériques, j'ai joué à 61 octets
Giuseppe
Wow, c'est une grosse amélioration, merci beaucoup.
Kirill L.
0

Gelée , 15 14 octets

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

Essayez-le en ligne!

Programme complet.

Explication:

FW; Ṛi, C $ ¥ ¦ / ṁḷY Lien principal. Entrée: ['ab', 'cd'] (gauche), 'ac' (droite).
FW                    F latten et W rap dans une liste. Valeur actuelle = ['abcd'].
  ; Concatène-le avec le bon argument. ['abcd', 'a', 'c']
          / Réduire de gauche:
   ¯r | Appliquer ¯r Réverse à ...
    i ¥ l'index (de l'argument de droite dans l'argument de gauche) ...
     , C $ et son indice de complément.

La dernière opération nécessite plus d'explications. Notons f = Ṛi,C$¥¦, puis pour la valeur ['abcd','a','c']qu'il calcule ('abcd' f 'a') f 'c', qui se développe comme suit:

Ṛi, C $ ¥ ¦ Fonction f . Supposons que l'argument gauche = 'abcd' et l'argument droit = ​​'a'
Ṛ Calculez d'abord l'inverse. Obtenez 'dcba'.
 i ¥ Pour calculer les indices auxquels s'appliquer, d'abord l'indice de 'a' dans 'abcd'
             est ('abcd' i 'a') = 1. (premier index)
  , C $ Puis jumeler avec (1 C) = 0. (dernier indice)
      ¦ Appliquer 'dcba' à 'abcd' aux indices 0 et 1:

              a bc d
               d cb a
              ^ 1 ^ 0
              ====
              dbca
user202729
la source
0

Retina 0.8.2 , 96 octets

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

Essayez-le en ligne! Prend la chaîne set le tableau de caractères comme une chaîne délimitée par des sauts de ligne sans l'entier N. Explication: Chaque caractère cde sest traité à son tour. L'expression régulière correspond à deux positions équidistantes des extrémités du tableau, dont l'une est cet l'autre est son miroir m. Ces caractères sont échangés et csupprimés de s.

+`

Traite stour à tour chaque personnage .

^(.)

$1capture c.

(.*¶(.|¶)*)

$3 capture une pile de caractères dans le tableau en préfixant l'un des c ou m. $2capture le reste de stous ces personnages.

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

Si mprécède c, $4a une valeur, $5capture met$6 capture les caractères entre met c. $7capture $6comme une pile mais sa valeur n'est pas utilisée.

\1

c est maintenant mis en correspondance dans le tableau lui-même.

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

S'il mn'a pas déjà été mis en correspondance, $8capture éventuellement une valeur, auquel cas $9capture les caractères de cà m, $10capture $9comme une pile inutilisée et $11capturem . La valeur est facultative dans le cas cet mest le même caractère.

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

$12capture les caractères suffixant l'autre cetm . Un groupe d'équilibrage est utilisé pour s'assurer qu'il $12est aussi long que $3profond, c'est-à-dire que le préfixe et le suffixe sont de la même longueur.

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

Les morceaux sont ensuite réassemblés - d' abord le reste set le préfixe du tableau, puis si cprécédé mpuis mpuis au milieu, puis c, alors si mprécédéc puis le milieu puis m, le suffixe.

1A`

Maintenant que sc'est vide, il est supprimé.

Neil
la source
0

JavaScript, 85 octets

Prend la chaîne Set un tableau Acomme chaîne jointe.

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

darrylyeo
la source