Jak szybko się burzę?

19

Wprowadzenie

Prędkościomierz mojego samochodu został zhakowany! Zamiast pokazywać mi, jak szybko jadę, pokazuje tylko: „Vroooom!” Proszę, pomóż mi wiedzieć, jak szybko jadę.

Wyzwanie

Weź ciąg jako dane wejściowe i sprawdź, czy pasuje do wyrażenia regularnego /^[Vv]ro*m!$/m. W języku angielskim oznacza to, że każda linia łańcucha musi zaczynać się od dużej lub małej litery v, następnie małą literą r, a następnie dowolną ilością (w tym zero) małej litery o, a następnie dokładnym łańcuchem m!. Mogą istnieć inne linie, ale łańcuch Vrooma musi znajdować się we własnej linii.

Jeśli znajdziesz dopasowanie, musisz policzyć ilość ociągów Vrooma i wyprowadzić go. Jeśli jednak nie znajdziesz dopasowania, powinieneś wypisać dowolną wartość domyślną, której inaczej nie można wypisać (np. -1Pusty ciąg)

Przypomnienia

Punktacja

To jest , więc wygrywa najkrótszy kod w bajtach. Jednakże , nie będzie oznaczać żadnej odpowiedzi jako przyjęte.

Przypadki testowe

Wejście

Vrom!

Wynik 1

Wejście

vrooooooom!

Wynik 7

Wejście

Hello, Vroom!

Wynik (none)

Wejście

Foo bar boo baz
Vrooom!
hi

Wynik 3

Wejście

Vrm!ooo

Wynik (none)

Wejście

PPCG puzzlers pie

Wynik (none)

Wejście

hallo
vROOOm!

Wynik (none)

FireCubez
źródło

Odpowiedzi:

4

Python 2 , 56 53 bajtów

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

Wypróbuj online!

Podstawowe wyrażenia regularne i grupowanie, używa flagi re.MULTILINE (która ma wartość 8) i ponownie przeszukuje, aby upewnić się, że działa dla danych wejściowych wieloliniowych. Zgłasza wyjątek, gdy nie znaleziono dopasowania. Dzięki @ovs za -3 bajty od (re.M == 8)końcówki.

Shamtam
źródło
1
Witamy w PPCG! Ponownie sformatowałem twoją odpowiedź, aby wyglądała nieco ładniej, jeśli jesteś niezadowolony z mojej edycji, zawsze możesz cofnąć. Btw. Sugeruję link do czegoś takiego jak tio.run , aby ludzie mogli łatwo przetestować twoją odpowiedź.
ბიმო
re.Mma wartość 8, więc można po prostu użyćre.search(regex,x,8)
ov
4

R , 62 60 58 44 bajtów

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

Wypróbuj online!

@Giuseppe z 14 bajtami golfowymi.

Oryginalne podejście z wyjaśnieniem:

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

Wypróbuj online!

R ma siedem funkcji dopasowania wzorca. Najczęściej używane są grep, grepli sub, ale tutaj jest dobry użytek regexec.

regexecdaje ci kilka rzeczy, z których jedną jest długość dowolnego przechwyconego podłańcucha, w tym przypadku (o*)część wyrażenia regularnego wieloliniowego.

attr(el .... "m")[2]Rzeczy jest Golfy sposób, aby uzyskać żądany numer.

Zwraca, NAjeśli nie ma dopasowania.

ngm
źródło
Mam podejście 44-bajtowe ... Nie opublikuję tego, chyba że mnie chcesz.
Giuseppe,
@Giuseppe nie wiesz, dlaczego nie? Zwłaszcza jeśli jest zasadniczo inny.
ngm
3

JavaScript (Node.js) , 41 bajtów

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

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
Nie udaje się tovroooooooooooom!x\nvrom!
ბიმო
1
Widząc, jak wolno wyjść z błędu, jeśli nie zostanie znaleziony, można zrobić to za -3 bajtów, ustalające @BMO problemu wspomnianego powyżej procesu.
Shaggy
Uncrossed-out 41 to zdecydowanie wciąż 41
Redwolf Programs
@Shaggy Po co jest miejsce [1]. length?
l4m2
@ l4m2, literówka! Nie zauważyłem tego na moim telefonie, bo i tak lengthbył na nowej linii.
Shaggy
3

PowerShell, 62 58 53 48 bajtów

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

zwraca liczbę z opierwszego Vroom!lub -4, jeśli Vroom!nie znaleziono.

Uwagi:

  • slsjest aliasem dla Select-String ;
  • (?m-i) wewnątrz wyrażenia regularnego oznacza:
    • Użyj trybu multilinii. ^i $dopasuj początek i koniec linii, zamiast początku i końca łańcucha.
    • Używaj dopasowania z rozróżnianiem wielkości liter
  • |% M*to skrót do właściwości Matches, która daje pierwsze dopasowanie, ponieważ nie używamy -AllMatchesparametru.

Skrypt testowy:

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

Wynik:

True: 1
True: 7
True: -4
True: 3
True: -4
True: -4
True: -4
True: 3
True: 0
mazzy
źródło
2

PowerShell , 83 bajty

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

Wypróbuj online!

-splits dane wejściowe $argsw `newlines, potokują je w pętli for. Przy każdej iteracji sprawdzamy, czy nasza [regex]::Matchjest, .successczy nie. Jeśli tak, zostawiamy $x(obiekt wyników wyrażenia regularnego) w potoku. Poza pętlą bierzemy .lengthwłaściwość - jeśli jest to obiekt wyników wyrażenia regularnego, jest to długość dopasowania (np. „Vroom!” To 6); jeśli nie jest to obiekt wyników wyrażenia regularnego, długość wynosi zero. Następnie odejmujemy, 4aby usunąć liczby dla Vrm!i pozostawiamy to w kolejce. Wynik jest niejawny. Zwraca a, -4jeśli nie znaleziono dopasowania.

AdmBorkBork
źródło
sls "^[Vv]ro*m!$"?
mazzy
@mazzy Jak to by działało w przypadku wprowadzania wielowierszowego? Twoje jedyne dane wejściowe to jeden ciąg znaków, więc slszwrócą ('','Vroom!','')na przykład.
AdmBorkBork
to nie jest kompletne rozwiązanie. Możesz spróbować slszamiast tego[regex]::Match
mazzy
@mazzy Może powinieneś opublikować to jako osobne rozwiązanie.
AdmBorkBork,
2

Retina , 21 bajtów

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

Wypróbuj online! Objaśnienie: Lwyświetla listę dopasowań, więc jeśli wyrażenie regularne nie pasuje, dane wyjściowe są puste. $powoduje, że wynikiem jest zastąpienie, a nie dopasowanie. msprawia, że ​​jest to dopasowanie wieloliniowe (odpowiednik końcowego mw pytaniu). .W substytucji sprawia, że wyjście długość przechwytywania w systemie dziesiętnym.

Neil
źródło
2

SNOBOL4 (CSNOBOL4) , 99 82 bajtów

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

Wypróbuj online!

Całkiem bezpośrednie tłumaczenie specyfikacji SNOBOL, odczytuje każdą linię, aż znajdzie taką, która jest zgodna ^[Vv]ro*m!$, a następnie wyprowadza długość o*bitu.

Wchodzi w nieskończoną pętlę, jeśli nie Vroom!można jej znaleźć.

Giuseppe
źródło
Czy to wszystko jest potrzebne? Łał.
FireCubez
5
@FireCubez tak, to jest to, co masz z ponad 50-letnim językiem: dziwne wymagania dotyczące białych znaków. Używa spacji / tabulacji jako konkatenacji i musisz także otoczyć operatorów spacjami.
Giuseppe,
2

C (gcc) , 188 183 bajtów

Po co używać wyrażeń regularnych, jeśli zamiast tego można użyć automatu stanów? :-)

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

Wypróbuj online!

ErikF
źródło
1

Haskell , 75 71 69 bajtów

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

Wypróbuj online!

Brak wyrażenia regularnego. Zamiast tego buduje wszystkie poprawne Vrooom!ciągi do wystarczającej długości i porównuje z nimi wiersze danych wejściowych, zbierając liczbę os na liście. Zatem dla nieprawidłowych danych wejściowych zwracana jest pusta lista.

Laikoni
źródło
1

C (gcc) , 104 100 bajtów

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

Wypróbuj online!

Wypisuj ndla każdego poprawnego wiersza dokładnie w wymaganiu (nic, jeśli nie ma poprawnego wiersza, njeśli dokładnie jeden)

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))
    }
  }
}
l4m2
źródło
To tak zabawne, że odpowiedź wyrażenia regularnego jest dłuższa
Windmill Cookies
@WindmillCookies GCC potrzebuje dodatkowego kodu do obsługi wyrażenia regularnego
l4m2
hmm Wygląda na to, że nazwy związane z wyrażeniami regularnymi są bardzo długie
Windmill Cookies
1

Japt , 18 bajtów

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

Wypróbuj online!

Zapisano bajt, przyjmując dane wejściowe jako tablicę wierszy.

Obejmuje niedrukowalny znak między ]i *.

Wyjaśnienie:

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
Kamil Drakari
źródło
1
19 bajtów
Shaggy
W rzeczywistości, ponieważ dane wejściowe mogą być tablicą wierszy, możesz zrzucić pierwszy bajt z mojego pierwszego komentarza powyżej.
Shaggy
@Shaggy Nie mogę znaleźć nigdzie w pytaniu, które określa, że ​​dane wejściowe mogą być tablicą linii i nie wydaje się, aby w domyślnych metodach We / Wy wymieniono ciąg, że ciąg wielowierszowy może być traktowany jako tablica linii . Wydaje się, że to rozsądne, ale najpierw poczekam na potwierdzenie.
Kamil Drakari
1

C (gcc) , 138 124 bajtów

Oto nudny sposób wyrażenia regularnego.

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

Wypróbuj online!

ErikF
źródło
0

Pyth, 20 bajtów

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

Wyprowadza jako listę zawierającą tylko liczbę „o” lub pustą listę, jeśli nie ma Vrooma.
Wypróbuj tutaj

Wyjaśnienie

/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.

źródło
0

Pip , 21 bajtów

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

Wypróbuj online!

Dopasuj wyrażenie regularne ^[Vv]r(o*)m!$w trybie multilinii; długość wyjściowa grupy przechwytywania.

DLosc
źródło
0

sfk , 94 bajty

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

Wypróbuj online!

Daje, -1gdy się nie wyposażysz.

Obrzydliwe
źródło
0

Czerwony , 104 bajty

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

Wypróbuj online!

Proste rozwiązanie. Red's parsejest fajny i czytelny, ale zbyt długi w porównaniu do wyrażenia regularnego

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 ]
]
Galen Iwanow
źródło
0

J, 35 bajtów

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

Zwraca ujemną 1, jeśli wzór nie pasuje.

hoosierEE
źródło
0

JavaScript, 90 73 61 bajtów

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

Wypróbuj online!

Zastąp znaki, które nie są przechwytywane, (o*)pustym ciągiem, zwróć lengthciąg zawierający tylko "o"lub -1jeśli wynikowy ciąg jest pusty.

guest271314
źródło
0

Rubinowy, 32 bajty

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

Dopasowuje ciąg do wyrażenia regularnego, a następnie używa magicznych zmiennych grupy wyrażeń regularnych Ruby, aby uzyskać rozmiar pierwszej grupy.

Nazwij to tak:

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

Rubin , 28 29 bajtów

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

Wypróbuj online!

Ciągi wieloliniowe wymagają jeszcze trzech bajtów. Nie jestem pewien, czy to trudne wymaganie. Jeśli tak, zaktualizuję to.

->l{l[/^[Vv]r(o*)m!$/].count ?o}
canhascodez
źródło
Jak możesz testować ciągi wieloliniowe?
Laikoni,
1
Fail onVROM!
l4m2
0

Clojure , 90 bajtów

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

Wypróbuj online!

Ta anonimowa funkcja zwraca liczbę „o” w ciągu vroom lub -1, jeśli nie ma prawidłowego ciągu vroom.

Wersja do odczytu

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

Wyjaśnienie

#"(?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
TheGreatGeek
źródło
0

perl -nE, 35 bajtów

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

Korzysta z Eskimo pozdrowienia ( }{), które nadużywają szybkiego sposobu obsługi -nopcji przez perla.


źródło
0

Java 8, 109 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
Kevin Cruijssen
źródło
0

C # (.NET Core) , 134 122 bajtów

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

Wypróbuj online!

-12 bajtów: przeniesiono null czek do for pętli i usunięto nawiasy

Nie golfowany:

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
Surykatka
źródło
-10 bajtów z zerowym łączeniem i operatorami warunkowymi C # 6 , również niepotrzebne, {}gdy używa się tylko jednej instrukcji w forpętli: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
To także wymaga using System.Linq; using System.Text.RegularExpressions;, nie jestem pewien, czy to ważny lol
Ivan García Topete,
Podany kod tak naprawdę nie działa, ponieważ nie tylko wyświetli a -1dla każdego wiersza, na którym nie działa, ale wyświetli -1s na zawsze, ponieważ nie ma możliwości sprawdzenia null.
Meerkat
Nie zrobi tego. a = Console.ReadLine()robi pętlę, więc za każdym razem żądasz wejście do pętli iść dalej, jeśli nie ma sygnału, pętla tylko czeka, nie drukuje -1na zawsze
Ivan Garcia Topete
Dowód koncepcji. Nawet jeśli zadziałało tak, jak powiedziałeś, niekończąca się pętla nie jest idealnym zachowaniem. Niezależnie od tego przesunąłem kontrolę zerową do pętli for, która usuwa nawiasy (i sprawia, że ​​kod jest krótszy niż twoja sugestia).
Meerkat
0

05AB1E , 39 37 bajtów

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

Chociaż 05AB1E jest językiem golfowym, wyzwania oparte na wyrażeniach regularnych zdecydowanie nie są jego mocnym zestawem, ponieważ nie ma wbudowanych wyrażeń regularnych.

Dane wyjściowe, []jeśli nie znaleziono dopasowania.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

|              # 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. []
Kevin Cruijssen
źródło
0

C ++, MSVC, 164 159 bajtów

-5 bajtów dzięki Zacharýowi

Kompiluje nawet z samym regexnagłówkiem

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

Testy:

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';
HatsuPointerKun
źródło
1
Myślę, using namespace std;że zaoszczędziłbym kilka bajtów
Zacharý