代码高尔夫 – 横幅代

当感谢某人,你不想只是给他们发送一封电子邮件说“谢谢!”,你想要一些东西FLASHY:

Input: THANKS!! Output: TTT HH AAA NNKK SSS !!! !!! THHAA NNN KKS !!! !!! T HHH AAA NNN KK SSS !!! !!! THHAANNKKSTHHAANNKK SSS !!! !!! 

编写一个程序来生成一个横幅。 你只需要生成大写AZ和空格和感叹号(什么是没有惊叹号的横幅?)。 所有的字符都是由相同字符的3×5网格组成(所以S是由S组成的3×5网格)。 所有的输出应该在一行(所以没有换行符)。 这里是你需要的所有信件:

 Input: ABCDEFGHIJKL Output: AAA BBB CCC DD EEE FFF GGG HH III JJJ KKL AABBCDDEFGHHIJKKL AAA BBB CDD EE FF GG HHH IJ KK L AABBCDDEFGGHHIJJKKL AA BBB CCC DD EEE F GGG HH III JJJ KK LLL Input: MNOPQRSTUVWX Output: MMNN OOO PPP QQQ RR SSS TTT UUVVWWXX MMM NNN OOPPQQRRSTUUVVWWX MM NNN OO PPP QQ RR SSS TUUVV WWW X MMNNOOP QQQ RRSTUUVV WWW X MMNN OOO P QQQ RR SSS T UUU V WWW XX Input: YZ! Output: YY ZZZ !!! YYZ !!! YYY Z !!! YZ YYY ZZZ !!! 

获胜者是最短的源代码 ,由以utf-8编码存储文件所需的字节数来计算。 源代码应该读取stdin的input,输出到stdout。 你可以假设input将只包含[AZ! ] [AZ! ] 。 如果你侮辱用户不正确的input,你会得到10个字符的折扣= P。

我将要求这些确切的28个字符,但要使它更有趣,你可以select你希望他们看起来如何 – 什么使你的代码更短! 为了certificate你的信件看起来像正常的字母,显示最后三次运行的输出。


到目前为止最短的代码,以字符(utf8编码,如果非ASCII存在):

133 J

205 Python

ruby209

313哈斯克尔

345 C89

382 F#

J,133 135 79 83 84 88个字符(utf-8编码)

 ;/5 3$"1(' ',.s){~"1#:3 u:(ucp'翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧'){~0>.64-~ais=: 

用法:

  ;/5 3$"1(' ',.s){~"1#:3 u:(ucp'翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧'){~0>.64-~ais=:'ABCDEFGHIJKLMNOPQRSTUVWXYZ !' ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │AAA│BBB│CCC│DD │EEE│FFF│GGG│HH│III│JJJ│KK│L │MM│NN│OOO│PPP│QQQ│RR │SSS│TTT│UU│VV│WW│XX│YY│ZZZ│ │!!!│ │AA│BB│C │DD│E │F │G │HH│ I │ J│KK│L │MMM│NNN│OO│PP│QQ│RR│S │ T │UU│VV│WW│ X │YY│ Z│ │!!!│ │AAA│BBB│C │DD│EE │FF │GG│HHH│ I │ J│KK │L │MM│NNN│OO│PPP│QQ│RR │SSS│ T │UU│VV│WWW│ X │YYY│ Z │ │!!!│ │AA│BB│C │DD│E │F │GG│HH│ I │JJ│KK│L │MM│NN│OO│P │QQQ│RR│ S│ T │UU│VV│WWW│ X │ Y│Z │ │ │ │AA│BBB│CCC│DD │EEE│F │GGG│HH│III│JJJ│KK│LLL│MM│NN│OOO│P │QQQ│RR│SSS│ T │UUU│ V │WWW│XX│YYY│ZZZ│ │!!!│ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ;/5 3$"1(' ',.s){~"1#:3 u:(ucp'翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧'){~0>.64-~ais=:'this is incorrect input.' |index error 

解释( NB. 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... ai NB. the ascii indexes of s s=: NB. Assign the input string to the variable s. 

Python, 250 224个字符

 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 

笔记:

  • 很大程度上依赖于2.x打印语句;
  • 支持空格。

跑步(我改变了几个字母的外观,只为了一个美观的原因):

 $ echo ABCDEFGHIJKL | python code-golf.py AAA BBB CCC DD EEE FFF GGG HH III JJJ KKLAABBCDDEFGHHIJKKL AAA BBB CDD EEE FFF G HHH IJ KK LAABBCDDEFGGHHIJJKKLA A BBB CCC DD EEE F GGG HH III JJJ KK LLL $ echo MNOPQRSTUVWX | python code-golf.py MMNN OOO PPP QQQ RR SSS TTT UUVVWWXX MMM NNN OOPPQQRRSTUUVVWWXXMM NNN OO PPP QQ RR SSS TUUVV WWW XMMNNOOP QQQ RRSTUUVV WWW XXMMNN OOO P QQQ RR SSS T UUU VWWXX $ echo YZ\! | python code-golf.py YY ZZZ !!! YYZ !!! YYY Z !!! YZ YYY ZZZ !!! 

有尾随空格。

小图(0字)

 wget -q 3.ly/gzkv;figlet -fb 

示例输出:

 % wget -q 3.ly/gzkv;figlet -fb ABCDEFGHIJKLMNOPQRS A BB CC DD EEE FFF GG HH III JJ KKLMM NNN O PP Q RR SS AABBCDDEFGHHIJKKL MMM NNOOPPQQRRS AAA BB CDD EE FF GG HHH IJ KK L MMM NNOO PP QQ RR SAABBCDDEFGGHHIJJKKLM MNNOOP QQ RRSAA BB CC DD EEE F GG HH III JKK LLL MMNNOPQRR SS % wget -q 3.ly/gzkv;figlet -fb TUVWXYZ \! TTT UUVVWWXXYY ZZZ !!! TUUVVWWXXYYZ !!! TUUVV WWW XYZ !!! TUUVV WWW XXYZT UUU VWWXXY ZZZ !!! 

Python, 233 231 225 224 205字符

候选最短的Python解决scheme在这里:-)
这是一个双线 – 最后一行被打破了3 urrrr 可读性

 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!

testing旗帜:

 TTT HH EEE QQQ UU III CCC KK BBB RR OOO WWNN FFF OOO XX JJJ UUMM PPP SSS OOO VV EEE RR TTT HH EEE L AAA ZZZ YY DD OOO GGG !!! THHEQQUUICKKBBRROOWW NNN FOOXJUU MMM PPSOOVVERRTHHELAAZYYD DOOG !!! T HHH EE QQUUIC KK BBB RR OO WWW NNN FF OOXJUUMM PPP SSS OOVV EE RR T HHH EE L AAA Z YYY DDOOGG !!! THHE QQQ UUICKKBBRROO WWW NNFOOXJJUUMMPSOOVVERR THHELAAZYDDOOGGTHH EEE QQQ UUU III CCC KK BBB RR OOO WWW NNF OOO XX JJJ UUU MMP SSS OOO V EEE RRTHH EEE LLL AA ZZZ YYY DD OOO GGG !!! 

Haskell,313 316 320

 import Data.Bits import Data.Char c&True=c c&_=' ' a ' '='@' a '!'='[' ac=c qs=unlines[s>>= \c->take 3(drop(84*n+3*(ord(ac)-64))$map((c&).testBit(0xffdebaf79f6fbfde7bfe8062f6a979b69b55a4d368ebaf6aeefbe9717add3f8f2ab6a36dbf9b1524d368fedb6fefff69bfdffbff8::Integer))[0..])++" "|n<-[0..4]] main=getLine>>=putStr.q 

对于好奇,大数是在下面的代码中的encoding的hex版本。 该数字只是用作位图。 即使使用非标准的字符表示法,通过将数字编码为其他基数来进一步缩短代码,我也没有成功。

 formats :: [String] -- order: [ AZ!] <- 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 FGHHI JK KL MMMNNNO OP PQ QR RS TU UV VW WXYYZ!!!" , " AAABBBC D DEE FF G GHHH I JKK LM MNNNO OPPPQ QRR SSS TU UV VWWW X YYY Z !!!" , " A AB BC D DE FG GH HIJ JK KL M MN NO OP QQQR RSTU 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,251243 – 227个字符

我尝试了一个稍微不同的方法(字母组成的部分 )…

  • 处理大写字母,空格,感叹号。
  • 为了可读性,在这里添加了2个不必要的换行符(for循环可以是一行)
  • 一定要把这个保存为带有BOM的UTF-8!

一如以往,所有的意见和build议,欢迎! 最短的Python解决scheme的争夺者(此刻还有几个字符)…

 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) ࠂ ᅜ ⭦⭪⫸㡩⬪㰼 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个字符

为了您的理智添加了换行符(它们不包括在字符数中,可以/应该被删除):

 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个字符

 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个字符

我把每行的两个字母压缩成一个可打印的字节,并专门处理空格和感叹号。

 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" 

下面的示例I / O:

 HELLO WORLD!!! HH EEE LL OOO WW OOO RR L DD !!! !!! !!! HHELLOOWWOORRLDD !!! !!! !!! HHH EE LLOO WWW OO RR LDD !!! !!! !!! HHELLOO WWW OORRLDD HH EEE LLL LLL OOO WWW OOO RR LLL DD !!! !!! !!! ABCDEFGHIJKL AAA BBB CCC DD EEE FFF GGG HH III JJJ KKL AABBCDDEFGHHIJKKL AAA BBB CDD EE FF GG HHH IJ KK L AABBCDDEFGGHHIJJKKL AA BBB CCC DD EEE F GGG HH III JJJ KK LLL MNOPQRSTUVWXYZ MMNN OOO PPP QQQ RR SSS TTT UUVVWWXXYY ZZZ MMM NNN OOPPQQRRSTUUVVWWXYYZ MM NNN OO PPP QQ RR SSS TUUVV WWW X YYY Z MMNNOOP QQQ RRSTUUVV WWW XYZ MMNN OOO P QQQ RR SSS T UUU V WWW XX YYY ZZZ 

Python,340个字符

 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 

样本输出

 >>> ABCDEFGHIJKLMNOPQRSTUVWXYZ ! aaa bbb ccc dd eee fff ggg hh iii jjj kklmmnn ooo ppp qqq rr sss ttt uuvvwwxxyy zzz !!! aabbcddefghhijkkl mmm nnn ooppqqrrstuuvvwwxyyz !!! aaa bbb cdd ee ff gg hhh ij kk lmm nnn oo ppp qq rr sss tuuvv www x yyy z !!! aabbcddefgghhijjkklmm nnoop qqq rrstuuvv www xyzaa bbb ccc dd eee f ggg hh iii jjj kk lll mmnn ooo p qqq rr sss t uuu v www xx yyy zzz !!! >>> 

不是太好,但写起来很有趣

编辑 whoops,我做了input小写。 现在修好了,救了我一个字符:)

Delphi,397个字符

好吧,所有的开始/结束语句Delphi可能永远不会比任何其他语言短,但是我确实看到一个尽可能短的挑战。

 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. 

字体是这样构build的:

 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 

这个5×3字体中的字符占用了15位,并按照这个顺序存储在字(UINT16)中:

 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 

格式化的代码:

 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个字符

不是最短的,但考虑到这是我的第一个Python脚本,我非常满意。

 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个字符

 $a=<>;s:(?{$z=substr$a,$-[0]/4,1})z|#:$z:g,print for`figlet -f3x5 $a` 

示例输出:

 % echo ABCDEFGHIJKLMNOPQRS | perl banner.pl A BB CC DD EEE FFF GG HH III JJ KKLMM NNN O PP Q RR SS AABBCDDEFGHHIJKKL MMM NNOOPPQQRRS AAA BB CDD EE FF GG HHH IJ KK L MMM NNOO PP QQ RR SAABBCDDEFGGHHIJJKKLM MNNOOP QQ RRSAA BB CC DD EEE F GG HH III JKK LLL MMNNOPQRR SS % echo TUVWXYZ \! | perl banner.pl TTT UUVVWWXXYY ZZZ ! TUUVVWWXXYYZ ! TUUVV WWW XYZ ! TUUVV WWW XXYZT UUU VWWXXY ZZZ ! 

我假设你已经在你的系统上安装了figlet和这个figlet字体 。 🙂

C#, 239 231 229个字符(292个字节)

我有点晚了,但这看起来很有趣。

 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<<bs)>0 ?c:' ');C.WriteLine();}}} 寭璗牯宭䤧彭忭筯笃筿僵秏璒孯孪寿咕寏牺 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<<bs)>0 ?c:' ');C.WriteLine();}}}