Season's greetings from PHASTAR

Season's greetings from Phastar's 2023 SAS Art competition winner!

Season's Greetings from the Phastar team!

Each year Phastar holds an internal competition among its programmers to create a work of festive art, using only their imagination and SAS software!

If you'd like to see how it all works , find the SAS code below: 

data xmas;
%annomac;
length style $200;
vpos = 100;
hpos = 105;

green = 'cx2A8307 cx3C6629 cx5B993D cx185920 cx16A629 cx388C4C cx118044 cx2E734E cx5D8C64 cx3B593F cx2E332C cx0A260E cx6EA688 cx143322 cx118044';
orn = 'cxFF0000 cx13478C cx3230B2 cx6130B2 cx90B0D9 cx4DBFBC cx138C89 cxCC1B2B cxE599A7 cxA030B2 cx731F65 cxAEE554 cxE5B82E cxD9892B cxDC143C cxFFF5EE cx73002E CXAF95A6';

%system(4,4,1);

*background;
*%bar(0,0,105,100,cx1B1B26 ,0,solid); * dark blue;
%bar(0,0,105,100,cx142233 ,0,solid); *deep greenish blue;
%bar(0,15, 105,50, cxBFBFBF, 0, solid); *light gray;
%bar(0,0, 105,15, cxFFFFFF, 0, solid); *white;

*moon;
%slice(12,90,0,365,5, cxDEDDED, ps, whole);


*mountain 1;
%poly(0,50, cx373740, solid, 1); *dary grayish blue;
%polycont(30,85);
%polycont(34,84);
%polycont(40,90);
%polycont(45,85);
%polycont(55,95);
%polycont(65,80);
%polycont(69,85);
%polycont(74,79);
%polycont(77,83);
%polycont(95,60);
%polycont(95,50);
* mountain snow;
%poly(25,80, cxFFFFFF, solid, 1);
%polycont(30,85);
%polycont(34,84);
%polycont(40,90);
%polycont(45,85);
%polycont(55,95);
%polycont(65,80);
%polycont(69,85);
%polycont(74,79);
%polycont(77,83);
%polycont(75,79);
%polycont(75,75);
%polycont(72,78);
%polycont(63,74);
%polycont(57,80);
%polycont(51,75);
%polycont(44,74);
%polycont(35,77);
%polycont(30,75);

*mountain 2;
%poly(0,50,cx8C8883, solid, 1); *light brownish gray;
%polycont(0,74);
%polycont(5,70);
%polycont(15,80);
%polycont(25,69);
%polycont(30,75);
%polycont(47,50);
*snow on mountain;
%poly(0,50,cxFFFFFF, solid, 1); *light brownish gray;
%polycont(0,74);
%polycont(5,70);
%polycont(15,80);
%polycont(25,69);
%polycont(30,75);
%polycont(25,65);
%polycont(23,64);
%polycont(20,65);
%polycont(14,69);
%polycont(10,64);
%polycont(7,68);
%polycont(3,65);
%polycont(0,67);

* Mountain 3;
%poly(73,50,cx535359, solid, 1); *dark blueish gray;
%polycont(100,85);
%polycont(105,80);
%polycont(105,50);
*mountain snow;
%poly(92,75,cxFFFFFF, solid, 1);
%polycont(96,73);
%polycont(101,76);
%polycont(105,72);
%polycont(105,80);
%polycont(100,85);

*trees behind Chalet;
do i = 0 to 103 by 2;
%poly(0+i,50, Cx172118, solid,1);
%polycont(1+i,57);
%polycont(2+i,50);
end;

do i = 0 to 100 by 3;
%poly(1+i,45, Cx3B593F , solid,1);
%polycont(3+i,55);
%polycont(5+i,45);
end;

%poly(0,47, Cx264C14, solid,1);
%polycont(3,55);
%polycont(6,47);

do i = 0 to 100 by 5;
%poly(0+i,45, Cx143322 , solid,1);
%polycont(2.5+i,55);
%polycont(5+i,45);
end;

%poly(9,50, Cx264C14, solid,1);
%polycont(10,56);
%polycont(11,50);

%poly(19,47, Cx264C14, solid,1);
%polycont(21,55);
%polycont(23,47);

%poly(53,48, Cx264C14, solid,1);
%polycont(54,57);
%polycont(53,48);

%poly(65,45, Cx264C14, solid,1);
%polycont(68,54);
%polycont(71,45);

%poly(80,40, Cx172118, solid,1);
%polycont(85,60);
%polycont(90,40);

%poly(99,47, Cx264C14, solid,1);
%polycont(100,55);
%polycont(101,47);

%poly(2,49, cx2A8307, solid,1);
%polycont(10,20);
%polycont(0,20);

%poly(80,55, cx0A260E , solid,1);
%polycont(84,25);
%polycont(76,25);

%poly(101,57,cx185920, solid,1);
%polycont(105,27);
%polycont(95,27);

%poly(97,49, cx3B593F , solid,1);
%polycont(103, 15);
%polycont(92,16);

%poly(77,52,cx16A629,solid,1);
%polycont(82,17);
%polycont(72,17);

%bar(89,17, 91,22, cx593B18 , 0, solid);
%poly(90,57, cx264C14 , solid,1);
%polycont(95,49);
%polycont(85,49);
%poly(90,51, cx264C14, solid,1);
%polycont(98,40);
%polycont(82,40);
%poly(90,45, cx264C14, solid,1);
%polycont(100,30);
%polycont(80,30);
%poly(90,35, cx264C14, solid,1);
%polycont(101,21);
%polycont(79,21);

%poly(16,52, cx47592A, solid,1);
%polycont(12,43);
%polycont(16,44);
%poly(16,46, cx47592A, solid,1);
%polycont(16,40);
%polycont(12,38);
%poly(16,42, cx47592A, solid,1);
%polycont(16,32);
%polycont(10,30);
%poly(16,54, cx47592A, solid,1);
%polycont(20,43);
%polycont(16,44);
%poly(16,46, cx47592A, solid,1);
%polycont(16,40);
%polycont(20,38);
%poly(16,42, cx47592A, solid,1);
%polycont(16,32);
%polycont(22,30);

%poly(61,50, cx1F261C, solid,1);
%polycont(61, 47);
%polycont(59, 46);
%poly(61,47, cx1F261C, solid,1);
%polycont(61, 43);
%polycont(57, 42);
%poly(61,45, cx1F261C, solid,1);
%polycont(61, 36);
%polycont(56,34);
%poly(61,50, cx1F261C, solid,1);
%polycont(61, 47);
%polycont(63, 46);
%poly(61,47, cx1F261C, solid,1);
%polycont(61, 43);
%polycont(65, 42);
%poly(61,45, cx1F261C, solid,1);
%polycont(61, 36);
%polycont(67,34);

%poly(12,47, cx143322, solid,1);
%polycont(9,30);
%polycont(15,30);

%poly(3,40, cx0A260E, solid,1);
%polycont(0, 15);
%polycont(6,15);

%poly(65, 59, cx5D8C64, solid,1);
%polycont(60,20);
%polycont(70,20);

%bar(99.5,11, 100.5,20, cx593B18 , 0, solid);
%poly(100,37, cx2A8307, solid,1);
%polycont(95,14);
%polycont(105,14);

*Chalet;
*chimney;
%bar(20,30,22.5,55, cx171719, 0, solid);
*roof green;
%poly(7.5,15, cx185920, solid,1);*green;
%polycont(27.5,57);
%polycont(30,57);
%polycont(10,15);

*face red;
%poly(10,15, cxFF0000, solid,1);
%polycont(30,57);
%polycont(50,15);
%poly(10,15, cx4C2714, n,3);
%polycont(30,57);
%polycont(50,15);

*doors and windows;
%bar(25,15,35,30,cx185920, 0, solid);
%bar(25,15,35,30,cx118044, 0, empty);
%bar(25,15,30,30,cx118044, 0, empty);

%bar(19,15, 24, 30, cxE5B82E, 0, solid);
%bar(19,15, 24, 30, cx185920, 0, empty);
%bar(19,25, 24, 30, cx185920, 0, empty);

%bar(36,15, 41, 30, cxE5B82E, 0, solid);
%bar(36,15, 41, 30, cx185920, 0, empty);
%bar(36,25, 41, 30, cx185920, 0, empty);

%bar(25,31,35,45,cxE5B82E, 0, solid);
%bar(25,31,35,45,cx185920, 0, empty);
%bar(25,31,30,45,cx185920, 0, empty);

%poly(24,31, cxE5B82E, solid,1);
%polycont(24, 40);
%polycont(19, 31);

%poly(36,31, cxE5B82E, solid,1);
%polycont(36,40);
%polycont(41, 31);

%poly(24,31, cx185920, empty, 1);
%polycont(24, 40);
%polycont(19, 31);

%poly(36,31, cx185920, empty,1);
%polycont(36,40);
%polycont(41, 31);

*door knob;
%slice(29,22.5,0,365,.7, cxFF0000, ps, whole);
%slice(31,22.5,0,365,.7, cxFF0000, ps, whole);

*roof white;
%poly(27.5,57, cxDEDDED, solid,1);
%polycont(50,57);
%polycont(72.5, 15);
%polycont(50,15);

*trees in front of chalet;
%bar(70,13,72,22, cx803009, 0, solid);
%poly(61, 19, cx0A260E, solid,1);
%polycont(70,51);
%polycont(79,19);

%bar(7,13,9,22, cx8C411C, 0, solid);
%poly(3,21, cx47592A , solid,1);
%polycont(8,60);
%polycont(13,21);

*snow;
do i=1 to 900 by 1;
%slice(rand("uniform",1,104), rand("uniform",1,99), 0,360,rand("uniform", .001,.5), cxFFFFFF,ps, whole);
end;

%bar(3, 3, 102, 12, CXAF95A6,0, solid);
%bar(3, 3, 102, 12, cx73002E,0, empty);
%label(52.5, 7.5, "Season's Greetings from Phastar", cx73002E, 0, 0, 8.3, OLDENG, +); * stuggling with the font-update length style fixed it;

run;

proc gslide annotate = xmas;
run;
quit;