Code Golf - Banner Generation
-
24-10-2019 - |
Pregunta
Al agradecer a alguien, no quieres enviarles un correo electrónico que diga "¡Gracias!", Quieres tener algo llamativo:
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 !!! !!!
Escriba un programa para generar un banner. Solo tiene que generar AZ en el caso superior junto con espacios y puntos de exclamación (¿qué es un banner sin un punto de exclamación?). Todos los personajes están formados por una cuadrícula de 3x5 del mismo personaje (por lo que la S es una cuadrícula 3x5 hecha de S). Toda la salida debe estar en una fila (por lo que no hay nuevas líneas). Aquí están todas las cartas que necesitas:
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 !!!
El ganador es el Código fuente más corto, según lo contado por el número de bytes que se necesita para almacenar el archivo en Codificación UTF-8. El código fuente debe leer la entrada de stdin, salida a stdout. Puede asumir que la entrada solo contendrá [A-Z! ]
. Si insulta al usuario en una entrada incorrecta, obtiene un descuento de 10 caracteres = p.
Iba a requerir estos 28 caracteres exactos, pero para hacerlo más interesante, puedes elegir cómo quieres que se vean, ¡lo que sea más corto! Para demostrar que sus letras parecen letras normales, muestre la salida de las últimas tres ejecuciones.
Códigos más cortos hasta ahora, en caracteres (codificación UTF8 si no es ASCII presente):
133 J
205 Python
209 Ruby
313 Haskell
345 C89
382 f#
Solución
J, 133 135 79 83 84 88 caracteres (codificación UTF-8)
;/5 3$"1(' ',.s){~"1#:3 u:(ucp'翇篭篯礧歮禧禤祯寭璗牯宭䤧彭忭筯篤筿殭秏璒孯孪寿咕寏犧'){~0>.64-~a.i.s=:
Uso:
;/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
Explicación (NB.
es comentario en 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.
Otros consejos
Pitón, 250 224 caracteres
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
Notas:
- se basa en la declaración de impresión 2.x considerablemente;
- Admite espacios.
Corriendo (cambié la apariencia de algunas letras, solo por razones estéticas;):
$ 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 !!!
Hay espacios finales.
Figlet (0 caracteres)
wget -q 3.ly/gzkv;figlet -f b
Salida de muestra:
% 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 !!!
Pitón, 233 231 225 224 205 caracteres
Candidato para la solución de Python más corta aquí :-)
Es una línea de dos líneas: la última línea se rompió en 3 para Urrrrr legibilidad
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)
PD. ¡Gracias por los comentarios, los problemas corregidos y ahora usando ASCII de 7 bits solamente!
Banner de prueba:
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
Para los curiosos, el gran número es la versión hexadecimal de encoding
en el siguiente código. El número simplemente se usa como un mapa de bits. No he tenido éxito al acortar más el código codificando el número a otras bases incluso con representaciones de carácter no estándar.
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 caracteres
Probé un enfoque ligeramente diferente (bit -packing el partes las cartas están hechas de) ...
- Maneja letras mayúsculas, espacios, marca de exclamación.
- 2 Breaks innecesarios agregados aquí para legibilidad (el bucle for podría ser una línea)
- ¡Asegúrese de guardar esto como UTF-8 con BOM!
Como siempre, ¡todos los comentarios y sugerencias dan la bienvenida! Contendiente para la solución de Python más corta (nuevamente algunos personajes detrás en este momento) ...
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 caracteres
Nuevas líneas agregadas para su cordura (no están incluidas en el recuento de personajes y pueden/deben eliminarse):
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]);}
Rubí : 207 215 252 345 caracteres
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
Comprimí dos letras de cada fila en un byte impresable ascii, y manejé el espacio y el punto de exclamación especialmente.
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"
Ejemplo de E/S a continuación:
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 caracteres
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
salida de muestra
>>>
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 !!!
>>>
No es muy bueno, pero fue divertido escribirlo
editar Vaya, hice que la entrada fuera en minúsculas. Se corrigió ahora, también me guardó un personaje :)
Delphi, 397 chars
Ok, con todas las declaraciones de inicio/final, Delphi probablemente nunca será más corto que ningún otro idioma, pero sí veo un desafío para obtenerlo lo más corto posible.
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.
La fuente está construida así:
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
Los personajes de esta fuente 5x3 toman 15 bits y se almacenan en Word (UINT16) en este orden:
00 01 02
03 04 05
06 07 08
09 10 11
12 13 14
Código formateado:
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
No es el más corto, pero teniendo en cuenta que fue mi primer guión de Python, estoy más que satisfecho.
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 chares
$a=<>;s:(?{$z=substr$a,$-[0]/4,1})z|#:$z:g,print for`figlet -f3x5 $a`
Salida de muestra:
% 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 !
Supongo que tienes Figlet y esta fuente de figlet instalado en su sistema. :)
C#, 239 231 229 chars (292 bytes)
Llego un poco tarde, pero esto parecía divertido.
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();}}}