Written by

Technical Graduate - DevRel at InterSystems
Discussion Gabriel Ing · 5 hr ago

Code Golf! Alternating Vowels

Anyone up for a round of golf?

Are you fed up of making a machine write code for you? Do you miss thinking through problems yourself? Then you are in luck, this round, I propose adding the rule of no AI use. obviously its a game of honor with no prize, so I shan't be enforcing this, but you'll know... 

Challenge:

Create a function which takes a string as a parameter, and returns the length of the longest sequence of alternating consonants and vowels. The sequence is broken by having two vowels or two consonants in a row.

Some clarification:

- A sequence can start at any letter, and is broken by two of the same letter.
- A sequence can start with a Consonant (CVC) or Vowel (VCV) 
- Only the 26 standard english language letters (a-z / A-Z)  are valid in the input string.
- Only the 5 canonical vowels (a, e, i, o, u) count, I'm not getting into any debate about whether "y" is a vowel. Consonants are any other letter .
- Empty strings return 0

Some examples

Input Output Sequence
mama 4 "mama"
sequence 4 "sequ"
abooom 3 "abo"
EmiTed 6 "EmiTed"
book 2 "bo" / "ok"
a 1 "a"
asdfampjn 3 "fam"
"" (empty string) 0 -


Note, the Sequence column is for demonstration, the function only needs to return the output.

Here is a stub class you can use for your solution: 

Class codegolf.AlternatingVowels
{

ClassMethod CountAlternates(input As %String)
{
	q 0
}

}

And some tests 

Class codegolf.unittest.AlternatingVowels Extends %UnitTest.TestCase
{

Method TestLowerCase()
{
		Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("mama"), 4)
		Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("sequence"), 4)
		Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("asdfakljn"), 3)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("emited"), 6)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("book"), 2)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("a"), 1)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates(""), 1)
}

Method TestEmptyString()
{
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates(""), 0)
}

Method TestUpperCase()
{
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("MAMA"), 4)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("SEQUENCE"), 4)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("ASDFAKLJN"), 3)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("EMITED"), 6)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("BOOK"), 2)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("A"), 1)
}


Method TestMixedCase()
{
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("MAma"), 4)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("SeQuEnCe"), 4)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("AsDfakLjN"), 3)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("EMItEd"), 6)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("BoOk"), 2)
        Do $$$AssertEquals(##class(codegolf.AlternatingVowels).CountAlternates("a"), 1)
}

}

And finally, to count your solution use: (courtesy of @Eduard Lebedyuk)

Class ITPlanet.Task2

{
ClassMethod main() As %String
{
    quit ""
}

/// write ##class(ITPlanet.Task2).length()
ClassMethod length(class = {$classname()}, method = "Main") As %Integer
{
    #dim methodObj As %Dictionary.MethodDefinition
    set methodObj = ##class(%Dictionary.MethodDefinition).IDKEYOpen(class, method)
    quit methodObj.Implementation.Size
}
}

Usage: 

w ##class(ITPlanet.Task2).length("codegolf.AlternatingVowels", "CountAlternates")

See previous editions: