Ne kadar hızlı vroooom yapıyorum?


19

Giriş

Benim araba hız göstergesi hacklendi! Bana ne kadar hızlı sürdüğümü göstermek yerine, sadece "Vroooom!" Lütfen ne kadar hızlı gittiğimi bilmeme yardım et.

Meydan okuma

Bir dizeyi girdi olarak alın ve dizinin normal ifadeyle eşleşip eşleşmediğini kontrol edin /^[Vv]ro*m!$/m. Bu, dizenin herhangi bir satırının büyük veya küçük harfle v, ardından küçük harfle r, sonra küçük harfin herhangi bir miktarının (sıfır dahil) o, ardından tam dizeyle başlaması gerektiği anlamına gelir m!. Başka satırlar da olabilir, ancak Vroom dizesi kendi satırında olmalıdır.

Bir eşleşme bulursanız o, Vroom dizesindeki 's miktarını saymanız ve çıktısını almanız gerekir . Bununla birlikte, bir eşleşme bulamazsanız, başka şekilde verilemeyen herhangi bir varsayılan değer ( -1boş veya boş bir dize gibi) çıkarmalısınız.

Hatırlatmalar

puanlama

Bu , bu yüzden bayttaki en kısa kod kazanır. Ancak hiçbir cevabı kabul edilmiş olarak işaretlemeyeceğim.

Test senaryoları

Giriş

Vrom!

Çıktı 1

Giriş

vrooooooom!

Çıktı 7

Giriş

Hello, Vroom!

Çıktı (none)

Giriş

Foo bar boo baz
Vrooom!
hi

Çıktı 3

Giriş

Vrm!ooo

Çıktı (none)

Giriş

PPCG puzzlers pie

Çıktı (none)

Giriş

hallo
vROOOm!

Çıktı (none)

Yanıtlar:



4

Python 2 , 56 53 bayt

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

Çevrimiçi deneyin!

Temel regex ve gruplama, çok satırlı girdilerde çalıştığından emin olmak için re.MULTILINE bayrağını (8 değerine sahip) ve re.search kullanır. Eşleşme bulunmadığında bir istisna oluşturur. Uçtan -3 bayt @ovs için teşekkürler (re.M == 8).


1
PPCG'ye Hoşgeldiniz! Cevabınızı biraz daha güzel görünmesi için yeniden biçimlendirdim, düzenlememden memnun değilseniz her zaman geri alabilirsiniz. Btw. İnsanların cevabınızı kolayca test edebilmesi için tio.run gibi bir şeye bağlanmanızı öneririm .
ბიმო

re.Mdeğeri vardır 8, bu yüzden sadece kullanabilirsinizre.search(regex,x,8)
ovs

4

R , 62 60 58 44 bayt

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

Çevrimiçi deneyin!

@Giuseppe 14 byte ile golf oynadı.

Açıklama ile orijinal yaklaşım:

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

Çevrimiçi deneyin!

R, yedi desen eşleştirme fonksiyonuna sahiptir. Daha yaygın olarak kullanılan olanlardır grep, greplve sub, ama burada güzel bir faydası regexec.

regexecsize bir grup yakalanan alt dizenin uzunluğu, bu durumda (o*)çok satırlı regex'in parçası olan bir sürü şey verir .

attr(el .... "m")[2]Şeyler istenilen numarayı almak için Golfy yoldur.

Eşleşme NAyoksa döndürür .



44 baytlık bir yaklaşımım var ... Siz istemedikçe göndermeyeceksiniz.
Giuseppe

@Giuseppe neden olmasın emin değil misiniz? Özellikle de temelde farklıysa.
ngm

3

JavaScript (Node.js) , 41 bayt

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

Çevrimiçi deneyin!


Bu başarısızvroooooooooooom!x\nvrom!
ბიმო

1
Biz hiçbir eşleşme bulunursa, yapabileceğin bir hatayla çıkışına izin var olarak gören bu süreçte yukarıda belirtilen sorun @BMO sabitleme için -3 bayt.
Shaggy

Uncrossed-out 41 kesinlikle 41
Redwolf Programs

@Shaggy Alan ne [1]. lengthiçin?
l4m2

@ l4m2, bir yazım hatası! Telefonumda fark etmedim çünkü lengthzaten yeni bir satıra geçiyordu.
Shaggy

3

Powershell, 62 58 53 48 bayt bayt

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

getirileri sayılar obirinci yılında Vroom!, veya -4 eğer Vroom!bulunamadı.

Notlar:

  • slsSelect-String için takma addır ;
  • (?m-i) normal ifade içinde:
    • Çok satırlı mod kullanın. ^ve $bir dizenin başlangıcı ve bitişi yerine çizginin başlangıcı ve bitişi ile eşleşir.
    • Büyük / küçük harf duyarlı eşleme kullan
  • |% M*olduğu kısayol özelliği için Matcheskullandığımız çünkü bir ilk maçı verir -AllMatchesparametre.

Test komut dosyası:

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

Çıktı:

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

2

PowerShell , 83 bayt

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

Çevrimiçi deneyin!

-splitewlines giriş $args, `nbir for döngüsü içine boruları. Her yineleme, kendimizi kontrol [regex]::Matchbir olduğunu .successya da değil. Öyleyse, $x(normal ifade sonuçları nesnesi) boru hattında kalırız . Döngünün dışında, .lengthözelliği alırız - regex sonuçları nesnesi ise, bu maçın uzunluğudur (örneğin, "Vroom!" 6 olur); normal ifade sonuçları nesnesi değilse uzunluk sıfırdır. Daha sonra 4, için sayıları kaldırmak Vrm!ve bunu boru hattında bırakmak için çıkarırız . Çıktı örtük. Eşleşme -4bulunmazsa a sonucunu verir.


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

@mazzy Bu çok satırlı giriş için nasıl çalışır? Tek girişiniz bir dizedir ve bu yüzden örneğin slsgeri verecektir ('','Vroom!','').
AdmBorkBork

tamamlanmış bir çözüm değil. Demek istediğim, slsbunun yerine deneyebilirsiniz[regex]::Match
mazzy

@mazzy Belki de ayrı bir çözüm olarak göndermelisiniz.
AdmBorkBork

2

Retina , 21 bayt

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

Çevrimiçi deneyin! Açıklama: Leşleşmeleri listeler, böylece normal ifade eşleşmezse çıktı boş olur. $sonucun maçtan ziyade oyuncu değişikliği olmasına neden olur. mbunu çok satırlı bir eşleme yapar ( msorudaki izlemeye eşdeğerdir ). .Yerine olsun motor ondalık içinde yakalama uzunluğu yapar.


2

SNOBOL4 (CSNOBOL4) , 99 82 bayt

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

Çevrimiçi deneyin!

Spesifikasyonun oldukça doğrudan SNOBOL çevirisi, eşleşen bir tane bulana kadar her satırı okur ^[Vv]ro*m!$, sonra o*bitin uzunluğunu verir .

Bulunamıyorsa sonsuz bir döngüye girer Vroom!.


Bütün bu boşluk gerekli mi? Vay.
FireCubez

5
@FireCubez evet, 50 yılı aşkın bir dil ile elde edeceğiniz şey budur: garip boşluk gereksinimleri. Birleştirme olarak boşluk / sekme kullanır ve operatörleri boşlukla da çevrelemeniz gerekir.
Giuseppe


2

C (gcc) , 188183 bayt

Bunun yerine durum makinesi kullanabiliyorsanız neden normal ifadeler kullanıyorsunuz? :-)

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

Çevrimiçi deneyin!



1

Haskell , 75 71 69 bayt

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

Çevrimiçi deneyin!

Normal ifade yok. Bunun yerine, tüm geçerli Vrooom!dizeleri yeterli uzunluğa kadar oluşturur ve giriş satırlarını bunlarla karşılaştırır, obir listedeki s sayısını toplar . Böylece geçersiz girişler için boş bir liste döndürülür.


1

C (GCC) , 104 , 100 bayt

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

Çevrimiçi deneyin!

Çıktı ntam gereksinimi içinde her geçerli hat için, (hiçbir geçerli hat ise hiçbir şey, neğer tam bir)

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

Normal yanıtı çok daha uzun
Windmill Cookies

@WindmillCookies GCC normal
ifadeyi

hı. regexes ile ilgili isimler son derece uzun gibi görünüyor
Windmill Cookies

1

Japt , 18 bayt

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

Çevrimiçi deneyin!

Girdiyi satır dizisi olarak alarak kaydedilmiş bayt.

Arasında yazdırılamayan karakter içerir ]ve *.

Açıklama:

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



Aslında, girdi bir satır dizisi olabileceğinden, yukarıdaki ilk yorumumdan ilk baytı kapatabilirsiniz.
Shaggy

@Shaggy Girişte bir satır dizisi olabileceğini belirten soruda hiçbir yerde bulamıyorum ve çok satırlı bir dizenin satır dizisi olarak alınabileceği varsayılan G / Ç yöntemlerinde listelenmiyor gibi görünüyor . Muhtemelen makul görünüyor, ama önce onay için bekleyeceğim.
Kamil Drakari

1

C (gcc) , 138124 bayt

İşte sıkıcı normal ifade yolu.

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

Çevrimiçi deneyin!



0

Pyth, 20 bayt

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

Yalnızca 'o' sayısını içeren bir liste veya Vroom yoksa boş bir liste olarak çıktılar.
Burada deneyin

açıklama

/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

Kırmızı , 104 bayt

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

Çevrimiçi deneyin!

Basit bir çözüm. Kırmızılar parseserin ve okunabilir, ancak regex'e kıyasla çok uzun

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 bayt

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

Desen eşleşmezse negatif 1 değerini döndürür.


0

JavaScript, 90 73 61 bayt

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

Çevrimiçi deneyin!

Yakalanmayan karakterleri (o*)boş dize, lengthyalnızca içeren dize dönüşü "o"veya -1sonuçta ortaya çıkan dize boşsa değiştirin.


0

Ruby, 32 bayt

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

Dizeyi normal ifade ile eşleştirir, ardından ilk grubun boyutunu elde etmek için Ruby'nin sihirli normal ifade grubu değişkenlerini kullanır.

Şöyle deyin:

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

0

Yakut , 28 29 bayt

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

Çevrimiçi deneyin!

Çok satırlı dizeler üç bayt daha gerektirir. Bunun zor bir gereklilik olup olmadığından emin değilim. Eğer öyleyse, bunu güncelleyeceğim.

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

Çok satırlı dizeleri nasıl test edebilirsiniz?
Laikoni

1
BaşarısızVROM!
l4m2

0

Clojure , 90 bayt

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

Çevrimiçi deneyin!

Bu anonim işlev, vroom dizesindeki "o" sayısını veya geçerli bir vroom dizesi yoksa -1 değerini döndürür.

Okunabilir versiyon

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

açıklama

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

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

Bu , seçeneğin perl tarafından nasıl ele alındığını hızlı bir şekilde kötüye kullanan Eskimo karşılamasını ( }{) kullanır -n.


0

Java 8, 109 bayt

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

Çevrimiçi deneyin.

Açıklama:

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) , 134122 bayt

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

Çevrimiçi deneyin!

-12 bayt: null denetimi döngüye taşıdı for ve parantezleri kaldırdı

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

C # 6'nın boş birleştirici ve koşullu operatörleriyle -10 bayt{} , fordöngüde yalnızca bir ifade kullanırken gereksiz :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

Ayrıca, bu using System.Linq; using System.Text.RegularExpressions;önemli, bunun önemli olup olmadığından emin değil lol
Ivan García Topete

Sağladığınız kod aslında çalışmaz, çünkü sadece -1üzerinde çalışmadığı her satır için bir a çıkışı sağlamakla kalmaz, aynı -1zamanda kontrol olmadığı için sonsuza kadar çıkış verir null.
Meerkat

Hayır, olmayacak. a = Console.ReadLine()döngü yapar, bu yüzden döngü devam etmek için her giriş isteğinde bulunduğunuzda, giriş yoksa, döngü -1sonsuza dek yazdırmıyor, bekliyor
Ivan García Topete

Kavramın ispatı. Söylediğiniz gibi çalışsa bile, hiç bitmeyen bir döngü ideal davranış değildir. Ne olursa olsun, parantezleri kaldıran (ve kodu önerinizden daha kısa yapan) for döngüsüne null denetimi taşıdım.
Meerkat

0

05AB1E , 39 37 bayt

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

05AB1E bir golf dili olmasına rağmen, regex temelli zorluklar kesinlikle güçlü paketi değildir, çünkü regex yerleşikleri yoktur.

Eşleşme []bulunmazsa çıktılar .

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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

Zacharý sayesinde -5 bayt

Yalnızca regexbaşlık ile bile derlenir

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

Testler:

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
Sanırım using namespace std;birkaç bayt kurtaracak
Zacharý
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.