Coding Challenge
-
Here's my stab at a solution in C#: [Edit: Chris updated the guidance, and I changed the method accordingly.]
public static string CPtrimmer(string input, string[] trims, StringComparison compare = StringComparison.InvariantCultureIgnoreCase)
{
String Input = input;foreach (var trimWord in trims) { if (Input.StartsWith(trimWord, compare)) Input = Input.Remove(Input.IndexOf(trimWord, compare), trimWord.Length); if (Input.EndsWith(trimWord, compare)) Input = Input.Remove(Input.LastIndexOf(trimWord, compare), trimWord.Length); } if (Input != input) return CPtrimmer(Input, trims); else return Input;
}
[modified] Given the exchange below, I am including the usage of this method as well (console C#):
static void Main(string[] args)
{
String input = "dog cat monkey dog horse dog";
String[] trims = new String[] { "dog", "cat" };String result = CPtrimmer(input, trims); // After CPtrimmer has returned, the result is " cat monkey dog horse "
}
Be The Noise
This will not remove all of the strings. You will only remove the first instances of them if the string starts with it or ends with it. If your collection is {"dog", "cat"} But your string is "cat dog monkey" you will remove cat but not dog.
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
-
Norm .net wrote:
2. Language Dependent
Nothing stated you could not use a specific language. In fact part of the point it seemed was it can be done so many different ways with different languages...
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
-
Collin Jasnoch wrote:
perceiver
Which is defined as what? The cat is inside the box, observing its own state, so no external observer is needed to collapse the waveform.
It is defined as the one holding the experiment. The cat is the experiment and therefore can not be the observer. Any experiement needs observation externally or it is not sound.
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
-
Back in the Days of Yore we had a couple of small coding challenges such as the Lean and Mean comp. I was thinking that there are a ton of small, well defined problems that can be tackled a zillion ways in a zillion languages and that it would be cool to see what you guys can come up with. I'd like to start the ball rolling with the following simple task: Problem: Given a string of text, trim from each end of the text each all occurrences of a given set of strings Sample input: Input string: "dog cat monkey dog horse dog" Strings that need to be trimmed from each end: { "dog", "cat" } Final output should be: " monkey dog horse" Final output should be " cat monkey dog horse " [Edit: My final sample output was incorrect, so to be fair I'll accept either answer] It's up to you whether you worry about case sensitivity. Let's see who can provide the smallest, neatest most elegant, most unique and/or fastest code. For those who feel like jumping on the "No Programming questions" bandwagon, please re-read the lounge guidelines. The point of this is to have fun, not to solve each other's programming issues.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
Can be done in RegEx albeit terse, I've just been experimenting I do believe somebody with day-to-day contact with reg ex will achieve this.
Software Kinetics Wear a hard hat it's under construction
Metro RSShttp://www.codeproject.com/Lounge.aspx?msg=4118816#xx4118816xx[^]
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
-
This will not remove all of the strings. You will only remove the first instances of them if the string starts with it or ends with it. If your collection is {"dog", "cat"} But your string is "cat dog monkey" you will remove cat but not dog.
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
Umm, no, it would remove both cat and dog. Just ran your example using my code, and it returned " monkey"... maybe you should try the same... [hint] The solution is recursive [/hint]
Be The Noise
-
Back in the Days of Yore we had a couple of small coding challenges such as the Lean and Mean comp. I was thinking that there are a ton of small, well defined problems that can be tackled a zillion ways in a zillion languages and that it would be cool to see what you guys can come up with. I'd like to start the ball rolling with the following simple task: Problem: Given a string of text, trim from each end of the text each all occurrences of a given set of strings Sample input: Input string: "dog cat monkey dog horse dog" Strings that need to be trimmed from each end: { "dog", "cat" } Final output should be: " monkey dog horse" Final output should be " cat monkey dog horse " [Edit: My final sample output was incorrect, so to be fair I'll accept either answer] It's up to you whether you worry about case sensitivity. Let's see who can provide the smallest, neatest most elegant, most unique and/or fastest code. For those who feel like jumping on the "No Programming questions" bandwagon, please re-read the lounge guidelines. The point of this is to have fun, not to solve each other's programming issues.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
why no one used Regex? ok, this code is far from optimum, but i had no time to do it better :(
using System;
using System.Text.RegularExpressions;namespace chalenge
{
class Program
{
public static void Main(string[] args)
{
string input = "dog cat dog monkey dog horse dog";
string[] removes = { "dog", "cat" };
bool hasMore = false;
do{
hasMore = false;
for(int i =0; i < removes.Length; i++){while (Regex.IsMatch(input, @"^\\s\*" + removes\[i\] + @"\\s\*.\*")){ input = Regex.Replace(input, @"(?^\\s\*)" + removes\[i\] + @"(?\\s\*.\*)", "${w1}${w2}"); } while (Regex.IsMatch(input, @".\*\\s\*" + removes\[i\] + @"\\s\*$")){ input = Regex.Replace(input, @"(?.\*\\s\*)" + removes\[i\] + @"(?\\s\*$)", "${w1}${w2}"); } foreach(var item in removes){ if(Regex.IsMatch(input, @"^\\s\*" + item + @"\\s\*.\*") || Regex.IsMatch(input, @".\*\\s\*" + removes\[i\] + @"\\s\*$")){ hasMore = true; break; } } } }while(hasMore); Console.Write(input); Console.ReadKey(); } }
}
(sorry by the english, i'm brasilian...)
-
ChrisElston wrote:
'each of two.
That is "both", not "either". Don't use a word for two meanings when there is already a word for the other. You want to ride a see-saw -- you may sit at either end.
-
It is defined as the one holding the experiment. The cat is the experiment and therefore can not be the observer. Any experiement needs observation externally or it is not sound.
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
Quantum collapse occurs due to quantum interactions with something else ("observation"). There is no need for that interaction to be conscious or human, it just means that one quantum system is disturbed through interaction with something else - such as a cat. :)
-
Umm, no, it would remove both cat and dog. Just ran your example using my code, and it returned " monkey"... maybe you should try the same... [hint] The solution is recursive [/hint]
Be The Noise
Yes if you call it recursively you will remove it. That was not clear in your OP though...
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
-
I'll be the first to put up the recursive solution in C#.
private string TrimCatDog(string input)
{
if (input.StartsWith(" ") || input.EndsWith(" "))
return TrimCatDog(input.Trim());
if (input.StartsWith("cat") || input.StartsWith("dog"))
return TrimCatDog(input.Substring(3));
if (input.EndsWith("cat") || input.EndsWith("dog"))
return TrimCatDog(input.Substring(0, input.Length - 3));
return input;
}The specs say nothing of trimming whitespace, and the hardcoding of "dog" and "cat" means the solution can't be reused.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
Yeah cos there are no other words with different meanings. You don't have to like it but they are both valid definitions. There were trees down either side of the road.
Every man can tell how many goats or sheep he possesses, but not how many friends.
ChrisElston wrote:
There were trees down either side of the road.
That makes no sense -- which side? The other side I hope.
-
Marc Clifton wrote:
Do we need detail specs? Hell NO!!!
I was about to invite you into my esteemed LinkIn network, but I'm not sure after reading that. :laugh:
Panic, Chaos, Destruction. My work here is done. Drink. Get drunk. Fall over - P O'H OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
Nagy Vilmos wrote:
I was about to invite you into my esteemed LinkIn network, but I'm not sure after reading that.
Specs are like the uncertainty principle. The more you spec something, the more inaccurate you will be in some other area. ;) Marc
My Blog
An Agile walk on the wild side with Relationship Oriented Programming -
If spaces aren't counted as special characters the output should be " cat monkey dog horse " because cat isn't at the end after removing dog.
Curvature of the Mind now with 3D
As philosophers would say: "That depends on how you define the concept of END". :-D
-
Yes if you call it recursively you will remove it. That was not clear in your OP though...
Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.
Again, no... the method itself is recursive, no need to call it recursively. Look at the last few lines of the method:
if (Input != input)
return CPtrimmer(Input, trims);
else
return Input;What this means is that if the mothod changed the original string in any way, it will call itself again to see if there is anything else to be removed. Otherwise, if nothing changed, then the method will return the result up the call stack.
Be The Noise
-
Here's my stab at a solution in C#: [Edit: Chris updated the guidance, and I changed the method accordingly.]
public static string CPtrimmer(string input, string[] trims, StringComparison compare = StringComparison.InvariantCultureIgnoreCase)
{
String Input = input;foreach (var trimWord in trims) { if (Input.StartsWith(trimWord, compare)) Input = Input.Remove(Input.IndexOf(trimWord, compare), trimWord.Length); if (Input.EndsWith(trimWord, compare)) Input = Input.Remove(Input.LastIndexOf(trimWord, compare), trimWord.Length); } if (Input != input) return CPtrimmer(Input, trims); else return Input;
}
[modified] Given the exchange below, I am including the usage of this method as well (console C#):
static void Main(string[] args)
{
String input = "dog cat monkey dog horse dog";
String[] trims = new String[] { "dog", "cat" };String result = CPtrimmer(input, trims); // After CPtrimmer has returned, the result is " cat monkey dog horse "
}
Be The Noise
You're algorithm results in: " monkey dog horse " (two leading spaces) rather than: " monkey dog horse " It's really odd how every solution that I've seen somehow fails to take this into account (as well as the fact that after the first trim, there will be a leading or trailing space in the result.) Are we that bad at reading specs, meeting simple requirements, and testing our code? :sigh: Marc
My Blog
An Agile walk on the wild side with Relationship Oriented Programming -
why no one used Regex? ok, this code is far from optimum, but i had no time to do it better :(
using System;
using System.Text.RegularExpressions;namespace chalenge
{
class Program
{
public static void Main(string[] args)
{
string input = "dog cat dog monkey dog horse dog";
string[] removes = { "dog", "cat" };
bool hasMore = false;
do{
hasMore = false;
for(int i =0; i < removes.Length; i++){while (Regex.IsMatch(input, @"^\\s\*" + removes\[i\] + @"\\s\*.\*")){ input = Regex.Replace(input, @"(?^\\s\*)" + removes\[i\] + @"(?\\s\*.\*)", "${w1}${w2}"); } while (Regex.IsMatch(input, @".\*\\s\*" + removes\[i\] + @"\\s\*$")){ input = Regex.Replace(input, @"(?.\*\\s\*)" + removes\[i\] + @"(?\\s\*$)", "${w1}${w2}"); } foreach(var item in removes){ if(Regex.IsMatch(input, @"^\\s\*" + item + @"\\s\*.\*") || Regex.IsMatch(input, @".\*\\s\*" + removes\[i\] + @"\\s\*$")){ hasMore = true; break; } } } }while(hasMore); Console.Write(input); Console.ReadKey(); } }
}
(sorry by the english, i'm brasilian...)
Results in too many leading spaces. The output should have one leading and one trailing space. Marc
My Blog
An Agile walk on the wild side with Relationship Oriented Programming -
Chris barely posted and already there is a design review, rejects from marketing, the devs want to shoot the PM. The PM is whistling nastily (Nagy you dog ... cat... horse... dog) and the mischievous ones reach for the assembler books. What we miss here is QA and we can start a death-march :laugh: EDIT-------------------------- I forgot legal as well. Legal department share its thoughts here with the assistance of the tech writers ;P
Alberto Bar-Noy --------------- “The city’s central computer told you? R2D2, you know better than to trust a strange computer!” (C3PO)
I think what you have described is what is known as "Agile" programming methodology. best, Bill
"It is the mark of an educated mind to be able to entertain a thought without accepting it." Aristotle
-
Results in too many leading spaces. The output should have one leading and one trailing space. Marc
My Blog
An Agile walk on the wild side with Relationship Oriented Programmingthis results in too many spaces because of the input string "dog cat dog monkey dog horse dog", the original are "dog cat monkey dog horse dog", i thought it was to preserve all spaces, so "dog cat dog " would result into 3 spaces, and " dog" would result in 1 space, am i wrong?
-
You're algorithm results in: " monkey dog horse " (two leading spaces) rather than: " monkey dog horse " It's really odd how every solution that I've seen somehow fails to take this into account (as well as the fact that after the first trim, there will be a leading or trailing space in the result.) Are we that bad at reading specs, meeting simple requirements, and testing our code? :sigh: Marc
My Blog
An Agile walk on the wild side with Relationship Oriented ProgrammingAn example is not a specification... the spec says:
Quote:
Given a string of text, trim from each end of the text each all occurrences of a given set of strings
Which says nothing about removing spaces (which Chris has already mentioned in a few replies on the thread), therefore, all spaces are left alone. Examples are guidance, specifications are rules... I followed the rules*. *I do agree that 'technically', once you remove the first occurance of "dog", cat is NOT at the begining of the string, and should actually result in " cat monkey dog horse ". Though in looking at the guidance, since cat is removed, I assumed that spaces should be ignored and left alone. Although if you really wanted to get convoluted, and have the EXACT match of a single leading space, that would fundamentally change the given specification... hence my design choice. Taking an occams razor approach, is it more likely that the spec is wrong and we should have a convoluted solution to have a single leading space? Or more likely that it was a typo and Chris ment to have two leading spaces?
Be The Noise