Thread overview | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
August 12, 2008 Puzzle 8-12-08 | ||||
---|---|---|---|---|
| ||||
1)First is simple.. What's the "condition" so that the following code snippet prints both HelloWorld ! if "condition" printf ("Hello"); else printf("World"); 2)Next little data structure knowledge need You are provided with two stacks, and pop() and push() functions for them. You have to implement queue i.e. enqueue() and dequeue() using the available operations. 3) little string manipulation How do you reverse the words in a string? "My name is Amit Agarwal" to "Agarwal Amit is name My" **try without using the library! |
August 12, 2008 Re: Puzzle 8-12-08 (Spoiler) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Wyverex | On Tue, 2008-08-12 at 15:46 -0400, Wyverex wrote: > 1)First is simple.. > > What's the "condition" so that the following code > snippet prints both HelloWorld ! > > if "condition" > printf ("Hello"); > else > printf("World"); > > > 2)Next little data structure knowledge need > > You are provided with two stacks, and pop() and push() functions for them. You have to implement queue i.e. enqueue() and dequeue() using the available operations. > > > 3) little string manipulation > > How do you reverse the words in a string? > > "My name is Amit Agarwal" > to > "Agarwal Amit is name My" > > **try without using the library! > > > > > 1. Don't know ;) 2. This depends on the stack implementation: void enqueue(Object obj) { while(Object tmp = stack2.pop()) stack1.push(tmp); stack1.push(obj); } Object dequeue() { while(Object tmp = stack1.pop()) stack2.push(tmp); return stack2.pop(); } 3. char[] reverse(char[] text) { char[][] words = [""]; foreach(c; text) { if(c == ' ') words ~= ""; else words[$-1] ~= c; } char[] retText; foreach_reverse(word; words) retText ~= word ~ " "; return retText[0 .. $-1]; } -- Mike Wey |
August 12, 2008 Re: Puzzle 8-12-08 (solutions, kindof) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Wyverex | Reply to wyverex, > 1)First is simple.. > > What's the "condition" so that the following code snippet prints > both HelloWorld ! > > if "condition" > printf ("Hello"); > else > printf("World"); cheats: (printf("Hello") && false) (scope _ = new class {~this(){printf("World"); } }) // this might work (not-tested) I think there might be a way to trick the parser into doing something strange but I can't seem to make it work. > 2)Next little data structure knowledge need > > You are provided with two stacks, and pop() and push() functions for > them. You have to implement queue i.e. enqueue() and dequeue() using > the available operations. > //Big Dumb solution Enqueue(T t) { while(S2.NotEmpty) S1.Push = S2.Pop; S1.Push = t; } Dequeue(T t) { while(S1.NotEmpty) S2.Push = S1.Pop; return S2.Pop; } > 3) little string manipulation > > How do you reverse the words in a string? > > "My name is Amit Agarwal" > to > "Agarwal Amit is name My" > **try without using the library! > // assume word's are [^ ] void worldRev(char[] str) { str.reverse; int i = 0; for(int j = 1; j < str.length) if(str[j] == ' ') { str[i..j].reverse; i=j; } } |
August 12, 2008 Re: Puzzle 8-12-08 (Spoiler) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Wyverex | Wyverex Wrote: > 1)First is simple.. > What's the "condition" so that the following code > snippet prints both HelloWorld ! I have no idea yet. Condition can be a function that prints things by itself, but that's cheating. > 2)Next little data structure knowledge need > You are provided with two stacks, and pop() and push() functions for > them. You have to implement queue i.e. enqueue() and dequeue() using the > available operations. import std.stdio: putr = writefln, format; class Stack(T) { T[] data; void push(T el) { this.data ~= el; } T pop() { T aux = this.data[$-1]; this.data.length = this.data.length - 1; return aux; } string toString() { return format("Stack(%s)", this.data); } int length() { return this.data.length; } void length(int n) { this.data.length = n; } void reverse() { if (this.data.length) this.data.reverse; } } class Queue(T) { // Modified from Cookbook Recipe 68436 Stack!(T) back, forward; this() { back = new typeof(back); forward = new typeof(forward); } T dequeue() { if (this.forward.length) return this.forward.pop(); else { this.back.reverse(); auto aux = this.forward; this.forward = this.back; this.back = aux; return this.forward.pop(); } } void enqueue(T el) { this.back.push(el); } } import std.stdio: put = writef, putr = writefln; // a bit of testing void main() { int n = 8; int m = 2; auto q = new Queue!(int); for (int i; i < n; i++) { q.enqueue(i); putr("enqueue: ", i); } putr(); for (int i; i < n; i++) putr("dequeue: ", q.dequeue()); for (int i; i < m; i++) { for (int j; j < 2; j++) { q.enqueue(j); putr("enqueue: ", j); } putr(); for (int j; j < 2; j++) putr("dequeue: ", q.dequeue()); } putr(); for (int i; i < m; i++) { for (int j; j < 12; j++) { q.enqueue(j); putr("enqueue: ", j); } putr(); for (int j; j < 12; j++) putr("dequeue: ", q.dequeue()); } } > 3) little string manipulation > How do you reverse the words in a string? > "My name is Amit Agarwal" > to > "Agarwal Amit is name My" > **try without using the library! Python: # not using string functions, nor slices from array import array def reverse(s, start, stop): n = stop - start + 1 for i in xrange(n // 2): s[start + i], s[stop - i] = s[stop - i], s[start + i] s = array("c", " My name is Amit Agarwal 2") reverse(s, 0, len(s)-1) start = -1 for pos, c in enumerate(s): if c in " \t\n\r": if start != -1: reverse(s, start, pos-1) start = -1 else: if start == -1: start = pos print s (using slices and string methods it's simpler) D: import std.stdio: putr = writefln; void reverse(T)(T[] s, int start, int stop) { int n = stop - start + 1; for (int i; i < n/2; i++) { // swap T aux = s[start + i]; s[start + i] = s[stop - i]; s[stop - i] = aux; } } void main() { string s = " My name is Amit Agarwal 0".dup; s.reverse; int start = -1; foreach (pos, c; s) if (c==' ' || c=='\t' || c=='\n' || c=='\r') { if (start != -1) { reverse(s, start, pos-1); start = -1; } } else if (start == -1) start = pos; putr('"', s, '"'); } (One bug found translating from Python to D: those brackets are necessary!) Most languages have a page with puzzles meant to be solved with that language, so I suggest you to create a Wiki page with such problems, plus the solutions shown by people too under a spoiler link. Bye, bearophile |
August 12, 2008 Re: Puzzle 8-12-08 (spoilers) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Wyverex | Wyverex Wrote:
>
> 1)First is simple..
>
> What's the "condition" so that the following code
> snippet prints both HelloWorld !
>
> if "condition"
> printf ("Hello");
> else
> printf("World");
Might work, don't know if the order is correct:
if (!fork())
printf ("Hello");
else
printf("World");
|
August 12, 2008 Re: Puzzle 8-12-08 (Spoiler) | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | With the queue puzzle I have even found another possible bug in DMD (18th bug I have found in DMD so far), minimal code: :-) void main() { for (int i; i < 1; i++) static if (false) printf("%d\n", i); } Bye, bearophile |
August 12, 2008 Re: Puzzle 8-12-08 (solutions, kindof) | ||||
---|---|---|---|---|
| ||||
Posted in reply to BCS | BCS:
> str[i..j].reverse;
Oh, right, the reverse method works in place on slices too :-)
Bye,
bearophile
|
August 12, 2008 Re: Puzzle 8-12-08 (spoilers) | ||||
---|---|---|---|---|
| ||||
Posted in reply to lurker | lurker wrote:
> Wyverex Wrote:
>
>> 1)First is simple..
>>
>> What's the "condition" so that the following code
>> snippet prints both HelloWorld !
>>
>> if "condition"
>> printf ("Hello");
>> else
>> printf("World");
>
> Might work, don't know if the order is correct:
>
> if (!fork())
> printf ("Hello");
> else
> printf("World");
>
if the order is right then I like this answer!
On the web the most accepted solution is the cheater solution
if (!printf("Hello"))
printf("Hello");
else
print("World");
|
August 12, 2008 Re: Puzzle 8-12-08 (Spoiler) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Wyverex | Wyverex wrote: > > 1)First is simple.. > > What's the "condition" so that the following code > snippet prints both HelloWorld ! > > if "condition" > printf ("Hello"); > else > printf("World"); !printf("Hello") opens a new possibility, run if on a list... if( [true, false] ) printf ("Hello"); else printf("World"); other possibility, hijack if... maybe messy Nop out the else jump in memory!!! > > > 2)Next little data structure knowledge need > > You are provided with two stacks, and pop() and push() functions for them. You have to implement queue i.e. enqueue() and dequeue() using the available operations. didn't code up but basically Stack work, temp; enqueue( item ) try while(1) temp.push(work.pop); catch(Object o) {} //work will throw underflow, maybe overflow? work.push(item); try while(1) work.push(temp.pop); catch(Object o) {} //temp will throw underflow dequeue try return work.pop; catch(Object o) //underflow return null; > > 3) little string manipulation > > How do you reverse the words in a string? > > "My name is Amit Agarwal" > to > "Agarwal Amit is name My" > > **try without using the library! //Yeah taking ML Programming was worth it!!! import std.stdio; char[] rev(char[] str) { if(str.length == 0) return ""; int index = -1; foreach(i, c; str) if(c == ' ') { index = i; break; } if(index == -1) return str; if(index == 0) return rev(str[1..$]); return rev(str[index+1..$]) ~ " " ~ str[0..index]; } void main() { char[] str = " My Name is Wyverex Cypher "; writefln("%s\n%s", str, rev(str)); } |
August 13, 2008 Re: Puzzle 8-12-08 (Spoiler) | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | Well, with my libs too (xsplit is lazy): import d.string, d.func; void main() { string s = " My name is Amit Agarwal 0".dup; s.reverse; foreach (part; s.xsplit()) part.reverse; putr(repr(s)); } Bye, bearophile |
Copyright © 1999-2021 by the D Language Foundation