Disegna le Stickman Wars


19


Foto di me che ho preparato questa sfida con le mie capacità avanzate di disegno.

sfondo

Le guerre Stickman sono avvenute molto tempo fa, quando le specie dominanti della Terra erano fatte solo di bastoncini. Gli storici si rammaricano del fatto che all'epoca non esistessero pittori o macchine fotografiche, potremmo usare alcune immagini di quella guerra nei libri di storia di oggi. Ecco dove i tuoi poteri di codifica diventano utili. Gli stickmen sono disegnati molto facilmente e gli storici sono riusciti a trovare alcuni dati su quanti stickmen hanno combattuto le guerre¹. Ora tocca a te ricreare un'immagine del momento proprio prima dell'inizio della guerra!

Ecco i coraggiosi stickmen coinvolti nella guerra:

  O /
| / | \ /
| |
 / \ Swordsman

 OA
/ | \ |
 | |
/ \ | Spearman

   . 
 .' *.
 'O *  
'\ | /.
. | *
'./ \ *. Mage

 O
/ | \
 |
/ \ Villager

 O
/ | \
/ \ Neonato

Ingresso

Ricevi tramite stdin o equivalente una rappresentazione di ogni stickman che è apparso su ogni lato del campo di battaglia. Ad esempio, se due Spadaccini hanno combattuto sul lato destro e due lancieri sul lato sinistro, il tuo input può essere {Sword: 2}, {Spear: 2}, [2,0,0,0,0], [0,2,0,0,0]o a "WW", "SS".

Produzione

Una rappresentazione di ogni coraggioso stickmen in un campo di battaglia, secondo le regole seguenti. Può essere mostrato su stdout o salvato in un file, qualunque cosa scuoti la tua barca.

Regole

  1. Sul lato sinistro ci saranno tutti gli stickmen del primo array / stringa / oggetto ricevuto dal programma.
  2. Quei stickmen devono apparire esattamente come quelli mostrati prima su questa domanda.
  3. L'ordine dell'esercito di sinistra deve essere Infants Villagers Mages Swordsmen Spearmen.
  4. L'esercito della parte destra si comporterà allo stesso modo, ma con i personaggi e l'ordine specchiati.
  5. Ogni stickman sarà separato da 1 spazio.
  6. Ogni classe sarà separata da 3 spazi.
  7. Gli eserciti saranno separati da 8 spazi.
  8. Dato che gli stickmen non volano, devi disegnare il terreno usando i trattini -.
  9. Il terreno deve finire sulla stessa colonna dell'ultimo stickman dell'esercito destro.

Esempio

Supponiamo che il mio programma preveda due array con lunghezza 5 e ogni valore nell'array rappresenti, in ordine Infants Villagers Mages Swordsmen Spearmen,.

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

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

Considerazioni finali

Si noti che si applicano scappatoie standard e che il mago è completamente asimmetrico proprio perché.

Il risultato della risposta più votata sarà l '"immagine di copertina" di questa sfida. La risposta più breve entro la fine del mese (31/08/2014) sarà selezionata come vincitrice.

Questo è , quindi vince il codice più breve, in byte.


¹Citazione necessaria


7
"il mago è completamente asimmetrica solo perché" ... contrazione ... hai appena avuto a, non è vero? : P
Maniglia della porta

4
@Doorknob ¯ \ _ (ツ) _ / ¯
William Barbosa,

OK è una funzione con 2 argomenti di array o è richiesta l'analisi dell'input da una stringa?
edc65,

TIL sui overscores. Le lingue con difficoltà Unicode possono usare trattini invece, per favore?
John Dvorak,

1
Manca una colonna tra il villico e il mago. Anche una rappresentazione del genere IVMMWWWS SWMsarebbe nel limite di "tutto ciò che ti aiuta"?
Martin Ender,

Risposte:


7

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

Modifica 6 Ultima modifica errata. Correzione di errori e riduzione. Questo è tutto ciò che spero.

Modifica 5 Alla fine ho trovato un modo per sbarazzarmi di moltiplicare per 23 - mi ha infastidito dall'inizio. Inoltre un'altra modifica all'input (grido di @William quando è troppo). Ora la funzione prevede un parametro array, contenente 2 sottoparagrafi. Senza questo cambiamento è 349 - è ancora un miglioramento

Modifica 4 Rasato alcuni byte in più e una piccola modifica al formato di input. Con il nuovo formato di input una classe mancante viene rappresentata come un elemento array vuoto. Quindi D([1,,2,3,1],[,3,1,1,2])invece di D([1,0,2,3,1],[0,3,1,1,2]). Penso che obbedisca ancora alle regole.

Modifica 3 Golfed di più. Nessuna modifica all'algoritmo, ma abuso di un sacco di array.map e funzioni locali per evitare loop.

Modifica la compressione a 2 stringhe, nel modo giusto ...

Modifica Aggiunta compressione delle stringhe, molto lavoro e poco guadagnato. Ora i mirror stickmen sono generati da un modello, non memorizzato.

Ho fatto qualche tentativo, prima di correre. Essere golfato. NB: gli affari di Kolmogorow devono ancora essere affrontati.

Test nella console FireFox. Cambia 'return' con Aggiungi 'alert (...)' per avere un'istruzione di output (anche se non è affatto utile)

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

Produzione

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

Codice Golfed

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,'¯')

Codice (modifica 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
}

Codice non golfato (1a versione)

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
}

4

Python 362 353

Modifica: rimuovendo un ciclo continuo e usando l'istruzione exec ho salvato 9 byte

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)

Ingresso:

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

Produzione:

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

Notato che si utilizza Os minuscole.
phord,

3

C, 418 414

Esempio di input:

stickwar.exe IVMMWWWS SWM

Esempio di output:

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

Codice golfed (le interruzioni di riga sono solo per leggibilità; dovrebbe essere una lunga riga di codice):

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));}

La larghezza massima del campo di battaglia è 999 (potrei salvare 2 caratteri limitandolo a 99). Ho usato una struttura di controllo di 1 byte per carattere di output (non spaziale), disegnando le figure dal basso verso l'alto.

  • 1 bit per coordinata y ("rimanere" o "salire")
  • 3 bit per lo spostamento delle coordinate x (0 ... 4)
  • 3 bit per il carattere di output (fortunatamente, ci sono solo 8 caratteri diversi)

Ci sono 5 offset nella struttura di controllo.

Alcuni altri bit oscuri:

  • Il codice f%27%5traduce i caratteri VWSMIin numeri0, 1, 2, 3, 4
  • Il codice t*3%12%5+4calcola la larghezza dello stickman di tipot
  • Il codice t^3|~o||(s=d[5]+p,*s--=46,*s=39)rappresenta l'asimmetria sinistra / destra
  • Uso il fatto che argc=3per generare flag di direzione del disegno 1e-1

Codice non golfato:

#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);
    }
}

Perché non riesci ad avere le inclusioni nella versione golfata? Inoltre, perché non cambiare il punto e virgola dopo *ain una virgola? Questo elimina un avviso e ha lo stesso numero di byte.
Fsmv,

1
C ha la regola della "dichiarazione implicita" ; non è sicuro fare affidamento su di esso, ma funziona in pratica, quindi è abbastanza standard nel golf. Per quanto riguarda il punto e virgola: uso l'espressione f=*acome condizione di arresto; il compilatore può lamentarsi ma intendo. Non riesco a rimuoverlo perché nella forsintassi -loop dovrebbero essere presenti due punti e virgola .
Anatolyg,

2

Haskell, 556

Formato di input

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

Ordine: [Neonato, Paesano, Mago, Spadaccino, Spearman], [Spearman, Spadaccino, Mago, Paesano, Infantile]

Uscita campione

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

Codice

(?)=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)

Ungolfed

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)

1
Non ho testato, ma in base al tuo output di esempio hai dimenticato di rispecchiare i personaggi sul lato destro
William Barbosa,

@WilliamBarbosa Risolto con una soluzione totalmente diversa.
Ray

1

Haskell ( 736 733 720 byte)

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)))'-')

Chiama con ./stickmanwars 2 3 1 3 4 -1 3 2 4 1 0 4 2 1 . -1 indica il delimitatore per i due array. Spero vada bene

Bene, la mia prima sfida di golf con il codice e la prima volta che ho usato haskell per una vera applicazione dopo averlo appreso questo semestre alla mia università. Probabilmente nemmeno vicino ad essere la soluzione migliore o più breve ma mi sono divertito a crearlo ed è stato un buon esercizio :) Critica e feedback sono molto apprezzati.

Ne ho tratto il golf:

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 ""

Gli spazi tra parentesi non sono necessari. Questo sembra salvarti molto.
Ray

ah va bene, mi ha salvato 3 byte, grazie :)
Ke Vin

No, molto di più.
Ray

hai ragione, ho ottenuto molto di più proprio ora.
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

Sfida fantastica! Potrei essere in grado di golf un po 'di più. Fondamentalmente sto memorizzando le colonne delle figure in modo da poterle unire facilmente le une alle altre, quindi capovolgere l'intera gamma di immagini Stringusando quella di Haskell transpose.

Il formato di input è ([Infants,Villagers,Mages,Swordsmen,Spearmen],[Infants,Villagers,Mages,Swordsmen,Spearmen])

Ecco l'esempio dell'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    /|\   ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\    \/|\|   . \|/ '
/|\    |    .  |  * .  |  *   | |    | |    | |       | |        | |       | |   *  |  .
/ \   / \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \     / \    .*/ \.'
----------------------------------------------------------------------------------------

Ed ecco la mia rappresentazione preferita del famigerato infanticidio rituale durante la seconda era!

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


  O  /
|/|\/          O   O   O   O   O
| |           /|\ /|\ /|\ /|\ /|\
 / \          / \ / \ / \ / \ / \
---------------------------------

0

Python ( 612 , 522 , 460 , 440)

  • Rev1: compressione rudimentale e codifica base64
  • Rev2: compressione / codifica rimosse; è diventato più piccolo
  • Rev3: maggiore riduzione del conteggio dei byte mediante allineamento
  • Rev4: rimosso l'inversione di input non necessaria sul 2 ° esercito; scambiato spadaccino e lanciatore per abbinare spec

Ogni "linea" è ritagliata dall'imbottitura di destra e questo viene aggiunto nuovamente durante la ricostruzione.

Ho pre-invertito gli stickmen nella mia codifica interna perché mi ha risparmiato di doverli invertire singolarmente durante il rendering nel codice.

Esecuzione di esempio:

$ 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    /|\   ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\    \/|\|   . \|/ '
/|\    |    .  |  * .  |  *   | |    | |    | |       | |        | |       | |   *  |  .
/ \   / \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \     / \    .*/ \.'
----------------------------------------------------------------------------------------

Codice:

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

0

Python (476)

Un risolutore diverso dal mio precedente; più a lungo, ma più funzionale.

$ 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    /|\   ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\    \/|\|   . \|/ '
/|\    |    .  |  * .  |  *   | |    | |    | |       | |        | |       | |   *  |  .
/ \   / \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \     / \    .*/ \.'
----------------------------------------------------------------------------------------

Codice:

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])])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.