<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: How to solve the 1000 $1 Bills in 10 Envelopes Puzzle in SQL</title>
	<atom:link href="http://oraqa.com/2008/10/12/how-to-solve-the-1000-1-bills-in-10-envelopes-puzzle-in-sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://oraqa.com/2008/10/12/how-to-solve-the-1000-1-bills-in-10-envelopes-puzzle-in-sql/</link>
	<description>Oracle Question and Answer</description>
	<lastBuildDate>Tue, 06 Jul 2010 14:28:12 -0600</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: newkid</title>
		<link>http://oraqa.com/2008/10/12/how-to-solve-the-1000-1-bills-in-10-envelopes-puzzle-in-sql/comment-page-1/#comment-268</link>
		<dc:creator>newkid</dc:creator>
		<pubDate>Thu, 24 Jun 2010 20:39:45 +0000</pubDate>
		<guid isPermaLink="false">http://oraqa.com/?p=277#comment-268</guid>
		<description>Your solution is brilliant. Here&#039;s an easy way to verify it:
&lt;pre&gt;
WITH DATA AS (SELECT num,MAX(num) OVER() m
                FROM (SELECT CASE
                                WHEN SUM (num) OVER (ORDER BY num) &gt; 1000
                                   THEN   num
                                        - (  SUM (num) OVER (ORDER BY num)
                                           - 1000
                                          )
                                ELSE num
                             END AS num
                        FROM (SELECT POWER (2, LEVEL - 1) AS num
                               FROM DUAL
                              CONNECT BY POWER (2, LEVEL - 1) &lt;= 1000
                              )
                      )
               )
,TO_CHECK AS (SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM &lt;=1000)
SELECT n
  FROM (
SELECT n,num
  FROM TO_CHECK, DATA
 WHERE (CASE WHEN n&gt;m THEN n-m ELSE n END)&gt;num-1 AND BITAND((CASE WHEN n&gt;m THEN n-m ELSE n END),num)&gt;0 AND num &lt; m
        OR (n&gt;m AND num=m)
 )
GROUP BY n HAVING SUM(num) != n

Or:

WITH DATA AS (SELECT num,MAX(num) OVER() m
                FROM (SELECT CASE
                                WHEN SUM (num) OVER (ORDER BY num) &gt; 1000
                                   THEN   num
                                        - (  SUM (num) OVER (ORDER BY num)
                                           - 1000
                                          )
                                ELSE num
                             END AS num
                        FROM (SELECT POWER (2, LEVEL - 1) AS num
                               FROM DUAL
                              CONNECT BY POWER (2, LEVEL - 1) &lt; = 1000
                              )
                      )
               )
,TO_CHECK AS (SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM  &lt;=1000)
SELECT num FROM DATA
WHERE NOT EXISTS (
SELECT n
  FROM (
SELECT n,num
  FROM TO_CHECK, DATA
 WHERE (CASE WHEN n&gt;m THEN n-m ELSE n END)&gt;num-1 AND BITAND((CASE WHEN n&gt;m THEN n-m ELSE n END),num)&gt;0 AND num &lt; m
        OR (n&gt;m AND num=m)
 )
GROUP BY n HAVING SUM(num) != n
)
;

&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>Your solution is brilliant. Here&#8217;s an easy way to verify it:</p>
<pre>
WITH DATA AS (SELECT num,MAX(num) OVER() m
                FROM (SELECT CASE
                                WHEN SUM (num) OVER (ORDER BY num) &gt; 1000
                                   THEN   num
                                        - (  SUM (num) OVER (ORDER BY num)
                                           - 1000
                                          )
                                ELSE num
                             END AS num
                        FROM (SELECT POWER (2, LEVEL - 1) AS num
                               FROM DUAL
                              CONNECT BY POWER (2, LEVEL - 1) &lt;= 1000
                              )
                      )
               )
,TO_CHECK AS (SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM &lt;=1000)
SELECT n
  FROM (
SELECT n,num
  FROM TO_CHECK, DATA
 WHERE (CASE WHEN n&gt;m THEN n-m ELSE n END)&gt;num-1 AND BITAND((CASE WHEN n&gt;m THEN n-m ELSE n END),num)&gt;0 AND num &lt; m
        OR (n&gt;m AND num=m)
 )
GROUP BY n HAVING SUM(num) != n

Or:

WITH DATA AS (SELECT num,MAX(num) OVER() m
                FROM (SELECT CASE
                                WHEN SUM (num) OVER (ORDER BY num) &gt; 1000
                                   THEN   num
                                        - (  SUM (num) OVER (ORDER BY num)
                                           - 1000
                                          )
                                ELSE num
                             END AS num
                        FROM (SELECT POWER (2, LEVEL - 1) AS num
                               FROM DUAL
                              CONNECT BY POWER (2, LEVEL - 1) &lt; = 1000
                              )
                      )
               )
,TO_CHECK AS (SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM  &lt;=1000)
SELECT num FROM DATA
WHERE NOT EXISTS (
SELECT n
  FROM (
SELECT n,num
  FROM TO_CHECK, DATA
 WHERE (CASE WHEN n&gt;m THEN n-m ELSE n END)&gt;num-1 AND BITAND((CASE WHEN n&gt;m THEN n-m ELSE n END),num)&gt;0 AND num &lt; m
        OR (n&gt;m AND num=m)
 )
GROUP BY n HAVING SUM(num) != n
)
;
</pre>
]]></content:encoded>
	</item>
</channel>
</rss>
