Code Golf - Banner Generation
当你感谢某人时,你不想只给他们发一封电子邮件说"谢谢!"你想要一些华丽的东西:
1 2 3 4 5 6 7 | 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 !!! !!! |
编写一个程序来生成横幅。您只需要生成大写的a-z以及空格和感叹号(什么是没有感叹号的横幅?)。所有字符都由相同字符的3x5网格组成(因此s是由s组成的3x5网格)。所有输出都应该在一行上(因此没有换行)。以下是您需要的所有信件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 !!! |
胜利者是最短的源代码,按以UTF-8编码存储文件所需的字节数计算。源代码应该从stdin读取输入,输出到stdout。您可以假设输入只包含
我本来打算要求这些确切的28个字符,但为了让它更有趣,您可以选择希望它们的外观-无论是什么使您的代码更短!为了证明您的字母看起来确实像普通字母,请显示最后三次运行的输出。
迄今为止最短的代码,以字符表示(如果存在非ASCII码,则使用UTF8编码):
133 J205Python209露比313哈斯克尔345 C89382 Fαj,133
1 | ;/5 3$"1(' ',.s){~"1#:3 u:(ucp'翇篭篯礧歮禧禤祯寭璗牯宭?彭忭筯篤筿殭秏璒孯孪寿咕寏犧'){~0>.64-~a.i.s=: |
用途:
1 2 3 4 5 6 7 8 9 10 11 | ;/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 |
解释(
1 2 3 4 5 6 7 8 9 10 11 12 | ;/ 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,
1 2 3 4 5 | 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]), |
笔记:
- 很大程度上依赖于2.x打印语句;
- 支持空格。
跑步(我改变了一些字母的外观,仅仅是出于审美的原因;):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $ 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 !!! |
有尾随空格。
无花果(0个字符)
1 | wget -q 3.ly/gzkv;figlet -f b |
样品输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | % 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,
这里是最短的python解决方案的候选者:—)这是一个两行-最后一行为URRR可读性在3行中断
1 2 3 4 | 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.感谢您的评论,更正了问题,现在只使用7位ASCII!
测试横幅:
1 2 3 4 5 | 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
1 2 3 4 5 6 7 8 9 | 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 |
奇怪的是,下面的代码中有大量的十六进制版本的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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,
我尝试了一种稍有不同的方法(对字母的组成部分进行位封装)。
- 处理大写字母、空格、感叹号。
- 为了可读性,这里添加了2个不必要的换行符(for循环可以是一行)
- 一定要用BOM将其保存为UTF-8!
一如既往,欢迎所有评论和建议!最短的python解决方案的竞争者(现在又落后几个字符)
16Ruby:207215 252 345characters
1 | 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+""}} |
C89、345个字符
为您的健全性添加的换行符(它们不包括在字符计数中,可以/应该删除):
4python:259个字符
不是最短的,但考虑到这是我的第一个python脚本,我非常满意。
1 2 | 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) |
德尔菲,397个字符
好的,对于所有的begin/end语句,delphi可能永远不会比任何其他语言都短,但是我确实看到了尽可能短的问题。
1 | 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. |
字体是这样建立的:
1 2 3 4 5 | 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 |
5x3字体中的字符占15位,按以下顺序存储在Word(uint16)中:
1 2 3 4 5 | 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 |
格式化代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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,340个字符
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
样本输出
1 2 3 4 5 6 7 8 | >>> 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 !!! >>> |
不算太好,但写起来很有趣
编辑哇哦,我把输入改成小写。现在修复了,也为我保存了一个字符:)
F 382,字符
我将每行的两个字母压缩成一个可打印的ASCII字节,并专门处理空格和感叹号。
1 2 3 4 5 | 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) !" " |
下面的I/O示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
C,
我有点晚了,但这看起来很有趣。
25Perl,69
1 | $a=<>;s:(?{$z=substr$a,$-[0]/4,1})z|#:$z:g,print for`figlet -f3x5 $a` |
样品输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | % 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 ! |
我假设您的系统上安装了figlet和这个figlet字体。:)