我发声的速度有多快?


19

介绍

我的汽车车速表被黑了!它没有显示我开车的速度,而是显示:“ Vroooom!” 请帮助我知道我要走多快。

挑战

接受一个字符串作为输入,并检查它是否与regex相匹配/^[Vv]ro*m!$/m。用英语表示字符串的任何行必须以大写字母或小写字母开头v,然后是小写字母r,然后是任意数量(包括零)的小写字母o,然后是确切的字符串m!。可能还有其他行,但是Vroom字符串必须在其自己的行上。

如果找到匹配项,则必须计算oVroom字符串中的数量并输出。但是,如果找不到匹配项,则应输出否则无法输出的任何默认值(例如-1或空字符串)

提醒事项

计分

这是,因此以字节为单位的最短代码获胜。但是,我不会将任何答案标记为已接受。

测试用例

输入项

Vrom!

输出量 1

输入项

vrooooooom!

输出量 7

输入项

Hello, Vroom!

输出量 (none)

输入项

Foo bar boo baz
Vrooom!
hi

输出量 3

输入项

Vrm!ooo

输出量 (none)

输入项

PPCG puzzlers pie

输出量 (none)

输入项

hallo
vROOOm!

输出量 (none)

Answers:



4

Python 2中56 53个字节

lambda x:len(re.search('^[Vv]r(o*)m!$',x,8).group(1))

在线尝试!

基本的正则表达式和分组使用re.MULTILINE标志(其值为8)和re.search以确保它适用于多行输入。未找到匹配项时引发异常。感谢@ovs为(re.M == 8)小费提供的-3个字节。


1
欢迎来到PPCG!我重新格式化了您的答案,使其看起来更好,如果您对我的编辑不满意,可以随时回退。顺便说一句。我建议链接到tio.run之类的东西,以便人们可以轻松地测试您的答案。
ბიმო

re.M具有值8,因此可以使用re.search(regex,x,8)
ovs

4

R62 60 58 44字节

nchar(grep("^[Vv]ro*m!$",readLines(),v=T))-4

在线尝试!

@Giuseppe打了14个字节。

带有解释的原始方法:

function(x)attr(el(regexec("(?m)[Vv]r(o*)m!$",x,,T)),"m")[2]

在线尝试!

R具有七个模式匹配功能。更常用的是grepgreplsub,但这里有一个很好的使用了regexec

regexec给您一堆东西,其中之一是任何捕获的子字符串的长度,在本例(o*)中为多行正则表达式的一部分。

这些attr(el .... "m")[2]东西是获得所需数量的高尔夫球方式。

NA如果没有匹配,则返回。



我有一个44字节的方法...除非您希望我将其发布。
朱塞佩

@Giuseppe不知道为什么不呢?尤其是在根本不同的情况下。
ngm

3

JavaScript(Node.js),41字节

a=>(l=/[Vv]r(o*)m!/.exec(a))&&l[1].length

在线尝试!


这对于失败vroooooooooooom!x\nvrom!
ბიმო

1
看到作为我们允许退出与一个错误,如果没有找到匹配的,你可以做到为-3个字节,固定在上面的过程中提到的问题@BMO。
毛茸茸的

未被淘汰的41绝对仍然是41
Redwolf Programs '18

@Shaggy的空间[1]. length是什么?
l4m2

@ l4m2,错字了!我没有在手机上发现它,因为length反正换行了。
毛茸茸的

3

Powershell,62 58 53 48字节字节

"$($args|sls '(?m-i)^[Vv]ro*m!$'|% M*)".Length-4

返回o第一个的数字,Vroom!如果Vroom!找不到则返回-4 。

笔记:

  • slsSelect-String的别名;
  • (?m-i) 内部正则表达式意味着:
    • 使用多行模式。^$匹配行的开头和结尾,而不是字符串的开头和结尾。
    • 使用区分大小写的匹配
  • |% M*是property的快捷方式Matches,它给出了第一个匹配项,因为我们不使用-AllMatchesparameter。

测试脚本:

$f = {

"$($args|sls '(?m-i)^[Vv]ro*m!$'|% M*)".Length-4

}

@(
,('Vrom!',1)
,('vrooooooom!',7)
,('Hello, Vroom!',-4)
,('Foo bar boo baz
Vrooom!
hi',3)
,('Vrm!ooo',-4)
,('PPCG puzzlers pie',-4)
,('hallo
vROOOm!',-4)
,('
Vrooom!
Vrooooom!
',3)        # undefined behavior.
,('vrm!',0) # :)
) | % {
    $n,$expected = $_
    $result = &$f $n
    "$($result-eq$expected): $result"
}

输出:

True: 1
True: 7
True: -4
True: 3
True: -4
True: -4
True: -4
True: 3
True: 0

2

PowerShell,83字节

($args-split"`n"|%{if(($x=[regex]::Match($_,"^[Vv]ro*m!$")).success){$x}}).length-4

在线尝试!

-split$args`newlines 上输入,将它们通过管道传递给for循环。每次迭代时,我们都会检查我们是否[regex]::Match为a .success。如果是这样,我们将$x(正则表达式结果对象)留在管道上。在循环之外,我们使用.length属性-如果它是正则表达式结果对象,则为匹配的长度(例如,“ Vroom!”为6);如果它不是正则表达式结果对象,则长度为零。然后4,我们减去以删除的计数,Vrm!并将其保留在管道中。输出是隐式的。-4如果找不到匹配项,则输出。


sls "^[Vv]ro*m!$"
mazzy

@mazzy如何用于多行输入?您唯一的输入是一个字符串,因此例如sls将返回('','Vroom!','')
AdmBorkBork

它不是完整的解决方案。我的意思是,您可以sls改为尝试[regex]::Match
mazzy

@mazzy也许您应该将其发布为单独的解决方案。
AdmBorkBork

2

视网膜,21字节

L$m`^[Vv]r(o*)m!$
$.1

在线尝试!说明:L列出匹配项,因此如果正则表达式匹配失败,则输出为空。$导致结果是替换而不是匹配。m使它成为多行匹配项(相当于问题中的结尾m)。的.在取代使得输出在十进制捕获的长度。


2

SNOBOL4(CSNOBOL4)99 82字节

I	INPUT POS(0) ('V' | 'v') 'r' ARBNO('o') @X 'm!' RPOS(0)	:F(I)
	OUTPUT =X - 2
END

在线尝试!

规范的SNOBOL转换非常直接,读取每一行,直到找到匹配的行^[Vv]ro*m!$,然后输出该o*位的长度。

如果找不到Vroom!则进入无限循环。


所有这些空格是否必要?哇。
FireCubez

5
@FireCubez是的,这就是使用50多年的语言所获得的:奇怪的空白要求。它使用空格/制表符作为连接,并且您还必须将运算符包含在空格中。
朱塞佩


2

C(GCC) 188个 183字节

为什么可以使用状态机来代替正则表达式?:-)

a,b;f(char*s){for(a=b=0;a<5;s++){!a&*s==86|*s=='v'?a++:a==1&*s=='r'?a++:a==2?*s-'o'?*s-'m'?0:a++:b++:a==3&*s==33?a++:!*s&a==4?a++:*s-10?(a=-1):a-4?(a=0):a++;if(!*s)break;}s=a<5?-1:b;}

在线尝试!



1

Haskell75 71 69字节

f s=[length n-2|r<-lines s,n<-scanr(:)"m!"$'o'<$r,v<-"Vv",r==v:'r':n]

在线尝试!

没有正则表达式。而是构建所有有效的Vrooom!字符串,直到足够长的长度,然后将输入的行与它们进行比较,从而收集o列表中的s 数。因此,对于无效输入,将返回一个空列表。


1

C(gcc)104100字节

s;main(c,n){for(;gets(&s);sscanf(&s,"v%*[o]%nm%c%c",&n,&c,&c)-1||c-33?:printf("%d",n-2))s=s-768|32;}

在线尝试!

输出n每个有效行的,恰好在需求中(如果没有有效行,则不输出,n如果恰好一个,则不输出)

int s; // Use as a char[]
main(c){
  while(gets(&s)) {
    s=s-768|32; // byte 0: 'V'=>'v'; byte 1: 'r'=>'o', 'o'=>'l'
    if (sscanf(&s,"v%[o]m%c%c",&s,&c,&c)==2 && c=='!') {
    // The last '%c' get nothing if it's EndOfLine
      printf("%d",strlen(&s)-1))
    }
  }
}

正则表达式的答案比这个更长,真是太有趣了
Windmill Cookies

@WindmillCookies GCC需要额外的代码来支持正则表达式
l4m2 '18

嗯。似乎与正则表达式相关的名称非常长
Windmill Cookies

1

Japt,18个字节

fè`^[Vv]*m!$` ®èo

在线尝试!

通过将输入作为行数组保存一个字节。

]和之间包含不可打印的字符*

说明:

fè                   Get the line(s) that match
  `^[Vv]*m!$`          The provided RegEx with a little compression
              ®èo    Count the number of "o" in that line if it exists



实际上,由于输入可以是行的数组,因此您可以将我的第一个注释的第一个字节删除。
毛茸茸的

@Shaggy我在指定输入可以是行数组的问题中找不到任何地方,并且默认I / O方法中似乎也没有列出多行字符串可以作为行数组。这似乎是合理的,但我将首先等待确认。
卡米尔·德拉卡里

1

C(gcc)138124字节

这是无聊的正则表达式方式。

#include<regex.h>
f(char*s){regmatch_t m[9];regcomp(m+2,"^[Vv]r(o*)m!$",5);s=regexec(m+2,s,2,m,0)?-1:m[1].rm_eo-m[1].rm_so;}

在线尝试!



0

Pyth,20个字节

/R\o:#"^Vro*m!$"1cQb

输出为仅包含数字“ o”的列表,如果没有Vroom,则输出为空列表。
在这里尝试

说明

/R\o:#"^Vro*m!$"1cQb
                 cQb  Split on newlines.
    :#"^Vro*m!$"1     Filter the ones that match the regex.
/R\o                  Count the `o`s in each remaining element.

0

,21字节

a~,`^[Vv]r(o*)m!$`#$1

在线尝试!

^[Vv]r(o*)m!$在多行模式下匹配正则表达式;捕获组的输出长度。


0

sfk,94个字节

xex -i -case "_[lstart][char of Vv]r[chars of o]m![lend]_[part 4]o_" +linelen +calc "#text-1" 

在线尝试!

给人-1当你不vrooming。


0

红色,104字节

func[s][n:""if parse/case s[opt[thru"^/"]["V"|"v"]"r"copy n any"o""m!"opt["^/"to end]][print length? n]]

在线尝试!

一个简单的解决方案。红色parse是很酷而且可读的,但是与正则表达式相比太长了

Red []
f: func [ s ] [
    n: ""
    if parse/case s [
             opt [ thru newline ]
             [ "V" | "v" ]
             "r"
             copy n any "o"
             "m!"
             opt [ newline to end ]
    ] [ print length? n ]
]

0

J,35个字节

(]{~0<{.)(1{'^[Vv]r(o*)m!'rxmatch])

如果模式不匹配,则返回负1。


0

JavaScript,90 73 61字节

_=>_.replace(/^[Vv]r(o*)m!$|[^\1]/mg,(m,a)=>a||'').length||-1

在线尝试!

替换未在捕获字符(o*)与空字符串,返回length仅包含字符串的"o"-1如果生成的字符串是空的。


0

Ruby,32个字节

->n{n=~/^[Vv]r(o*)m!$/m;$1.size}

将字符串与正则表达式匹配,然后使用Ruby的魔术正则表达式组变量来获取第一个组的大小。

这样称呼它:

x=->n{n=~/^[Vv]r(o*)m!$/m;$1.size}
x["Vrooooooooooooooooooooom!"] # returns 21


0

Clojure,90个字节

#(do(def a(clojure.string/replace % #"(?ms).*^[Vv]r(o*)m!$.*""$1"))(if(= a %)-1(count a)))

在线尝试!

此匿名函数返回vroom字符串中的“ o”数,如果没有有效的vroom字符串,则返回-1。

可读版本

(fn [s]
  (def a (clojure.string/replace s #"(?ms).*^[Vv]r(o*)m!$.*" "$1"))
  (if (= a s) -1 (count a)))

说明

#"(?ms).*^[Vv]r(o*)m!$.*" ; This regex matches any string that contains a valid vroom string. The first capturing group contains only the "o"s in the vroom string
(clojure.string/replace s #"(?ms).*^[Vv]r(o*)m!$.*" "$1") ; Replaces a match of the above regex with its first capturing group. The resulting string is stored in the variable a
(if (= a s) -1 (count a))) ; a equals s if and only if there is no valid vroom string, so if a equal s we return -1. If there is a valid vroom string, a contains only the "o"s from the vroom string, so we return the length of a

0

perl -nE,35个字节

$s=length$1if/^[Vv]r(o*)m!$/}{say$s

这使用了Eskimo问候语}{),后者滥用了-nperl 如何处理该选项的快速方法。


0

Java 8,109字节

s->{int r=-1;for(var l:s.split("\n"))r=l.matches("[Vv]ro*m\\!")?l.replaceAll("[^o]","").length():r;return r;}

在线尝试。

说明:

s->{                             // Method with String parameter and integer return-type
  int r=-1;                      //  Result-integer, starting at -1
  for(var l:s.split("\n"))       //  Loop over the lines:
    r=l.matches("[Vv]ro*m\\!")?  //   If the current line matches the regex:
       l.replaceAll("[^o]","").length()
                                 //    Change `r` to the amount of "o"'s in it
      :                          //   Else:
       r;                        //    Leave the result `r` unchanged
  return r;}                     //  Return the result

0

C#(.NET Core)134122字节

for(var a="";a!=null;a=Console.ReadLine())if(new Regex(@"^[Vv]ro*m!$").Match(a).Success)Console.Write(a.Count(x=>x=='o'));

在线尝试!

-12个字节:移动 null for 循环中并除去了括号

取消高尔夫:

for(var a = ""; a != null; a = Console.ReadLine())  // initialize a, and while a isn't null, set to new line from console
    if(new Regex(@"^[Vv]ro*m!$")                        // set regex
                        .Match(a).Success)              // check if the line from the console matches
        Console.Write(a.Count(x => x == 'o'));              // write the number of 'o's to the console

带有C#6的空合并条件运算符的-10个字节{}for循环中仅使用一个语句时也不需要:for(var a="";;a=Console.ReadLine())Console.WriteLine(new Regex(@"^[Vv]ro*m!$").Match(a??"").Success?a.Count(x =>x=='o'):-1);
IvanGarcíaTopete

另外,这需要using System.Linq; using System.Text.RegularExpressions;,不确定这是否重要大声笑
IvanGarcíaTopete 18-11-2

您提供的代码实际上并不起作用,因为它不仅会-1为每条不起作用的行输出a ,而且由于-1没有check,它将永远输出s null
猫鼬

不,不会。a = Console.ReadLine()进行循环,因此每次您请求循环输入时,如果没有输入,则循环只是在等待,而不是-1永远打印
IvanGarcíaTopete

概念证明。即使它确实如您所说的那样工作,永无止境的循环也不是理想的行为。无论如何,我都将null检查移到了for循环中,该循环除去了方括号(并使代码比您的建议短)。
Meerkat

0

05AB1E39 37 字节

|ʒć„VvsåsÁÁD…m!rÅ?s¦¦¦Ù'oså)P}Dgi`'o¢

尽管05AB1E是一种高尔夫语言,但是基于正则表达式的挑战绝对不是其强大的套件,因为它没有正则表达式内置的组件。

[]如果未找到匹配项,则输出。

在线尝试验证所有测试用例

说明:

|              # Get the input split by newlines
 ʒ             # Filter it by:
  ć            #  Head extracted: Pop and push the remainder and head-character
               #   i.e. "vrm!" → "rm!" and "v"
               #   i.e. "Vroaom!" → "roaom!" and "V"
   Vvså       #  Is this head character in the string "Vv"?
               #   i.e. "v" → 1 (truthy)
               #   i.e. "V" → 1 (truthy)
  s            #  Swap so the remainder is at the top of the stack again
   ÁÁ          #  Rotate it twice to the right
               #   i.e. "rm!" → "m!r"
               #   i.e. "roaom!" → "m!roao"
     D         #  Duplicate it
      m!rÅ?   #  Does the rotated remainder start with "m!r"?
               #   i.e. "m!r" → 1 (truthy)
               #   i.e. "m!roao" → 1 (truthy)
  s¦¦¦         #  Remove the first three characters from the duplicated rotated remainder
               #   i.e. "m!r" → ""
               #   i.e. "m!roao" → "oao"
      Ù        #  Uniquify, leaving only distinct characters
               #   i.e. "" → ""
               #   i.e. "oao" → "oa"
       'oså   '#  Is this uniquified string in the string "o"?
               #   i.e. "" → 1 (truthy)
               #   i.e. "oa" → 0 (falsey)
  )P           #  Check if all three checks above are truthy
               #   i.e. [1,1,1] → 1 (truthy)
               #   i.e. [1,1,0] → 0 (falsey)
 }             # Close the filter
  D            # After the filter, duplicate the list
   gi          # If its length is 1:
               #   i.e. ["vrm!"] → 1 (truthy)
               #   i.e. [] → 0 (falsey)
     `         #  Push the value in this list to the stack
               #   i.e. ["vrm!"] → "vrm!"
      'o¢     '#  And count the amount of "o" in it (and output implicitly)
               #   i.e. "vrm!" → 0
               # (Implicit else:)
               #  (Implicitly output the duplicated empty list)
               #   i.e. []

0

C ++,MSVC,164个 159字节

-5个字节,感谢Zacharý

即使regex仅使用标头也可以编译

#include<regex>
using namespace std;int f(vector<string>i){smatch m;for(auto&e:i)if(regex_match(e,m,regex("^[Vv]ro*m!$")))return m[0].str().size()-4;return-1;}

测试:

std::cout << "Vrom!" << " -> " << f({ "Vrom!" }) << '\n';
std::cout << "vrooooooom!" << " -> " << f({ "vrooooooom!" }) << '\n';
std::cout << "Hello, Vroom!" << " -> " << f({ "Hello, Vroom!" }) << '\n';
std::cout << "Foo bar boo baz \\n Vrooom! \\n hi" << " -> " << f({ "Foo bar boo baz", "Vrooom!", "hi" }) << '\n';
std::cout << "Vrm!ooo" << " -> " << f({ "Vrm!ooo" }) << '\n';
std::cout << "PPCG puzzlers pie" << " -> " << f({ "PPCG puzzlers pie" }) << '\n';
std::cout << "hallo \\n vROOOm!" << " -> " << f({ "hallo", "vROOOm!" }) << '\n';

1
我认为using namespace std;将节省几个字节
扎卡里
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.