关于语言不可知:Code Golf – Banner Generation

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。您可以假设输入只包含[A-Z! ]。如果您在输入错误时侮辱用户,您将得到10个字符的折扣=P。

我本来打算要求这些确切的28个字符,但为了让它更有趣,您可以选择希望它们的外观-无论是什么使您的代码更短!为了证明您的字母看起来确实像普通字母,请显示最后三次运行的输出。

迄今为止最短的代码,以字符表示(如果存在非ASCII码,则使用UTF8编码):

133 J205Python209露比313哈斯克尔345 C89382 Fα


j,133135<79<83<84<88characters(utf-8 encoding)

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

解释(NB.为j中的注释):

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

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]),
    print

笔记:

  • 很大程度上依赖于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,233231225224205 chars

这里是最短的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,313316320

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

奇怪的是,下面的代码中有大量的十六进制版本的encoding。该数字仅用作位图。即使使用非标准字符表示,我也没有成功地通过将数字编码到其他基数来进一步缩短代码。

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,251-243-227 characters

我尝试了一种稍有不同的方法(对字母的组成部分进行位封装)。

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

一如既往,欢迎所有评论和建议!最短的python解决方案的竞争者(现在又落后几个字符)

16


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

为您的健全性添加的换行符(它们不包括在字符计数中,可以/应该删除):

4


python: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,239 231229 chars(292 bytes)

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

25


Perl,6974777879chars

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字体。:)