|
这个老贴这么多人在顶,就没有人试试新玩法?
把输出部分加工一下:
with a as ( select distinct round(sum(x) over(order by n)) x,
round(sum(y) over(order by n)) y
from (select n,
cos(trunc(n / 20) * (1-1/5) * 3.1415926) * 2 x,
sin(trunc(n / 20) * (1-1/5) * 3.1415926) y
from (select rownum - 1 n from DUAL CONNECT BY rownum <= 20 * 5))
)
SELECT LPAD(REPLACE(SUM(POWER(10,x-1)),'0',' '),(SELECT MAX(x) FROM a)) AS star
FROM a
GROUP BY y
ORDER BY y;
STAR
-------------------------------------------------------
1
1 1
1 1
1 1
11 11
1 1
1 1
1 1 1 1 1 1 1 111 1 1 1 111 1 1 1 1 1 1
11 1 1 11
11 1 1 11
1 1 1 1
11 1 1 11
11 1 1 11
1 1 1 1 1 1
1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1
11 1 1 11
1 1
美中不足的是缺了一个点,因为ORACLE只能算40位加法。
瘦身版的倒是不缺,就是有些难看:
with a as ( select distinct round(sum(x) over(order by n)) x,
round(sum(y) over(order by n)) y
from (select n,
cos(trunc(n / 20) * (1-1/5) * 3.1415926) x,
sin(trunc(n / 20) * (1-1/5) * 3.1415926) y
from (select rownum - 1 n from DUAL CONNECT BY rownum <= 20 * 5))
)
SELECT LPAD(REPLACE(SUM(POWER(10,x)),'0',' '),(SELECT MAX(x)+1 FROM a)) AS star
FROM a
GROUP BY y
ORDER BY y;
STAR
------------------------
1
1
1 1
1 1
11 11
1 1
1 1
111111111111111111111
11 1 1 11
11 1 1 11
1 1 1 1
11 11
11 11
1 11 11 1
1 1 1
1 1 1 1
1 11 11 1
1 1 1 1
11 11
1 1
既然40位不够用,拆成两截再拼回来:
with a as ( select distinct round(sum(x) over(order by n)) x,
round(sum(y) over(order by n)) y
from (select n,
cos(trunc(n / 20) * (1-1/5) * 3.1415926) * 2 x,
sin(trunc(n / 20) * (1-1/5) * 3.1415926) y
from (select rownum - 1 n from DUAL CONNECT BY rownum <= 20 * 5))
)
SELECT TRANSLATE(LPAD(NVL(SUM(POWER(10,CASE WHEN x>=40 THEN x-40 END)),0),(SELECT MAX(x)-39 FROM a WHERE x>=40))
||LPAD(SUM(POWER(10,CASE WHEN x<40 THEN x END)),40)
,'01',' *'
)
AS star
FROM a
GROUP BY y
ORDER BY y;
STAR
---------------------------------------------
*
* *
* *
* *
** **
* *
* *
* * * * * * * *** * * * *** * * * * * * *
** * * **
** * * **
* * * *
** * * **
** * * **
* * * * * *
* * * *
* * * * * *
* * * * * *
* * * *
** * * **
* *
再来试试11GR2的递归WITH拼接字符串:
with a as (SELECT x,y
,ROW_NUMBER() OVER(PARTITION BY y ORDER BY x) rn
,MAX(x) OVER(PARTITION BY y) maxx
FROM (select distinct round(sum(x) over(order by n)) x,
round(sum(y) over(order by n)) y
from (select n,
cos(trunc(n / 20) * (1-1/5) * 3.1415926) * 2 x,
sin(trunc(n / 20) * (1-1/5) * 3.1415926) y
from (select rownum - 1 n from DUAL CONNECT BY rownum <= 20 * 5)
)
)
)
,t(rn,x,y,str,maxx) AS (
SELECT 1,x,y,LPAD('*',x+1),maxx FROM a WHERE rn=1
UNION ALL
SELECT a.rn,a.x,t.y,str||RPAD(' ',a.x-t.x-1)||'*',t.maxx
FROM t,a
WHERE t.rn=a.rn-1 AND t.y=a.y
) CYCLE x,y SET cycle_flag TO 'Y' DEFAULT 'N'
SELECT str FROM t WHERE x=maxx ORDER BY y;
STR
----------------------------------------------------
*
* *
* *
* *
** **
* *
* *
* * * * * * * *** * * * *** * * * * * * *
** * * **
** * * **
* * * *
** * * **
** * * **
* * * * * *
* * * *
* * * * * *
* * * * * *
* * * *
** * * **
* *
放大:以10点为单位,设备数为SCALE
VAR SCALE NUMBER;
EXEC :SCALE :=3;
with a as (SELECT x,y
,ROW_NUMBER() OVER(PARTITION BY y ORDER BY x) rn
,MAX(x) OVER(PARTITION BY y) maxx
FROM (select distinct round(sum(x) over(order by n)) x,
round(sum(y) over(order by n)) y
from (select n,
cos(trunc(n / (10*:SCALE)) * (1-1/5) * 3.1415926) * 2 x,
sin(trunc(n / (10*:SCALE)) * (1-1/5) * 3.1415926) y
from (select rownum - 1 n from DUAL CONNECT BY rownum <= 10*:SCALE * 5)
)
)
)
,t(rn,x,y,str,maxx) AS (
SELECT 1,x,y,LPAD('*',x+1),maxx FROM a WHERE rn=1
UNION ALL
SELECT a.rn,a.x,t.y,str||RPAD(' ',a.x-t.x-1)||'*',t.maxx
FROM t,a
WHERE t.rn=a.rn-1 AND t.y=a.y
) CYCLE x,y SET cycle_flag TO 'Y' DEFAULT 'N'
SELECT str FROM t WHERE x=maxx ORDER BY y;
STR
----------------------------------------------------------------------
*
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* * * * * * * * * * * *** * * * * * *** * * * * * * * * * * *
** ** ** **
** * * **
* * * *
** * * **
* * * * * *
* ** ** *
** **
* * * * * *
* * * * * *
* * * *
* * * *
* * * * * *
* * * *
* * * * * *
* * * * * *
* ** ** *
** **
* *
搞了那么多装修,只有核心的坐标计算不敢动 
|
|