How can add rightmost column by calculating all prices by id wise? - mysql

I have 4 tables. they are as follows:
-- 1. m_student
-- 2. t_reserve_a
-- 3. t_reserve_b
-- 4. t_reserve_c
I wanted to merge all required data from these 4 tables and get the total price of ordered textbooks in rightmost column as "total". i have tried to merge data from these table as follows:
SELECT tr.recptid AS ID,
tr.student_id AS S_ID,
tr.student_name AS S_N,
tr.student_zip AS ZIP,
tr.student_address AS ADD1,
tr.student_address2 AS ADD2,
tr.student_tel AS TEL,
IFNULL(tr.text_name, '') AS T_N,
tr.price,
COALESCE(tr.upd_date, rc.upd_date) AS UPDT
FROM
( SELECT ra.reserve_id,
RIGHT(ra.reserve_id,5) AS recptid,
m.student_id,
m.student_name,
m.student_zip,
m.student_address,
m.student_address2,
m.student_tel,
rb.subject,
rb.text_name,
rb.price,
rb.upd_date
FROM t_reserve_a AS ra INNER JOIN t_reserve_b AS rb ON ra.reserve_id=rb.reserve_id
INNER JOIN m_student AS m ON m.student_id=ra.student_id ) AS tr
LEFT JOIN t_reserve_c AS rc ON tr.reserve_id=rc.reserve_id
ORDER BY tr.reserve_id
they display like here in below:
ID S_ID S_N ZIP ADD1 ADD2 TEL T_N price UPDT
00000 19C2135004L H A 100-0000 USA TUCSON AZ 85705 0000-00-0000 GA 2475 2020/04/13 8:04:36
00000 19C2135004L H A 100-0000 USA TUCSON AZ 85705 0000-00-0000 R 1782 2020/04/13 8:04:36
00001 20A1109010F H S 100-0001 USA TUCSON AZ 706 0000-00-0001 R 1782 2020/04/13 8:05:51
00001 20A1109010F H S 100-0001 USA TUCSON AZ 706 0000-00-0001 LL 891 2020/04/13 8:05:51
00002 19C2134016F M K 100-0002 USA PHOENIX AZ 85123 0000-00-0002 R 2475 2020/04/13 8:06:27
00003 20A1124018B C O 100-0003 USA PHOENIX AZ 85122 0000-00-0003 LL 1782 2020/04/13 8:06:47
00003 20A1124018B C O 100-0003 USA PHOENIX AZ 85122 0000-00-0003 R 891 2020/04/13 8:06:47
00004 20C2136005I F H 100-0004 USA SEATTLE WA 98102 0000-00-0004 R 3534 2020/04/13 8:07:03
00004 20C2136005I F H 100-0004 USA SEATTLE WA 98102 0000-00-0004 T 2178 2020/04/13 8:07:03
00004 20C2136005I F H 100-0004 USA SEATTLE WA 98102 0000-00-0004 GB 4158 2020/04/13 8:07:03
00005 20C3156502C Y 100-0005 USA TUCSON AZ 8572 0000-00-0005 R 3534 2020/04/13 8:07:58
00005 20C3156502C Y 100-0005 USA TUCSON AZ 8572 0000-00-0005 GB 2178 2020/04/13 8:07:58
But how can I add total column like as below:
ID S_ID S_N ZIP ADD1 ADD2 TEL T_N price UPDT total
00000 19C2135004L H A 100-0000 USA TUCSON AZ 85705 0000-00-0000 GA 2475 2020/04/13 8:04:36 4257
00000 19C2135004L H A 100-0000 USA TUCSON AZ 85705 0000-00-0000 R 1782 2020/04/13 8:04:36
00001 20A1109010F H S 100-0001 USA TUCSON AZ 706 0000-00-0001 R 1782 2020/04/13 8:05:51 2673
00001 20A1109010F H S 100-0001 USA TUCSON AZ 706 0000-00-0001 LL 891 2020/04/13 8:05:51
00002 19C2134016F M K 100-0002 USA PHOENIX AZ 85123 0000-00-0002 R 2475 2020/04/13 8:06:27 2475
00003 20A1124018B C O 100-0003 USA PHOENIX AZ 85122 0000-00-0003 LL 1782 2020/04/13 8:06:47 2673
00003 20A1124018B C O 100-0003 USA PHOENIX AZ 85122 0000-00-0003 R 891 2020/04/13 8:06:47
00004 20C2136005I F H 100-0004 USA SEATTLE WA 98102 0000-00-0004 R 3534 2020/04/13 8:07:03 9870
00004 20C2136005I F H 100-0004 USA SEATTLE WA 98102 0000-00-0004 T 2178 2020/04/13 8:07:03
00004 20C2136005I F H 100-0004 USA SEATTLE WA 98102 0000-00-0004 GB 4158 2020/04/13 8:07:03
00005 20C3156502C Y 100-0005 USA TUCSON AZ 8572 0000-00-0005 R 3534 2020/04/13 8:07:58 5712
00005 20C3156502C Y 100-0005 USA TUCSON AZ 8572 0000-00-0005 GB 2178 2020/04/13 8:07:58
can anyone please help me to sort out this problem?

Related

Selecting a row from a dataframe based on condition in R

I am trying to subset a dataframe based on each user_id and order_date.
If ecomm_id and pulse_id exists in the row for that userid and for order_date, that row should be selected to new dataframe.
Else only one row with no ecomm_id must be selected to the new data frame and all other rows must be discarded.
Sample data:
userid returning device store_n testid ecomm_id pulse_id order_date
1.00 1 0 9328 Experience E 1 23 7/25/2015
1.00 1 0 NA Experience E NA NA 7/25/2015
2.00 1 1 NA Experience C NA NA 7/14/2015
3.00 1 0 3486 Experience F 2 86 7/23/2015
3.00 1 0 NA Experience F NA NA 7/24/2015
3.00 1 0 NA Experience F NA NA 7/24/2015
Expected Output:
userid returning device store_n testid ecomm_id pulse_id order_date
1.00 1 0 9328 Experience E 1 23 7/25/2015
2.00 1 1 NA Experience C NA NA 7/14/2015
3.00 1 0 3486 Experience F 2 86 7/23/2015
3.00 1 0 NA Experience F NA NA 7/24/2015
Hope this helps!
df <- data.frame(userid=c(1,1,2,3,3,3),
returning=c(1,1,1,1,1,1),
device=c(0,0,1,0,0,0),
store_n=c(9328,NA,NA,3486,NA,NA),
testid=c('Experience E','Experience E','Experience C','Experience F','Experience F','Experience F'),
ecomm_id=c(1,NA,NA,2,NA,NA),
pulse_id=c(23,NA,NA,86,NA,NA),
order_date=c('7/25/2015','7/25/2015','7/14/2015','7/23/2015','7/24/2015','7/24/2015')
)
library(dplyr)
df1 <- unique(df) %>% group_by(userid,order_date) %>% summarise(count=n())
df1 <- merge(unique(df),df1,on=c(userid,order_date))
final_df <- df1[!(is.na(df1$ecomm_id) & is.na(df1$pulse_id) & df1$count > 1),-ncol(df1)]
Don't forget to let us know if it solved your problem :)
With data.table, this becomes a concise "one-liner":
library(data.table)
setDT(DT)[order(ecomm_id), .SD[1], keyby = .(userid, order_date)]
userid order_date returning device store_n testid tid ecomm_id pulse_id
1: 1.00 7/25/2015 1 0 9328 Experience E 1 23
2: 2.00 7/14/2015 1 1 NA Experience C NA NA
3: 3.00 7/23/2015 1 0 3486 Experience F 2 86
4: 3.00 7/24/2015 1 0 NA Experience F NA NA
By ordering by ecomm_id, the NA entries are moved to the bottom. Now, for each combination of userid and order_date the first element within that group is picked.
Note that this assumes that there is at most one entry per group in case of non-NA ecomm_ids because the OP has specified:
If ecomm_id and pulse_id exists in the row for that userid and for order_date, that row should be selected to new dataframe.

sql filtering 2 or more

voorletters, naam, geslacht, boete
B Niewenburg V 25.00
B Niewenburg V 140.00
D Moerman V 35.00
D Moerman V 50.00
DD Cools V 75.00
DD Cools V 85.00
E Bakker, de M 30.00
E Bakker, de M 35.00
E Bakker, de M 90.00
E Bakker, de M 95.00
IP Baalen, van V 140.00
R Permentier M 100.00
And I have this as sql statement
SELECT VOORLETTERS, NAAM, GESLACHT, BEDRAG
FROM SPELER S
RIGHT JOIN BOETE B ON B.SPELERSNR = S.SPELERSNR
LEFT joiN BESTUURSLID BL ON BL.SPELERSNR = S.SPELERSNR
GROUP BY VOORLETTERS, NAAM, GESLACHT, BEDRAG
how can i make it that I only see people with 2 or more 'boete'?
so that I get this as an answer
voorletters, naam, geslacht, boete
B Niewenburg V 25.00
B Niewenburg V 140.00
D Moerman V 35.00
D Moerman V 50.00
DD Cools V 75.00
DD Cools V 85.00
E Bakker, de M 30.00
E Bakker, de M 35.00
E Bakker, de M 90.00
E Bakker, de M 95.00
use a subselect for get the people with two or more rows in speler
SELECT VOORLETTERS, NAAM, GESLACHT, BEDRAG
FROM SPELER S
RIGHT JOIN BOETE B ON B.SPELERSNR = S.SPELERSNR
LEFT joiN BESTUURSLID BL ON BL.SPELERSNR = S.SPELERSNR
where s.naam in (select naam from (select naam, count(*) from speler group by name ) )
GROUP BY VOORLETTERS, NAAM, GESLACHT, BEDRAG

SELECT occupation from movie where year = 1950 AND rating =5 AND MAX(views);

I need help in solving this question. "in year 1950 which was the highest viewed movie and 5 rating given user occupations for that movie, and which oocupation people viewed the movie a lot;"
I am getting the follow error
"SemanticException [Error 10128]: Line 1:56 Not yet supported place for UDAF 'MAX'"
movie_name, year, rating, occupation, views
A 1950 1 teacher 52
B 1953 5 doctor 45
C 1950 1 teacher 85
D 1952 4 police 35
E 1951 2 lawyer 15
F 1950 3 doctor 26
G 1951 1 lawyer 53
H 1952 2 teacher 85
I 1951 4 police 45
J 1950 3 doctor 36
K 1953 1 lawyer 52
L 1951 5 police 62
M 1953 2 teacher 42
N 1950 4 lawyer 85
O 1951 3 police 9
P 1952 1 doctor 44
Q 1950 5 teacher 27
R 1951 2 police 86
S 1955 3 lawyer 51
T 1950 5 police 49
U 1955 4 teacher 86
V 1954 3 lawyer 99
W 1951 2 teacher 84
X 1955 5 police 72
Y 1954 2 teacher 62
Z 1950 4 doctor 85
You cannot use an aggregate expression in the where clause; ordering the result should be sufficient.
SELECT movie_name, occupation, views
FROM movie
WHERE year = 1950 AND rating = 5
ORDER BY views DESC
LIMIT 1

Only n records for every x field

Given this data set:
ID Name City Birthyear
1 Egon Spengler New York 1957
2 Mac Taylor New York 1955
3 Sarah Connor New York 1959
4 Jean-Luc Picard La Barre 2305
5 Ellen Ripley Nostromo 2092
6 James T. Kirk Nostromo 2233
7 Henry Jones La Barre 1899
How can I get only 2 records from every city?
Try this:
SELECT i1.*
FROM your_table i1
LEFT JOIN your_table i2
ON (i1.City = i2.City AND i1.ID > i2.ID)
GROUP BY i1.ID
HAVING COUNT(*) < 2
ORDER BY city, ID;

Code Golf - Banner Generation

Locked. This question and its answers are locked because the question is off-topic but has historical significance. It is not currently accepting new answers or interactions.
When thanking someone, you don't want to just send them an e-mail saying "Thanks!", you want to have something FLASHY:
Input: THANKS!!
Output:
TTT H H AAA N N K K SSS !!! !!!
T H H A A NNN K K S !!! !!!
T HHH AAA NNN KK SSS !!! !!!
T H H A A N N K K S
T H H A A N N K K SSS !!! !!!
Write a program to generate a banner. You only have to generate upper-case A-Z along with spaces and exclamation points (what is a banner without an exclamation point?). All characters are made up of a 3x5 grid of the same character (so the S is a 3x5 grid made of S). All output should be on one row (so no newlines). Here are all the letters you need:
Input: ABCDEFGHIJKL
Output:
AAA BBB CCC DD EEE FFF GGG H H III JJJ K K L
A A B B C D D E F G H H I J K K L
AAA BBB C D D EE FF G G HHH I J KK L
A A B B C D D E F G G H H I J J K K L
A A BBB CCC DD EEE F GGG H H III JJJ K K LLL
Input: MNOPQRSTUVWX
Output:
M M N N OOO PPP QQQ RR SSS TTT U U V V W W X X
MMM NNN O O P P Q Q R R S T U U V V W W X
M M NNN O O PPP Q Q RR SSS T U U V V WWW X
M M N N O O P QQQ R R S T U U V V WWW X
M M N N OOO P QQQ R R SSS T UUU V WWW X X
Input: YZ!
Output:
Y Y ZZZ !!!
Y Y Z !!!
YYY Z !!!
Y Z
YYY ZZZ !!!
The winner is the shortest source code, as counted by the number of bytes it takes to store the file in utf-8 encoding. Source code should read input from stdin, output to stdout. You can assume input will only contain [A-Z! ]. If you insult the user on incorrect input, you get a 10 character discount =P.
I was going to require these exact 28 characters, but to make it more interesting, you can choose how you want them to look - whatever makes your code shorter! To prove that your letters do look like normal letters, show the output of the last three runs.
Shortest codes so far, in characters (utf8 encoding if non-ASCII present):
133 J
205 Python
209 Ruby
313 Haskell
345 C89
382 F#
J, 133 135 79 83 84 88 characters (utf-8 encoding)
;/5 3$"1(' ',.s){~"1#:3 u:(ucp'翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧'){~0>.64-~a.i.s=:
Usage:
;/5 3$"1(' ',.s){~"1#:3 u:(ucp'翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧'){~0>.64-~a.i.s=:'ABCDEFGHIJKLMNOPQRSTUVWXYZ !'
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│AAA│BBB│CCC│DD │EEE│FFF│GGG│H H│III│JJJ│K K│L │M M│N N│OOO│PPP│QQQ│RR │SSS│TTT│U U│V V│W W│X X│Y Y│ZZZ│ │!!!│
│A A│B B│C │D D│E │F │G │H H│ I │ J│K K│L │MMM│NNN│O O│P P│Q Q│R R│S │ T │U U│V V│W W│ X │Y Y│ Z│ │!!!│
│AAA│BBB│C │D D│EE │FF │G G│HHH│ I │ J│KK │L │M M│NNN│O O│PPP│Q Q│RR │SSS│ T │U U│V V│WWW│ X │YYY│ Z │ │!!!│
│A A│B B│C │D D│E │F │G G│H H│ I │J J│K K│L │M M│N N│O O│P │QQQ│R R│ S│ T │U U│V V│WWW│ X │ Y│Z │ │ │
│A A│BBB│CCC│DD │EEE│F │GGG│H H│III│JJJ│K K│LLL│M M│N N│OOO│P │QQQ│R R│SSS│ T │UUU│ V │WWW│X X│YYY│ZZZ│ │!!!│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
;/5 3$"1(' ',.s){~"1#:3 u:(ucp'翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧'){~0>.64-~a.i.s=:'this is incorrect input.'
|index error
Explanation (NB. is comment in J):
;/ NB. String together along the third dimension...
5 3$"1 NB. ... reshape each line to 5x3...
(' ',.s) NB. ... a space before each letter of the input string...
{~"1 NB. ... indexed using...
#: NB. ... the (15 bit) binary representation of ...
3 u: NB. ... the integer representation of...
(ucp'翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧') ... the unicode versions of these code points...
{~ NB. ...indexed using...
0>. NB. ...the max of 0 and...
64-~ NB. ...64 less than...
a.i. NB. the ascii indexes of s
s=: NB. Assign the input string to the variable s.
Python, 250 224 chars
s=raw_input()
for i in range(5):
for c in s:
print''.join((' ',c)[int('2zj93fqzj6hsh2bc8i2b1ycncj5yc2v9i0m16dz91gcizj18blbw6wt0p3qqh8svchwc5onna2808of',36)>>((ord(c)-65 if c>'#'else 26)*15+i*3+j)&1]for j in[0,1,2]),
print
Notes:
relies on 2.x print statement considerably;
supports spaces.
Running (I changed appearance of a few letters, for aestetic reasons only ;):
$ echo ABCDEFGHIJKL | python code-golf.py
AAA BBB CCC DD EEE FFF GGG H H III JJJ K K L
A A B B C D D E F G H H I J K K L
AAA BBB C D D EEE FFF G HHH I J KK L
A A B B C D D E F G G H H I J J K K L
A A BBB CCC DD EEE F GGG H H III JJJ K K LLL
$ echo MNOPQRSTUVWX | python code-golf.py
M M N N OOO PPP QQQ RR SSS TTT U U V V W W X X
MMM NNN O O P P Q Q R R S T U U V V W W X X
M M NNN O O PPP Q Q RR SSS T U U V V WWW X
M M N N O O P QQQ R R S T U U V V WWW X X
M M N N OOO P QQQ R R SSS T UUU V W W X X
$ echo YZ\! | python code-golf.py
Y Y ZZZ !!!
Y Y Z !!!
YYY Z !!!
Y Z
YYY ZZZ !!!
There are trailing spaces.
Figlet (0 chars)
wget -q 3.ly/gzkv;figlet -f b
Sample output:
% wget -q 3.ly/gzkv;figlet -f b ABCDEFGHIJKLMNOPQRS
A BB CC DD EEE FFF GG H H III JJ K K L M M NNN O PP Q RR SS
A A B B C D D E F G H H I J K K L MMM N N O O P P Q Q R R S
AAA BB C D D EE FF G G HHH I J KK L MMM N N O O PP Q Q RR S
A A B B C D D E F G G H H I J J K K L M M N N O O P QQ R R S
A A BB CC DD EEE F GG H H III J K K LLL M M N N O P Q R R SS
% wget -q 3.ly/gzkv;figlet -f b TUVWXYZ \!
TTT U U V V W W X X Y Y ZZZ !!!
T U U V V W W X X Y Y Z !!!
T U U V V WWW X Y Z !!!
T U U V V WWW X X Y Z
T UUU V W W X X Y ZZZ !!!
Python, 233 231 225 224 205 chars
Candidate for the shortest python solution here :-)
It is a two-liner - last line was broken in 3 for urrrr readability
s=raw_input()
for i in range(5):print' '.join(''.join((' ',c)[ord(
'W_E__U__QQ_QN_UQ_EA_Q]_D_Q_QYQ__D[_PP_B__F__Q__EG_Y__EZWU]A_A_P_OPO_\\_QNQWT_YUS'
[max(0,3*ord(c)-192-k)])>>i&1]for k in(2,1,0))for c in s)
ps. Thanks for comments, corrected issues and now using 7-bit ASCII only!
Test banner:
TTT H H EEE QQQ U U III CCC K K BBB RR OOO W W N N FFF OOO X X JJJ U U M M PPP SSS OOO V V EEE RR TTT H H EEE L AAA ZZZ Y Y DD OOO GGG !!!
T H H E Q Q U U I C K K B B R R O O W W NNN F O O X J U U MMM P P S O O V V E R R T H H E L A A Z Y Y D D O O G !!!
T HHH EE Q Q U U I C KK BBB RR O O WWW NNN FF O O X J U U M M PPP SSS O O V V EE RR T HHH EE L AAA Z YYY D D O O G G !!!
T H H E QQQ U U I C K K B B R R O O WWW N N F O O X J J U U M M P S O O V V E R R T H H E L A A Z Y D D O O G G
T H H EEE QQQ UUU III CCC K K BBB R R OOO WWW N N F OOO X X JJJ UUU M M P SSS OOO V EEE R R T H H EEE LLL A A ZZZ YYY DD OOO GGG !!!
Haskell, 313 316 320
import Data.Bits
import Data.Char
c&True=c
c&_=' '
a ' '='#'
a '!'='['
a c=c
q s=unlines[s>>= \c->take 3(drop(84*n+3*(ord(a c)-64))$map((c&).testBit(0xffdebaf79f6fbfde7bfe8062f6a979b69b55a4d368ebaf6aeefbe9717add3f8f2ab6a36dbf9b1524d368fedb6fefff69bfdffbff8::Integer))[0..])++" "|n<-[0..4]]
main=getLine>>=putStr.q
For the curious, the large number is the hex version of encoding in the following code. The number is simply used as a bitmap. I've had no success with further shortening the code by encoding the number to other bases even with non-standard character representations.
formats :: [String] -- order: [ A-Z!] <- that's a space in front of A
formats = [
" AAABBBCCCDD EEEFFFGGGH HIIIJJJK KL M MN NOOOPPPQQQRR SSSTTTU UV VW WX XY YZZZ!!!"
, " A AB BC D DE F G H H I JK KL MMMNNNO OP PQ QR RS T U UV VW W X Y Y Z!!!"
, " AAABBBC D DEE FF G GHHH I JKK L M MNNNO OPPPQ QRR SSS T U UV VWWW X YYY Z !!!"
, " A AB BC D DE F G GH H I J JK KL M MN NO OP QQQR R S T U UV VWWW X YZ "
, " A ABBBCCCDD EEEF GGGH HIIIJJJK KLLLM MN NOOOP QQQR RSSS T UUU V WWWX XYYYZZZ!!!"
]
charToBool :: Char -> Bool
charToBool ' ' = False
charToBool _ = True
boolToInteger :: Bool -> Integer
boolToInteger True = 1
boolToInteger _ = 0
encoding :: Integer
encoding = foldr f 0 $ zip [0..] $ map charToBool $ concat formats
where
f (pow, bool) z = z + ((2^pow) * boolToInteger bool)
Python 2.6, 251 - 243 - 227 characters
I tried a slightly different approach (bitpacking the parts the letters are made of) ...
handles uppercase letters, spaces, exclamation mark.
2 unnecessary linebreaks added here for readability (the for loop could be one line)
be sure to save this as UTF-8 with BOM!
As always, all comments and suggestions welcome! Contender for shortest Python solution (again a few characters behind at the moment)...
w=raw_input()
for l in range(5):print''.join("1111 11 11 1 1 "
[int(("%05d"%ord(u"<ϳϲࢬ禉ऐऒ࠾⬃ᅘᖆⰯ囌❿✛іϾь穏ࠂᅜ⭦⭪⫸㡩⬪㰼"
[max(0,ord(c)-64)]))[l])*3:][:3].replace("1",c)+" "for c in w)
C89, 345 characters
Newlines added for your sanity (they are not included in the character count and can/should be deleted):
char o[5][99];
d[]={0x2df7fbef,0x3927bb6b,0x396792cf,0x3da7dbed,0x3a4bfb27,0x2d76f249,0x2dbedbfd,0x3db793ef,0x3fb7daeb,0x3ce7a497,0x3db6ab6d,0x3ff6d495,0x3cf6f2a7,0x38ff8000};
c,i,j;
main(){memset(o,32,495);
while((c=getchar())>0){
for(j=0;j<15;j++)
o[j/3][i+j%3]=d[c-33?(c-65)/2:13]>>((c&1)*15+j)&1?c:32;i+=4;}
for(j=0;j<5;j++)printf("%.*s\n",i,o[j]);}
Ruby : 207 215 252 345 characters
i=gets.chomp;5.times{|t|p i.gsub(/./){|c|j=3*(c>?#?c.ord-64:0);(3*t..3*t+2).map{|d|"mini5mbmzjf2bqjmof3prl72i5pn138iuhylmkpi65i278kq3qjfaihyjb66787odp8ktiy5hwt78tmnb"[j..j+2].to_i(36)[d]==1?c:" "}.join+" "}}
F#, 382 chars
I compressed two letters from each row into an ascii-printable byte, and handled space and exclamation point specially.
let s,(!)=stdin.ReadLine(),printf"%s"
for n in 0..4 do
for c in s do if c=' '||n=3&&c='!'then !" "elif c='!'then !"!!! "else for x in 0..3 do printf"%c"(if(Array.collect(fun b->let B n=int b&&&n=0 in[|(B 64)||not(B 8);B 32;B 16;true;B 4;B 2;B 1;true|])"wvwuwTUwvwUUWUEDEiTwUUBURQwEfWidWWVrUrrUEDUmTUTuZUr\\WvtuwWUturruw"B).[n*104+(int c-int 'A')*4+x]then ' 'else c)
!"\n"
Sample I/O below:
HELLO WORLD!!!
H H EEE L L OOO W W OOO RR L DD !!! !!! !!!
H H E L L O O W W O O R R L D D !!! !!! !!!
HHH EE L L O O WWW O O RR L D D !!! !!! !!!
H H E L L O O WWW O O R R L D D
H H EEE LLL LLL OOO WWW OOO R R LLL DD !!! !!! !!!
ABCDEFGHIJKL
AAA BBB CCC DD EEE FFF GGG H H III JJJ K K L
A A B B C D D E F G H H I J K K L
AAA BBB C D D EE FF G G HHH I J KK L
A A B B C D D E F G G H H I J J K K L
A A BBB CCC DD EEE F GGG H H III JJJ K K LLL
MNOPQRSTUVWXYZ
M M N N OOO PPP QQQ RR SSS TTT U U V V W W X X Y Y ZZZ
MMM NNN O O P P Q Q R R S T U U V V W W X Y Y Z
M M NNN O O PPP Q Q RR SSS T U U V V WWW X YYY Z
M M N N O O P QQQ R R S T U U V V WWW X Y Z
M M N N OOO P QQQ R R SSS T UUU V WWW X X YYY ZZZ
Python, 340 characters
d=dict((i,[23535,31727,29263,15211,29391,4815,31567,23533,29847,31527,23277,29257,23421,23549,31599,5103,32623,23275,31183,9367,31597,11117,32749,21653,31213,29351][i-65])for i in range(65,91))
d[33]=29183
d[32]=0
s=raw_input()
for l in range(5):
p=""
for c in s:
for n in range(3):
if d[ord(c)]&2**(3*l+n):p+=c
else:p+=" "
p+=" "
print p
sample output
>>>
ABCDEFGHIJKLMNOPQRSTUVWXYZ !
aaa bbb ccc dd eee fff ggg h h iii jjj k k l m m n n ooo ppp qqq rr sss ttt u u v v w w x x y y zzz !!!
a a b b c d d e f g h h i j k k l mmm nnn o o p p q q r r s t u u v v w w x y y z !!!
aaa bbb c d d ee ff g g hhh i j kk l m m nnn o o ppp q q rr sss t u u v v www x yyy z !!!
a a b b c d d e f g g h h i j j k k l m m n n o o p qqq r r s t u u v v www x y z
a a bbb ccc dd eee f ggg h h iii jjj k k lll m m n n ooo p qqq r r sss t uuu v www x x yyy zzz !!!
>>>
not too great, but it was fun writing it
edit whoops, I made the input be lowercase. fixed now, saved me one character too :)
Delphi, 397 chars
Ok, with all the begin/end statements Delphi probably will never be shorter than any other languages, but I do see a challenge in getting it as short as possible.
vvar s:String;i,j,k:Word;const F:Array[65..92]of Word=($5BEA,$3AEB,$624E,$3B6B,$72CF,$12CF,$6B4E,$5BED,$7497,$2B26,$5AED,$7249,$5BFD,$5B6F,$2B6A,$12EB,$4D6A,$5AEB,$388E,$2497,$7B6D,$2B6D,$5FED,$5AAD,$24AD,$72A7,$2092,$0000);begin S:=ParamStr(1);for j:=0 to 4 do begin for k:=1 to Length(S)do begin for i := 0 to 2 do Write((' '+S[k])[1+(F[ord(S[k])]shr(i+j*3))and 1]);Write(' ');end;WriteLn;end;end.
The font is built up like this:
010 110 011 110 111 111 011 101 111 011 101 100 101 111 010 110 010 110 011 111 101 101 101 101 101 111 010 000
101 101 100 101 100 100 100 101 010 001 101 100 111 101 101 101 101 101 100 010 101 101 101 101 101 001 010 000
111 110 100 101 110 110 101 111 010 001 110 100 111 101 101 110 101 110 010 010 101 101 111 010 010 010 010 000
101 101 100 101 100 100 101 101 010 101 101 100 101 101 101 100 011 101 001 010 101 101 111 101 010 100 000 000
101 110 011 110 111 100 011 101 111 010 101 111 101 101 010 100 001 101 110 010 111 010 101 101 010 111 010 000
The characters in this 5x3 font take up 15 bits and are stored in word (UINT16) in this order:
00 01 02
03 04 05
06 07 08
09 10 11
12 13 14
Formatted code:
var
s:String;
i, j, k: Word;
const
F: Array [65 .. 92] of Word = (
$5BEA,$3AEB,$624E,$3B6B, $72CF,$12CF,$6B4E,$5BED,
$7497,$2B26,$5AED,$7249, $5BFD,$5B6F,$2B6A,$12EB,
$4D6A,$5AEB,$388E,$2497, $7B6D,$2B6D,$5FED,$5AAD,
$24AD,$72A7,$2092,$0000);
begin
S := ParamStr(1);
for j := 0 to 4 do
begin
for k := 1 to Length(S) do
begin
for i := 0 to 2 do
Write((' '+S[k])[1+(F[ord(S[k])]shr(i+j*3))and 1]);
Write(' ');
end;
WriteLn;
end;
end.
Python: 259 chars
Not the shortest, but considering it was my first Python script, I'm more than satisfied.
k=raw_input()
for i in range(5):print' '.join(''.join((' ',x)[int(z)]for z in bin(int(''.join('%02d'%(ord(q)-43)for q in'xwxvxabxwxbbdqbXWX#axbbUb_^qxXwd#kddcsbssqbXWvDabav7bs9+dwuvxdbuvssvxq')[i*28+'ABCDEFGHIJKLMNOPQRSTUVWXYZ! '.find(x)],8))[2:])for x in k)
Perl, 69 74 77 78 79 chars
$a=<>;s:(?{$z=substr$a,$-[0]/4,1})z|#:$z:g,print for`figlet -f3x5 $a`
Sample output:
% echo ABCDEFGHIJKLMNOPQRS | perl banner.pl
A BB CC DD EEE FFF GG H H III JJ K K L M M NNN O PP Q RR SS
A A B B C D D E F G H H I J K K L MMM N N O O P P Q Q R R S
AAA BB C D D EE FF G G HHH I J KK L MMM N N O O PP Q Q RR S
A A B B C D D E F G G H H I J J K K L M M N N O O P QQ R R S
A A BB CC DD EEE F GG H H III J K K LLL M M N N O P Q R R SS
% echo TUVWXYZ \! | perl banner.pl
TTT U U V V W W X X Y Y ZZZ !
T U U V V W W X X Y Y Z !
T U U V V WWW X Y Z !
T U U V V WWW X X Y Z
T UUU V W W X X Y ZZZ !
I assume you have figlet and this figlet font installed on your system. :)
C#, 239 231 229 chars (292 bytes)
I'm a bit late but this just looked like fun.
using C=System.Console;class P{static void Main(){var t=C.ReadLine();for(int
b=15,s;b>0;b-=3){foreach(var c in t)for(s=0;s++<4;)C.Write(s>3||c<33?' ':((
"翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧"[c<34?0:c-64])&1<<b-s)>0
?c:' ');C.WriteLine();}}}