language-agnostic code-golf rosetta-stone

language agnostic - Code Golf-Banner Generation



language-agnostic code-golf (14)

Al agradecer a alguien, no quiere simplemente enviarles un correo electrónico diciendo "¡Gracias!", Quiere tener algo 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 !!! !!!

Escribe un programa para generar un banner. Solo tiene que generar mayúsculas AZ junto con espacios y signos de exclamación (¿qué es un banner sin un signo 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 de 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 letras que necesita:

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 , contado por la cantidad de bytes que se necesitan para almacenar el archivo en codificación utf-8 . El código fuente debe leer la entrada desde stdin, salida a stdout. Puede suponer que la entrada solo contendrá [AZ! ] [AZ! ] Si insulta al usuario con una entrada incorrecta, obtendrá un descuento de 10 caracteres = P.

Iba a necesitar estos 28 caracteres exactos, pero para hacerlo más interesante, puedes elegir cómo quieres que se vean, lo que hace que tu código sea más corto. Para demostrar que sus letras se parecen a las letras normales, muestre la salida de las últimas tres ejecuciones.

Los 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 #


C #, 239 231 229 caracteres (292 bytes)

Llegué 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();}}}


C89, 345 caracteres

Se agregaron líneas nuevas para su cordura (no se incluyen en el recuento de caracteres 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]);}


Delphi, 397 caracteres

De acuerdo, con todas las declaraciones de comienzo / final, Delphi probablemente nunca será más corto que cualquier otro idioma, pero veo un desafío para hacerlo lo más breve 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 caracteres en esta fuente de 5x3 toman 15 bits y se almacenan en la palabra (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.


F #, 382 caracteres

Comprimí dos letras de cada fila en un byte ascii-imprimible, y manejé el espacio y el signo 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


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 la encoding en el siguiente código. El número simplemente se usa como un mapa de bits. No he tenido éxito al acortar aún más el código al codificar el número en otras bases, incluso con representaciones de caracteres 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, 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:

  • confía en la declaración de impresión 2.x considerablemente;
  • admite espacios.

Correr (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

Muestra de salida:

% 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 !!!


Perl, 69 74 77 78 79 caracteres

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

Muestra de salida:

% 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 tiene figlet y esta fuente de figlet instalada en su sistema. :)


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 el 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.


Python 2.6, 251 - 243 - 227 caracteres

Probé un enfoque ligeramente diferente (bitpacking de las partes de las letras) ...

  • maneja letras mayúsculas, espacios, signo de exclamación.
  • 2 linebreaks 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 son bienvenidos! Contender para la solución más corta de Python (de nuevo 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)


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

muestra de salida

>>> 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 demasiado grande, pero fue divertido escribirlo

edito whoops, hice la entrada en minúsculas. arreglado ahora, me salvó un personaje también :)


Python, 233 231 225 224 205 caracteres

Candidato para la solución más corta de Python aquí :-)
Es un trazador de líneas doble: la última línea se rompió en 3 para una legibilidad 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)

PD. ¡Gracias por los comentarios, problemas corregidos y ahora utilizando solo ASCII de 7 bits!

Bandera 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 !!!


Python: 259 caracteres

No es el más corto, pero considerando que fue mi primer script 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)


Ruby : 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+" "}}