中级字符串数组反射


16

让我们从在二维字符数组中重新定义字符的反射开始:

给定一个方形的二维数组,其中的字符带有不同的小写字母字母,则定义一个字母在矩阵中的反射,即将其与通过正方形中心直接从其对面的字符交换。

因此,c

abcde
fghij
klmno
pqrst
uvwxy

会导致配置

abwde
fghij
klmno
pqrst
uvcxy

因为cw已被切换。

其他一些示例(具有与上述相同的原始配置):

反映人物e会形成

 abcdu
 fghij
 klmno
 pqrst
 evwxy

反映角色m将使

 abcde
 fghij
 klmno
 pqrst
 uvwxy

反映人物b会形成

 axcde
 fghij
 klmno
 pqrst
 uvwby

挑战

给定二维数组的字符,这些字符具有不同的小写字母,请遍历给定字符串中的每个字符,然后将其“反射”到矩阵中。

说明:字符串中a-z的字母是from ,字母是唯一的,并且数组至少为1x1,最大为5x5(显然,英文字母中只有26个字符。)字符串中的字符必须保证为在二维数组中 该字符串最长为100个字符。

输入值

一个字符串s,一个整数N,然后是一个NxN字符数组。

输入:

ac
2
ab
cd

输出:

dc
ba

*原因:首先,反映ad。然后,用来反映cb因为c是输入字符串中的第二个字母。


计分

  • 输出可以通过任何方便的方法给出。
  • 完整的程序或功能都是可以接受的。如果是函数,则可以返回输出而不是打印输出。
  • 禁止出现标准漏洞
  • 这是因此所有常见的高​​尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

现任优胜者


9
半小时实际上不是足够的时间来从沙箱中获得任何有意义的使用。
发布岩石Garf Hunter,

3
没问题,看起来不错。
user202729 '18

1
(我们还有一个堆栈
摘要

6
50小时太短了,无法接受获胜者;通常,您需要等待一周左右。但是,在PPCG上,通常的做法是不接受任何答案,因为这会阻止将来的答案,我们希望永远保持挑战。
HyperNeutrino

2
您所有的示例都按字母顺序排列字符。我认为这不是我们可以做的假设?另外,如果我们不需要它,我们是否必须N作为输入?
Stewie Griffin '18

Answers:


3

八度85 68 66字节

使用eval,内部有一个循环,节省了很多字节!我从路易斯·门多Luis Mendo)的回答中得到了启发!

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

在线尝试!

说明:

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个字节

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

在线尝试!

接受输入:

  • s:字符串
  • N:被忽略
  • a:加入的字符串

返回字符的平面列表


如果我必须将数组作为列表:

Python 2中111个 108 107 104字节

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

在线尝试!

接受输入:

  • s:字符串
  • n:int
  • a:二维字符列表

返回二维字符列表


1

爪哇10,126个 123 116字节

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

修改输入字符矩阵,而不是返回新的字符矩阵以节省字节。

在线尝试。

说明:

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

当当,用Java编码!+1 Def
NL628

1

Python 3122 111字节

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

在线尝试!

返回2D字符数组。


您应该能够进一步打高尔夫球。.在Java中修改输入矩阵的方法要比在Python中短。.; p要开始使用(并使其比我的Java答案短1个字节而不是1个字节):的ab,并使用n+~xn+~y:直接保存2个字节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]
凯文Cruijssen

1

[R 74 61字节

-13字节,感谢Giuseppe。

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

在线尝试!

输入要搜索的字符向量,s矩阵大小为n,矩阵本身为m。如果绝对有必要将第一个参数作为string,那将极大地破坏乐趣。


使用逻辑索引而不是数字索引,我精简了61个字节
Giuseppe

哇,这是一个很大的进步,非常感谢。
Kirill L.

0

果冻15 14字节

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

在线尝试!

完整程序。

说明:

FW;Ṛi,C $¥¦ /ṁḷY主链接。输入:['ab','cd'](左),'ac'(右)。
FW                    ˚F薄金属片和w ^说唱它在列表中。当前值= ['abcd']。
  ; 将其与正确的参数连接。['abcd','a','c']
          /从左减少:
   at ¦将反向应用于...
    我¥(左参数中右参数的索引)...
     ,C $及其补充指数。

最后的操作需要更多说明。表示f = Ṛi,C$¥¦,然后['abcd','a','c']计算('abcd' f 'a') f 'c'其值,它扩展为:

Ṛi,C $¥¦函数f。假设左参数='abcd'和右参数='a'
Ṛ首先,计算反向。获取“ dcba”。
 要计算要应用的索引,请先在“ abcd”中计算“ a”的索引
             是('abcd'i'a')=1。(第一个索引)
  ,C $然后与(1 C)= 0配对。(最后一个索引)
      ¦在索引0和1处将'dcba'应用于'abcd'

              a bc d
               d cb a
              ^ 1 ^ 0
              ====
              数据库

0

视网膜0.8.2,96字节

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

在线尝试!将字符串s和字符数组作为不带整数的换行符分隔的字符串N。说明:每个字符cs依次处理的IS。正则表达式匹配两个与数组末端等距的位置,一个是c,另一个是它的mirror m。这些字符被交换并c从中删除s

+`

s依次处理每个字符。

^(.)

$1捕获c

(.*¶(.|¶)*)

$3捕获数组中以c或为前缀的字符堆栈m$2捕获其余s所有这些字符。

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

如果m先于c$4有一个值,$5捕获m$6捕获之间的字符mc$7捕获$6为堆栈,但未使用其值。

\1

c 现在与数组本身匹配。

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

如果m没有已经匹配,然后$8任选地捕获的值,在这种情况下$9,从拍摄的人物cm$10捕获$9作为堆栈,其是未使用的和$11捕获m。该值是可选的情况下c,并m有相同的字符。

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

$12捕获后缀为c和的字符m。平衡组用于确保$12长度尽可能长$3,即前缀和后缀的长度相同。

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

然后将各个部分放在一起-首先是s数组的其余部分和前缀,然后是(如果c在先的m话)m然后是中间的话,然后是c,然后(如果m在先的c话则是中间的话m)然后是后缀。

1A`

现在s为空,将其删除。


0

JavaScript,85个字节

将字符串S和数组A作为连接字符串。

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


0

Perl -lpF 5,97个字节

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

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.