Как стать автором
Обновить

Комментарии 15

www.sql.ru/forum/1135451/elka-c

A еще на TSQL

;WITH cteDummy AS (
SELECT 1 as Number, convert (varchar(39),convert (decimal(19,19), rand())) as rnd
UNION ALL
SELECT Number+1, convert (varchar(39),convert (decimal(19,19), rand(Number + DATEPART(ms,GETDATE()))))
FROM cteDummy
WHERE Number < 100
)
, q AS (
SELECT 25-((Number/5)+1)*3 + (-Number % 5)*2 as num, rnd
FROM cteDummy
)
, cteTree as (
SELECT
--right(replicate(' ',num + 2),num + 2) +
right(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(rnd,'0','*'),'1',' '),'2',' '),'3',' '),'4',' '),'5',' '),'6',' '),'7',' '),'8',' '),'9','*'),'.',' ')
,ISNULL(num,1) + 2) +
right(replicate('/',Max(num) over() — num + 1) + '/',Max(num) over() — num + 1) +
right(replicate('\',Max(num) over() — num + 1) + '\',Max(num) over() — num + 1) +
--right(replicate(' ',num + 2),num + 2) as col
left(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(rnd,'0','*'),'1',' '),'2',' '),'3',' '),'4',' '),'5',' '),'6',' '),'7',' '),'8',' '),'9','*'),'.',' ')
,ISNULL(num,0) + 2)
AS e2015
FROM q where num > 0
)
SELECT * FROM cteTree WHERE e2015 IS NOT NULL
Ну, тут много латинских букв и цифр, так неинтересно =)
В данном случае я бы удивился, если бы было можно сделать хоть что-нибудь без букв
Эхх… не удержался… сделал SQL параметрическую елочку на postgres 9.3.
height — высота, igr — вероятность игрушек, rost — угол наклона елки, fon — кол-во символов обрамления, penok — высота пенька елки.

                                                    DO $_$
                                            DECLARE param text := 
                             '20 height,0.2 igr,0.7 rost,5 fon,0.06 sneg,2 penok';
                                         tt text; pp text;xx text;zz 
                                              text;___ text;elka 
                                                   CONSTANT 
                                                   refcursor
                                                   :='elka';
                                                     BEGIN 
                                                 xx:= 'select';
                                               zz:='from' ;___:=
                                              '::text'; pp :=  $$
                                             WITH b as ($$ ||xx ||
                                            $$ 'tr' $$||___|| $$ a,
                                           'r' $$ || ___ || $$ b,'a' 
                                          $$ || ___ || $$ c , 'in' $$
                                         ||___|| $$ v), a as ($$||xx||
                                        $$ 's'||a||v || 'g' s,c||b||b||
                                       c||'y' a,'en' $$ ||___|| $$ e,'l'
                                      ||c $$||___||$$ l,b|| 'e' $$||___||
                                    $$ r,'ne' $$||___||$$ n, 'el' $$||___||
                                   $$ k,'e'||b $$||___||$$ d, 'to_'$$||___||
                                  $$ _,'e'||c $$||___|| $$ g,'ow' $$||___||$$ 
                                 w,'oup' $$||___||$$ p,'by' $$||___||$$ b,'nio'
                                $$||___||$$ i,'ig'||b rg, 'dom' $$||___|| $$ o,c
                               ||'s' $$||___||$$ z,'o'||b $$||___||$$ t,'ch' $$||
                             ___||$$ f,'p' $$||___||$$ h,'on' $$||___||$$ y,b||'o'
                             $$||___||$$ j,v, c||b||c c $$||zz||$$ b),d as ($$||xx||
                            $$' f'||j||'m ' $$||___||$$ f,'s'||k||'ect ' s,'sub'||s||
                           '(' u,' f'||t||' ' r,'::'||v||'t' $$||___||$$ i,'i,g'||e||d
                          ||'ate_s'||d||'ies(' g,a||'_'||_||s||'('||a||'_agg(' a,'c'||z
                         ||'e wh'||e||' ' w,'v'||d||'si'||y||'(),_,_-_))' v,' gr'||p||' '
                        ||b||' _' o,'ran'||o||'()' n,h||'i()' p,'th'||e t,k||'se' e,e||'d'
                       d,rg,y mm,f||'r(' c,'ne'$$||___||$$ sg,z z,'l'||e||'gth' l,'::'||r||
                      'al' q,''||h||'c' __,'u'||i||'n ' un,r||h||g||'t(' re,r||h||l||'ce('pl
                     ,'un'||n||'st('||a ua,'deg'||r||'es' de,t||'d'||d||' '||b y,'ov'||d||l||
                    'y(e '||h||l||'c'||v||'g'||' '||_||f||'ar(n'||w||'(),___)' ov, n||'w_y'||g
                   ||'r_t'||r||'e' ne,'hei'$$||___||$$||'ght'$$||___||$$ b,'p' ||c||'m' ar,'os'
                  $$||___||$$ rt,'eno'$$||___||$$ pk $$||zz||$$ a)$$||xx||$$ '),c '||z||'('||s||
                 '('||p||'/'||p||')'||i||' _,('||p||'*'||p||'*'||p||')'||i||' '||__||'),i '||z||'
                ('||s||'('||s||a||'c),'||u||v||f||'('||s||c||ua||'['||__||'+_+_,'||__||'+'||p||i||
               '+_+_,'||__||'+('||p||'+'||p||')'||i||'+_,('||__||'+'||__||q||'/(_+_)-'||p||')'||i||
              ','||__||'+_+'||__||'+_,'||__||'+'||__||'+'||__||'/(_+_)+(_+_)])) c) h) j, '||c||__||'
             +_) q, '||c||__||'+'||__||'/(_+_)) z,'||c||__||'+'||__||'/(_+_)+_) n,'||c||__||'+'||__||
            '+'||__||'-_)$$||___||$$ m,'||re||c||__||'+_+'||p||i||'),_+_+_) pe,'||c||__||'+'||__||'/(_
           +_)-'||p||i||'-_) v,'||c||'('||__||'+'||__||')*(_+_)) b,r'||rt||'t'||q||' r,'||rg||''||q||',
          '||b||''||i||' h,f'||mm||i||' f,s'||sg||'g'||q||' u,p'||pk||'k'||i||' y,('||b||'*r'||rt||'t+('
          ||p||'/'||p||'))'||i||' '||z||' o, _,_+_ _t,'||c||'('||__||'+_)'||i||')||'||re||c||'(('||de||'(
         '||p||')/(_+_))-_)'||i||'),('||p||'+'||p||'-_-_)'||i||')||'||c||'('||__||'+_)'||i||')___ '||f||' '
        ||ar||',c),l '||z||'('||s||'g, (g*r)'||i||' '||z||' l'||f||g||'_,h)g '|| un||s||'_-_,_-_'||f||'i '||
       un||s||'g+h,('||l||'(pe)-_)/_t l'||f||g||'_,y)g),s '||z||'('||s||a||w||n||'> u '||t||' q '||e||' z '||
      d||'),'||u||v||'x'||f||g||'_,((h+_+y+f)*h*(_+_+_)))g'||o||'),v '||z||'('||s||a||w||n||'>'||rg||' '||t||'
     n '||e||'('||s||u||'j||p,('||n||'*('||l||'(j)-_)+_)'||i||',_)'||f||'i)'||d||'),'||u||v||' '||z||' w'||f||g
    ||'_,((h+_)*h*(_+_+_)))p'||o||'),e '||z||'('||s||'g,'||w||'g<=h '||t||' '||u||'x'||f||'g*h*_t+_'||r||'(o-l+f
   ))||'||u||'w'||f||'g*h*_t+_'||r||'l)||'||w||'g=_-_ '||t||' v '||e||' b '||d||'||'||pl||u||'w'||f||'g*h*_t+h+_'
  ||r||'l),n,m)||'||u||'x'||f||'g*h*_t+h+_'||r||'(o-l+f))'||e||' '||u||'x'||f||'g*h*_t+_'||r||'(o-l+f))||pe||' ||u
 ||'x'||f||'g*h*_t+h+_'||r||'(o-l+f))'||d||' e'||f||'i,l,s,v '||y||' g)'||s||w||'g=h-_ '||t||' '||ov||f||l||'(e)/_t-
                         _t)'||e||' e '||d||' '||ne||' '||f||'e,i' $$||zz||$$ d $$;
                                              EXECUTE PP INTO TT;
                                                OPEN ELKA FOR 
                                                EXECUTE'WITH 
                                                 PARAM AS('
                                                 ||XX||' '|| 
                                                 PARAM||TT;
                                                 END ; $_$;
                                                 FETCH  ALL 
                                                 FROM ELKA;


В pgAdmin — выглядит нормально :) елка just for fun, без цифр :) С новым годом!
PATH= LANG=ru_RU.UTF-8
Это бы тоже внутрь скрипта и без букв :)
Второе легко, но как‐то не хочется: это ведь увеличение кода без каких‐либо качественных изменений. Лучше попробовать LANG=C: при этом (#) будет работать с байтами, а для UTF-8 придётся либо писать свою функцию, либо увеличивать число «символов».

PATH= не нужно вообще, это присваивание здесь просто для контроля выполнения первого условия (я бы его не писал вообще, если бы не strace: про NULLCMD я помнил, но как‐то теоретически и считал, что конкретно к <<< оно не относится).
Вот вариант с LANG=C:
(){__=$# } !;___=$[__<<__];____=$[__<<___];_____=$[___<<___]
______=$[_____<<____-___<<____+____]
________=${(#):-______+__}${(#):-______-__}${(#):-______+____}${(#):-______+_____+___+__}
@()$________ $________
^()`@` ${(#):-$@[1]}${(#):-$@[2]}
''(){(($@<(_____<<____)))&&`@` ${(#)@}||^ $[($@)>>(____+___)|(_____<<____+_____<<(___+__))] $[($@)&(__<<(____+___)-__)|(_____<<____)]}
_______=$[__+(__<<(__+____))+(__<<(__+____))<<(__+____)]
______=$[_______+__+__<<____]
\*(){((${@[-__]}<${@[__]}))&&{`@` $[$@[-__]] `\* $@[__] $[$@[___]+____]` }}
+(){(($#))&&`@` $('' $@[__])$(+ $@[___,-__])}
/()`@` "${${(#)@}// }"
`() {/ $@[__] $@[-__]+____+__ $@[__]-____ $@[-___]-__} $(\* $[#________+(_____<<__)] $[#________])` \
    `() {/ $@[-__] $@[__]+__ $@[-__]+___ $@[___+__]-__} $(\* '(____<<____)+_____*___' '____<<____')`=${(#):-$[_____<<(___+__)+___+__]}
(){(){`@` $@} `+ _______` `+ ${@[____]}-__ ${@[____]} ______ ${@[-__]}+__ ${@[____]}-___` `+ ${@[__]}+__ ${@[____]} ${@[__]}+___ ${@[____]} ${@[____]}-___ '____<<(____-__)+__'` } `\* '______+(______-_______)+_____' ______`
.
> ^()`@` ${(#):-$@[1]}${(#):-$@[2]}

Что я вижу? Цифры! Ай-яй-яй!
Как‐то пропустил. Ну здесь тривиально: единица — два подчёркивания, двойка — три:
(){__=$# } !;___=$[__<<__];____=$[__<<___];_____=$[___<<___]
______=$[_____<<____-___<<____+____]
________=${(#):-______+__}${(#):-______-__}${(#):-______+____}${(#):-______+_____+___+__}
@()$________ $________
^()`@` ${(#):-$@[__]}${(#):-$@[___]}
''(){(($@<(_____<<____)))&&`@` ${(#)@}||^ $[($@)>>(____+___)|(_____<<____+_____<<(___+__))] $[($@)&(__<<(____+___)-__)|(_____<<____)]}
_______=$[__+(__<<(__+____))+(__<<(__+____))<<(__+____)]
______=$[_______+__+__<<____]
\*(){((${@[-__]}<${@[__]}))&&{`@` $[$@[-__]] `\* $@[__] $[$@[___]+____]` }}
+(){(($#))&&`@` $('' $@[__])$(+ $@[___,-__])}
/()`@` "${${(#)@}// }"
`() {/ $@[__] $@[-__]+____+__ $@[__]-____ $@[-___]-__} $(\* $[#________+(_____<<__)] $[#________])` \
    `() {/ $@[-__] $@[__]+__ $@[-__]+___ $@[___+__]-__} $(\* '(____<<____)+_____*___' '____<<____')`=${(#):-$[_____<<(___+__)+___+__]}
(){(){`@` $@} `+ _______` `+ ${@[____]}-__ ${@[____]} ______ ${@[-__]}+__ ${@[____]}-___` `+ ${@[__]}+__ ${@[____]} ${@[__]}+___ ${@[____]} ${@[____]}-___ '____<<(____-__)+__'` } `\* '______+(______-_______)+_____' ______`
Параметры запуска содержающие симвлы и цифры- это чит.
В параметрах можно передать что угодно, например строку «Happy new year!» и тогда задача значительно упрощается.
Вообще‐то предполагается, что у вас уже юникодная локаль (любая, не обязательно ru_RU). Да и, как я показал выше, засунуть туда этот параметр запуска можно, можно даже засунуть туда код, который собирает UTF-8 по байтам (именно он там и есть). Просто это уже тривиально по сравнению с основной задачей.
Ну вы, батенька, и извращенец!
Кстати, никто не хочет попытаться обойтись без подчёркиваний? Или без подчёркиваний и без fork? Я знаю, что это возможно и как это сделать, но процедура ещё более муторная. Второе без генератора я бы писать не стал.

Если никто не напишет вариант до середины следующего дня (или даже несколько позже), то я обновлю статью.
А под Oracle есть? :)
Собственно, обновил. Без fork и подчёркиваний получилось как‐то неинтересно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории