Gambarkan Perang Stickman

19


Foto saya sedang menyusun tantangan ini dengan keterampilan menggambar tingkat lanjut saya.

Latar Belakang

Perang Stickman terjadi jauh sebelumnya, ketika spesies dominan Bumi tidak lain hanyalah tongkat. Sejarawan menyesali kenyataan bahwa tidak ada pelukis atau kamera saat itu, kita dapat menggunakan beberapa gambar perang itu dalam buku-buku sejarah saat ini. Di situlah kekuatan coding Anda menjadi berguna. Stickmen sangat mudah digambar dan Sejarawan berhasil menemukan beberapa data tentang berapa banyak stickmen yang berperang¹. Sekarang terserah Anda untuk membuat ulang gambar saat sebelum perang dimulai!

Inilah stickmen pemberani yang terlibat dalam perang:

  O /
| / | \ /
| |
 / \ Pendekar Pedang

 OA
/ | \ |
 | |
/ \ | pendekar tombak

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

 HAI
/ | \
 |
/ \ Penduduk desa

 HAI
/ | \
/ \ Bayi

Memasukkan

Terima melalui stdin atau yang setara dengan representasi setiap stickman yang muncul di setiap sisi medan perang. Misalnya, jika dua Swordmen bertarung di sisi kanan dan dua spearmen di sisi kiri, input Anda bisa {Sword: 2}, {Spear: 2}, [2,0,0,0,0], [0,2,0,0,0]atau a "WW", "SS".

Keluaran

Representasi setiap stickmen pemberani di medan perang, sesuai dengan aturan di bawah ini. Itu dapat ditampilkan di stdout atau disimpan ke file, apa pun batu perahu Anda.

Aturan

  1. Di sebelah kiri adalah setiap stickmen dari array / string / objek pertama yang diterima program Anda.
  2. Stickmen itu harus terlihat persis seperti yang ditunjukkan sebelumnya pada pertanyaan ini.
  3. Urutan tentara sisi kiri harus Infants Villagers Mages Swordsmen Spearmen.
  4. Tentara sisi kanan akan berperilaku sama, tetapi dengan karakter dan urutannya dicerminkan.
  5. Setiap stickman akan dipisahkan oleh 1 ruang.
  6. Setiap kelas akan dipisahkan oleh 3 spasi.
  7. Tentara akan dipisahkan oleh 8 ruang.
  8. Karena stickmen tidak bisa terbang, Anda harus menggambar tanah menggunakan minus-minus -.
  9. Tanah harus berakhir pada kolom yang sama dengan stickman terakhir dari pasukan kanan berakhir.

Contoh

Mari kita asumsikan program saya mengharapkan dua array dengan panjang 5 dan setiap nilai dalam array mewakili, secara berurutan 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 / | \ '\ | /. '\ | /. | / | \ / | / | \ / | \ / / | \ | | / | \ \ / | \ | . \ | / '
/ | \ | . | *. | * | | | | | | | | | | | | * | .
/ \ / \ './ \ *. './ \ *. / \ / \ / \ / \ | | / \ / \. * / \ '.
-------------------------------------------------- -------------------------------------

Pertimbangan Terakhir

Harap dicatat bahwa celah standar berlaku dan mage benar-benar asimetris hanya karena.

Hasil dari jawaban yang paling banyak dipilih akan menjadi "gambar sampul" dari tantangan ini. Jawaban terpendek pada akhir bulan (31/08/2014) akan dipilih sebagai pemenang.

Ini adalah , jadi kode terpendek, dalam byte, menang.


Itation Kutipan diperlukan

William Barbosa
sumber
7
"Penyihir itu benar-benar asimetris hanya karena" ... berkedut ... kau harus melakukannya, bukan? : P
Doorknob
4
@Doorknob ¯ \ _ (ツ) _ / ¯
William Barbosa
Apakah ok sebuah fungsi dengan argumen 2 array atau Anda memerlukan parsing input dari string?
edc65
TIL tentang overscores. Bisakah bahasa unicode-challenge menggunakan tanda hubung?
John Dvorak
1
Ada kolom yang hilang antara penduduk desa dan mage. Juga akankah representasi seperti IVMMWWWS SWMberada dalam batas "apa pun yang membantu Anda"?
Martin Ender

Jawaban:

7

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

Sunting 6 Sunting terakhir adalah buggy. Memperbaiki bug dan dipersingkat. Itu saja yang saya harap.

Sunting 5 Akhirnya menemukan cara untuk menghilangkan kalikan dengan 23 - mengganggu saya dari awal. Ditambah lagi perubahan pada input (@William berteriak ketika terlalu banyak). Sekarang fungsi tersebut mengharapkan satu parameter array, yang mengandung 2 subarrays. Tanpa perubahan ini 349 - masih merupakan perbaikan

Sunting 4 Cukur beberapa byte lagi dan sedikit perubahan ke format input. Dengan format input baru, kelas yang hilang diwakili sebagai elemen array kosong. Jadi, D([1,,2,3,1],[,3,1,1,2])bukannya D([1,0,2,3,1],[0,3,1,1,2]). Saya pikir itu masih mematuhi aturan.

Sunting 3 Dipotong lagi. Tidak ada perubahan pada algoritma, tetapi menyalahgunakan banyak array.map dan fungsi lokal untuk menghindari loop.

Edit 2 kompresi String, dengan cara yang benar ...

Edit kompresi string yang ditambahkan, banyak pekerjaan dan tidak banyak diperoleh. Sekarang stickmen cermin dihasilkan dari templat, tidak disimpan.

Lakukan beberapa percobaan, pertama berjalan. Untuk golf. NB Kolmogorow-bisnis masih harus ditangani.

Tes di konsol FireFox. Ubah 'kembali' dengan Tambahkan 'lansiran (...)' untuk memiliki pernyataan keluaran (meskipun tidak berguna sama sekali)

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

Keluaran

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

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

Kode (edit 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
}

Kode tidak digabungkan (versi 1)

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
sumber
4

Python 362 353

Sunting: Menghapus satu for-loop dan menggunakan pernyataan exec menyimpan 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)

Memasukkan:

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

Keluaran:

   .       .                                                   .       .         
 .' *.   .' *.                                               .* '.   .* '.       
 ' o *   ' o *      o  /    o A        A o  A o    \  o      * o '   * o '       
' \|/ . ' \|/ .   |/|\/    /|\|        |/|\ |/|\    \/|\|   . \|/ ' . \|/ '    o 
.  |  * .  |  *   | |       | |        | |  | |       | |   *  |  . *  |  .   /|\
'./ \*. './ \*.    / \     / \|        |/ \ |/ \     / \    .*/ \.' .*/ \.'   / \
---------------------------------------------------------------------------------
Markuz
sumber
Melihat Anda menggunakan huruf kecil O.
phord
3

C, 418 414

Contoh input:

stickwar.exe IVMMWWWS SWM

Contoh output:

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

Kode golf (linebreak hanya untuk keterbacaan; harus berupa satu baris panjang kode):

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

Lebar maksimal medan perang adalah 999 (saya bisa menghemat 2 karakter dengan membatasinya menjadi 99). Saya menggunakan struktur kontrol 1 byte per karakter keluaran (non-spasi), menggambar angka-angka dari bawah ke atas.

  • 1 bit untuk koordinat y (baik "tetap" atau "naik")
  • 3 bit untuk perpindahan koordinat x (0 ... 4)
  • 3 bit untuk output char (untungnya, hanya ada 8 karakter yang berbeda)

Ada 5 offset ke dalam struktur kontrol.

Beberapa bit tidak jelas lainnya:

  • Kode f%27%5menerjemahkan karakter VWSMIke angka0, 1, 2, 3, 4
  • Kode t*3%12%5+4menghitung lebar stickman tipet
  • Kode t^3|~o||(s=d[5]+p,*s--=46,*s=39)bertanggung jawab atas asimetri kiri / kanan
  • Saya menggunakan fakta bahwa argc=3untuk menghasilkan bendera arah gambar 1dan-1

Kode tidak dikunci:

#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
sumber
Mengapa Anda tidak dapat menyertakan di dalam versi golf? Juga mengapa tidak mengubah titik *akoma setelah menjadi koma? Itu menghilangkan peringatan dan memiliki jumlah byte yang sama.
Fsmv
1
C memiliki aturan "deklarasi implisit" ; tidak aman untuk mengandalkannya, tetapi ia bekerja dalam praktik sehingga cukup standar dalam bermain golf. Adapun semi-kolon: Saya menggunakan ekspresi f=*asebagai kondisi berhenti; kompiler mungkin mengeluh tetapi saya bersungguh-sungguh. Saya tidak dapat menghapusnya karena harus ada dua titik koma di forsintaks -loop.
anatolyg
2

Haskell, 556

Masukkan format

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

Urutan: [Bayi, Penduduk Desa, Mage, Pendekar Pedang, Spearman], [Spearman, Pendekar Pedang, Penyihir, Penduduk Desa, Bayi]

Output Sampel

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

Kode

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

Tidak disatukan

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)
sinar
sumber
1
Saya tidak menguji, tetapi menurut sampel sampel Anda, Anda lupa untuk mencerminkan karakter di sisi kanan
William Barbosa
@ WilliamBarbosa Diperbaiki dengan solusi yang sama sekali berbeda.
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)))'-')

Panggilan dengan ./stickmanwars 2 3 1 3 4 -1 3 2 4 1 0 4 2 1 . -1 menandai pembatas untuk dua array. Saya harap tidak apa-apa.

Nah, tantangan golf kode pertama saya dan pertama kali saya menggunakan haskell untuk aplikasi nyata setelah saya mempelajarinya semester ini di universitas saya. Mungkin bahkan tidak mendekati menjadi solusi terbaik atau terpendek tapi saya senang menciptakannya dan itu adalah latihan yang baik :) Kritik dan umpan balik sangat dihargai.

Keluar dari ini:

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
sumber
Spasi di sekitar tanda kurung tidak perlu. Tampaknya itu menghemat banyak.
Ray
ah oke, menyelamatkan saya 3 byte, thx :)
Ke Vin
Tidak, lebih banyak.
Ray
Anda benar, saya mendapat lebih banyak sekarang.
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

Tantangan keren! Saya mungkin bisa bermain golf itu sedikit lebih. Pada dasarnya saya menyimpan kolom angka dengan bijaksana sehingga saya dapat menambahkannya satu sama lain dengan mudah, dan kemudian membalik seluruh array Strings diseluruh menggunakan Haskell transpose.

Format input adalah ([Infants,Villagers,Mages,Swordsmen,Spearmen],[Infants,Villagers,Mages,Swordsmen,Spearmen])

Berikut adalah contoh dari 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    /|\   ' \|/ . ' \|/ .   |/|\/  |/|\/  |/|\/    /|\|        |/|\    \/|\|   . \|/ '
/|\    |    .  |  * .  |  *   | |    | |    | |       | |        | |       | |   *  |  .
/ \   / \   './ \*. './ \*.    / \    / \    / \     / \|        |/ \     / \    .*/ \.'
----------------------------------------------------------------------------------------

Dan di sini adalah penggambaran favorit saya tentang pembunuhan bayi ritual yang terkenal selama era kedua!

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


  O  /
|/|\/          O   O   O   O   O
| |           /|\ /|\ /|\ /|\ /|\
 / \          / \ / \ / \ / \ / \
---------------------------------
Flonk
sumber
0

Python ( 612 , 522 , 460 , 440)

  • Rev1: Kompresi yang belum sempurna dan pengkodean base64
  • Rev2: Penghapusan kompresi / encoding; semakin kecil
  • Rev3: Lebih banyak pengurangan jumlah byte dengan inlining
  • Rev4: Penghapusan input yang tidak dibutuhkan pada pasukan kedua; swordsman dan spearman bertukar untuk mencocokkan spec

Setiap "garis" dipangkas bantalan kanan, dan ini ditambahkan kembali ketika merekonstruksi.

Saya pra-membalikkan stickmen dalam penyandian internal saya karena itu menyelamatkan saya harus membalikkannya secara individual ketika merendernya dalam kode.

Contoh dijalankan:

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

Kode:

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
sumber
0

Python (476)

Pemecah yang berbeda dari yang sebelumnya; lebih lama, tetapi lebih fungsional.

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

Kode:

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
sumber