Draw the Stickman Wars

19


Imagen mía redactando este desafío con mis habilidades avanzadas de dibujo.

Antecedentes

Las guerras de Stickman ocurrieron hace mucho tiempo, cuando la especie dominante de la Tierra estaba hecha de palos. Los historiadores lamentan el hecho de que no había pintores o cámaras en ese entonces, podríamos usar algunas imágenes de esa guerra en los libros de historia de hoy. Ahí es donde tus poderes de codificación se vuelven útiles. Los stickmen se dibujan muy fácilmente y los historiadores lograron encontrar algunos datos sobre cuántos stickmen lucharon en las guerras¹. ¡Ahora depende de usted recrear una imagen del momento justo antes de que comience la guerra!

Aquí están los valientes hombres de palo involucrados en la guerra:

  O /
| / | \ /
El | El |
 / \ Espadachín

 OA
/ | \ |
 El | El |
/ \ | Lancero

   . 
 . ' *.
 'O *  
'\ | /.
. El | * *
'./ \ *. Mago

 O
/ | \
 El |
/ \ Villager

 O
/ | \
/ \ Infantil

Entrada

Recibe a través de stdin o equivalente una representación de cada stickman que apareció a cada lado del campo de batalla. Por ejemplo, si dos espadachines lucharon en el lado derecho y dos lanceros en el lado izquierdo, tu entrada puede ser {Sword: 2}, {Spear: 2}, [2,0,0,0,0], [0,2,0,0,0]o a "WW", "SS".

Salida

Una representación de cada valiente stickman en un campo de batalla, de acuerdo con las reglas a continuación. Puede mostrarse en stdout o guardarse en un archivo, lo que sea que haga temblar su bote.

Reglas

  1. En el lado izquierdo estarán todos los stickmen de la primera matriz / cadena / objeto que recibió su programa.
  2. Esos hombres de palo deben verse exactamente como los mostrados anteriormente en esta pregunta.
  3. El orden del ejército del lado izquierdo debe ser Infants Villagers Mages Swordsmen Spearmen.
  4. El ejército del lado derecho se comportará igual, pero con los personajes y el orden reflejados.
  5. Cada stickman estará separado por 1 espacio.
  6. Cada clase estará separada por 3 espacios.
  7. Los ejércitos estarán separados por 8 espacios.
  8. Como los hombres de palo no vuelan, debes dibujar el suelo usando guiones menos -.
  9. El terreno debe terminar en la misma columna en la que termina el último stickman del ejército derecho.

Ejemplo

Supongamos que mi programa espera dos matrices con longitud 5 y cada valor en la matriz representa, en orden Infants Villagers Mages Swordsmen Spearmen,.

Entrada: [1,1,2,3,1] [0,0,1,1,1]

               . . .
             . ' *. . ' *. . * '.
       O 'O *' O * O / O / O / OAAO \ O * O ' 
 O / | \ '\ | /. '\ | /. | / | \ / | / | \ / | / | \ / / | \ | | / | \ \ / | \ | . \ | / '
/ | \ | . El | *. El | * | El | El | El | El | El | El | El | El | El | El | El | * | .
/ \ / \ './ \ *. './ \ *. / \ / \ / \ / \ | | / \ / \. * / \ '.
-------------------------------------------------- -------------------------------------

Consideraciones finales

Tenga en cuenta que se aplican lagunas estándar y que el mago es completamente asimétrico solo porque sí.

El resultado de la respuesta más votada será la "imagen de portada" de este desafío. La respuesta más corta antes de fin de mes (31/08/2014) será seleccionada como la ganadora.

Este es el , por lo que el código más corto, en bytes, gana.


¹ cita requerida

William Barbosa
fuente
77
"el mago es completamente asimétrico solo porque" ... se contrae ... solo tenías que hacerlo, ¿no? : P
Pomo de la puerta
44
@Doorknob ¯ \ _ (ツ) _ / ¯
William Barbosa
¿Está bien una función con 2 argumentos de matriz o necesita un análisis de entrada de una cadena?
edc65
TIL sobre las puntuaciones excesivas. ¿Pueden los lenguajes desafiados unicode usar guiones en su lugar, por favor?
John Dvorak
1
Falta una columna entre el aldeano y el mago. ¿También una representación como IVMMWWWS SWMestar dentro del límite de "cualquier cosa que te ayude"?
Martin Ender

Respuestas:

7

JavaScript (E6) 336 344 356 369 424 478 522 570

Edición 6 La última edición tuvo errores. Corrección de errores y acortado. Eso es todo lo que espero.

Edit 5 Finalmente encontré una manera de deshacerme de multiplicar por 23 - me molestó desde el principio. Además de otro cambio en la entrada (@William grita cuando es demasiado). Ahora la función espera un parámetro de matriz, que contiene 2 submatrices. Sin este cambio es 349, sigue siendo una mejora

Edición 4 Afeitó algunos bytes más y un pequeño cambio en el formato de entrada. Con el nuevo formato de entrada, una clase faltante se representa como un elemento de matriz vacío. Entonces en D([1,,2,3,1],[,3,1,1,2])lugar de D([1,0,2,3,1],[0,3,1,1,2]). Creo que todavía obedece las reglas.

Editar 3 Golfed más. Sin cambios en el algoritmo, pero abusando de un montón de array.map y funciones locales para evitar bucles.

Edite la compresión de 2 cadenas, de la manera correcta ...

Editar Compresión de cadena agregada, mucho trabajo y poco ganado. Ahora los stickmen espejo se generan a partir de una plantilla, no se almacenan.

Hice algunos intentos, primero corriendo. Para jugar al golf. NB Kolmogorow-negocio aún no se ha abordado.

Prueba en la consola FireFox. Cambie 'return' con Agregar 'alert (...)' para tener una declaración de salida (aunque no sea útil en absoluto)

console.log(D([[1,,2,3,1],[,3,1,1,2]]))

Salida

         .       .                                                                 .                 
       .' *.   .' *.                                                             .* '.               
       ' O *   ' O *      O  /   O  /   O  /    O A        A O  A O    \  O      * O '     O   O   O 
 O    ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\ |/|\    \/|\|   . \|/ '   /|\ /|\ /|\
/|\   .  |  * .  |  *   | |    | |    | |       | |        | |  | |       | |   *  |  .    |   |   | 
/ \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \ |/ \     / \    .*/ \.'   / \ / \ / \
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Código de golf

D=a=>
  (J=v=>v.join(''))((l=[r=n=' ',3,6,13,19,23]).map(_=>f=(F=f=>J(a[f].map((c,q)=>
  ("9.299.' *.87O2' O *3O21 O A O 1|0' 0|1 .|1|01 1|0|1|0 | .2|2*| |4| |1 01 0'.1 0*. 1 021 0|"[R='replace'](/[2-9]/g,x=>n.repeat(x))
   .slice(l[q]-r,l[q+1]-r)[R](/\d/g,x=>'\\/'[x^f])+n).repeat(c)+n+n
  ))+n)(0)+J([...F(1)].reverse(r-=23))+'\n'))+f[R](/./g,'¯')

Código (editar 2)

D=(a,b)=>{
  F=(s,f)=>(s=s[R](/\d/g,x=>'/\\'[x^f]),f?s:[...s].reverse().join('')),
  v="9.299.' *.87O2' O *3O21 O A O 1|0' 0|1 .|1|01 1|0|1|0 | .2|2*| |4| |1 01 0'.1 0*. 1 021 0|"
    [R='replace'](/\d/g,x=>x>1?' '.repeat(x):x),
  l=[0,3,6,13,19,23];
  for(o='',r=0;v[r];r+=23,f=F(z,1)+'  '+F(w,0),o+=f+'\n',f=f[R](/./g,'¯'))
    for(z=w=p='';p<10;++p)
      if(c=(p<5?a:b)[q=p%5])x=(v.slice(r+l[q],r+l[q+1])+' ').repeat(c)+'  ',p<5?z+=x:w+=x
  return o+f
}

Código sin golf (primera versión)

D=(a,b)=>{
  v="         .                .                    .' *.            .* '.               O  ' O *   O  / O A * O ' \\  O  A O  O /|\\' \\|/ .|/|\\/ /|\\|. \\|/ ' \\/|\\||/|\\/|\\ | .  |  *| |    | |*  |  .   | || | / \\/ \\'./ \\*. / \\  / \\|.*/ \\'.  / \\ |/ \\"
  l=[0,3,6,13,19,23,30,36,40]
  o=''
  for(r=0;r<6;++r)
  {
    z=w=''
    for(p=0;p<10;p++)
    {
      c=a[p]||b[p-5];
      if (c)
      {
        q = p<7 ? p%5 : p-2
        x = (v.slice(r*40+l[q],r*40+l[q+1])+' ').repeat(c)
        if (p<5) 
          z+=x+'  ';
        else 
          w=x+'  '+w
      }
    }
    f = z + '     ' + w
    o += f + '\n'
    f = '¯'.repeat(f.length-3)
  }
  return o+f
}
edc65
fuente
4

Python 362 353

Editar: eliminar un bucle for y usar la instrucción exec ahorró 9 bytes

z,x,t,j=" ",input(),str.replace,0
w=0,3,6,13,19,23
a=9*z+"."+20*z+".' *."+15*z+"o  ' o *   o  a o A o a|b' b|a .|a|ba a|b|a|b | .  |  *| |    | |a ba b'.a b*. a b  a b|"
exec"b=''\nfor c in 0,1:b+=z*8*c+t(t('   '.join([z.join([a[w[k]+j:w[k+1]+j]]*v)for k,v in enumerate(x[c])if v])[::1-2*c],'a','\/'[c<1]),'b','\/'[c])\nprint b;j+=23;"*6
print'-'*len(b)

Entrada:

[0,0,2,1,1],[1,0,2,1,2]

Salida:

   .       .                                                   .       .         
 .' *.   .' *.                                               .* '.   .* '.       
 ' o *   ' o *      o  /    o A        A o  A o    \  o      * o '   * o '       
' \|/ . ' \|/ .   |/|\/    /|\|        |/|\ |/|\    \/|\|   . \|/ ' . \|/ '    o 
.  |  * .  |  *   | |       | |        | |  | |       | |   *  |  . *  |  .   /|\
'./ \*. './ \*.    / \     / \|        |/ \ |/ \     / \    .*/ \.' .*/ \.'   / \
---------------------------------------------------------------------------------
Markuz
fuente
Noté que usa minúsculas Os.
Phord
3

C, 418 414

Entrada de ejemplo:

stickwar.exe IVMMWWWS SWM

Salida de ejemplo:

               . . .   
             . ' *. . ' *. . * '.
       O 'O *' O * O / O / O / OAAO \ O * O ' 
 O / | \ '\ | /. '\ | /. | / | \ / | / | \ / | / | \ / / | \ | | / | \ \ / | \ | . \ | / '
/ | \ | . El | *. El | * | El | El | El | El | El | El | El | El | El | El | El | * | .
/ \ / \ './ \ *. './ \ *. / \ / \ / \ / \ | | / \ / \. * / \ '.
-------------------------------------------------- --------------------------------------

Código de golf (los saltos de línea son solo para facilitar la lectura; debe ser una larga línea de código):

char d[8][999],*s,*a;p,f,t,x,y,c,l;main(o,g)char**g;{for(memset(d,32,6993);o-=
2,a=*++g;p+=3)for(;f=*a;f^*++a?p+=2:0){t=f%27%5;l=t*3%12%5+4;p+=l&o;y=6;for(s=
"(A(21;\0(A2:B(212;F\08A*B*0210KP\0-70A47/RT-A20G=CD?5D7_\0(A:(21;"+"V3'? "[t]
-32;c=*s++;)c&8?x=0*--y:0,x+=c/16-2,c^=o-1&&!(c&6),d[y][p+o*x]="/\\|O*'A."[c&7
];t^3|~o||(s=d[5]+p,*s--=46,*s=39);p+=l&-o;}memset(d[6],45,p-=4);for(y=0;*(s=d
[y++]);s[p]=0,puts(s));}

El ancho máximo del campo de batalla es de 999 (podría ahorrar 2 caracteres limitándolo a 99). Utilicé una estructura de control de 1 byte por carácter de salida (sin espacio), dibujando las figuras de abajo hacia arriba.

  • 1 bit para la coordenada y ("quedarse" o "subir")
  • 3 bits para desplazamiento de coordenadas x (0 ... 4)
  • 3 bits para salida de caracteres (afortunadamente, solo hay 8 caracteres diferentes)

Hay 5 desplazamientos en la estructura de control.

Algunas otras partes oscuras:

  • El código f%27%5traduce los caracteres VWSMIa números.0, 1, 2, 3, 4
  • El código t*3%12%5+4calcula el ancho del stickman de tipot
  • El código t^3|~o||(s=d[5]+p,*s--=46,*s=39)explica la asimetría izquierda / derecha
  • Utilizo el hecho de que argc=3para generar banderas de dirección de dibujo 1y-1

Código sin golf:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char k[] = "(A(21;\0(A2:B(212;F\08A*B*0210KP\0-70A47/RT-A20G=CD?5D7_\0(A:(21;";

char d[8][999], // data of the battlefield
*s, // control string
*a; // cmdline argument
p, // position in the battlefield
f, // figure (char)
t, // type of the figure (0...4)
x,y, // coordinates while drawing the stickman
c; // control char, specifying what to draw

main(o, g) char**g; // o means "orientation" (+1, then -1)
{
    freopen("out.txt", "w", stdout);
    memset(d, ' ', 6993);

    for (; o -= 2, a=*++g;)
    {
        for (; f=*a;)
        {
            t = f%27%5;

            if (o<0)
                p += t*3%12%5+4; // go to the next stickman

            y = 6;
            for (s=k+"V3'? "[t]-32; c = *s++;) // loop over the control
            {
                if (c & 8) // bit 3: next line; set x to 0
                    --y, x = 0;
                x += c / 16 - 2; // bits 6...4: x coordinate
                if (o == -1 && !(c & 6)) // mirror \ <-> /
                    c ^= 1;
                d[y][p + o * x] = "/\\|O*'A."[c & 7];
            }
            if (t == 3 && o<0) // fix the asymmetrical mage
            {
                s=d[5]+p;
                *s--='.';
                *s='\'';
            }

            if (o>0)
                p += t*3%12%5+4; // go to the next stickman
            if (f != *++a) // is next stickman of different type?
                p += 2;
        }
        p += 3; // separate the armies
    }

    p -= 4;
    memset(d[6], '-', p); // draw the ground

    for (y = 0; *(s=d[y++]); ) // print the battle field
    {
        s[p] = 0;
        puts(s);
    }
}
anatolyg
fuente
¿Por qué no puedes tener los incluye en la versión de golf? Además, ¿por qué no cambiar el punto y coma *aa una coma? Eso elimina una advertencia y tiene el mismo número de bytes.
Fsmv
1
C tiene la regla de "declaración implícita" ; no es seguro confiar en él, pero funciona en la práctica, por lo que es bastante estándar en el golf. En cuanto al punto y coma: uso la expresión f=*acomo la condición de detención; compilador puede quejarse pero lo digo en serio. No puedo eliminarlo porque debería haber dos puntos y coma en la forsintaxis -loop.
anatolyg
2

Haskell, 556

Formato de entrada

([1,1,2,3,1],[0,1,1,0,1])

Orden: [Infante, Aldeano, Mago, Espadachín, Lancero], [Lancero, Espadachín, Mago, Aldeano, Infantil]

Salida de muestra

               .        .                                                       .      
             .' *.    .' *.                                                   .* '.    
       O     ' O *    ' O *       O  /   O  /   O  /    O A        \  O       * O '    
 O    /|\   ' \|/ .  ' \|/ .    |/|\/  |/|\/  |/|\/    /|\|         \/|\|    . \|/ '    O
/|\    |    .  |  *  .  |  *    | |    | |    | |       | |           | |    *  |  .   /|\
/ \   / \   './ \*.  './ \*.     / \    / \    / \     / \|          / \     .*/ \.'   / \
------------------------------------------------------------------------------------------

Código

(?)=replicate
v=reverse
g=map
e=length
s=foldr1
p=zip[3,3,8,6,4]$g lines[" O\n/|\\\n/ \\"," O\n/|\\\n |\n/ \\","   . \n .' *.\n ' O *  \n' \\|/ .\n.  |  *\n'./ \\*.","  O  /\n|/|\\/\n| |\n / \\"," O A\n/|\\|\n | |\n/ \\|"]
r n x a=a++(n-e a)?x
x '\\'='/';x '/'='\\';x c=c
y(w,p)=(w,g(v.dropWhile(==' ').g x.r w ' ')p)
m n(a,p)(b,q)=(a+b+n,[r(a+n)' ' c++d|(c,d)<-zip(h p)(h q)])where h=v.r(max(e p)(e q))[].v
p%c|sum c==0=(0,[])|1<2=s(m 3)[s(m 1)$d?(p!!i)|(i,d)<-zip[0..]c,d>0]
f(w,p)=p++[w?'-']
main=interact((\(a,b)->unlines.f$m 8(p%a)((g y.v$p)%b)).read)

Sin golf

type Pic = (Int, [String])

pics :: [Pic]
pics = zip[3,3,8,6,4]$map lines[" O\n/|\\\n/ \\"," O\n/|\\\n |\n/ \\","   . \n .' *.\n ' O *  \n' \\|/ .\n.  |  *\n'./ \\*.","  O  /\n|/|\\/\n| |\n / \\"," O A\n/|\\|\n | |\n/ \\|"]

mirrorChar '\\' = '/'
mirrorChar '/' = '\\'
mirrorChar c = c

padL, padR :: Int -> a -> [a] -> [a]
padL n x a = replicate (n - length a) x ++ a
padR n x a = a ++ replicate (n - length a) x

mirrorPic :: Pic -> Pic
mirrorPic (w, pic) = (w, map (reverse . dropWhile (==' ') . map mirrorChar . padR w ' ') pic)

merge n (w1, pic1) (w2, pic2) =
  let h = max (length pic1) (length pic2)
  in (w1 + n + w2, [padR (w1 + n) ' ' line1 ++ line2 | (line1, line2) <- zip (padL h [] pic1) (padL h [] pic2)])

makeArmy :: [Pic] -> [Int] -> Pic
makeArmy pics counts | sum counts == 0 = (0, []) | otherwise = foldr1 (merge 3) [ foldr1 (merge 1) . replicate count $ pics !! i | (i, count) <- zip [0..] counts, count > 0]

addField :: Pic -> [String]
addField (w, pic) = pic ++ [replicate w '-']

main = do
  (counts1, counts2)<- return . read =<< getLine
  putStr . unlines . addField $ merge 8 (makeArmy pics counts1) (makeArmy (map mirrorPic . reverse $ pics) counts2)
Rayo
fuente
1
No probé, pero de acuerdo con su salida de muestra, olvidó reflejar los caracteres en el lado derecho
William Barbosa
@WilliamBarbosa Corregido con una solución totalmente diferente.
Ray
1

Haskell ( 736 733 720 Bytes)

import System.Environment
import Data.List
a=1<2
h="   "
n="      "
o="    "
b (x:y)|x<0=[]|a=x:(b y)
c (x:y)|x>=0=c y|a=y
d [] _=[]
d (x:y)z|z/=x=[-5,x]++(d y x)|a=[x]++(d y x)
e x y|x< -5="        "|x<0=h|a=(([[h,h,"   .   ",n,o],[h,h," .' *. ",n,o],[h," o "," ' O * ","  O  /"," O A"],[" o ","/|\\", "' \\|/ .","|/|\\/ ","/|\\|"],["/|\\"," | ",".  |  *","| |   "," | |"],["/ \\","/ \\","'./ \\*."," / \\  ","/ \\|"]]!!(div z 5))!!(mod z 5))++" "where z=5*y+x
(§)=map
g=putStrLn
m=concat
main=do
    z<-getArgs
    let y=read§z::[Int]
    let w=sort(b y)
    let v=reverse(sort(c y))
    let u=(\(t,i)->(\s->e s i)§t)§(zip(take 6(cycle[((d w (w!!0))++[-9]++(d v (v!!0)))]))[0..5])
    mapM(\x->g(m x))u
    g(replicate(length(m(u!!0)))'-')

Llame con ./stickmanwars 2 3 1 3 4 -1 3 2 4 1 0 4 2 1 . El -1 marca el delimitador para las dos matrices. Espero que esté bien.

Bueno, mi primer desafío de golf de código y la primera vez que usé haskell para una aplicación real después de aprenderlo este semestre en mi universidad. Probablemente ni siquiera esté cerca de ser la mejor solución o la más corta, pero me divertí mucho creándola y fue un buen ejercicio :) La crítica y los comentarios son muy apreciados.

Golfed fuera de esto:

import System.Environment
import Data.List

layers = [
    ["   ", "   ",  "   .   ",  "      ",  "    "],
    ["   ", "   ",  " .' *. ",  "      ",  "    "],
    ["   ", " o ",  " ' O * ",  "  O  /",  " O A"],
    [" o ", "/|\\", "' \\|/ .", "|/|\\/ ", "/|\\|"],
    ["/|\\"," | ",  ".  |  *",  "| |   "," | |"],
    ["/ \\","/ \\", "'./ \\*.", " / \\  ","/ \\|"],
    ["¯¯¯", "¯¯¯",  "¯¯¯¯¯¯¯",  "¯¯¯¯¯¯", "¯¯¯¯"]]

getLeftSide :: [Int] -> [Int]
getLeftSide (x:xs) | x < 0 = []
                   | otherwise = x : (getLeftSide xs)

getRightSide :: [Int] -> [Int]
getRightSide (x:xs) | x >= 0 = getRightSide xs 
                    | otherwise = xs

addSpacing :: [Int] -> Int -> [Int]
addSpacing [] _ = []
addSpacing (x:xs) old | old /= x = [(-50),x] ++ (addSpacing xs x)
                      | otherwise = [x] ++ (addSpacing xs x)

getLayerStr :: Int -> Int -> String
getLayerStr item dimension | item < (-50) = "        "
getLayerStr item dimension | item < 0  = "   "
                           | otherwise = ((layers !! i) !! j) ++ " "
    where
        value = (item + (5 * dimension))
        i = div value 5
        j = mod value 5

main = do
    -- Read Arguments from command line
    a <- getArgs
    -- Convert command line arguments to Int array
    let args = map read a :: [Int]
    -- Get left side of the array and sort it
    let frstArray = sort $ getLeftSide args 
    -- Get right side of the array and sort it mirrored
    let scndArray = reverse $ sort $ getRightSide args
    -- Concat the two sides and put a delimiter in between them
    let finalArray = (addSpacing frstArray (frstArray !! 0)) ++ [-99] ++ (addSpacing scndArray (scndArray !! 0))
    -- Create the matrix by 
    -- 1. Duplicating the final array 6 times (one for each level)
    -- 2. Pair each of those 6 arrays with its level (= index)
    -- 3. Create a matrix like below:
    --
    -- 1  1  2  2  3  4  4  5 -  1  1  2  2  2  4
    -- 6  6  7  7  8  9  9 10 -  6  6  7  7  7  9
    -- 11 11 12 12 13 14 14 15 - 11 11 12 12 12 14
    -- 16 16 17 17 18 19 19 20 - 16 16 17 17 17 19
    -- 21 21 22 22 23 24 24 25 - 21 21 22 22 22 24
    -- 26 26 27 27 28 29 29 20 - 26 26 27 27 27 29
    --
    -- 4. Convert the newly calculated indices to their respective strings
    let matrix = map (\(list,i) -> map (\item -> getLayerStr item i) list) (zip (take 6 $ cycle [finalArray]) [0..5])
    -- Finaly output the matrix by concating the elements ...
    mapM (\x -> putStrLn (concat x)) matrix
    -- ... and print the ground level.
    putStrLn (replicate (length $ concat $ matrix !! 0) '¯')
    -- Exit with a new line
    putStrLn ""
Ke Vin
fuente
Los espacios entre paréntesis no son necesarios. Eso parece ahorrarte mucho.
Ray
ah está bien, me ahorró 3 bytes, gracias :)
Ke Vin
No mucho más.
Ray
tienes razón, ahora tengo mucho más.
Ke Vin
0

Haskell, 450

import Data.List
s=["      -"]
c=["    //-":"   O| -":"    \\\\-":s,"   / /-":"  O|| -":"   \\ \\-":s,"   '.'-":" .'  .-":" ' \\ /-":". O|| -":" * / \\-":" .*  *-":"   .*.-":s,"   || -":"   / /-":"  O|| -":"   \\ \\-":"   /  -":"  /   -":s,"   / /-":"  O|| -":"   \\ \\-":"  A|||-":s]
m '\\'='/'
m '/'='\\'
m x=x
u[]=[]
u x=x++[s,s]
f x=zipWith replicate x c>>=concat.u
k(a,b)=unlines.transpose$f a++s++s++map(map$m)(reverse$f b)
main=interact$k.read

¡Genial desafío! Podría ser capaz de jugar golf un poco más. Básicamente, estoy almacenando las figuras en forma de columna para poder agregarlas entre sí fácilmente, y luego voltear todo el conjunto de Strings alrededor usando Haskell's transpose.

El formato de entrada es ([Infants,Villagers,Mages,Swordsmen,Spearmen],[Infants,Villagers,Mages,Swordsmen,Spearmen])

Aquí está el ejemplo del OP:

>>>echo ([1,1,2,3,1],[0,0,1,1,1]) | cg2
               .       .                                                            .
             .' *.   .' *.                                                        .* '.
       O     ' O *   ' O *      O  /   O  /   O  /    O A        A O    \  O      * O '
 O    /|\   ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\    \/|\|   . \|/ '
/|\    |    .  |  * .  |  *   | |    | |    | |       | |        | |       | |   *  |  .
/ \   / \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \     / \    .*/ \.'
----------------------------------------------------------------------------------------

¡Y aquí está mi descripción favorita del infanticida ritual infame durante la segunda era!

>>>echo ([0,0,0,1,0],[5,0,0,0,0]) | cg2


  O  /
|/|\/          O   O   O   O   O
| |           /|\ /|\ /|\ /|\ /|\
 / \          / \ / \ / \ / \ / \
---------------------------------
Flonk
fuente
0

Python ( 612 , 522 , 460 , 440)

  • Rev1: compresión rudimentaria y codificación base64
  • Rev2: Se eliminó la compresión / codificación; se hizo más pequeño
  • Rev3: más reducción del recuento de bytes mediante la inserción
  • Rev4: Se eliminó la inversión de entrada innecesaria en el 2º ejército; intercambiaron espadachín y lancero para que coincida con las especificaciones

Cada "línea" se recorta de relleno derecho, y esto se agrega nuevamente al reconstruir.

Pre-invertí los stickmen en mi codificación interna porque me ahorró tener que invertirlos individualmente al representarlos en el código.

Ejecución de muestra:

$ echo "[1,1,2,3,1],[0,0,1,1,1]"|python /tmp/g2.py 
               .       .                                                            .   
             .' *.   .' *.                                                        .* '. 
       O     ' O *   ' O *      O  /   O  /   O  /    O A        A O    \  O      * O ' 
 O    /|\   ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\    \/|\|   . \|/ '
/|\    |    .  |  * .  |  *   | |    | |    | |       | |        | |       | |   *  |  .
/ \   / \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \     / \    .*/ \.'
----------------------------------------------------------------------------------------

Código:

c=",,A O,|/|\\,| |,|/ \\,,,\\  O, \\/|\\|,   | |,  / \\,   .  , .* '., * O ',. \\|/ ',*  |  .,.*/ \\.',,, O,/|\\, |,/ \\,,,, O,/|\\,/ \\".split(',')
r=['']*6
for b in input():
    for e,f in '/$ \\/ $\\'.split():r=[x.replace(e,f)[::-1] for x in r]
    if r[0]:r=[x+'  ' for x in r]
    for n,a in enumerate(b[::-1]):
        m=c[n*6:n*6+6]
        if a:r=[x+'   '+(' '.join([y.ljust(max(map(len,m)))]*a)) for x,y in zip(r,m)] 
print '\n'.join(r+['-'*len(r[0])])
Phord
fuente
0

Pitón (476)

Un solucionador diferente al anterior; más largo, pero más funcional.

$ echo "[1,1,2,3,1],[0,0,1,1,1]"|python g3.py
               .       .                                                            .   
             .' *.   .' *.                                                        .* '. 
       O     ' O *   ' O *      O  /   O  /   O  /    O A        A O    \  O      * O ' 
 O    /|\   ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\    \/|\|   . \|/ '
/|\    |    .  |  * .  |  *   | |    | |    | |       | |        | |       | |   *  |  .
/ \   / \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \     / \    .*/ \.'
----------------------------------------------------------------------------------------

Código:

c=",,A O,|L|R,| |,|L R,,,R  O, RL|R|,   | |,  L R,   .  , .* '., * O ',. R|L ',*  |  .,.*L R.',,, O,L|R, |,L R,,,, O,L|R,L R".split(',')+['']*12
s=[sum([[4-n,5]*a+[6] for n,a in enumerate(b) if a]+[[5]],[])[::-1] for b in input()]
t=[[''.join([c[a*6+n].ljust([4,6,7,3,3,1,2][a]) for a in x]) for x in s] for n in range(0,6)]
for d,e,f in 'RL/ LR\\'.split():t=[[x[0].replace(d,f),x[1].replace(e,f)] for x in t]
t=[x[0][::-1]+x[1] for x in t]
print '\n'.join(t+['-'*len(t[0])])
Phord
fuente