一个字母适合另一个吗?


23

你还记得我的垫子按颜色正确分组吗?

我的垫子按颜色正确分组

昨天我看着它,发现有些字母适合其他字母。示例:一个字母P适合该字母所在的位置R。因此,这是一个简单的挑战:给定两个字母,如果其中一个字母适合另一个字母(直接或旋转但不翻转),则返回真实值,否则返回假值。也就是说,如果输入为[P,R][R,P],则必须返回true,因为在两种情况下一个字母都适合另一个字母。如果得到[L,U],则必须返回false,因为两者都不适合。

规则

  • 输入必须是[0-9A-Z]范围内的两个字母数字字符,因为垫子中还有数字,可以按照您需要的任何形式显示(两个单独的字符作为两个输入,一个列表包含两个字符,一个字符串包含2个字符,无论如何)。
  • 输出必须是一致的(真值和假值必须始终相同)。
  • 以下是配件表(请注意,字母始终适合于其适当位置,以防万一您收到类似[Y,Y]输入的内容):

    char fits inside chars
    --------------------------------------------------------
       C             G,O
       F             B,E,P,R
       G             O
       I             0,1,7,B,D,E,F,H,K,L,M,N,O,P,R,T,V,W,X,Z
       L             E
       M             W
       P             R
       S             O
       V             A
       W             M
       0             O
       1             B,E,L
       3             O
       6             9,O
       8             O
       9             6,O
    

我郑重保证我已经测试过孩子垫子上的所有配件。(擦干额头上的汗水。)

这是,因此每种语言的最短代码可能会胜出!

一些测试案例

input  output
-------------
[C,G]  truthy (C fits inside G)
[G,C]  truthy (C fits inside G)
[F,R]  truthy (F fits inside R)
[M,W]  truthy (both fit inside the other)
[O,S]  truthy (S fits inside O)
[T,T]  truthy (T fits in its place)
[E,V]  falsey (no fit found)
[P,L]  falsey

沙盒发布。如果您发现我错过的更多配件,请原谅我。非常感谢Ourous为我提供的配件清单。



1
1不适合F吗?
user202729

@ user202729不,因为您需要翻转1使其适合,F但是这在我的垫子中是不允许的。:-)
查理

4
插图ASCII艺术图(当然,拟合是传递的)
user202729 '17

1
@OOurous这是另一个问题,当它已经有两个答案时...除此之外,挑战已经有很多案例可以测试,更多案例将无济于事(我认为最有创意的部分是这两个输入是可互换,因为您必须检查两个配件)。
查理

Answers:


6

Python 2中135个 130 129字节

-1字节感谢Lynn

lambda s:cmp(*s)%2*s[::cmp(*s)|1]in'OIH TIE XI7 RF O8 OGC LI0 O3 O96 VA O6 KI PI WI L1 WMI O0 RIB NI1 FE SOC VID ZIFB1 PF LE1 RP'

在线尝试!

Python 3,143字节

lambda*i:any({*i}&{a,c}=={*i}for a,b in zip('CFGILMPSVW013689','GO BEPR O 017BDEFHKLMNOPRTVWXZ E W R O A M O BEL O 9O O 6O'.split())for c in b)

在线尝试!



2

干净276226字节

模糊地打高尔夫球。明天会擦亮。

import StdEnv
i a b=isMember b a
t=True
f'C'b=i['GO']b
f'F'b=i['BEPR']b
f'O'b=i['GS03689']b
f'I'b=i['017BDEFHKLMNOPRTVWXZ']b
f'L''E'=t
f'P''R'=t
f'V''A'=t
f'M''W'=t
f'1'b=i['BEL']b
f'6''9'=t
f _ _=False
?a b=a==b||f a b||f b a

在线尝试!



2

使用Javascript 155 153 151 149字节

我认为这适用于所有情况,1/0为true / false。

(c,f,q=1)=>"CGO,FBEPR,GO,I017BDEFHKLMNOPRTVWXZ,LE,MW,PR,SO,VA,WM,0O,1BEL,3O,69O,8O,96O".split`,`.some((v=>v[0]==c&v.includes(f)))|c==f|(q?F(f,c,0):0)

说明:

F=(
c, // input 1
f, // input 2
q=1 // variable used to execute F twice
)=>(
"CGO,FBEPR,GO,I017BDEFHKLMNOPRTVWXZ,LE,MW,PR,SO,VA,WM,0O,1BEL,3O,69O,8O,96O".split`,` 
                              // array of strings where [0] is input 1 and [>0] are the fittings
.some(                        // any element of the array meets:
(v=>v[0]==c&v.includes(f)))|  // input 1 equals [0] and input 2  exists in the lookup string OR
c==f|                         // input 1 equals input 2 OR
(q?F(f,c,0):0)                // input 2 fits inside input 1

let F=(c,f,q=1)=>"CGO,FBEPR,GO,I017BDEFHKLMNOPRTVWXZ,LE,MW,PR,SO,VA,WM,0O,1BEL,3O,69O,8O,96O".split`,`.some((v=>v[0]==c&v.includes(f)))|c==f|(q?F(f,c,0):0);
let tests = [
  ["C","G"],  //truthy (C fits inside G)
  ["G","C"],  //truthy (C fits inside G)
  ["F","R"],  //truthy (F fits inside R)
  ["M","W"],  //truthy (both fit inside the other)
  ["O","S"],  //truthy (S fits inside O)
  ["T","T"],  //truthy (T fits in its place)
  ["E","V"],  //falsey (no fit found)
  ["P","L"]   //falsey
];
tests.forEach((v)=>{console.log("F('"+v[0]+"','"+v[1]+"') = " + F(v[0],v[1]))});

变更日志:

  • 由于kamoroso94节省了2个字节
  • 克里斯·M节省了2个字节
  • 通过将查找方法更改为.some(),节省了2个字节

如果这是否返回true c配合ff配合c?看来您只检查一种情况。
查理

固定代码以在f适合时返回truec
Brian H.

我不太善于解释,如果有人想更清楚地建议编辑
Brian H.

您可以使用includes(f)而不是indexOf(f)>=0保存2个字节。
kamoroso94 '17

太棒了,甚至都不知道那是一件事:D
Brian H.

1

朱莉娅 0.6,139字节

(a,b)->(a==b)|any(map(x->all(in.((a,b),x))|all(in.((b,a),x)),zip("OCFILMPV16",split("CGS0368 G BEPR 017BDEFHKLMNOPRTVWXZ E W R A BEL 9"))))

在线尝试!

通过将适合“ O”的字符分组来节省一些字节。但是测试反向输入会使用太多代码...

说明:

  • zip(☐)"OCFILMPV16"&匹配的字符串字符串中压缩相应的单个字母。
  • .in(☐) 逐元素应用,例如 (in(a,'O'),in(b,"OCFILMPV16"))
  • all(.in(☐)) 两者都必须找到...
  • |a,bb,a...
  • any(map(☐)) 至少一个压缩列表中的元素。

1

Kotlin147139字节

fun p(s:String)=setOf(s,s.reversed()).any{it.matches(Regex("(.)\\1|F[BEPR]|I[017BDEFHKLMNOPRTVWXZ]|1[BEL]|69|CG|LE|MW|PR|VA|O[CG69038S]"))}

在线尝试!

在线试用的示例包括每个阳性组合和几个阴性组合的测试用例。

我还没有优化reg.ex。太多,因此可能比必要的时间更长

编辑:在reg.ex上保存了一些字节。


1

C(gcc),211字节

第一次尝试。非常简单。

i;char*c="CFGILMPSVW013689",*x[]={"GO","BEPR","O","017BDEFHKLMNOPRTVWXZ","E","W","R","O","A","M","O","BEL","O","9O","O","6O"};h(a,b){return(i=strchr(c,a)-c)>=0&&strchr(x[i],b);}f(a,b){return a==b|h(a,b)|h(b,a);}

在线尝试!


0

PHP,204字节

-147字节,因为我退回去删除了2个字节,只是发现我的代码有一些错误和未使用的变量!我的代码现在要短得多。

<?php $a=fgets(STDIN);for($w=0;$w<2;$w++){if(strpos(explode(',','GO,BEPR,O,017BDEFHKLMNOPRTVWXZ,E,W,R,O,A,M,O,BEL,O,9O,O,6O')[strpos(CFGILMPSVW013689,$a[0])],$a[1])!==false){echo"t";break;}$a=strrev($a);}

在线尝试!


0

Ruby,140个字节

->c,t{x='CFGILMPSVW013689'.chars.zip('GO BEPR O 017BDEFHKLMNOPRTVWXZ E W R O A M O BEL O 9O O 6O'.split).to_h;p x.key?(c)&&x[c].include?(t)}

与python 3答案几乎相同,但执行方式不同。

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.