Quão rápido estou me divertindo?

19

Introdução

Meu velocímetro do carro foi hackeado! Em vez de me mostrar o quão rápido estou dirigindo, ele apenas mostra: "Vroooom!" Por favor, me ajude a saber o quão rápido estou indo.

Desafio

Pegue uma string como entrada e verifique se ela corresponde ao regex /^[Vv]ro*m!$/m. Em inglês, isso significa que qualquer linha da sequência deve começar com maiúscula ou minúscula v, depois minúscula re depois qualquer valor (incluindo zero) da letra minúscula e o, em seguida, a sequência exata m!. Pode haver outras linhas, mas a string Vroom deve estar na sua própria linha.

Se você encontrar uma correspondência, deve contar a quantidade de os na string Vroom e produzi-la. Se você não encontrar uma correspondência, no entanto, deve gerar qualquer valor padrão que não possa ser emitido de outra forma (como -1uma string vazia)

Lembretes

Pontuação

Isso é , então o código mais curto em bytes vence. No entanto , não marcarei nenhuma resposta como aceita.

Casos de teste

Entrada

Vrom!

Resultado 1

Entrada

vrooooooom!

Resultado 7

Entrada

Hello, Vroom!

Resultado (none)

Entrada

Foo bar boo baz
Vrooom!
hi

Resultado 3

Entrada

Vrm!ooo

Resultado (none)

Entrada

PPCG puzzlers pie

Resultado (none)

Entrada

hallo
vROOOm!

Resultado (none)

FireCubez
fonte

Respostas:

9

sed 4.2.2 , 20 bytes

-nr opções necessárias na linha de comando.

s/^[Vv]r(o*)m!$/\1/p

Isso gera a velocidade em unário como o número de os.

Experimente online!

Trauma Digital
fonte
Não posso dizer Vrm!deVram!
l4m2
4

Python 2 , 56 53 bytes

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

Experimente online!

Regex básico e agrupamento, usa o sinalizador re.MULTILINE (que tem um valor de 8) e re.search para garantir que funcione para entradas com várias linhas. Gera uma exceção quando nenhuma correspondência é encontrada. Obrigado a @ovs pelos -3 bytes da (re.M == 8)ponta.

Shamtam
fonte
1
Bem-vindo ao PPCG! Reformatei sua resposta para torná-la um pouco melhor, se você não estiver satisfeito com minha edição, sempre poderá reverter. Btw. Sugiro vincular a algo como tio.run , para que as pessoas possam testar facilmente sua resposta.
ბიმო
re.Mtem o valor 8, então pode apenas usarre.search(regex,x,8)
ovs 03/11
4

R , 62 60 58 44 bytes

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

Experimente online!

@ Giuseppe com 14 bytes de golfe.

Abordagem original com explicação:

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

Experimente online!

R possui sete funções de correspondência de padrões. Os mais utilizados são grep, greple sub, mas aqui está um uso bom para regexec.

regexecfornece várias coisas, uma das quais é o comprimento de qualquer substring capturado, neste caso, a (o*)parte do regex multilinha.

O attr(el .... "m")[2]material é uma maneira de obter o número desejado.

Retorna NAse não houver correspondência.

ngm
fonte
Eu tenho uma abordagem de 44 bytes ... Não vou postar a menos que você queira.
9788 Giuseppe #
@ Giuseppe não sabe por que não? Especialmente se for fundamentalmente diferente.
Ng
3

JavaScript (Node.js) , 41 bytes

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

Experimente online!

Luis felipe De jesus Munoz
fonte
Isso falha para #vroooooooooooom!x\nvrom!
11/11/18
1
Visto que é permitido sair com um erro se nenhuma correspondência for encontrada, você pode fazer isso por -3 bytes, corrigindo o problema @BMO mencionado acima no processo.
Shaggy
Uncrossed-out 41 é definitivamente ainda 41
RedWolf Programas
@ Shaggy Para que serve o espaço [1]. length?
L4m2 3/11
@ l4m2, um erro de digitação! Eu não o localizei no meu telefone porque lengthestava quebrando uma nova linha de qualquer maneira.
Shaggy
3

Powershell, 62 58 53 48 bytes bytes

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

retorna números de oem um primeiro Vroom!, ou -4 se Vroom!não for encontrado.

Notas:

  • slsé o alias para Select-String ;
  • (?m-i) regexp interno significa:
    • Use o modo multilinha. ^e $corresponda ao início e ao fim de uma linha, em vez do início e do fim de uma sequência.
    • Usar correspondência com distinção entre maiúsculas e minúsculas
  • |% M*é um atalho para a propriedade Matches, que fornece uma primeira correspondência porque não usamos o -AllMatchesparâmetro

Script de teste:

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

Resultado:

True: 1
True: 7
True: -4
True: 3
True: -4
True: -4
True: -4
True: 3
True: 0
confuso
fonte
2

PowerShell , 83 bytes

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

Experimente online!

-splits a entrada $argsnas `nlinhas de ew, canaliza essas para um loop for. A cada iteração, verificamos se o nosso [regex]::Matché .successou não. Nesse caso, deixamos $x(o objeto de resultados regex) no pipeline. Fora do loop, pegamos a .lengthpropriedade - se for o objeto de resultados de regex, esse é o comprimento da partida (por exemplo, "Vroom!" Seria 6); se não for um objeto de resultados de regex, o comprimento será zero. Subtraímos então 4para remover as contagens Vrm!e deixá-las no pipeline. A saída está implícita. Emite a -4se nenhuma correspondência for encontrada.

AdmBorkBork
fonte
sls "^[Vv]ro*m!$"?
Mazzy
@mazzy Como isso funcionaria para entradas multilinhas? Sua única entrada é uma string e, portanto sls, retornará ('','Vroom!','')por exemplo.
AdmBorkBork #
não está solução concluída. Quero dizer, você pode tentar em slsvez disso[regex]::Match
mazzy
@mazzy Talvez você deva publicá-lo como uma solução separada.
AdmBorkBork
2

Retina , 21 bytes

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

Experimente online! Explicação: Llista correspondências, portanto, se o regex falhar, a saída estará vazia. $faz com que o resultado seja a substituição e não a correspondência. mfaz com que seja uma correspondência multilinha (o equivalente ao final mda pergunta). A .substituição substitui o tamanho da captura em decimal.

Neil
fonte
2

SNOBOL4 (CSNOBOL4) , 99 82 bytes

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

Experimente online!

Tradução SNOBOL bastante direta da especificação, lê cada linha até encontrar uma que corresponda ^[Vv]ro*m!$e depois gera o comprimento do o*bit.

Insere um loop infinito se não for Vroom!possível encontrar.

Giuseppe
fonte
Todo esse espaço em branco é necessário? Uau.
22418 FireCubez
5
@FireCubez sim, é isso que você obtém com uma linguagem de mais de 50 anos: requisitos de espaço em branco estranhos. Ele usa espaço / guia como concatenação e você também deve envolver os operadores com espaços em branco.
11557 Giuseppe
2

C (gcc) , 188 183 bytes

Por que usar expressões regulares quando você pode usar uma máquina de estado? :-)

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

Experimente online!

ErikF
fonte
1

Haskell , 75 71 69 bytes

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

Experimente online!

Sem regex. Em vez disso, constrói todas as Vrooom!cadeias válidas até um comprimento suficiente e compara as linhas da entrada com elas, coletando o número de os em uma lista. Assim, para entradas inválidas, uma lista vazia é retornada.

Laikoni
fonte
1

C (gcc) , 104 100 bytes

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

Experimente online!

Saída npara cada linha válida, exatamente no requisito (nada se não houver linha válida, nse for exatamente uma)

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
fonte
É tão engraçado que a resposta regex é mais do que isso
Moinho cookies
@WindmillCookies GCC precisa de código extra para regex apoio
l4m2
Hmm. Parece que nomes relacionados com expressões regulares são extremamente longos
Moinho cookies
1

Japonês , 18 bytes

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

Experimente online!

Salva um byte, recebendo a entrada como uma matriz de linhas.

Inclui um caractere não imprimível entre ]e *.

Explicaçã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
Kamil Drakari
fonte
1
19 bytes
Shaggy
Na verdade, como a entrada pode ser uma matriz de linhas, você pode tirar o primeiro byte do meu primeiro comentário acima.
Shaggy
@ Shaggy Não consigo encontrar em nenhum lugar da pergunta que especifique que a entrada pode ser uma matriz de linhas e ela não parece estar listada nos métodos de E / S padrão que uma cadeia de linhas múltipla pode ser usada como uma matriz de linhas . Parece provável que seja razoável, mas vou esperar pela confirmação primeiro.
Kamil Drakari #
1

C (gcc) , 138 124 bytes

Aqui está a maneira regex chata.

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

Experimente online!

ErikF
fonte
0

Pitão, 20 bytes

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

Saída como uma lista contendo apenas o número de 'o's ou uma lista vazia, se não houver Vroom.
Experimente aqui

Explicação

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

fonte
0

Pip , 21 bytes

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

Experimente online!

Regex de correspondência ^[Vv]r(o*)m!$no modo multilinha; comprimento de saída do grupo de captura.

DLosc
fonte
0

sfk , 94 bytes

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

Experimente online!

-1quando você não está vomitando.

Furioso
fonte
0

Vermelho , 104 bytes

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

Experimente online!

Uma solução simples. Vermelho parseé legal e legível, mas muito longo em comparação com 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 ]
]
Galen Ivanov
fonte
0

J, 35 bytes

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

Retorna 1 negativo se o padrão não corresponder.

hoosierEE
fonte
0

JavaScript, 90 73 61 bytes

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

Experimente online!

Substitua caracteres que não são capturados por (o*)uma sequência vazia, retorno lengthda sequência contendo apenas "o"ou -1se a sequência resultante estiver vazia.

guest271314
fonte
0

Ruby, 32 bytes

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

Corresponde a string ao regex e, em seguida, usa as variáveis ​​do grupo regex mágico do Ruby para obter o tamanho do primeiro grupo.

Chame assim:

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

Ruby , 28 29 bytes

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

Experimente online!

Cadeias de linhas múltiplas requerem mais três bytes. Não tenho certeza se isso é um requisito difícil. Se assim for, eu vou atualizar isso.

->l{l[/^[Vv]r(o*)m!$/].count ?o}
canhascodez
fonte
Como você pode testar strings de várias linhas?
Laikoni #
1
Falha ao ligarVROM!
l4m2
0

Clojure , 90 bytes

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

Experimente online!

Essa função anônima retorna o número de "o" s na cadeia de caracteres do vroom ou -1 se não houver uma sequência de caracteres do vroom válida.

Versão legível

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

Explicação

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

perl -nE, 35 bytes

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

Isso usa a saudação esquimó ( }{), que abusa da maneira rápida de como a -nopção é tratada pelo perl.


fonte
0

Java 8, 109 bytes

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

Experimente online.

Explicação:

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
fonte
0

C # (.NET Core) , 134 122 bytes

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

Experimente online!

-12 bytes: null verificação movida no for loop e colchetes removidos

Ungolfed:

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
Meerkat
fonte
-10 bytes com C # 6 do nulo coalescentes e condicionais operadores, também desnecessário {}quando se utiliza apenas uma declaração no forloop: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
Além disso, este necessidades using System.Linq; using System.Text.RegularExpressions;, não sei se isso é lol importante
Ivan García Topete
O código que você forneceu não funciona, pois ele não apenas gera um -1para cada linha em que não funciona, mas também produz uma -1eternidade, pois não há verificação null.
Meerkat
Não, não vai. a = Console.ReadLine()faz com que o loop, de modo que cada vez que você está solicitando entrada para o loop para continuar, se não houver nenhuma entrada, o circuito está apenas esperando, não está imprimindo -1para sempre
Ivan García Topete
Prova de conceito. Mesmo que funcionasse como você disse, um loop sem fim não é um comportamento ideal. Independentemente disso, movi a verificação nula para o loop for, que remove os colchetes (e torna o código mais curto que a sua sugestão).
Meerkat
0

05AB1E , 39 37 bytes

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

Embora 05AB1E seja uma linguagem de golfe, os desafios baseados em regex definitivamente não são sua suíte forte, já que não possui recursos embutidos em regex.

Saída []se nenhuma correspondência foi encontrada.

Experimente online ou verifique todos os casos de teste .

Explicação:

|              # 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
fonte
0

C ++, MSVC, 164 159 bytes

-5 bytes graças a Zacharý

Compila mesmo com regexapenas o cabeçalho

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

Testes:

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
fonte
1
Eu acho que using namespace std;iria salvar alguns bytes
Zachary