Coding Challenge
-
Just out of fun as this is fun I created this in VB.NET
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Input As String = "dog cat monkey dog horse dog"
Dim ToRemove As String() = New String() {"dog", "cat"}
Dim Start As Integer = 0
Dim EndPointer As Integer = 0For Each Value As String In ToRemove If Start < Input.IndexOf(Value) Then Start = Input.IndexOf(Value) + Value.Length If EndPointer < Input.LastIndexOf(Value) Then EndPointer = Input.LastIndexOf(Value) Next MessageBox.Show(Input.Substring(Start, (EndPointer - Start))) End Sub
Lobster Thermidor aux crevettes with a Mornay sauce, served in a Provençale manner with shallots and aubergines, garnished with truffle pate, brandy and a fried egg on top and Spam - Monty Python Spam Sketch
Won't work if you have "dog dog text". It will only remove the first "dog"
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
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
Too easy.
While DogsAndCatsAreStillInTheLine
LineEnd = "left"
GetRidOfCatsAndDogs(LineEnd)
LineEnd = "right"
GetRidOfCatsAndDogs(LineEnd)
WendGetRidOfCatsAndDogs {
OpenCanOfDogFood(ThisEnd)
OpenCanOfCatFood(ThisEnd)
}It's so simple that it's not even worth optimising it or using recursion. For future updates, though, it would be a good idea to use a set for the animals to remove, so that different ones could be included, another for the line ends (so that multiple lines could be serviced), and a third for the food types -- although getting bamboo shoots for pandas, eucalyptus leaves for koalas, and starlets for great whites might cause difficulties in implementation.
I wanna be a eunuchs developer! Pass me a bread knife!
-
I have discovered a truly marvellous solution of this, which the margin of this website is too narrow to contain.
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
Thank you, Fermat.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
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
My approach is to use substring to grab the current end and starting strings. Substring is also used to update the result. I am sure there are some faster ways, but this approach is very clean IMO.
public string Parse(string input, List remove)
{
string result = input.Trim();
bool startRemoved;
bool endRemoved;do { startRemoved = false; endRemoved = false; foreach (var match in remove) { //Determine if the remove string is fitable with in the remaining output bool inRange = result.Length >= match.Length; //Capture the beginning and ending characters string beginning = result.Substring(0, match.Length); string end = result.Substring(result.Length - match.Length, match.Length); if (inRange && beginning.Equals(match)) { //Update the result with the matched section removed result = result.Substring(match.Length, result.Length - match.Length).TrimStart(); startRemoved = true; } if (inRange && end.Equals(match)) { //Update the result with the matched section removed result = result.Substring(0, result.Length - match.Length).TrimEnd(); endRemoved = true; } } } while (startRemoved || endRemoved); return result;
}
[Edit] Added a do while. The do while shuts down if nothing is removed. If anything is removed it must go back and check the removal collection. Optimization could be to track which is removed to then check up to that point. E.g. "dog" "cat" and "monkey" are to be removed (and collection is in that order). If "cat" is removed (start or end), then "monkey" will be checked on active foreach. "dog" and "cat" are the only ones that need be checked on the next do while iteration (unless one of them removes another character set) [Edit] Added Trimmers.
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.
-
No to be pedantic about things, bit if you're tokenizing based on "dog" and "cat", your final answer should be " monkey dog horse " (begins with 2 spaces) or "monkey dog horse " (begins with no space). Otherwise, the requirement on what to do with spaces is incomplete. :)
Who said anything about tokenising?
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
Too easy.
While DogsAndCatsAreStillInTheLine
LineEnd = "left"
GetRidOfCatsAndDogs(LineEnd)
LineEnd = "right"
GetRidOfCatsAndDogs(LineEnd)
WendGetRidOfCatsAndDogs {
OpenCanOfDogFood(ThisEnd)
OpenCanOfCatFood(ThisEnd)
}It's so simple that it's not even worth optimising it or using recursion. For future updates, though, it would be a good idea to use a set for the animals to remove, so that different ones could be included, another for the line ends (so that multiple lines could be serviced), and a third for the food types -- although getting bamboo shoots for pandas, eucalyptus leaves for koalas, and starlets for great whites might cause difficulties in implementation.
I wanna be a eunuchs developer! Pass me a bread knife!
For Dalek Dave's benefit, I dub this the Most Unique Solution.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
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
No substrings [except for the end] or tokenizing in Java:
public static String trimStrings(String string, String\[\] trimmings) { if (trimmings == null || trimmings.length == 0) { return string.trim(); } int left = 0; int right = string.length()-1; boolean trimmed; do { while (left < right && string.charAt(left) == ' ') { left++; } while (left < right && string.charAt(right) == ' ') { right--; } trimmed = false; for (int trim = 0; trim < trimmings.length; trim++) { if (string.indexOf(trimmings\[trim\], left) == left) { left += trimmings\[trim\].length(); trimmed = true; } else if (string.lastIndexOf(trimmings\[trim\], right) == (right - trimmings\[trim\].length() + 1)) { right -= trimmings\[trim\].length(); trimmed = true; } } } while (trimmed); return string.substring(left, right+1); }
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
-
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
Being a programmer, I cannot resist a coding challenge. Do not misconstrue this to be a general lifting of my personal CodeProject boycott. Usage:
string text = "dog cat dog doghorse monkey dog fishcat dog cat";
string[] removers = new string[] {"cat", "dog"};
do
{
} while (Challenge(ref text, removers));Method:
//-----------------------------------------------------------------------
private bool Challenge(ref string text, string[] removeThese)
{
bool changed = false;
for (int i = 0; i < removeThese.Length; i++)
{
string target = removeThese[i];
int start = -1;
int end = -1;
do
{
end = (text.StartsWith(target)) ? target.Length : -1;
if (end > -1)
{
text = text.Substring(end);
changed = true;
}
text = text.Trim();
} while (end > -1);
do
{
start = (text.EndsWith(target)) ? text.Length - target.Length : -1;
if (start > -1)
{
text = text.Substring(0, start);
changed = true;
}
text = text.Trim();
} while (start > -1);
}
return changed;
}You can also easily make this a recursive method.
".45 ACP - because shooting twice is just silly" - JSOP, 2010
-----
You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010
-----
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass." - Dale Earnhardt, 1997 -
Who said anything about tokenising?
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
Failed: 1. No formatting 2. Language Dependent 3. Too verbose
Software Kinetics Wear a hard hat it's under construction
Metro RSSNorm .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.
-
The challenge is to remove the strings that are provided. Nothing is said about removing (or, indeed, caring about, whitespace)
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
In that case, shouldn't "cat dog monkey..." end up as " monkey..." with two leading spaces? (It might just be the HTML rendering changing two to one in your OP.)
-
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.
-
It might be the site's HTML rendering which reduces two or more adjacent spaces to one. (I put about 10 in the last sentence but it doesn't display that way!)
-
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)
Obligatory comic: http://www.sonnyradio.com/whatthecustomerreallywanted.htm[^]
-
It might be the site's HTML rendering which reduces two or more adjacent spaces to one. (I put about 10 in the last sentence but it doesn't display that way!)
-
For Dalek Dave's benefit, I dub this the Most Unique Solution.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
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
Dang, what are we, a bunch of whiners? It's a PROGRAMMING CHALLENGE! START YOUR CODING ENGINES!!! Do we need detail specs? Hell NO!!! There's probably a regex solution, but that's gross. Here's something I whipped together in about 15 minutes (took a bit of debugging, a few nuances to it) that I hope readable and somewhat reusable:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Stripper
{
public enum StringPoint
{
None,
Start,
End,
}
public static class StringHelpersExtensions
{
public static string RightOf(this String src, string s)
{
string ret = src;
int idx = src.IndexOf(s);
if (idx != -1)
{
ret = src.Substring(s.Length);
}
return ret;
}
public static string LeftOfRightmostOf(this String src, string s)
{
string ret = src;
int idx = src.LastIndexOf(s);
if (idx != -1)
{
ret = src.Substring(0, idx);
}
return ret;
}
public static bool StartsOrEndsWith(this String src, string[] items, out string match, out StringPoint whichEnd)
{
bool ret = false;
whichEnd = StringPoint.None;
match = String.Empty;
foreach (string item in items)
{
if (src.StartsWith(item))
{
match = item;
whichEnd = StringPoint.Start;
ret = true;
break;
}
if (src.EndsWith(item))
{
match = item;
whichEnd = StringPoint.End;
ret = true;
break;
}
}
return ret;
}
}
class Program
{
static void Main(string[] args)
{
string input = "dog cat monkey dog horse dog";
string[] stripOf = { "dog", "cat" };
string desiredOutput = " monkey dog horse ";
string result = Stripper(input, stripOf);
if (result == desiredOutput)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Fail! '" + result + "'");
}
}
static string Stripper(string input, string[] stripOf)
{
string ret = input;
string match;
StringPoint whichEnd;
string test = ret.Trim();
string leftPad = String.Empty;
string rightPad = String.Empty;
while (test.StartsOrEndsWith(stripOf, out match, out whichEnd))
{
switch (whichEnd)
{
case StringPoint.Start:
// The result always preserves the leading space separating the token, so add it back in.
leftPad = " ";
ret = leftPad + test.RightOf(match).Trim() + rightPad;
break;
case StringPoint.End:
// The result always preserves -
You can think it means whatever you want, but in correct English usage either can mean both 'one of two' or 'each of two.
Every man can tell how many goats or sheep he possesses, but not how many friends.
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.
-
Being a programmer, I cannot resist a coding challenge. Do not misconstrue this to be a general lifting of my personal CodeProject boycott. Usage:
string text = "dog cat dog doghorse monkey dog fishcat dog cat";
string[] removers = new string[] {"cat", "dog"};
do
{
} while (Challenge(ref text, removers));Method:
//-----------------------------------------------------------------------
private bool Challenge(ref string text, string[] removeThese)
{
bool changed = false;
for (int i = 0; i < removeThese.Length; i++)
{
string target = removeThese[i];
int start = -1;
int end = -1;
do
{
end = (text.StartsWith(target)) ? target.Length : -1;
if (end > -1)
{
text = text.Substring(end);
changed = true;
}
text = text.Trim();
} while (end > -1);
do
{
start = (text.EndsWith(target)) ? text.Length - target.Length : -1;
if (start > -1)
{
text = text.Substring(0, start);
changed = true;
}
text = text.Trim();
} while (start > -1);
}
return changed;
}You can also easily make this a recursive method.
".45 ACP - because shooting twice is just silly" - JSOP, 2010
-----
You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010
-----
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass." - Dale Earnhardt, 1997Did you actually test this? The resulting string needs to preserve any leading and/or trailing spaces after removing the token. Marc
My Blog
An Agile walk on the wild side with Relationship Oriented Programming -
Not "either alive and dead"? ;) In any case, the cat is itself an observer, so the waveform is always collapsed to a known state or "alive" or "dead", so it's a silly thought experiment (IMHO).
A dead cat knows it's dead? :confused: