Làm thế nào nhanh chóng tôi vrooooming?


19

Giới thiệu

Đồng hồ tốc độ xe của tôi đã bị hack! Thay vì cho tôi thấy tôi đang lái xe nhanh như thế nào, nó chỉ hiển thị: "Vroooom!" Xin hãy giúp tôi biết tôi sẽ đi nhanh như thế nào.

Thử thách

Lấy một chuỗi làm đầu vào và kiểm tra xem nó có khớp với biểu thức chính quy không /^[Vv]ro*m!$/m. Trong tiếng Anh có nghĩa là bất kỳ dòng nào của chuỗi phải bắt đầu bằng chữ in hoa hoặc chữ thường v, sau đó là chữ thường r, sau đó là bất kỳ số tiền nào (bao gồm số không) của chữ thường o, sau đó là chuỗi chính xác m!. Có thể có các dòng khác, nhưng chuỗi Vroom phải nằm trên dòng riêng của nó.

Nếu bạn tìm thấy kết quả khớp, thì bạn phải đếm số lượng otrong chuỗi Vroom và xuất nó. Tuy nhiên, nếu bạn không tìm thấy kết quả khớp, bạn nên xuất bất kỳ giá trị mặc định nào không thể xuất ra nếu không (như -1hoặc một chuỗi trống)

Nhắc nhở

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng. Tuy nhiên , tôi sẽ không đánh dấu bất kỳ câu trả lời nào được chấp nhận.

Các trường hợp thử nghiệm

Đầu vào

Vrom!

Đầu ra 1

Đầu vào

vrooooooom!

Đầu ra 7

Đầu vào

Hello, Vroom!

Đầu ra (none)

Đầu vào

Foo bar boo baz
Vrooom!
hi

Đầu ra 3

Đầu vào

Vrm!ooo

Đầu ra (none)

Đầu vào

PPCG puzzlers pie

Đầu ra (none)

Đầu vào

hallo
vROOOm!

Đầu ra (none)

Câu trả lời:



4

Python 2 , 56 53 byte

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

Hãy thử trực tuyến!

Regex cơ bản và nhóm, sử dụng cờ re.MULTILINE (có giá trị 8) và nghiên cứu lại để đảm bảo nó hoạt động cho các đầu vào đa dòng. Tăng một ngoại lệ khi không tìm thấy kết quả phù hợp. Cảm ơn @ovs cho -3 byte từ (re.M == 8)đầu.


1
Chào mừng đến với PPCG! Tôi đã định dạng lại câu trả lời của bạn để làm cho nó xuất hiện đẹp hơn một chút, nếu bạn không hài lòng với chỉnh sửa của mình, bạn luôn có thể quay lại. Btw. Tôi đề nghị liên kết đến một cái gì đó như tio.run để mọi người có thể dễ dàng kiểm tra câu trả lời của bạn.
ბიმო

re.Mcó giá trị 8, vì vậy chỉ có thể sử dụngre.search(regex,x,8)
ovs

4

R , 62 60 58 44 byte

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

Hãy thử trực tuyến!

@Giuseppe với 14 byte được đánh gôn.

Cách tiếp cận ban đầu với lời giải thích:

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

Hãy thử trực tuyến!

R có bảy chức năng khớp mẫu. Những người thường được sử dụng là grep, greplsub, nhưng đây là một sử dụng tốt đẹp cho regexec.

regexeccung cấp cho bạn một loạt các thứ, một trong số đó là độ dài của bất kỳ chuỗi con nào bị bắt, trong trường hợp này là (o*)một phần của biểu thức đa tuyến.

Các attr(el .... "m")[2]công cụ là một cách golf để có được số lượng mong muốn.

Trả về NAnếu không có kết quả khớp.



Tôi có một cách tiếp cận 44 byte ... Sẽ không đăng nó trừ khi bạn muốn tôi.
Giuseppe

@Giuseppe không chắc tại sao không? Đặc biệt là nếu nó về cơ bản là khác nhau.
ngm

3

JavaScript (Node.js) , 41 byte

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

Hãy thử trực tuyến!


Đây không chovroooooooooooom!x\nvrom!
ბიმო

1
Xem như chúng tôi được phép thoát với lỗi nếu không tìm thấy kết quả khớp, bạn có thể thực hiện việc này với -3 byte, khắc phục sự cố @BMO đã đề cập ở trên trong quy trình.
Shaggy

Uncrossed-out 41 chắc chắn vẫn là 41
Chương trình Redwolf

@Shaggy Không gian trong là [1]. lengthgì?
l4m2

@ l4m2, một lỗi đánh máy! Tôi đã không phát hiện ra nó trên điện thoại của mình vì lengthdù sao nó đã chuyển sang một dòng mới.
Xù xì

3

Powershell, 62 58 53 48 byte byte

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

trả về số otrong một Vroom!, hoặc -4 nếu Vroom!không tìm thấy.

Ghi chú:

  • slslà bí danh cho Chuỗi chọn ;
  • (?m-i) bên trong regrec có nghĩa là:
    • Sử dụng chế độ đa dòng. ^$khớp với đầu và cuối của một dòng, thay vì bắt đầu và kết thúc của một chuỗi.
    • Sử dụng kết hợp phân biệt chữ hoa chữ thường
  • |% M*lối tắt cho thuộc tính Matches, cung cấp kết quả khớp đầu tiên vì chúng tôi không sử dụng -AllMatchestham số.

Kịch bản thử nghiệm:

$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"
}

Đầu ra:

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

2

PowerShell , 83 byte

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

Hãy thử trực tuyến!

-splits đầu vào $argstrên `newlines, chuyển chúng thành một vòng lặp for. Mỗi lần lặp, chúng tôi kiểm tra xem chúng tôi có phải [regex]::Matchlà một .successhay không. Nếu vậy, chúng tôi để lại $x(đối tượng kết quả regex) trên đường ống. Bên ngoài vòng lặp, chúng tôi lấy thuộc .lengthtính - nếu đó là đối tượng kết quả regex, thì đây là độ dài của trận đấu (ví dụ: "Vroom!" Sẽ là 6); nếu nó không phải là một đối tượng kết quả regex, thì độ dài bằng không. Sau đó, chúng tôi trừ đi 4để loại bỏ số đếm cho Vrm!và để lại trên đường ống. Đầu ra là ẩn. Đầu ra a -4nếu không tìm thấy kết quả khớp.


sls "^[Vv]ro*m!$"?
mê mẩn

@mazzy Làm thế nào mà hoạt động cho đầu vào đa dòng? Đầu vào duy nhất của bạn là một chuỗi, và vì vậy slssẽ trả lại ('','Vroom!','')ví dụ.
admBorkBork

nó chưa hoàn thành giải pháp. Ý tôi là, bạn có thể thử slsthay thế[regex]::Match
mazzy

@mazzy Có lẽ bạn nên đăng nó như một giải pháp riêng biệt.
admBorkBork

2

Võng mạc , 21 byte

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

Hãy thử trực tuyến! Giải thích: Lliệt kê các kết quả khớp, vì vậy nếu regex không khớp thì đầu ra trống. $làm cho kết quả là sự thay thế chứ không phải là trận đấu. mlàm cho nó trở thành một trận đấu nhiều dòng (tương đương với dấu mtrong câu hỏi). Sự .thay thế làm cho nó xuất độ dài của bản chụp theo số thập phân.


2

SNOBOL4 (CSNOBOL4) , 99 82 byte

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

Hãy thử trực tuyến!

Bản dịch SNOBOL khá trực tiếp của thông số kỹ thuật, đọc từng dòng cho đến khi tìm thấy một dòng trùng khớp ^[Vv]ro*m!$, sau đó xuất độ dài của o*bit.

Nhập một vòng lặp vô hạn nếu không Vroom!thể được tìm thấy.


Là tất cả khoảng trắng cần thiết? Ồ
FireCubez

5
@FireCubez yep, đó là những gì bạn nhận được với ngôn ngữ trên 50 tuổi: yêu cầu khoảng trắng kỳ lạ. Nó sử dụng không gian / tab làm nối và bạn cũng phải bao quanh các toán tử với khoảng trắng.
Giuseppe


2

C (gcc) , 188 183 byte

Tại sao nên sử dụng regexes khi bạn có thể sử dụng máy trạng thái thay thế? :-)

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

Hãy thử trực tuyến!



1

Haskell , 75 71 69 byte

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

Hãy thử trực tuyến!

Không có regex. Thay vào đó, xây dựng tất cả các Vrooom!chuỗi hợp lệ lên đến một độ dài đủ và so sánh các dòng của đầu vào với chúng, thu thập số os trong danh sách. Do đó, đối với đầu vào không hợp lệ, một danh sách trống được trả về.


1

C (gcc) , 104 100 byte

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

Hãy thử trực tuyến!

Xuất ra ncho mỗi dòng hợp lệ, chính xác trong yêu cầu (không có gì nếu không có dòng hợp lệ, nnếu chính xác một dòng)

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

Thật buồn cười khi câu trả lời regex dài hơn thế này
Bánh quy cối xay gió

@WindmillCookies GCC cần thêm mã để hỗ trợ regex
l4m2

hmm có vẻ như những cái tên liên quan đến regexes rất dài
Bánh quy cối xay gió

1

Japt , 18 byte

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

Hãy thử trực tuyến!

Đã lưu một byte bằng cách lấy đầu vào là một mảng các dòng.

Bao gồm một ký tự không thể in giữa ]*.

Giải trình:

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



Trên thực tế, vì đầu vào có thể là một mảng các dòng, bạn có thể loại bỏ byte đầu tiên khỏi nhận xét đầu tiên của tôi ở trên.
Xù xì

@Shaggy Tôi không thể tìm thấy bất cứ nơi nào trong câu hỏi chỉ định rằng đầu vào có thể là một mảng các dòng và dường như không được liệt kê trong các phương thức I / O mặc định mà một chuỗi nhiều dòng có thể được lấy dưới dạng một mảng của các dòng . Có vẻ hợp lý, nhưng tôi sẽ đợi xác nhận trước.
Kamil Drakari



0

Bình thường, 20 byte

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

Đầu ra dưới dạng danh sách chỉ chứa số 'o' hoặc danh sách trống nếu không có Vroom.
Hãy thử nó ở đây

Giải trình

/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

Màu đỏ , 104 byte

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

Hãy thử trực tuyến!

Một giải pháp đơn giản. Màu đỏ parserất tuyệt và dễ đọc, nhưng quá dài so với regex

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 byte

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

Trả về âm 1 nếu mẫu không khớp.


0

JavaScript, 90 73 61 byte

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

Hãy thử trực tuyến!

Thay thế các ký tự không được bắt giữ (o*)bằng chuỗi trống, trả lengthvề chuỗi chỉ chứa "o"hoặc -1nếu chuỗi kết quả là trống.


0

Ruby, 32 byte

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

Ghép chuỗi với regex, sau đó sử dụng các biến nhóm regex ma thuật của Ruby để lấy kích thước của nhóm đầu tiên.

Gọi nó như vậy:

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

0

Ruby , 28 29 byte

p$_[/^[vV]r(o*)m!$/].count ?o

Hãy thử trực tuyến!

Chuỗi nhiều dòng yêu cầu thêm ba byte. Tôi không chắc đó có phải là một yêu cầu khó không. Nếu vậy, tôi sẽ cập nhật điều này.

->l{l[/^[Vv]r(o*)m!$/].count ?o}

Làm thế nào bạn có thể kiểm tra chuỗi nhiều dòng?
Laikoni

1
Thất bại vàoVROM!
l4m2

0

Clojure , 90 byte

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

Hãy thử trực tuyến!

Hàm ẩn danh này trả về số "o" trong chuỗi vroom hoặc -1 nếu không có chuỗi vroom hợp lệ.

Phiên bản dễ đọc

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

Giải trình

#"(?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 byte

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

Điều này sử dụng lời chào Eskimo ( }{) lạm dụng sự nhanh chóng về cách -ntùy chọn được xử lý bằng perl.


0

Java 8, 109 byte

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

Hãy thử trực tuyến.

Giải trình:

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 byte

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

Hãy thử trực tuyến!

-12 byte: di chuyển null kiểm tra vào for vòng lặp và loại bỏ dấu ngoặc

Ung dung:

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 byte với các toán tử kết hợpđiều kiện null của C # 6 , cũng không cần thiết {}khi chỉ sử dụng một câu lệnh trong forvòng lặp:for(var a="";;a=Console.ReadLine())Console.WriteLine(new Regex(@"^[Vv]ro*m!$").Match(a??"").Success?a.Count(x =>x=='o'):-1);
Ivan García Topete

Ngoài ra, điều này cần using System.Linq; using System.Text.RegularExpressions;, không chắc đây có phải là lol quan trọng không
Ivan García Topete

Mã bạn cung cấp không thực sự hoạt động, vì nó sẽ không chỉ xuất ra một -1dòng cho mỗi dòng mà nó không hoạt động, mà nó sẽ xuất ra -1mãi mãi vì không có kiểm tra null.
Meerkat

Không, nó sẽ không. a = Console.ReadLine()tạo vòng lặp, vì vậy mỗi lần bạn yêu cầu đầu vào cho vòng lặp tiếp tục, nếu không có đầu vào, vòng lặp chỉ chờ, không in -1mãi mãi
Ivan García Topete

Bằng chứng của khái niệm. Ngay cả khi nó đã hoạt động như bạn đã nói, một vòng lặp không bao giờ kết thúc không phải là hành vi lý tưởng. Bất kể, tôi đã chuyển séc null vào vòng lặp for, loại bỏ dấu ngoặc (và làm cho mã ngắn hơn đề xuất của bạn).
Meerkat

0

05AB1E , 39 37 byte

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

Mặc dù 05AB1E là một ngôn ngữ chơi gôn, các thách thức dựa trên regex chắc chắn không phải là bộ phần mềm mạnh mẽ của nó, vì nó không có các bản dựng regex.

Đầu ra []nếu không tìm thấy kết quả khớp.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

|              # 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 byte

-5 byte nhờ Zacharý

Nó biên dịch ngay cả với regexchỉ tiêu đề

#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;}

Các xét nghiệm:

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
Tôi nghĩ rằng using namespace std;sẽ tiết kiệm được một vài byte
Zacharý
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.