[squeak-dev] One liner challenge

Travis Griggs travisgriggs at gmail.com
Fri Mar 12 06:41:27 UTC 2010

Here's 3 solutions from me:

Similar to others:

coercion := #yourself.
string collect:
		[:c |
		coercion := c = $(
					ifTrue: [#asUppercase]
					ifFalse: [c = $) ifTrue: [#yourself] ifFalse: [coercion]].
		c perform: coercion]

Requires VW specific methods piecesCutWhere: and fold:

((string piecesCutWhere: [:a :b | b = $( or: [a = $)]])
	collect: [:phrase | phrase first = $( ifTrue: [phrase asUppercase]  
ifFalse: [phrase]])
		fold: [:a :b | a , b]

I know Eliot and others know how to write both of these methods,  
nudge, nudge :)

Requires VW difference engine that shows up in tomorrows build (I  
regret that this ends making my original post look like an opportunity  
to tout this. I honestly didn't even think about the differences  
engine, it was only later this evening while I was thinking about ways  
to solve it, that this donned on me):

(string differences: (string reject: [:c | '()' includes: c]))
	fold: [:a :b | a , (a last = $( ifTrue: [b collect: #asUppercase]  
ifFalse: [b])]

This last one is definitely terse and elegant, but much more obscure  
how it actually pulls it off.

Travis Griggs
I multiply all time estimates by pi, to account for running around in  

More information about the Squeak-dev mailing list