vroooomingの速度はどれくらいですか?


19

前書き

車の速度計がハッキングされました!運転速度を示す代わりに、「Vroooom!」と表示されます。どれだけ早く行くかを教えてください。

チャレンジ

入力として文字列を取得し、正規表現に一致するかどうかを確認し/^[Vv]ro*m!$/mます。英語では、文字列のすべての行は大文字または小文字vで始まり、次に小文字r、次に任意の量(ゼロを含む)の小文字o、そして正確な文字列でなければなりませんm!。他の行があるかもしれませんが、Vroom文字列はそれ自身の行になければなりません。

一致するものが見つかった場合o、Vroom文字列内のの数をカウントして出力する必要があります。ただし、一致するものが見つからない場合は、他の方法では出力できないデフォルト値(-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)

回答:



4

パイソン256の、53バイト

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

オンラインでお試しください!

基本的な正規表現とグループ化では、re.MULTILINEフラグ(値は8)とre.searchを使用して、複数行の入力で機能することを確認します。一致が見つからない場合に例外を発生させます。(re.M == 8)tip から-3バイトの@ovsに感謝します。


1
PPCGへようこそ!私の編集に不満がある場合は、いつでも元に戻すことができます。ところで 人々があなたの答えを簡単にテストできるように、tio.runのようなものにリンクすることをお勧めします。
18/11/20

re.M値を持っている8ので、ちょうど使用することができますre.search(regex,x,8)
OVS

4

R62 60 58 44バイト

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

オンラインでお試しください!

ゴルフをする14バイトの@Giuseppe。

説明付きの元のアプローチ:

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

オンラインでお試しください!

Rには7つのパターンマッチング関数があります。より一般的に使用されるものでありgrepgreplsub、しかし、ここのための素敵な使用ですregexec

regexecたくさんのものを与えます。そのうちの1つは、キャプチャされたサブストリングの長さです(o*)。この場合、複数行の正規表現の一部です。

attr(el .... "m")[2]ものは、所望の数を取得するgolfy方法です。

NA一致するものがない場合に戻ります。



私は44バイトのアプローチをしています...あなたが私に望んでいない限り、それを投稿しない
ジュゼッペ

@ジュゼッペはなぜそうなのか分かりませんか?特に根本的に異なる場合。
-ngm

3

JavaScript(Node.js)、41バイト

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

オンラインでお試しください!


これがために失敗したvroooooooooooom!x\nvrom!
ბიმო

1
一致が見つからない場合、エラーで終了することが許可されているので、-3バイトでこれを行うことができ、プロセスで上記の@BMOの問題が修正されます。
シャギー

Uncrossed-out 41は間違いなく41
Redwolfプログラム

@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*は、プロパティのショートカットですMatches。これは、-AllMatchesパラメーターを使用しないため、最初の一致を提供します。

テストスクリプト:

$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、パイプループのためにそれらを。繰り返しごとに、[regex]::Matchaがaであるかどうかを確認します.success。その場合、$x(正規表現結果オブジェクト)をパイプラインに残します。ループの外側で、.lengthプロパティを取得します。正​​規表現の結果オブジェクトの場合、これは一致の長さです(たとえば、「Vroom!」は6になります)。正規表現の結果オブジェクトではない場合、長さはゼロです。次に4、のカウントを削除Vrm!してパイプラインに残します。出力は暗黙的です。-4一致が見つからない場合に出力します。


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

@mazzy複数行入力の場合、どのように機能しますか?あなたの唯一の入力は1つの文字列であり、そのため、例えば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) 104の 100バイト

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、正確に1つある場合)

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

これは、正規表現の答えはこれよりも長くなるように面白いです
風車クッキー

@WindmillCookies GCCは正規表現をサポートするために追加のコードが必要です
l4m2

うーん。正規表現に関連する名前は非常に長いようです
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メソッドにリストされていないようです。合理的であると思われますが、まず確認を待ちます。
カミルドラカリ



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

、104バイト

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

オンラインでお試しください!

簡単なソリューション。Red 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

ルビー、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)134 122バイト

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

-10バイト、C#6のヌル合体および条件演算子、ループ内で{}1つのステートメントのみを使用する場合も不要forfor(var a="";;a=Console.ReadLine())Console.WriteLine(new Regex(@"^[Vv]ro*m!$").Match(a??"").Success?a.Count(x =>x=='o'):-1);
イヴァンガルシアトペ

また、これが必要ですusing System.Linq; using System.Text.RegularExpressions;、これが重要であるかどうかわからないlol
イヴァンガルシアトペー

あなたが提供したコードは実際-1には動作しません。動作しないすべての行に対してa を出力するだけ-1でなく、チェックがないため永久にs を出力するからnullです。
ミーアキャット

いいえ、できません。a = Console.ReadLine()入力がない場合は、上に行くためにループのための入力を要求しているたびに、ループだけで印刷していない、待っているので、ループを作る-1永遠に
イワン・ガルシアTopeteは

コンセプトの証明。あなたが言ったように動作したとしても、終わりのないループは理想的な動作ではありません。とにかく、nullチェックをforループに移動しました。これにより、角かっこが削除されます(コードが提案よりも短くなります)。
ミーアキャット

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バイト

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;数バイト節約できると思います
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.