Refleksi Array String Menengah

16

Mari kita mulai dengan mendefinisikan ulang refleksi karakter dalam array karakter 2-d:

Dengan deretan karakter 2-d persegi dengan huruf alfabet huruf kecil yang berbeda, tentukan cerminan huruf dalam matriks sebagai menukarnya dengan karakter tepat di seberangnya melalui bagian tengah kotak.

Dengan demikian, cerminan huruf cdalam

abcde
fghij
klmno
pqrst
uvwxy

akan menghasilkan konfigurasi

abwde
fghij
klmno
pqrst
uvcxy

karena cdan wtelah diaktifkan.

Beberapa contoh lagi (dengan konfigurasi asli yang sama seperti di atas):

Mencerminkan karakter eakan terbentuk

 abcdu
 fghij
 klmno
 pqrst
 evwxy

Mencerminkan karakter makan membuatnya

 abcde
 fghij
 klmno
 pqrst
 uvwxy

Mencerminkan karakter bakan terbentuk

 axcde
 fghij
 klmno
 pqrst
 uvwby

Tantangan

Diberikan array karakter 2-d dengan huruf kecil yang berbeda, buka setiap karakter dalam string yang diberikan dan "refleksikan" dalam matriks.

Klarifikasi: Huruf-huruf dalam string berasal dari a-z, huruf-hurufnya unik, dan susunannya setidaknya 1x1 dan paling banyak 5x5 (jelas, karena hanya ada 26 karakter dalam alfabet bahasa Inggris.) Karakter-karakter dalam string dijamin menjadi dalam array 2-d. Panjang string paling banyak 100 karakter.

Memasukkan

String s, integer N, dan kemudian NxNarray karakter.

Contoh

Memasukkan:

ac
2
ab
cd

Keluaran:

dc
ba

* Alasan: Pertama, refleksikan adengan d. Kemudian, refleksikan cdengan bkarena cadalah huruf kedua dalam string input.


Mencetak gol

  • Keluaran dapat diberikan dengan metode apa pun yang mudah .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Pemenang saat ini

NL628
sumber
9
Setengah jam sebenarnya bukan waktu yang cukup untuk mendapatkan penggunaan berarti dari kotak pasir.
Posting Rock Garf Hunter
3
Tidak masalah, itu terlihat bagus.
user202729
1
(juga kami memiliki leaderboard snippet Stack )
user202729
6
50 jam agak terlalu pendek untuk menerima pemenang; biasanya Anda ingin menunggu seminggu atau lebih. Namun, di PPCG, merupakan praktik umum untuk tidak menerima jawaban apa pun karena itu mengecilkan jawaban di masa depan, dan kami ingin menjaga tantangan terbuka selamanya.
HyperNeutrino
2
Semua contoh Anda memiliki karakter dalam urutan abjad. Saya menganggap itu bukan asumsi yang bisa kita buat? Juga, apakah kita harus mengambil Ninput jika kita tidak membutuhkannya?
Stewie Griffin

Jawaban:

3

Oktaf , 85 68 66 byte

Menggunakan eval, dengan loop di dalamnya menyimpan banyak byte! Saya mendapat inspirasi dari jawaban ini oleh Luis Mendo !

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

Cobalah online!

Penjelasan:

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
sumber
2

Python 2 , 76 byte

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

Cobalah online!

Mengambil input:

  • s: string
  • N: diabaikan
  • a: bergabung dengan serangkaian karakter

Mengembalikan daftar karakter yang rata


Jika saya punya mengambil array sebagai daftar:

Python 2 , 111 108 107 104 byte

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

Cobalah online!

Mengambil input:

  • s: string
  • n: int
  • a: Daftar karakter 2D

Mengembalikan daftar karakter 2D

TFeld
sumber
1

Java 10, 126 123 116 byte

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

Memodifikasi input karakter-matriks alih-alih mengembalikan yang baru untuk menghemat byte.

Cobalah online.

Penjelasan:

(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
sumber
Sial, coding di java! ??!?! +1 Def
NL628
1

Python 3 , 122 111 byte

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

Cobalah online!

Mengembalikan array karakter 2D.

Jo King
sumber
Anda harus bisa bermain golf ini lebih jauh .. Tidak ada cara memodifikasi matriks input lebih pendek di Jawa daripada di Python ..; p Untuk Anda mulai (dan membuatnya 1 byte lebih pendek, bukan 1 byte lebih lama dari jawaban Java saya): Menghapus yang adan bdan menggunakan n+~xdan n+~ylangsung menyimpan 2 bytes: a,b=n+~x,n+~y;A[x][y],A[a][b]=A[a][b],A[x][y]keA[x][y],A[n+~x][n+~y]=A[n+~x][n+~y],A[x][y]
Kevin Cruijssen
1

R , 74 61 byte

-13 byte terima kasih kepada Giuseppe.

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

Cobalah online!

Masukkan vektor karakter untuk dicari sebagai s, ukuran dari matriks sebagai ndan matriks itu sendiri sebagai m. Jika mutlak diperlukan untuk mengambil argumen pertama sebagai string , itu akan cukup merusak kesenangan.

Kirill L.
sumber
Dengan menggunakan indeks logis dan bukan numerik, saya bermain golf hingga 61 byte
Giuseppe
Wow, itu peningkatan yang lumayan, terima kasih banyak.
Kirill L.
0

Jelly , 15 14 byte

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

Cobalah online!

program penuh.

Penjelasan:

FW; Ṛi, C $ ¥ ¦ / ṁḷY Tautan utama. Input: ['ab', 'cd'] (kiri), 'ac' (kanan).
FW                    F latten dan W rap dalam daftar. Nilai saat ini = ['abcd'].
  ; Kombinasikan dengan argumen yang benar. ['abcd', 'a', 'c']
          / Kurangi dari kiri:
   Ṛ ¦ Terapkan  everse di ...
    i ¥ indeks (argumen kanan dalam argumen kiri) ...
     , C $ dan indeks komplemennya.

Operasi terakhir membutuhkan lebih banyak penjelasan. Nyatakan f = Ṛi,C$¥¦, lalu untuk nilai ['abcd','a','c']yang dihitungnya ('abcd' f 'a') f 'c', yang meluas ke:

Ṛi, C $ ¥ ¦ Fungsi f . Asumsikan argumen kiri = 'abcd' dan argumen kanan = 'a'
Ṛ Pertama, hitung sebaliknya. Dapatkan 'dcba'.
 i ¥ Untuk menghitung indeks yang akan diterapkan, pertama indeks 'a' in 'abcd'
             is ('abcd' i 'a') = 1. (indeks pertama)
  , C $ Kemudian pasangkan dengan (1 C) = 0. (indeks terakhir)
      ¦ Terapkan 'dcba' ke 'abcd' di indeks 0 dan 1:

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

Retina 0.8.2 , 96 byte

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

Cobalah online! Mengambil string sdan array karakter sebagai string yang dibatasi-baris baru tanpa integer N. Penjelasan: Setiap karakter cdari sis diproses pada gilirannya. Regex cocok dengan dua posisi yang berjarak sama dari ujung array, yang satu adalah cdan yang lainnya adalah mirrornya m. Karakter-karakter ini ditukar dan cdihapus dari s.

+`

Memproses setiap karakter spada gilirannya.

^(.)

$1menangkap c.

(.*¶(.|¶)*)

$3menangkap setumpuk karakter dalam array yang mengawali salah satu catau m. $2menangkap sisa splus semua karakter ini.

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

Jika mmendahului c, $4memiliki nilai, $5menangkap mdan $6menangkap karakter antara mdan c. $7menangkap $6sebagai tumpukan tetapi nilainya tidak digunakan.

\1

c sekarang dicocokkan dalam array itu sendiri.

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

Jika mbelum cocok, maka $8secara opsional menangkap nilai, dalam hal ini $9menangkap karakter dari cke m, $10menangkap $9sebagai tumpukan yang tidak digunakan dan $11menangkap m. Nilai adalah opsional dalam kasus cdan madalah karakter yang sama.

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

$12menangkap karakter suffixing yang lain dari cdan m. Grup penyeimbang digunakan untuk memastikan $12selama $3kedalaman, yaitu awalan dan akhiran sama panjang.

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

Potongan-potongan itu kemudian disatukan kembali - pertama sisa sdan awalan array, kemudian jika cdidahului mlalu mtengah, lalu c, lalu jika mdidahului cmaka tengah maka m, lalu akhiran.

1A`

Sekarang skosong itu dihapus.

Neil
sumber
0

JavaScript, 85 byte

Mengambil string Sdan array Asebagai string yang bergabung.

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

Darrylyeo
sumber
0

Perl 5 -lpF , 97 byte

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

Cobalah online!

Xcali
sumber