З якою швидкістю я заробляю?


19

Вступ

Мій автомобільний спідометр був зламаний! Замість того, щоб показувати мені, як швидко я їду, це просто показує: "Vroooom!" Будь ласка, допоможіть мені знати, як швидко я йду.

Виклик

Візьміть рядок як вхідний і перевірте, чи відповідає він регулярному вираженню /^[Vv]ro*m!$/m. Англійською мовою означає, що будь-який рядок рядка повинен починатися з великої чи малої літери v, потім з малої літери r, потім будь-якої суми (включаючи нуль) малої літери o, а потім точного рядкаm! . Можуть бути й інші рядки, але рядок Vroom повинен бути у власній лінії.

Якщо ви знайдете відповідність, ви повинні порахувати кількість os у рядку 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

Python 2 , 56 53 байти

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

Спробуйте в Інтернеті!

Базовий регулярний вираз і групування, використовує прапор re.MULTILINE (який має значення 8) і повторно шукає, щоб переконатися, що він працює для багаторядкових входів. Викликає виняток, коли не знайдено відповідності. Дякуємо @ovs за -3 байти від (re.M == 8)чайових.


1
Ласкаво просимо до PPCG! Я переформатував вашу відповідь, щоб вона виглядала трохи приємніше, якщо ви незадоволені моєю редагуванням, ви завжди зможете відмовитися. Btw. Я пропоную зв’язати щось на зразок tio.run , щоб люди могли легко перевірити вашу відповідь.
ბიმო

re.Mмає значення 8, тому може просто використовуватиre.search(regex,x,8)
вт

4

R , 62 60 58 44 байт

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

Спробуйте в Інтернеті!

@Giuseppe з 14 байтами.

Оригінальний підхід з поясненням:

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

Спробуйте в Інтернеті!

R має сім функцій узгодження малюнка. Більш часто використовувані з них є grep, greplі sub, але ось приємне використанняregexec .

regexecдає вам купу речей, одна з яких - це довжина будь-якого захопленого підрядка, в даному випадку - (o*)частина мультилінійного регулярного виразів.

The attr(el .... "m")[2]Матеріал є golfy способом , щоб отримати потрібний номер.

Повертається, NAякщо немає відповідності.



У мене 44-байтний підхід ... Я не буду публікувати його, якщо ви цього не захочете.
Джузеппе

@Giuseppe не впевнений, чому б і ні? Особливо, якщо це принципово інше.
ngm

3

JavaScript (Node.js) , 41 байт

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

Спробуйте в Інтернеті!


Це не вдаєтьсяvroooooooooooom!x\nvrom!
червня 1818

1
Побачивши, як нам дозволяється вихід з помилкою, якщо не знайдено відповідності, ви можете зробити це за -3 байти, виправляючи проблему @BMO, згадану вище в процесі.
Кудлатий

Uncrossed-out 41, безумовно, все ще 41
Redwolf Programs

@Shaggy Для чого потрібний простір [1]. length?
l4m2

@ l4m2, друкарська помилка! Я не помітив його на своєму телефоні, тому що lengthвсе-таки проривався на нову лінію
Кудлатий

3

Powershell, 62 58 53 48 байт

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

повертає числа oу першому Vroom!, або -4, якщоVroom! не знайдено.

Примітки:

  • slsпсевдонім для Select-String ;
  • (?m-i) всередині regexp означає:
    • Використовуйте багаторядковий режим. ^і $збігають початок і кінець рядка, а не початок і кінець рядка.
    • Використовуйте відповідність регістру
  • |% 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

Спробуйте в Інтернеті!

-splits вхід $argsпо `newlines, передає їх у цикл for. Кожну ітерацію ми перевіряємо, чи [regex]::Matchє наша .successчи ні. Якщо так, ми залишаємо $x(об'єкт результатів регулярних виразів) на конвеєрі. Поза циклом ми беремо .lengthвластивість - якщо це об’єкт результатів регулярних виразів, це довжина відповідності (наприклад, "Vroom!" Було б 6); якщо це не об'єкт результатів регулярних виразів, довжина дорівнює нулю. Потім віднімаємо, 4щоб зняти рахунки для Vrm!і залишимо це на конвеєрі. Вихід неявний. Виводить a, -4якщо не знайдено відповідності


sls "^[Vv]ro*m!$"?
маззи

@mazzy Як би це працювало для введення рядків? Ваш єдиний вхід - це один рядок, і так 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

Haskell , 75 71 69 байт

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

Спробуйте в Інтернеті!

Без регексу. Натомість будує всі дійсні Vrooom!рядки до достатньої довжини та порівнює рядки введення проти них, збираючи кількість os у списку. Таким чином, для недійсних входів повертається порожній список.


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якщо точно один)

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

Це настільки смішно, що відповідь на регулярний вигляд довша за це
Cookie Windmill

@WindmillCookies GCC потребує додаткового коду для підтримки регулярного виразу
l4m2

хм. здається, що імена, пов'язані з регулярними виразами, надзвичайно довгі
Cookie Windmill

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

@Shaggy Я не можу ніде знайти у запитанні, яке вказує, що введенням може бути масив рядків, і він, схоже, не вказаний у методах вводу / виводу за замовчуванням, що багаторядковий рядок може вважатися масивом рядків . Це здається розумним, але я спочатку дочекаюся підтвердження.
Каміль Дракарі



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

Спробуйте в Інтернеті!

Ця анонімна функція повертає число "o" s у рядку vroom, або -1, якщо немає дійсної строки vroom.

Читаема версія

(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

Для цього використовується ескімоське привітання ( }{), яке зловживає швидким способом -nобробки варіанту за допомогою perl.


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 і умовними операторами, також непотрібними, {}коли використовується лише один вислів у forциклі:for(var a="";;a=Console.ReadLine())Console.WriteLine(new Regex(@"^[Vv]ro*m!$").Match(a??"").Success?a.Count(x =>x=='o'):-1);
Іван Гарсія Topete

Також це потрібно using System.Linq; using System.Text.RegularExpressions;, не впевнений, чи це важливо хаха
Іван Гарсія Топете

Код, який ви надали, насправді не працює, оскільки він не тільки виводить a -1для кожного рядка, на який він не працює, але і виводить -1s назавжди, оскільки перевірки на нього немає null.
Meerkat

Ні, не буде. a = Console.ReadLine()робить цикл, тому кожен раз, коли ви вимагаєте ввести цикл, щоб продовжити, якщо введення немає, цикл просто чекає, а не друкується -1назавжди
Іван Гарсія Топете

Доказ концепції.Навіть якби це спрацювало, як ви сказали, нескінченний цикл не є ідеальною поведінкою. Незважаючи на те, я перемістив нульовий чек у цикл for, який видаляє дужки (і робить код коротшим, ніж ваша пропозиція).
Meerkat

0

05AB1E , 39 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;, врятувало б декілька байтів
Zacharý
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.