Intermediate String Array Reflection

16

Beginnen wir damit, eine Reflektion eines Zeichens in einem 2D-Array von Zeichen neu zu definieren:

Definieren Sie bei einem quadratischen 2-d-Array von Zeichen mit unterschiedlichen alphabetischen Kleinbuchstaben ein Abbild eines Buchstabens in der Matrix, indem Sie es durch die Mitte des Quadrats mit dem Zeichen direkt gegenüber vertauschen.

So ein Spiegelbild des Buchstabens cin

abcde
fghij
klmno
pqrst
uvwxy

würde in der Konfiguration führen

abwde
fghij
klmno
pqrst
uvcxy

weil die cund die wgeschaltet worden sind.

Einige weitere Beispiele (mit derselben ursprünglichen Konfiguration wie oben):

Das Reflektieren des Charakters ewürde sich bilden

 abcdu
 fghij
 klmno
 pqrst
 evwxy

Den Charakter zu reflektieren mwürde machen

 abcde
 fghij
 klmno
 pqrst
 uvwxy

Das Reflektieren des Charakters bwürde sich bilden

 axcde
 fghij
 klmno
 pqrst
 uvwby

Die Herausforderung

Bei einem 2-d-Array von Zeichen mit unterschiedlichen Kleinbuchstaben durchlaufen Sie jedes Zeichen in einer bestimmten Zeichenfolge und "reflektieren" es in der Matrix.

Erläuterungen: Die Buchstaben in der Zeichenfolge stammen von a-z, die Buchstaben sind eindeutig, und das Array ist mindestens 1x1 und höchstens 5x5 (offensichtlich, da das englische Alphabet nur 26 Zeichen enthält). Die Zeichen in der Zeichenfolge sind garantiert in der 2-d-Anordnung. Die Zeichenfolge ist höchstens 100 Zeichen lang.

Eingang

Eine Zeichenfolge s, eine Ganzzahl Nund dann ein NxNArray von Zeichen.

Beispiel

Eingang:

ac
2
ab
cd

Ausgabe:

dc
ba

* Grund: Reflektiere zuerst das amit dem d. Dann spiegeln Sie das cmit dem, bweil cder zweite Buchstabe in der Eingabezeichenfolge ist.


Wertung

  • Die Ausgabe kann auf jede bequeme Weise erfolgen .
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

Aktueller Gewinner

NL628
quelle
9
Eine halbe Stunde ist nicht genug Zeit, um den Sandkasten sinnvoll zu nutzen.
Weizen-Assistent
3
Kein Problem, es sieht gut aus.
user202729
1
(auch wir haben eine Stack-Snippet- Bestenliste)
user202729
6
50 Stunden sind etwas zu kurz, um einen Gewinner zu akzeptieren. Normalerweise möchten Sie eine Woche oder so warten. Bei PPCG ist es jedoch üblich, keine Antworten zu akzeptieren, da dies zukünftige Antworten abschreckt, und wir möchten Herausforderungen für immer offen halten.
HyperNeutrino
2
In allen Beispielen sind die Zeichen in alphabetischer Reihenfolge aufgeführt. Ich nehme an, das ist keine Annahme, die wir machen können. Außerdem tun wir haben zu nehmen Nals eine Eingabe , wenn wir es nicht brauchen?
Stewie Griffin

Antworten:

3

Oktave , 85 68 66 Bytes

Durch die Verwendung evaleiner Schleife wurden viele Bytes gespart! Diese Antwort von Luis Mendo hat mich inspiriert !

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

Probieren Sie es online!

Erläuterung:

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

Probieren Sie es online!

Übernimmt die Eingabe:

  • s: string
  • N: ignoriert
  • a: Zeichenfolge verbunden

Gibt eine flache Liste von Zeichen zurück


Wenn ich habe das Array als Liste in Anspruch nehmen:

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

Probieren Sie es online!

Übernimmt die Eingabe:

  • s: string
  • n: int
  • a: 2D-Listen von Zeichen

Gibt eine 2D-Liste von Zeichen zurück

TFeld
quelle
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;}}

Ändert die eingegebene Zeichenmatrix, anstatt eine neue zurückzugeben, um Bytes zu speichern.

Probieren Sie es online aus.

Erläuterung:

(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
quelle
Dang, Codierung in 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)]

Probieren Sie es online!

Gibt ein 2D-Array von Zeichen zurück.

Scherzen
quelle
Sie sollten in der Lage sein, weiter Golf zu spielen. Keine Möglichkeit, die Eingabematrix in Java zu ändern, ist kürzer als in Python das aund bund mit n+~xund n+~yspeichert direkt 2 Bytes: a,b=n+~x,n+~y;A[x][y],A[a][b]=A[a][b],A[x][y]zuA[x][y],A[n+~x][n+~y]=A[n+~x][n+~y],A[x][y]
Kevin Cruijssen
1

R , 74 61 Bytes

-13 Bytes dank Giuseppe.

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

Probieren Sie es online!

Gibt einen Vektor von Zeichen für die Suche s, die Größe der Matrix als nund die Matrix selbst als ein m. Wenn es absolut notwendig ist, das erste Argument als Zeichenfolge zu verwenden , würde dies den Spaß ziemlich beeinträchtigen.

Kirill L.
quelle
Unter Verwendung logischer statt numerischer Indizes habe ich auf 61 Bytes
Giuseppe,
Wow, das ist eine kräftige Verbesserung, vielen Dank.
Kirill L.
0

Jelly , 15 bis 14 Bytes

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

Probieren Sie es online!

Volles Programm.

Erläuterung:

FW; Ṛi, C $ ¥ ¦ / ṁḷY Hauptverbindung. Eingabe: ['ab', 'cd'] (links), 'ac' (rechts).
FW                    F latten und W rap es in einer Liste. Aktueller Wert = ['abcd'].
  ; Verketten Sie es mit dem richtigen Argument. ['abcd', 'a', 'c']
          / Verkleinern von links:
   Ṛ ¦ Anwenden  Umgekehrt bei ...
    i ¥ der Index (des rechten Arguments im linken Argument) ...
     , C $ und sein Komplementindex.

Die letzte Operation bedarf weiterer Erklärung. Bezeichne f = Ṛi,C$¥¦, dann berechnet ['abcd','a','c']es für den Wert ('abcd' f 'a') f 'c', der erweitert wird zu:

Ṛi, C $ ¥ ¦ Funktion f . Angenommen, linkes Argument = 'abcd' und rechtes Argument = 'a'
Ṛ Berechnen Sie zunächst die Umkehrung. Holen Sie sich "dcba".
 i ¥ Um die Indizes zu berechnen, auf die angewendet werden soll, zuerst den Index von 'a' in 'abcd'
             is ('abcd' i 'a') = 1. (erster Index)
  , C $ Dann Paar mit (1 C) = 0. (letzter Index)
      ¦ Wenden Sie 'dcba' bei den Indizes 0 und 1 auf 'abcd' an:

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

Retina 0,8,2 , 96 Bytes

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

Probieren Sie es online! Nimmt die Zeichenfolge sund das Zeichenarray als durch Zeilenumbrüche getrennte Zeichenfolge ohne die Ganzzahl N. Erläuterung: Jedes Zeichen cvons wird nacheinander verarbeitet. Der reguläre Ausdruck entspricht zwei Positionen mit gleichem Abstand von den Enden des Arrays, von denen die eine cund die andere der Spiegel ist m. Diese Zeichen werden ausgetauscht und aus centfernt s.

+`

Verarbeitet jeden Charakter der sReihe nach.

^(.)

$1 erfasst c .

(.*¶(.|¶)*)

$3Erfasst einen Stapel von Zeichen im Array mit dem Präfix coderm . $2erfasst den Rest von splus all diesen Zeichen.

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

Wenn mvorangeht c, $4hat einen Wert, $5erfasst mund $6erfasst die Zeichen zwischen mund c.$7erfasst $6als Stapel, aber sein Wert wird nicht verwendet.

\1

c wird jetzt im Array selbst abgeglichen.

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

Wenn mnicht bereits abgestimmt, dann $8fängt optional einen Wert, in welchem Fall $9die Zeichen von fängt can m, $10erfasst $9als Stapel , die nicht benutzt wird und $11erfasstm . Der Wert ist in diesem Fall optional cund hat mdasselbe Zeichen.

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

$12 fängt die Zeichen ein, die mit dem Suffix des anderen von c undm . Mit einer Bilanzgruppe wird sichergestellt, dass $12die Länge so lang ist, wie sie $3tief ist, dh Präfix und Suffix sind gleich lang.

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

Die Stücke werden dann wieder zusammengesetzt - zuerst den Rest sund das Präfix des Arrays, dann , wenn cvorausgegangen mdann mdann die Mitte, dann c, dann , wennm vorangegangen ist, cdann die Mitte m, dann das Suffix.

1A`

Nun sist das leer, es wird gelöscht.

Neil
quelle
0

JavaScript, 85 Bytes

Nimmt string Sund ein Array Aals verknüpften String.

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

darrylyeo
quelle