Seberapa cepat saya vrooooming?


19

pengantar

Speedometer mobil saya diretas! Alih-alih menunjukkan kepada saya seberapa cepat saya mengemudi, itu hanya menunjukkan: "Vroooom!" Tolong bantu saya tahu seberapa cepat saya pergi.

Tantangan

Ambil string sebagai input, dan periksa apakah cocok dengan regex /^[Vv]ro*m!$/m. Dalam bahasa Inggris itu berarti setiap baris string harus dimulai dengan huruf kapital atau huruf kecil v, kemudian huruf kecil r, lalu jumlah apa pun (termasuk nol) dari huruf kecil o, kemudian string yang tepat m!. Mungkin ada baris lain, tetapi string Vroom harus pada baris itu sendiri.

Jika Anda menemukan kecocokan, maka Anda harus menghitung jumlah odalam string Vroom dan mengeluarkannya. Namun, jika Anda tidak menemukan kecocokan, Anda harus menampilkan nilai default apa pun yang tidak dapat ditampilkan sebaliknya (seperti -1atau string kosong)

Pengingat

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang. Namun , saya tidak akan menandai jawaban apa pun yang diterima.

Uji kasus

Memasukkan

Vrom!

Keluaran 1

Memasukkan

vrooooooom!

Keluaran 7

Memasukkan

Hello, Vroom!

Keluaran (none)

Memasukkan

Foo bar boo baz
Vrooom!
hi

Keluaran 3

Memasukkan

Vrm!ooo

Keluaran (none)

Memasukkan

PPCG puzzlers pie

Keluaran (none)

Memasukkan

hallo
vROOOm!

Keluaran (none)

Jawaban:



4

Python 2 , 56 53 byte

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

Cobalah online!

Regex dan pengelompokan dasar, menggunakan bendera re.MULTILINE (yang memiliki nilai 8) dan penelitian ulang untuk memastikan itu berfungsi untuk input multiline. Menimbulkan pengecualian saat tidak ada kecocokan yang ditemukan. Terima kasih kepada @ovs untuk -3 byte dari (re.M == 8)tip.


1
Selamat datang di PPCG! Saya memformat ulang jawaban Anda untuk membuatnya tampak lebih bagus, jika Anda tidak puas dengan hasil edit saya, Anda selalu dapat memutar kembali. Btw. Saya sarankan untuk menautkan sesuatu seperti tio.run sehingga orang dapat dengan mudah menguji jawaban Anda.
ბიმო

re.Mmemiliki nilai 8, jadi bisa saja menggunakanre.search(regex,x,8)
Ov

4

R , 62 60 58 44 byte

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

Cobalah online!

@Giuseppe dengan 14 byte golf.

Pendekatan asli dengan penjelasan:

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

Cobalah online!

R memiliki tujuh fungsi pencocokan pola. Yang lebih umum digunakan adalah grep, grepl, dan sub, tapi di sini adalah penggunaan yang bagus untuk regexec.

regexecmemberi Anda banyak hal, salah satunya adalah panjang dari setiap substring yang ditangkap, dalam hal ini (o*)bagian dari regex multiline.

attr(el .... "m")[2]Barang - barang adalah cara golf untuk mendapatkan nomor yang diinginkan.

Kembali NAjika tidak ada yang cocok.



Saya memiliki pendekatan 44 byte ... Tidak akan mempostingnya kecuali Anda menginginkannya.
Giuseppe

@ Giuseppe tidak yakin mengapa tidak? Terutama jika secara fundamental berbeda.
ngm

3

JavaScript (Node.js) , 41 byte

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

Cobalah online!


Gagal untukvroooooooooooom!x\nvrom!
ბიმო

1
Melihat kami diizinkan keluar dengan kesalahan jika tidak ada kecocokan yang ditemukan, Anda bisa melakukan ini untuk -3 byte, memperbaiki masalah @BMO yang disebutkan di atas dalam proses.
Shaggy

Uncrossed-out 41 jelas masih 41
Program Redwolf

@ Shaggy Untuk apa ruang dalam [1]. length?
l4m2

@ l4m2, salah ketik! Saya tidak melihatnya di ponsel saya karena lengthitu melanggar ke baris baru.
Shaggy

3

Powershell, 62 58 53 48 byte byte

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

mengembalikan angka odalam yang pertama Vroom!, atau -4 jika Vroom!tidak ditemukan.

Catatan:

  • slsalias untuk Select-String ;
  • (?m-i) inside regexp berarti:
    • Gunakan mode multiline. ^dan $cocokkan awal dan akhir suatu garis, bukannya awal dan akhir suatu string.
    • Gunakan pencocokan case-sensitive
  • |% M*adalah pintasan untuk properti Matches, yang memberikan kecocokan pertama karena kami tidak menggunakan -AllMatchesparameter.

Skrip uji:

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

Keluaran:

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

Cobalah online!

-splits input $argspada `nbaris baru, pipa mereka menjadi for for loop. Setiap iterasi, kami memeriksa apakah kami [regex]::Matchadalah .successatau tidak. Jika demikian, kita meninggalkan $x(objek hasil regex) di pipeline. Di luar loop, kita mengambil .lengthproperti - jika objek hasil regex, ini adalah panjang pertandingan (misalnya, "Vroom!" Akan menjadi 6); jika bukan objek hasil regex, panjangnya nol. Kami kemudian mengurangi 4untuk menghapus jumlah untuk Vrm!dan membiarkannya di dalam pipa. Output tersirat. Keluaran a -4jika tidak ditemukan kecocokan.


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

@ Mazzy Bagaimana cara kerjanya untuk input multiline? Input Anda hanya satu string, dan jadi slsakan memberikan kembali ('','Vroom!','')misalnya.
AdmBorkBork

itu bukan solusi yang lengkap. Maksud saya, Anda dapat mencoba slssebagai gantinya[regex]::Match
mazzy

@ Mazzy Mungkin Anda harus mempostingnya sebagai solusi terpisah.
AdmBorkBork

2

Retina , 21 byte

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

Cobalah online! Penjelasan: Ldaftar cocok, jadi jika regex gagal untuk mencocokkan maka output kosong. $menyebabkan hasilnya menjadi substitusi alih-alih pertandingan. mmenjadikannya pencocokan multiline (setara dengan tertinggal mdalam pertanyaan). The .substitusi membuatnya output panjang penangkapan dalam desimal.


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

Cobalah online!

Terjemahan SNOBOL yang cukup langsung dari spec, membaca setiap baris sampai menemukan yang cocok ^[Vv]ro*m!$, lalu menampilkan panjang o*bit.

Memasuki loop tak terbatas jika tidak Vroom!dapat ditemukan.


Apakah semua ruang putih itu diperlukan? Wow.
FireCubez

5
@FireCubez ya, itulah yang Anda dapatkan dengan bahasa lebih dari 50 tahun: persyaratan ruang kosong yang aneh. Ini menggunakan ruang / tab sebagai gabungan dan Anda harus mengelilingi operator dengan spasi putih juga.
Giuseppe


2

C (gcc) , 188 183 byte

Mengapa menggunakan regex ketika Anda dapat menggunakan mesin negara sebagai gantinya? :-)

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

Cobalah online!



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]

Cobalah online!

Tidak ada regex. Alih-alih membangun semua Vrooom!string yang valid hingga cukup panjang dan membandingkan garis input terhadap mereka, mengumpulkan jumlah os dalam daftar. Jadi untuk input yang tidak valid daftar kosong dikembalikan.


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

Cobalah online!

Keluarkan nuntuk setiap baris yang valid, tepat di persyaratan (tidak ada jika tidak ada garis yang valid, njika tepat satu)

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

Sangat lucu bahwa jawaban regex lebih panjang dari ini
Windmill Cookies

@WindmillCookies GCC membutuhkan kode tambahan untuk mendukung regex
l4m2

hmm sepertinya nama yang terkait dengan regex sangat panjang
Windmill Cookies

1

Japt , 18 byte

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

Cobalah online!

Menyimpan byte dengan mengambil input sebagai larik baris.

Termasuk karakter yang tidak diinginkan antara ]dan *.

Penjelasan:

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



Sebenarnya, karena input dapat berupa array baris, Anda dapat menjatuhkan byte pertama dari komentar pertama saya di atas.
Shaggy

@Shaggy Saya tidak dapat menemukan di mana pun dalam pertanyaan yang menentukan bahwa input dapat berupa array baris, dan sepertinya tidak terdaftar dalam metode I / O default yang string multiline dapat diambil sebagai array baris . Tampaknya masuk akal, tetapi saya akan menunggu konfirmasi terlebih dahulu.
Kamil Drakari

1

C (gcc) , 138 124 byte

Inilah cara regex yang membosankan.

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

Cobalah online!



0

Pyth, 20 byte

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

Output sebagai daftar yang hanya berisi jumlah 'o's, atau daftar kosong jika tidak ada Vroom.
Coba di sini

Penjelasan

/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

Pip , 21 byte

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

Cobalah online!

Cocokkan regex ^[Vv]r(o*)m!$dalam mode multiline; panjang keluaran dari kelompok tangkap.


0

sfk , 94 byte

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

Cobalah online!

Memberi -1ketika Anda tidak perawatan.


0

Merah , 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]]

Cobalah online!

Solusi mudah. Merah itu parsekeren dan enak dibaca, tapi terlalu panjang dibandingkan dengan 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])

Mengembalikan negatif 1 jika polanya tidak cocok.


0

JavaScript, 90 73 61 byte

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

Cobalah online!

Ganti karakter yang tidak ditangkap (o*)dengan string kosong, kembalikan lengthstring yang hanya berisi "o"atau -1jika string yang dihasilkan kosong.


0

Ruby, 32 byte

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

Cocokkan string dengan regex, lalu gunakan variabel grup regex magic Ruby untuk mendapatkan ukuran grup pertama.

Sebut seperti ini:

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

Cobalah online!

String multi-line membutuhkan tiga byte lagi. Saya tidak yakin apakah itu persyaratan yang sulit. Jika demikian, saya akan memperbarui ini.

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

Bagaimana Anda bisa menguji string multi-line?
Laikoni

1
GagalVROM!
14m2

0

Clojure , 90 byte

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

Cobalah online!

Fungsi anonim ini mengembalikan jumlah "o" dalam string vroom, atau -1 jika tidak ada string vroom yang valid.

Versi yang mudah dibaca

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

Penjelasan

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

Ini menggunakan sapaan Eskimo ( }{) yang menyalahgunakan quick tentang bagaimana -nopsi ditangani oleh 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;}

Cobalah online.

Penjelasan:

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'));

Cobalah online!

-12 byte: memindahkan tanda null centang ke for loop dan menghapus tanda kurung

Tidak Disatukan:

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 bytes dengan C # 6 ini null-penggabungan dan kondisional operator, juga tidak perlu {}bila menggunakan hanya satu pernyataan dalam forlingkaran: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

Juga, ini perlu using System.Linq; using System.Text.RegularExpressions;, tidak yakin apakah ini penting lol
Ivan García Topete

Kode yang Anda berikan tidak benar-benar berfungsi, karena tidak hanya akan menghasilkan a -1untuk setiap baris yang tidak berfungsi, tetapi juga akan menghasilkan -1selamanya karena tidak ada pemeriksaan null.
Meerkat

Tidak, tidak akan. a = Console.ReadLine()membuat perulangan, jadi setiap kali Anda meminta masukan untuk perulangan, jika tidak ada masukan, perulangan hanya menunggu, tidak mencetak -1selamanya
Ivan García Topete

Bukti dari konsep. Bahkan jika itu berhasil seperti yang Anda katakan, loop tanpa akhir bukanlah perilaku yang ideal. Apapun, saya telah memindahkan cek nol ke for loop, yang menghilangkan tanda kurung (dan membuat kode lebih pendek dari saran Anda).
Meerkat

0

05AB1E , 39 37 byte

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

Meskipun 05AB1E adalah bahasa golf, tantangan berbasis regex jelas bukan suite yang kuat, karena tidak memiliki regex-builtin.

Output []jika tidak ditemukan kecocokan.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

|              # 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 terima kasih kepada Zacharý

Itu mengkompilasi bahkan dengan regexheader saja

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

Tes:

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
Saya pikir using namespace std;akan menghemat beberapa byte
Zacharý
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.