Pośrednie odbicie tablicy łańcuchów

16

Zacznijmy od ponownego zdefiniowania odbicia znaku w dwuwymiarowej tablicy znaków:

Biorąc pod uwagę kwadratową tablicę 2-d znaków z wyraźnymi małymi literami alfabetu, zdefiniuj odbicie litery w matrycy jako zamianę znaku na znak znajdujący się naprzeciwko niego przez środek kwadratu.

Tak więc odbicie litery cw

abcde
fghij
klmno
pqrst
uvwxy

spowoduje konfigurację

abwde
fghij
klmno
pqrst
uvcxy

ponieważ ci wzostały zamienione.

Kilka innych przykładów (z taką samą oryginalną konfiguracją jak powyżej):

Powstanie odzwierciedlenie epostaci

 abcdu
 fghij
 klmno
 pqrst
 evwxy

Odzwierciedlające charakter muczyniłoby

 abcde
 fghij
 klmno
 pqrst
 uvwxy

Powstanie odzwierciedlenie bpostaci

 axcde
 fghij
 klmno
 pqrst
 uvwby

Wyzwanie

Biorąc pod uwagę tablicę 2D z wyraźnymi małymi literami, przejrzyj każdy znak w danym ciągu i „odzwierciedlaj” go w macierzy.

Wyjaśnienia: Litery w ciągu pochodzą z a-z, litery są unikalne, a tablica ma co najmniej 1x1 i co najwyżej 5x5 (oczywiście, ponieważ w alfabecie angielskim jest tylko 26 znaków) . Znaki w ciągu są gwarantowane w tablicy 2-d. Ciąg ma maksymalnie 100 znaków.

Wejście

Ciąg s, liczba całkowita N, a następnie NxNtablica znaków.

Przykład

Wejście:

ac
2
ab
cd

Wynik:

dc
ba

* Powód: Po pierwsze, odzwierciedlają az d. Następnie odzwierciedlają cz bponieważ cto drugie pismo w ciągu wejściowego.


Punktacja

  • Dane wyjściowe można podać dowolną dogodną metodą .
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Aktualny zwycięzca

NL628
źródło
9
Pół godziny to naprawdę za mało czasu, aby uzyskać sensowne wykorzystanie piaskownicy.
Post Rock Garf Hunter
3
Nie ma problemu, wygląda dobrze.
user202729
1
(mamy też
tabelę
6
50 godzin to trochę za mało, aby zaakceptować zwycięzcę; zazwyczaj chcesz poczekać tydzień. Jednak w przypadku PPCG powszechną praktyką jest nieakceptowanie żadnych odpowiedzi, ponieważ zniechęca to do przyszłych odpowiedzi, a my chcemy, aby wyzwania były otwarte na zawsze.
HyperNeutrino
2
Wszystkie przykłady mają znaki w kolejności alfabetycznej. Zakładam, że nie możemy tego założyć? Czy musimy również brać Njako dane wejściowe, jeśli nie są potrzebne?
Stewie Griffin

Odpowiedzi:

3

Oktawa , 85 68 66 bajtów

Korzystanie evalz pętli w środku pozwoliło zaoszczędzić wiele bajtów! Mam natchnienie z tej odpowiedzi przez Luis Mendo !

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

Wypróbuj online!

Wyjaśnienie:

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
źródło
2

Python 2 , 76 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe:

  • s: strunowy
  • N: zignorowany
  • a: dołączył ciąg znaków

Zwraca płaską listę znaków


Gdybym miał podjąć tablicę jako listę:

Python 2 , 111 108 107 104 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe:

  • s: strunowy
  • n: int
  • a: 2D listy znaków

Zwraca listę znaków 2D

TFeld
źródło
1

Java 10, 126 123 116 bajtów

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

Zmienia wejściową macierz znaków zamiast zwracać nową, aby zapisać bajty.

Wypróbuj online.

Wyjaśnienie:

(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
źródło
Dang, kodowanie w java! ??!?! +1 Def
NL628
1

Python 3 , 122 111 bajtów

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

Wypróbuj online!

Zwraca tablicę znaków 2D.

Jo King
źródło
Powinieneś być w stanie zagrać w golfa dalej. Nie ma mowy, aby modyfikacja macierzy wejściowej była krótsza w Javie niż w Pythonie ..; p Na początek (i uczynienie jej 1 bajtu krótszym zamiast 1 bajtu dłuższym niż moja odpowiedź Java): Usuwanie aa bi korzystania n+~xi n+~ybezpośrednio oszczędza 2 bajty: a,b=n+~x,n+~y;A[x][y],A[a][b]=A[a][b],A[x][y]doA[x][y],A[n+~x][n+~y]=A[n+~x][n+~y],A[x][y]
Kevin Cruijssen
1

R , 74 61 bajtów

-13 bajtów dzięki Giuseppe.

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

Wypróbuj online!

Wprowadza wektor znaków do wyszukiwania jako s, rozmiar matrycy jako ni samą matrycę jako m. Jeśli absolutnie konieczne jest przyjęcie pierwszego argumentu jako ciągu , prawie zepsułoby to zabawę.

Kirill L.
źródło
Używając raczej logicznych niż numerycznych wskaźników, grałem w golfa do 61 bajtów
Giuseppe,
Wow, to znaczna poprawa, wielkie dzięki.
Kirill L.,
0

Galaretka , 15 14 bajtów

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

Wypróbuj online!

Pełny program

Wyjaśnienie:

FW; Ṛi, C $ ¥ ¦ / ṁḷY Link główny. Dane wejściowe: [„ab”, „cd”] (po lewej), „ac” (po prawej).
FW                    F latten i W rapują go na liście. Aktualna wartość = [„abcd”].
  ; Połącz to z właściwym argumentem. [„abcd”, „a”, „c”]
          / Zmniejsz od lewej:
   ¦ ¦ Zastosuj verse everse w ...
    i index indeks (prawego argumentu w lewym argumencie) ...
     , C $ i jego indeks uzupełniający.

Ostatnia operacja wymaga więcej wyjaśnień. Oznacz f = Ṛi,C$¥¦, a następnie ['abcd','a','c']oblicza wartość ('abcd' f 'a') f 'c', która rozwija się do:

Ṛi, C $ ¥ ¦ Funkcja f . Załóżmy lewy argument = „abcd” i prawy argument = „a”
Ṛ Najpierw oblicz odwrotną stronę. Uzyskaj „dcba”.
 i ¥ Aby obliczyć stosowane wskaźniki, najpierw indeks „a” w „abcd”
             is ('abcd' i 'a') = 1. (pierwszy indeks)
  , C $ Następnie sparuj z (1 C) = 0. (ostatni indeks)
      ¦ Zastosuj „dcba” do „abcd” przy indeksach 0 i 1:

              a bc d
               d cb a
              ^ 1 ^ 0
              ====
              dbca
użytkownik202729
źródło
0

Retina 0.8.2 , 96 bajtów

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

Wypróbuj online! Bierze ciąg si tablicę znaków jako ciąg rozdzielany znakiem nowej linii bez liczby całkowitej N. Objaśnienie: Każda postać cz sprzetwarzane są z kolei. Wyrażenie regularne dopasowuje dwie pozycje w równej odległości od końców tablicy, z których jedna jest, ca druga jest jej lustrem m. Te postacie są zamieniane i csą usuwane z s.

+`

Przetwarza kolejno każdy znak s.

^(.)

$1przechwytuje c.

(.*¶(.|¶)*)

$3przechwytuje stos znaków w tablicy poprzedzającej jeden z club m. $2przechwytuje resztę splus wszystkie te postacie.

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

Jeśli mpoprzedza c, $4ma wartość, $5przechwytuje mi $6przechwytuje znaki pomiędzy mi c. $7przechwytuje $6jako stos, ale jego wartość nie jest używana.

\1

c jest teraz dopasowany w samej tablicy.

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

Jeśli mnie został jeszcze dopasowany, to $8opcjonalnie przechwytuje wartość, w którym to przypadku $9przechwytuje znaki od cdo m, $10przechwytuje $9jako stos, który nie jest używany i $11przechwytuje m. Wartość jest opcjonalna w przypadku ci mma ten sam znak.

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

$12przechwytuje znaki z przyrostkiem drugiego ci m. Grupa równoważąca służy do upewnienia się, że $12jest tak długa, jak $3głęboka, tzn. Że prefiks i sufiks mają tę samą długość.

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

Kawałki są następnie składane z powrotem - najpierw reszta si prefiks tablicy, a następnie, jeśli cpoprzedza, mto mśrodek, a następnie c, jeśli mpoprzedza, cto środek m, a następnie przyrostek.

1A`

Teraz sjest pusty, jest usuwany.

Neil
źródło
0

JavaScript, 85 bajtów

Pobiera ciąg Si tablicę Ajako ciąg połączony.

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

darrylyeo
źródło
0

Perl 5 -lpF , 97 bajtów

$i=0|<>;$_=join'',<>;s/\W//g;for$k(@F){/$k/g;$t=substr$_,-pos,1;eval"y/$t$k/$k$t/"}s%.{$i}%$&$/%g

Wypróbuj online!

Xcali
źródło