无味和其他错误


52

标准Android计算器应用程序的某些版本允许您按一个键,例如“ sin”,然后按“ del”键使其变为“ si”。可能只是一个bug,他们不能为删除而烦恼。

Android计算器的屏幕截图

以下字母/字母分组是可键入的:

 

罪
si
s
cos
合作
C
棕褐色
ta
Ť
ln
升
日志
罗
Ë

因此,“无味”是典型的,因为ta-steless,“木s”也是如此,因为“ c-log-s”。但是,“ got”不是可键入的,“ an”或“ xyz”也不是可键入的。

编写一个程序,该程序将单个单词(或字母序列,输入中仅包含z)作为输入,并生成输出以指示单词是否可键入。

输出可以是单个字符/字母/数字/等。或可能更大。所有可打字的单词应产生相同的输出。所有非典型词也应产生相同的输出。

PS只是出于好奇,“无味”是最长的可打字的字典单词吗?


1
只是要清楚一点:我们输出我们选择的单个一致数字或字母来表示该单词是可键入的,而我们选择一个不同的,单个一致数字或字母来表示该单词不是可键入的。那是对的吗?
丹尼斯

3
我能找到的最长的单词是10个字母,coelostats
科纳·奥布莱恩

1
那么,“πe”不是一个词吗?
李斯特先生,2013年

@Dennis Ya,或多或少。
ghosts_in_the_code

1
另一个11:娘娘腔
克里斯H

Answers:


20

Perl,47 43 41 +1 = 42字节

-4个字节感谢@Sunny Pun。-2个字节,感谢@Brad Gilbert b2gills和@Downgoat

-n标志一起运行。

say!/^(s(in?)?|co?|t(an?)?|ln?|log?|e)+$/

当然可以继续打高尔夫球,但是出于竞争的精神,我离开了刚开始时想到的最原始的正则表达式。如果为true,1则为false ,则不返回任何内容。

在线尝试!

我下载了字典文件,发现的最长单词是11个字母- tattletales


1
我认为co?应该足够了,因为sin会照顾好s:)和/log?/我一起玩!
Sunny Pun

1
它并不是说它不需要区分大小写(删除i),或者单个结果必须有意义(删除一个!
Brad Gilbert b2gills

由于输入仅为a,您是否需要在末尾标记我?
Downgoat

您可以简化一下:-2:/^(s|sin?|co?|t|tan?|ln?|log?|e)+$/或者您更喜欢:/^([celst]|sin?|co|tan?|ln|log?)+$/
并不是说Charles

1
享受您的赏金!
ghosts_in_the_code

16

JavaScript(ES6),44个字节

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

认为这是最短的正则表达式,但是我当然可能错了。

说明

一个明显的开始是一个正则表达式,它仅单独包含所有选项:

s=>/^(sin|si|s|cos|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

首先,我们可以观察到cos可以由co和形成s,因此没有必要:

s=>/^(sin|si|s|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

其中的某些字符(例如sinsi)可以通过将最后一个字母设为可选来组合:

s=>/^(sin?|s|co?|tan?|t|log?|ln?|e)+$/.test(s)

之所以有效,是因为sin?匹配末尾si有或没有n,因此覆盖了sinsi

似乎也有很多n?。如果我们把它们放在一起怎么办?

s=>/^((si|ta|l)n?|s|co?|t|log?|e)+$/.test(s)

打高尔夫球的另一种方法是将剩余的单字符选项组合到一个字符范围中,但是长度相同:

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

这就是您打高尔夫球简单正则表达式的方式。我相信这是最短的正则表达式,可以正确匹配每个字符串,但也许不匹配。我将向设法改进此正则表达式的任何人奖励+100悬赏


我在回答中使用的类似:^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll

首先,我计算了44个字节。其次,这里是一个备用但更长的解决方案:/ /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/)
·奥布赖恩

@ ConorO'Brien哎呀,不知道我怎么错
算了

您可以a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.test为42个字节执行操作。我相信这是允许的,因为它a.test是一个匿名函数。
NoOneIsHere

@SeeOneRhino可以,但是实际上是不允许的,因为f=a.test它不起作用。我不知道是否可以使用其他名字来打电话a.test……
ETHproductions'December

7

Pyth,37 33 29 28字节

该代码包含不可打印的字符,因此这里是一个xxd十六进制转储。

00000000: 737d 5173 4d5e 733c 5252 6336 2e22 6174  s}QsM^s<RRc6."at
00000010: 14d0 69ba 76f1 ac59 6422 346c            ..i.v..Yd"4l

在线尝试。

非常天文效率低下。时间和空间复杂度为O(16 n O(24 n)。

说明

首先,a Q被隐式附加。

s}QsM^s<RRc6."…"4lQ     Implicit: Q = input
            ."…"        Generate "logsincostanlnee"
          c6            Split in 6 parts: ["log", "sin", "cos", "tan", "ln", "ee"]
         R      4       For each n from 0 to 3
       <R               Take the first n chars from each string
      s                 Flatten the results
                 lQ     Get length of input
     ^                  Take that Cartesian power of the list
   sM                   Join each resulting list
 }Q                     Check if the input is found
s                       Cast to integer

OP已经澄清;您不需要s
丹尼斯

6

果冻32 31 30 28 26字节

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ

如果该单词是可输入的,则输出0;否则输入1感谢@JonathanAllan打高尔夫球1个字节!

在线尝试!

这个怎么运作

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ  Main link. Argument: s (string of lowercase letters)

ŒṖ                          Yield all partitions of s.
      “¡Ṡ[ẈKœịḲ-¢ȧ?-»       Yield "sine  logcostanln". Every third character
                            marks the start of a typeable word.
  w@€€                      Find the indices of all substrings in the partitions
                            in the string to the right (1-based, 0 if not found).
                     ’      Decrement. "Good" indices are now multiples of 3.
                      %3    Modulo 3. "Good" indices are mapped to 0, "bad"
                            indices are mapped to 1 or 2.
                        Ḍ   Convert from decimal to integer. A partition will
                            yield 0 iff all indices are "good".
                         Ạ  All; yield 0 if one or more integers are falsy (0), 1
                            if all integers are truthy (non-zero).

6

Brachylog,33个字节

修复了@Synoli带来的错误。

~c:1a
,"sincostanloglneeee"@6e@[?

在线尝试!

输出true.是否可以键入false.

说明

我们尝试对输入进行解串,直到找到一个其连接的所有字符串均为之一的前缀的字符串["sin", "cos", "tan", "log", "lne", "eee]

~c                          A list of strings which when concatenated results in the Input
  :1a                       All strings of this list satisfy the predicate below:

,"sincostanloglneeee"@5           The list ["sin", "cos", "tan", "log", "lne", "eee"]
                       e          Take one element of that list
                        @[?       The input is a prefix of that element

为什么.之后true呢?
Kritixi Lithos

1
@KritixiLithos在SWI-Prolog中,当查询为true时,将进行打印true.false.否则进行打印。我只是重新实现了这一点:如果忽略了输出(如此处所示)并且没有写入STDOUT,则它将输出true.false.取决于主谓词是成功还是失败。它在SWI-Prolog中带有一个点,因为true.false.实际上是始终成功/总是失败的有效程序。
致命

tan在没有明确出现在列表中的情况下,该解决方案如何工作?
Synoli 2013年

2
@Synoli不是。我将其修复为3个字节,谢谢。
致命

4

Perl 6的 60 50  44个字节

第一次尝试(60

put +?(get~~/^<{<sin cos tan ln log e>».&{|m:ex/^.+/}}>*$/)

Perl 5答案的翻译(50

put +?(get~~/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/)

使用-n开关(43 + 1

put +?/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/

第一个?将结果转换为布尔值,第一个将结果+转换为数字(1for True0for False


3

Mathematica,101个字节

If[StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..],"T","F"]&

似乎挑战的难点在于提出最短的正则表达式,并选择最简洁的语言来匹配正则表达式。我对前者没有任何贡献,而Mathematica并不是后者的理想选择,因为您必须使用StringMatchQRegularExpression。我能做的就是回答您的PS:“无味”是您可以输入的最长单词?

In[1]:= f=StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..]&;

In[2]:= Select[EntityList@"Word",f@#[[2,1]]&][[All,2,1]]//SortBy[StringLength]//DeleteDuplicates
Out[2]= {c,e,l,s,t,cc,cl,el,et,lo,si,sl,ta,te,ccc,col,cos,cot,eel,ell,eta,etc,lee,let,log,lot,sec,see,set,sic,sin,sit,tae,tan,tat,tec,tee,cell,clog,clot,coco,cole,colt,coss,cost,cote,else,less,loco,loge,loll,lose,loss,lota,sect,seel,sell,sess,seta,sett,sill,silo,silt,sine,sise,siss,site,sloe,slog,slot,stet,taco,tact,tael,talc,tale,tall,tect,tell,test,cello,close,cosec,costa,cotan,eccle,elect,elsin,ettle,loess,lotte,secle,setee,since,sleet,stale,stall,state,steel,stele,tasse,taste,tatee,teest,telco,testa,tetel,tsine,cellco,closet,coleta,collet,coltan,cosine,cosset,costal,ecesis,estate,lessee,scelet,select,sellee,sestet,settee,settle,siesta,silole,stacte,stance,stasis,tallet,tallot,taslet,tassel,tasset,tattle,tectal,teetan,tellee,testee,tsetse,celesta,cessile,cocotte,collect,costate,ecolect,ectasis,electee,sessile,sinless,sitelet,statant,tassell,tastant,testate,coestate,colessee,colocolo,cosiness,costless,electant,lossless,sceletal,siletane,statelet,tactless,tallness,telltale,telocoel,coelostat,sissiness,stateless,tasteless,tattletale}

因此,“传奇故事”似乎是最长的一个角色。


为什么这种不竞争?您定义的功能f是否不符合挑战规则?
丹尼斯

不,它输出True或者False不是一个字符。
ngenisis

标有决策问题的帖子是关于确定对/错的,所以我认为这是竞争。
FlipTack

非竞争状态保留给使用不存在语言或语言功能或在发布挑战时出现错误的语言的提交。
丹尼斯

很公平。我编辑了答案以找到实际的解决方案。
ngenisis

2

不可思议,41个字节

!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")

用法:

(!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")) "tasteless"

以前完全误解了这个问题,但是现在所有问题都已解决。F匹配和T不匹配的输出。

非竞争性,35个字节

!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`

用法:

(!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`) "tasteless"

这利用了适用的正则表达式,该正则表达式是在挑战之后实施的。


2
从我的理解,你只能删除计算器中的最后一个字符,这意味着n在没有键式,但sinln是。
Sunny Pun

此正则表达式检测sa为真实
Kritixi Lithos

1
这使测试用例失败got
丹尼斯

我相信它是固定的。
Mama Fun Roll

?制作子表达温顺; 请参阅rexegg.com/regex-quantifiers.html#cheat_sheet。但是,即使出于某种原因,即使使它变得贪婪??或占有也?+不起作用(至少在PHP中如此)。coelostats触发陷阱(位于lota)。
泰特斯(Titus)

2

处理中,223字节

int d(String b){for(String p:"tan0log0sin0cos0ln0e".split("0"))if(p.startsWith(b))return 1;return 0;}

int l(String p){String b="";int t=1;for(char c:p.toCharArray()){b+=c;if(d(b)<1){b=c+"";t=d(b);}if(t<1)return t;}return t;}

最终决定不使用正则表达式来回答。要调用该函数,请使用l("tasteless");。返回0false和1true。

带说明的扩展代码

int d(String b){
  for(String p:"tan0log0sin0cos0ln0e".split("0"))
    if(p.startsWith(b))
      return 1;
  return 0;
}
//main function
int l(String p){
  String b="";
  int t=1;
  for(char c:p.toCharArray()){
    b+=c;
    if(d(b)<1){
      b=c+"";
      t=d(b);
    }
    if(t<1)return t;
  }
  return t;
}

基本上,我们遍历给定的字符串,b逐个字符地构建char。我们检查使用d(),如果任何的tanlog...下手b。如果是这样,则它是有效的。否则,我们检查该位置的char是否有效,然后重置b。现在,如果它无效,0将被返回,否则它将仍然有效。最后,如果程序尚未返回任何内容,则返回1


d函数不能返回a bool吗?
罗曼·格拉夫(RomanGräf)

@RomanGräf使用的字节数boolean多于int。此外true,还需false要比1和更多的字节0
Kritixi Lithos 16/12/5

2

Scala,49个字节

s=>s.matches("(s(in?)?|co?|t(an?)?|ln?|log?|e)+")

如果给定的字符串与正则表达式匹配,则返回true,否则返回false。


2

Python 3,154个字节

r=1;i=input()
while r:
 r=0
 for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','):
  if i.startswith(s):r=i=i.replace(s,'',1);break
print(i=='')

在线尝试!


1
您可能需要检查缩进,我必须编辑代码以使其起作用
乔治

@george,很奇怪,我在IDLE和在线编译器中尝试过,两者似乎都可以工作
Henke

2

Python 3中149个 130字节

i=input()
for a in 'tan,sin,cos,log,si,co,ta,lo,lo,ln,s,c,t,l,e'.split(','):
    if a in i:
        i=i.replace(a,"")
print(not i)

编辑#1:使用@Henke解决方案将19字节剃光


0

Python 2,124字节

f=lambda w:any(f(w[len(s):])if w[:len(s)]==s else 0for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','))if w else 1

0

PHP,60字节

<?=preg_match("#^((si|ta|l)n?|co?|log?|s|e|t)+$#",$argv[1]);

ETHproductions中盗取的正则表达式:
从命令行参数获取输入;打印1可印刷,0不可印刷。

旧版本,75 73 69字节

<?=!preg_replace("#co|log|ln|lo|sin|si|tan|ta|[celst]#","",$argv[1]);

用空字符串替换所有可能的单词,返回结果,取反。

<?=!preg_split("#co|log|ln|lo|sin|si|tan|ta|[celst]#",$argv[1],-1,1);

按正则表达式匹配拆分输入。标志1代表PREG_SPLIT_NO_EMPTY并告知preg_split仅返回非空结果。如果输入是可键入的,preg_split则结果将为空,因此它将返回一个空数组,这是虚假的。!否定结果。

两种版本均从命令行参数获取输入,
1在结果为空(输入为可键入内容)时打印,否则为空。

注意:
使用regex包装?此处不起作用。它使表达不愉快;可能是由于回溯。备选方案的顺序很重要:ta必须站在前面,t否则引擎在找到时将停止匹配t

我发现了量词备忘单,认为???+可能有所帮助;但是他们没有为我工作。


0

Java 8,55字节

s->return s.matches("^((si|ta|l)n?|co?|log?|[ste])+$");

Disclamer:我使用ETHproductions的正则表达式,因为它比我的短了许多字节。正则表达式的全部功劳归于他。我所做的是添加24个字节以使其成为Java函数。

false如果单词不适用于正则表达式,则返回;否则返回true

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.