匹配相邻词


27

在此挑战中,您会听到两个词:您的工作是确定它们是否相邻

如果两个字母相邻,则:

  1. 他们是同一封信,或者
  2. 它们在字典上是相邻的。

例如,J仅与IJK相邻。 ZA不相邻

如果两个单词相邻,则:

  1. 它们的长度相同,并且
  2. 每个字母都与另一个单词中的唯一字母相邻。

例如,CAT邻近SAD,如C> d,A> A,T>取值
FREEGRRD不相邻(每个E需要一个字母配对)

输入输出

您传递了两个字符串,如果它们相邻,则需要返回一个真实值,否则返回一个虚假值。您应该在一分钟内返回以下所有测试用例。

您可以假设字符串仅包含大写字母。

这两个字符串可以作为列表传递,也可以串联在一起,带或不带引号。

测试用例

真相:

A A
A B
C B
DD CE
DE FC
ABCD BCDE
AACC DBBB
DJENSKE FDJCLMT
DEFGHIJKL HJLEHMCHE
IKLIJJLIJKKL LJLJLJLJLJHI
ACEGIKMOQSUWY BLNPRDFTVHXJZ
QQSQQRRQSTTUQQRRRS PQTTPPTTQTPQPPQRTP
ELKNSDUUUELSKJFESD DKJELKNSUELSDUFEUS

虚假:

A C
A Z
B J
JK J
CC BA
CE D
DJENSKE GDJCLMT
DEFGHIJKL HJLHMCHE
IJKLIJKLKIJL LIJLLHJLJLLL 
AWSUKMEGICOQY RSHXBLJLNQDFZ
QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT
ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS

这是,因此最短的有效答案将获胜!


输入中可以有引号"A A"吗?
TanMath

修复测试用例。行情很好。
内森·美林

输入的内容只能是大写吗?
TanMath

您可以假设是的。
内森·美林

我认为您应该在质询文本中提及允许使用引号定义输入字符串。表格的单个数组是否也{'string1' 'string2'}可以接受?
路易斯·门多

Answers:


11

CJam,14 13 12字节

r$r$.-:)3,-!

在线尝试!一次验证所有测试用例

算法

st为两个长度相同的排序词。为了使st在字典上相邻(LA),有必要且足够的是,所有其对应字符对也都为LA。

该条件显然对所有单词都足够,对于长度为1的单词来说是必要条件。

现在,假设st的长度n> 1,并且让ab分别是st的第一个字符。

由于小号是LA,有一些双射映射φ的字符之间小号和的字符,使得Xφ(x)的是LA所有X小号的,这意味着| X - φ(x)|的 ≤1所有X小号

c =φ(a)d =φ -1(b)。由于ab的极小性,a≤d(1)b≤c(2)

此外,由于bdac以及LA,所以d≤b+ 1(3),并且c≤a+ 1(4)

通过组合(1)(3)以及(2)(4),我们得出a≤d≤b +1b≤c≤a +1,由此得出a-1≤b≤a +1,因此ab为LA。

现在,通过组合(1)(4)以及(2)(3),我们得出c-1≤a≤dd-1≤b≤c,由此得出c-1≤d ≤c +1,因此cd为LA。

因此,如果我们用φ(a)= bφ(d)= c重新定义φ| x-φ(x)| ≤1仍然将持有的所有X小号和,特别是,对于所有的XS [1:]

这样,s [0] = at [0] = b,并且s [1:]t [1:]是LA。

由于s [1:]的长度为n-1,因此证明了归纳法的必要性。

r               e# Read the first word from STDIN.
 $              e# Sort its characters.
  r             e# Read the second word from STDIN.
   $            e# Sort its characters.
    .-          e# Perform vectorized subtraction.
                e# This pushes either the difference of char codes of two
                e# corresponding characters or a character that has no does not
                e# correspond to a character in the other, shorter word.
      :)        e# Increment all results.
                e# In particular, this maps [-1 0 1] to [0 1 2].
        3,      e# Push the range [0 1 2].
          -     e# Perform set difference, i.e., remove all occurrences of 0, 1 and
                e# 2 from the array of incremented differences.
           !    e# Apply logical NOT. This gives 1 iff the array was empty iff
                e# all differences gave -1, 0 or 1.

我认为这里有一个更简单的论据-匹配违反排序顺序的唯一地方是当两个事物像like一样交叉时C->Y, D->X,而这些东西不能交叉。
xnor

@xnor基本上就是我写的。只是很多更多的单词。:P
丹尼斯,

4

MATL,10 12 17字节

c!S!odXl2<

这使用了丹尼斯(Dennis)的方法:首先进行排序,然后比较匹配位置的字符。

输入是一个字符串数组,格式为{'CAT 'SAD'}

输出是零和一的数组。如果结果包含所有内容,则它是真实的(这被认为是真实的)。

使用当前版本(10.2.1),它比此挑战要早。

编辑:函数Xl已被重命名|为该语言的较新版本(并且o不再需要)。下面的链接包括那些修改。

在线尝试!

说明

c         % implicitly cell array of strings and convert to 2D char array. 
          % This pads with spaces if needed
!S!       % sort each row
o         % convert array from char to double
d         % difference between elements in the same column
Xl        % absolute value of each entry
2         % number literal
<         % each entry becomes 1 if smaller than 2 (adjacent letters), and 0 otherwise

旧方法,接受字符串作为单独的输入:12个字节

SiSXhcodXl2<

编辑:链接中的代码已根据语言的更改进行了修改;参见上面的评论。

在线尝试

说明

S         % implicitly input first string and sort
iS        % input second string and sort
Xh        % build cell array with these two strings
c         % convert to 2D char array. This pads with spaces if needed
o         % convert array from char to double
d         % difference between elements in the same column
Xl        % absolute value of each entry
2         % number literal
<         % each entry becomes 1 if smaller than 2 (adjacent letters), and 0 otherwise

1
因此,数组[1 0 1]在MATL中是虚假的。这很有用。
丹尼斯

@Dennis在其他语言中也不是假的吗?在Matlab / Octave中,它是这样工作的:所有元素都必须为非零
Luis Mendo

1
否。事实上,我不知道另一种语言会表现这种方式。例如,在Python和CJam中,数组是真实的,前提是它们不是空的。例如,在JavaScript和Ruby中,所有数组都是真实的。
丹尼斯

@Dennis这对我的Matlab思维方式很奇怪。那么在Python中,数组[0 0]是真的吗?
路易斯·门多

1
是的,因为它的长度是正数。打高尔夫球时通常很烦人。
丹尼斯

2

C,233字节

#include <stdlib.h>
#include <string.h>
#define h char
#define r return
int c(void*a,void*b){r*(h*)a-*(h*)b;}int a(h*s,h*t){int l=strlen(s),m=strlen(t);if(l!=m)r 0;qsort(s,l,1,c);qsort(t,m,1,c);while(l--)if(abs(s[l]-t[l])>1)r 0;r 1;}

您可以通过将其另存为adj.h然后使用以下adj.c文件来对其进行测试:

#include <stdio.h>
#include "adj.h"

int main() {
  char aa[] = "A", A[] = "A";
  char b[] = "A", B[] = "B";
  char cc[] = "C", C[] = "B";
  char d[] = "DD", D[] = "CE";
  char e[] = "DE", E[] = "FC";
  char f[] = "ABCD", F[] = "BCDE";
  char g[] = "AACC", G[] = "DBBB";
  char hh[] = "DJENSKE", H[] = "FDJCLMT";
  char i[] = "DEFGHIJKL", I[] = "HJLEHMCHE";
  char j[] = "IKLIJJLIJKKL", J[] = "LJLJLJLJLJHI";
  char k[] = "ACEGIKMOQSUWY", K[] = "BLNPRDFTVHXJZ";
  char l[] = "QQSQQRRQSTTUQQRRRS", L[] = "PQTTPPTTQTPQPPQRTP";
  char m[] = "ELKNSDUUUELSKJFESD", M[] = "DKJELKNSUELSDUFEUS";
  char n[] = "A", N[] = "C";
  char o[] = "A", O[] = "Z";
  char p[] = "B", P[] = "J";
  char q[] = "JK", Q[] = "J";
  char rr[] = "CC", R[] = "BA";
  char s[] = "CE", S[] = "D";
  char t[] = "DJENSKE", T[] = "GDJCLMT";
  char u[] = "DEFGHIJKL", U[] = "HJLHMCHE";
  char v[] = "IJKLIJKLKIJL", V[] = "LIJLLHJLJLLL";
  char w[] = "AWSUKMEGICOQY", W[] = "RSHXBLJLNQDFZ";
  char x[] = "QQSQQRRQSTTUQQQRRS", X[] = "PQTTPPTTQTPQPPQRTT";
  char y[] = "ELKNSDUVWELSKJFESD", Y[] = "DKJELKNSUELSDUFEUS";
  char *z[] = {aa,b,cc,d,e,f,g,hh,i,j,k,l,m,n,o,p,q,rr,s,t,u,v,w,x,y};
  char *Z[] = {A ,B,C ,D,E,F,G,H ,I,J,K,L,M,N,O,P,Q,R ,S,T,U,V,W,X,Y};

  for(int _=0;_<25;_++) {
    printf("%s %s: %s\r\n", z[_], Z[_], a(z[_], Z[_]) ? "true" : "false");
  }

  return 0;
}

然后使用编译gcc adj.c -o adj。输出为:

A A: true
A B: true
C B: true
DD CE: true
DE CF: true
ABCD BCDE: true
AACC BBBD: true
DEEJKNS CDFJLMT: true
DEFGHIJKL CEEHHHJLM: true
IIIJJJKKKLLL HIJJJJJLLLLL: true
ACEGIKMOQSUWY BDFHJLNPRTVXZ: true
QQQQQQQRRRRRSSSTTU PPPPPPPQQQQRTTTTTT: true
DDEEEFJKKLLNSSSUUU DDEEEFJKKLLNSSSUUU: true
A C: false
A Z: false
B J: false
JK J: false
CC AB: false
CE D: false
DEEJKNS CDGJLMT: false
DEFGHIJKL HJLHMCHE: false
IIIJJJKKKLLL HIJJJLLLLLLL: false
ACEGIKMOQSUWY BDFHJLLNQRSXZ: false
QQQQQQQQRRRRSSSTTU PPPPPPQQQQRTTTTTTT: false
DDEEEFJKKLLNSSSUVW DDEEEFJKKLLNSSSUUU: false

2

Python 2,90个字节

lambda A,B:all(ord(b)-2<ord(a)<ord(b)+2for a,b in zip(sorted(A),sorted(B)))*len(A)==len(B)

简单的匿名函数,我必须单独检查长度,因为zip它将连续。itertoolszip_longest)中有一个类似的函数,可以填充空字符串,但这会非常昂贵。

用测试

f=lambda A,B:all(ord(b)-2<ord(a)<ord(b)+2for a,b in zip(sorted(A),sorted(B)))*len(A)==len(B)

for case in testCases.split('\n'):
    print case, f(*case.split())

产生:

A A True
A B True
C B True
DD CE True
DE FC True
ABCD BCDE True
AACC DBBB True
DJENSKE FDJCLMT True
DEFGHIJKL HJLEHMCHE True
IKLIJJLIJKKL LJLJLJLJLJHI True
ACEGIKMOQSUWY BLNPRDFTVHXJZ True
QQSQQRRQSTTUQQRRRS PQTTPPTTQTPQPPQRTP True
ELKNSDUUUELSKJFESD DKJELKNSUELSDUFEUS True
A C False
A Z False
B J False
JK J False
CC BA False
CE D False
DJENSKE GDJCLMT False
DEFGHIJKL HJLHMCHE False
IJKLIJKLKIJL LIJLLHJLJLLL  False
AWSUKMEGICOQY RSHXBLJLNQDFZ False
QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT False
ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS False

2

JavaScript(ES6),86 90 94

编辑 4个已保存的字节@Neil
编辑2个 4个已保存的字节@ Mwr247

(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)

注意:对字母进行邻接检查。以这对货币对作为底数为36的n,如果字母相等,则n = a*36+a = a*37。如果相差1,则n = a*36+a+1 = a*37+1n = a*36+a-1 = a*37-1。因此n % 37必须为0、1或36。并且n%37%36必须为0或1。

注2:添加的“ 0”用于确保a和b的长度相同。比那短a.length==b.length

F=(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)

console.log=x=>O.textContent+=x+'\n';

testOK=[['A','A'],['A','B'],['C','B'],['DD','CE'],['DE','FC'],
['ABCD','BCDE'],['AACC','DBBB'],['DJENSKE','FDJCLMT'],
['DEFGHIJKL','HJLEHMCHE'],['IKLIJJLIJKKL','LJLJLJLJLJHI'],
['ACEGIKMOQSUWY','BLNPRDFTVHXJZ'],
['QQSQQRRQSTTUQQRRRS','PQTTPPTTQTPQPPQRTP'],
['ELKNSDUUUELSKJFESD','DKJELKNSUELSDUFEUS']];
testFail=[['A','C'],['A','Z'],['B','J'],['JK','J'],['CC','BA'],['CE','D'],
['DJENSKE','GDJCLMT'],['DEFGHIJKL','HJLHMCHE'],
['IJKLIJKLKIJL','LIJLLHJLJLLL',''],
['AWSUKMEGICOQY','RSHXBLJLNQDFZ'],
['QQSQQRRQSTTUQQQRRS','PQTTPPTTQTPQPPQRTT'],
['ELKNSDUVWELSKJFESD','DKJELKNSUELSDUFEUS']];

console.log('TRUE')
testOK.forEach(t=>{
  var a=t[0],b=t[1],r=F(a,b)
  console.log(r+' '+a+' '+b)
})  
console.log('FALSE')
testFail.forEach(t=>{
  var a=t[0],b=t[1],r=F(a,b)
  console.log(r+' '+a+' '+b)
})
<pre id=O></pre>


我认为您可以''代替第一个使用,'0'因为它不会更改解析的值。
Neil

@Neil对,然后再想一遍,那就更好了。我可以使用数字0和0。当添加到字符串中时,无论如何它都会变成字符串,并且无论如何数字0 + 0仍然是0 mod
edc65 '16

我相信您可以b使用字符引用折叠您的排序:(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)= 86字节
Mwr247 '16

@ Mwr247聪明。谢谢
edc65 '16

1

JavaScript ES6,117 个字节 116个字节 111个字节 109个字节

(j,k)=>j.length==k.length&&(f=s=>[...s].sort())(j).every((c,i)=>Math.abs(c[h='charCodeAt']()-f(k)[i][h]())<2)

测试用例

a=(j,k)=>j.length==k.length&&(f=s=>[...s].sort())(j).every((c,i)=>Math.abs(c[h='charCodeAt']()-f(k)[i][h]())<2);
// true
console.log('A A:', a('A', 'A'));
console.log('A B:', a('A', 'B'));
console.log('C B:', a('C', 'B'));
console.log('DD CE:', a('DD', 'CE'));
console.log('DE FC:', a('DE', 'FC'));
console.log('ABCD BCDE:', a('ABCD', 'BCDE'));
console.log('AACC DBBB:', a('AACC', 'DBBB'));
console.log('DJENSKE FDJCLMT:', a('DJENSKE', 'FDJCLMT'));
console.log('DEFGHIJKL HJLEHMCHE:', a('DEFGHIJKL', 'HJLEHMCHE'));
console.log('IKLIJJLIJKKL LJLJLJLJLJHI:', a('IKLIJJLIJKKL', 'LJLJLJLJLJHI'));
console.log('ACEGIKMOQSUWY BLNPRDFTVHXJZ:', a('ACEGIKMOQSUWY', 'BLNPRDFTVHXJZ'));
console.log('QQSQQRRQSTTUQQRRRS PQTTPPTTQTPQPPQRTP:', a('QQSQQRRQSTTUQQRRRS', 'PQTTPPTTQTPQPPQRTP'));
console.log('ELKNSDUUUELSKJFESD DKJELKNSUELSDUFEUS:', a('ELKNSDUUUELSKJFESD', 'DKJELKNSUELSDUFEUS'));

// false
console.log('A C:', a('A', 'C'));
console.log('A Z:', a('A', 'Z'));
console.log('B J:', a('B', 'J'));
console.log('JK J:', a('JK', 'J'));
console.log('CC BA:', a('CC', 'BA'));
console.log('CE D:', a('CE', 'D'));
console.log('DJENSKE GDJCLMT:', a('DJENSKE', 'GDJCLMT'));
console.log('DEFGHIJKL HJLHMCHE:', a('DEFGHIJKL', 'HJLHMCHE'));
console.log('IJKLIJKLKIJL LIJLLHJLJLLL:', a('IJKLIJKLKIJL', 'LIJLLHJLJLLL'));
console.log('AWSUKMEGICOQY RSHXBLJLNQDFZ:', a('AWSUKMEGICOQY', 'RSHXBLJLNQDFZ'));
console.log('QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT:', a('QQSQQRRQSTTUQQQRRS', 'PQTTPPTTQTPQPPQRTT'));
console.log('ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS:', a('ELKNSDUVWELSKJFESD', 'DKJELKNSUELSDUFEUS'));
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 -->
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

信用

  • @ rink.attendant.6减少了5个字节
  • @ user81655减少了2个字节

可以[...s]代替使用s.split('')吗?
rink.attendant。16年

@ rink.attendant.6,是的,谢谢。仍然习惯于ES6,这是我需要记住的一个捷径!
帕特里克·罗伯茨

1

Pyth,37 31字节

&qZ-FmldK.zqY-m.a-FdCmmCkSdK[Z1

在线尝试所有测试用例!

使用缩短的reduce表示法(-F代替.U-bZ)削减6个字节

丹尼斯启发的解决方案

第一次提交到codegolf!

说明

我们可以将表达式分为两部分,与之比较&以输出结果。我将尝试通过编写一些伪Python进行解释

首先我们检查两个单词的长度是否相同

mldK.z         lengths = map(lambda d: len(d), K=all_input())
.U-bZmldK.z    diff = reduce(lambda b, Z: b - Z, lengths)
qZ.U-bZmldK.z  diff == 0

然后,我们应用Dennis的方法:

       K                                                      # ['CAT', 'SAD']
 m   SdK           sort = map(lambda d: sorted(d), K)         # ['ACT', 'ADS']
 mmCkSdK           ascii = map(lambda d: sorted(d), map(lambda k: ord(k), K))
                                                              # [[65, 67, 84], [65, 68, 83]]
CmmCkSdK           zipped = zip(*ascii)                       # [[65, 65], [67, 68], [84, 83]]
m.U-bZd CmmCkSdK   map(lambda d: d[0] - d[1], zipped)         # [0, -1, 1]
m.a.U-bZd CmmCkSdK map(lambda d: abs(d[0] - d[1]), zipped)    # [0, 1, 1] 

然后,我们使用-运算符过滤列表中不在[Z1[0, 1])中的所有元素,并检查结果是否为空列表qY


1

JavaScript(ES6),87个字节

(a,b)=>![...a].sort().some((d,i)=>(d[c='charCodeAt']()-([...b].sort()[i]||c)[c]())/2|0)

使用零中心对称范围检查,方法是除以最大值,然后按位“或”(|)截断。比执行两次检查或一次进行检查要短Math.abs()


1

Haskell,67 63字节

import Data.List
f a=any(null.(a\\)).mapM(\x->[pred x..succ x])

用法示例:f "FREE" "GRRD"-> False

工作原理(注意:f部分没有点,第二个参数b未出现在定义中):

mapM(\x->[pred x..succ x])      -- for each letter of b make a list of the
                                -- predecessor, the letter itself and the successor.
                                -- Make a list of every possible combination
                                -- thereof, e.g "dr" ->
                                -- ["cq","cr","cs","dq","dr","ds","eq","er","es"] 
any(null.(a\\))                 -- see if the difference between any of the
                                -- combinations and the other parameter a is
                                -- empty, i.e. they have the same elements

编辑:@xnor发现要保存的4个字节。谢谢!


id x不是只x?还是[pred x..succ x]呢?
xnor

@xnor:我从开始\x->map($x)[pred,id,succ],所以id只是一个剩菜。当然..胜过一切。谢谢!
nimi 2016年

0

C,172字节

#define q(x)qsort(x,strlen(x),1,c)
c(x,y)char*x,*y;{return*x-*y;}main(a,v,w)char**v,*w,*a;{for(q(w=v[1]),q(a=v[2]);*w&&*a&&abs(*w-*a)<2;w++,a++);printf("%d",abs(*w-*a)<2);}

测试用例

$ bash -x test.sh
+ bash -x test.sh
+ ./a.out A A
1+ ./a.out A B
1+ ./a.out C B
1+ ./a.out DD CE
1+ ./a.out DE FC
1+ ./a.out ABCD BCDE
1+ ./a.out AACC DBBB
1+ ./a.out DJENSKE FDJCLMT
1+ ./a.out DEFGHIJKL HJLEHMCHE
1+ ./a.out IKLIJJLIJKKL LJLJLJLJLJHI
1+ ./a.out ACEGIKMOQSUWY BLNPRDFTVHXJZ
1+ ./a.out QQSQQRRQSTTUQQRRRS PQTTPPTTQTPQPPQRTP
1+ ./a.out ELKNSDUUUELSKJFESD DKJELKNSUELSDUFEUS
1+ ./a.out A C
0+ ./a.out A Z
0+ ./a.out B J
0+ ./a.out JK J
0+ ./a.out CC BA
0+ ./a.out CE D
0+ ./a.out DJENSKE GDJCLMT
0+ ./a.out DEFGHIJKL HJLHMCHE
0+ ./a.out IJKLIJKLKIJL LIJLLHJLJLLL
0+ ./a.out AWSUKMEGICOQY RSHXBLJLNQDFZ
0+ ./a.out QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT
0+ ./a.out ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS
0++

0

PowerShell,140字节

param($a,$b)(($a=[char[]]$a|sort).Count-eq($b=[char[]]$b|sort).Count)-and(($c=0..($a.Count-1)|%{+$a[$_]-$b[$_]}|sort)[0]-ge-1-and$c[-1]-le1)

可能可以缩短它的时间。它目前在Python或JavaScript上没有竞争力,但它使用的方法略有不同,因此我认为应该将其发布。

说明

对于不精通PowerShell的人来说,这段代码确实令人困惑,因此我将尽我所能将其分解为英文...

我们从接受输入开始 param($a,$b)正常。

整个代码的其余部分实际上是一个语句,可以将其破坏(...)-and(...)以测试两个布尔语句。-and运算符。

可以将左侧的paren断开(... -eq ...)以测试两个对象的相等性。在这种情况下,对象是.Count两个新char数组的s(即长度)。每个内部括号($a=[char[]]$a|sort)都采用原始输入字,将其重新转换为字符数组,然后对其进行排序,然后重新保存回相同的变量。我们为$a和都这样做$b。因此,左侧验证输入单词的长度相同。如果它们的长度不同,则外部布尔语句的这一半将失败并被False输出。

移至右侧,我们再次使用来测试两个布尔语句(... -and ...)。左侧测试带有的东西是否大于或等于负1 -ge-1。的东西是一个构造阵列的第零元素$c,这是由创建的:

  • 取一定范围的允许索引 0..($a.count-1)
  • 管道成一个循环 |%{...}
  • 循环的每次迭代中,我们都采用的索引字符$a的ASCII值减去中的索引字符的ASCII值。$b
  • 然后|sort由数值编辑

语句的另一端采用$c[-1]数组的最大值,并确保该值小于或等于1 -le1

因此,如果两个输入字符串确实相邻,则$c数组将类似于@(-1,-1,-1...0,0,0...1,1,1)。因此,第一个元素将是-1,最后一个元素将是1。如果它们不相邻,则特定对的ASCII值之差将为< -1> 1,因此外部布尔测试的这一半将失败,并将False输出。

仅在双方通过时才True输出,因此字符串为LA。


0

Rust,269264字节

fn a(w:&str,x:&str)->bool{if w.len()==x.len(){return{let mut c:Vec<char>=w.chars().collect();let mut d:Vec<char>=x.chars().collect();c.sort();d.sort();for(e,f)in c.iter().zip(d.iter()){if(((*e as u8)as f64)-((*f as u8)as f64)).abs()>1f64{return false}}true}}false}

展开:

fn are_adjacent(w: &str, x: &str)->bool{

    if w.len() == x.len(){

        return {

            let mut c : Vec<char> = w.chars().collect();
            let mut d : Vec<char> = x.chars().collect();

            c.sort();
            d.sort();

            for (e,f) in c.iter().zip(d.iter()){
                if (((*e as u8) as f64) - ((*f as u8) as f64)).abs() > 1f64{
                    return false
                } 
            }

            true
        }
    }

    false
}

测试用例:

fn main(){
    assert_eq!(true,are_adjacent("A","B"));
    assert_eq!(true,are_adjacent("A","B"));
    assert_eq!(true,are_adjacent("C","B"));
    assert_eq!(true,are_adjacent("DD","CE"));
    assert_eq!(true,are_adjacent("DE","FC"));
    assert_eq!(true,are_adjacent("ABCD","BCDE"));
    assert_eq!(true,are_adjacent("AACC","DBBB"));
    assert_eq!(true,are_adjacent("DJENSKE","FDJCLMT"));
    assert_eq!(true,are_adjacent("DEFGHIJKL","HJLEHMCHE"));
    assert_eq!(true,are_adjacent("IKLIJJLIJKKL","LJLJLJLJLJHI"));
    assert_eq!(true,are_adjacent("ACEGIKMOQSUWY","BLNPRDFTVHXJZ"));
    assert_eq!(true,are_adjacent("QQSQQRRQSTTUQQRRRS","PQTTPPTTQTPQPPQRTP"));
    assert_eq!(true,are_adjacent("ELKNSDUUUELSKJFESD","DKJELKNSUELSDUFEUS"));

    assert_eq!(false,are_adjacent("A","C"));
    assert_eq!(false,are_adjacent("A","Z"));
    assert_eq!(false,are_adjacent("B","J"));
    assert_eq!(false,are_adjacent("JK","J"));
    assert_eq!(false,are_adjacent("CC","BA"));
    assert_eq!(false,are_adjacent("CE","D"));
    assert_eq!(false,are_adjacent("DJENSKE","GDJCLMT"));
    assert_eq!(false,are_adjacent("DEFGHIJKL","HJLHMCHE"));
    assert_eq!(false,are_adjacent("IJKLIJKLKIJL","LIJLLHJLJLLL"));
    assert_eq!(false,are_adjacent("AWSUKMEGICOQY","RSHXBLJLNQDFZ"));
    assert_eq!(false,are_adjacent("QQSQQRRQSTTUQQQRRS","PQTTPPTTQTPQPPQRTT"));
    assert_eq!(false,are_adjacent("QQSQQRRQSTTUQQQRRS","PQTTPPTTQTPQPPQRTT"));
    assert_eq!(false,are_adjacent("ELKNSDUVWELSKJFESD","DKJELKNSUELSDUFEUS"));
}

0

APL,59个字节(字符)

(如果必须提供{和},则为61,其中f←)

我不是最出色的APLer,但这太有趣了。

(0=+/2≤|¨∊-/{⎕av⍳⍵}¨(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵])∧=/⍴¨∊¨⍺⍵

=/⍴¨∊¨⍺⍵ 输入同样长吗?

和所有下面的

(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵] 对两个输入进行排序,并将它们的形状定为与两个输入中的最长的一样长(如果使它们长于它们,它们会环绕起来)

|¨∊-/{⎕av⍳⍵} 将两个char向量都转换为其ascii值的int向量,进行向量减法并将所有值绝对化

0=+/2≤ 将大于或等于2的值相加,然后检查结果是否等于0


0

K(ok),27个字节

解:

2>|/x*x:-/(|/#:'x)$x@'<:'x:

在线尝试!

例子:

2>|/x*x:-/(|/#:'x)$x@'<:'x:("QQSQQRRQSTTUQQRRRS";"PQTTPPTTQTPQPPQRTP")
1
2>|/x*x:-/(|/#:'x)$x@'<:'x:("DEFGHIJKL";"HJLHMCHE")
0
2>|/x*x:-/(|/#:'x)$x@'<:'x:("AAA";"AAA")
1
2>|/x*x:-/(|/#:'x)$x@'<:'x:("AAA";"AA")
0

说明:

首先对每个字符串进行排序,然后将其填充为相同的长度,然后从另一个字符串中取一个(chars的ASCII值),由于没有内置值,求平方结果abs,取最大差值并检查其是否小于2。

2>|/x*x:-/(|/#:'x)$x@'<:'x: / the solution
                         x: / save input to variable x
                      <:'   / ascending sorted indices (<:) for each (') list
                   x@'      / apply (@) each (') of these indices to the input (x)                             
          (      )$         / pad
             #:'x           / count (#:) each (') list (x)
           |/               / max (|) over (/) to get maximum
        -/                  / subtract (-) over (/) to take 2nd list from 1st
      x:                    / save in variable x
    x*                      / multiply by x (so square)
  |/                        / max over to get maximum distance
2>                          / is 2 greater than (>) to this maximum? returns 1 (true) or 0 (false)

0

J,27个字节

[:*/@(2>|)[:-/,:&(3&u:@/:~)

不打高尔夫球

[: */@(2 > |) [: -/ ,:&(3&u:@/:~)

解释

  • &(3&u:@/:~) 对两个参数进行排序,并将其转换为ASCII编号
  • ,: 创建一个2 xn矩阵,其中n是args的字符数
  • -/ 从另一行中减去一行,得到长度为n的列表,代表相应字符的距离
  • (2>|) 如果距离的绝对值小于2,则返回1,否则返回0
  • */将所有0s和1s 相乘:因此,如果所有对应字符对都相邻,则最终结果为1。

在线尝试!

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.