Çöp Adam Savaşlarını Çiz


19


Bu meydan okumayı ileri çizim becerilerimle hazırladığımı hayal et.

Arka fon

Çöp Adam savaşları, Dünya'nın baskın türünün sopalardan başka bir şeyden yapılmadığı uzun zaman önce gerçekleşti. Tarihçiler o zamanlar ressam ya da kamera bulunmadığı için pişmanlık duyuyorlar, bugünün tarih kitaplarında bu savaşın bazı resimlerini kullanabiliriz. Kodlama güçleriniz bu noktada yararlı olur. Çöp adamlar çok kolay bir şekilde çizilir ve Tarihçiler kaç savaşçının savaşlarla savaştığı hakkında bazı veriler bulmayı başardılar¹. Şimdi savaş başlamadan hemen önceki anın görüntüsünü yeniden oluşturmak size kalmış!

İşte savaşa katılan cesur çöp adamlar:

  Ö /
| / | \ /
| |
 / \ Kılıç Ustası

 OA
/ | \ |
 | |
/ \ | mızrakçı

   . 
 .' *.
 ' Ö *  
'\ | /.
. | *
'./ \ *. sihirbaz

 Ö
/ | \
 |
/ \ Köylü

 Ö
/ | \
/ \ Bebek

Giriş

Savaş alanının her tarafında görünen her çöp adamın stdin veya eşdeğeri bir temsilini alın. İki swordmen sağ tarafında savaşmış ve sol tarafta iki mızraklı Örneğin, girişinizi olabilir {Sword: 2}, {Spear: 2}, [2,0,0,0,0], [0,2,0,0,0]ya da bir "WW", "SS".

Çıktı

Aşağıdaki kurallara göre, bir savaş alanındaki her cesur çöp adamın bir temsili. Teknenizde ne olursa olsun stdout'ta gösterilebilir veya bir dosyaya kaydedilebilir.

kurallar

  1. Sol tarafta, programınızın aldığı ilk dizinin / dizginin / nesnenin her çubuğu olacak.
  2. Bu çöp adamlar tam olarak bu soruda gösterilenlere benzemelidir.
  3. Sol taraftaki ordunun sırası olmalıdır Infants Villagers Mages Swordsmen Spearmen.
  4. Sağ taraf ordusu aynı şekilde davranacak, ancak karakterler ve düzen yansıtılacak.
  5. Her çöp adam 1 boşlukla ayrılır.
  6. Her sınıf 3 boşlukla ayrılacaktır.
  7. Ordular 8 boşlukla ayrılacak.
  8. Çöp adamlar uçmadığından, kısa çizgileri kullanarak zemini çizmelisiniz -.
  9. Zemin, sağ ordunun son çöpçüsünün bittiği aynı sütunda bitmelidir.

Misal

Programımın uzunluğu 5 olan iki dizi beklediğini ve dizideki her bir değerin sırayla temsil ettiğini varsayalım Infants Villagers Mages Swordsmen Spearmen.

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

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

Son muhakemeler

Standart boşlukların uygulandığını ve büyücünün tamamen asimetrik olduğunu lütfen unutmayın .

En çok oylanan cevabın sonucu, bu zorluğun “kapak resmi” olacaktır. Ay sonuna kadar en kısa cevap (31.08.2014) kazanan olarak seçilecektir.

Bu , bu yüzden bayt cinsinden en kısa kod kazanır.


Alıntı gerekli


7
"büyücü tamamen asimetrik çünkü" ... seğirme ... sadece zorundaydın , değil mi? : P
Kapı tokmağı

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

Tamam, 2 dizi bağımsız değişkeni olan bir işlev mi yoksa bir dizeden girdi ayrıştırma mı gerekiyor?
edc65

Fazla puanlar hakkında TIL. Unicode tarafından zorlanan diller bunun yerine tire kullanabilir mi?
John Dvorak

1
Köylü ve büyücü arasında bir sütun eksik. Ayrıca bir temsil IVMMWWWS SWM"size yardımcı olan herhangi bir şey" sınırında mıdır?
Martin Ender

Yanıtlar:


7

JavaScript (E6) 336344356369424448522570

Düzenle 6 Son düzenleme was buggy. Hata düzeltildi ve kısaltıldı. Tüm umudum budur.

Edit 5 Nihayet 23 ile çarpmak kurtulmak için bir yol buldum - baştan beni rahatsız. Ayrıca girişte başka bir değişiklik (@William çok fazla olduğunda bağırır). Şimdi fonksiyon 2 alt dizi içeren bir dizi parametresi beklemektedir. Bu değişiklik olmadan 349 - hala bir gelişme

Düzenle 4 Daha fazla bayt ve giriş biçiminde küçük bir değişiklik tıraş etti. Yeni giriş formatı ile eksik bir sınıf boş bir dizi elemanı olarak temsil edilir. Bunun D([1,,2,3,1],[,3,1,1,2])yerine D([1,0,2,3,1],[0,3,1,1,2]). Bence hala kurallara uyuyor.

Düzenle 3 Golfed more. Algoritmada değişiklik yok, ancak döngülerden kaçınmak için dizi.map ve yerel işlevleri kötüye kullanıyor.

Düzenle 2 Dize sıkıştırması, doğru yol ...

Düzenle Eklenen dize sıkıştırma, çok iş ve çok kazanılmış değil. Şimdi ayna çöp adamları saklanmayan bir şablondan üretiliyor.

İlk önce birkaç deneme yaptım. Golf oynamak için. NB Kolmogorow işi hala ele alınacak.

FireFox konsolunda test edin . 'Return' seçeneğini Add 'alert (...)' ile değiştirerek bir çıktı bildirimi oluşturun (hiç de kullanışlı olmasa da)

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

Çıktı

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

Golf Kodu

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

Kod (değiştir 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
}

Kod çözülmemiş kod (1. sürüm)

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

Düzenleme: Bir for-loop'u kaldırma ve 9 bayt kaydedilen exec deyimini kullanma

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)

Giriş:

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

Çıktı:

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

Küçük Os kullandığınızı fark ettiniz.
phord

3

C 418 414

Örnek girdi:

stickwar.exe IVMMWWWS SWM

Örnek çıktı:

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

Golf kodu (satır aralıkları yalnızca okunabilirlik içindir; uzun bir kod satırı olmalıdır):

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

Savaş alanının maksimum genişliği 999'dur (2 karakteri 99 ile sınırlayarak kaydedebilirim). Rakamları aşağıdan yukarıya doğru çizerek, çıktı karakteri başına 1 baytlık (boşluk olmayan) bir kontrol yapısı kullandım.

  • Y koordinatı için 1 bit ("kal" veya "yukarı çık")
  • X-koordinat deplasmanı için 3 bit (0 ... 4)
  • Çıktı karakter için 3 bit (neyse ki, sadece 8 farklı karakter vardır)

Kontrol yapısında 5 ofset vardır.

Diğer bazı gizli bitler:

  • Kod f%27%5karakterleri VWSMIsayılara çevirir0, 1, 2, 3, 4
  • Kod t*3%12%5+4, çöp adam tipinin genişliğini hesaplart
  • Kod t^3|~o||(s=d[5]+p,*s--=46,*s=39)sol / sağ asimetrisini açıklar
  • Ben argc=3çizim yön bayrakları oluşturmak için kullanın 1ve-1

Kod çözülmemiş kod:

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

Golfçü versiyonda neden yer alamıyorsunuz? Ayrıca neden *anoktalı virgülü virgülle değiştirmiyorsunuz? Bu bir uyarıdan kurtulur ve aynı sayıda bayt içerir.
Fsmv

1
C'nin "örtülü bildirim" kuralı vardır ; güvenmek güvensizdir ama pratikte çalışır, bu yüzden golfte oldukça standarttır. Yarı kolon için: İfadeyi f=*adurma koşulu olarak kullanıyorum; derleyici şikayet edebilir ama demek istediğim. Bunu kaldıramıyorum çünkü for-loop sözdiziminde iki noktalı virgül olmalı .
anatolyg

2

Haskell, 556

Giriş Formatı

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

Emir: [Bebek, Köylü, Büyücü, Kılıçlı, Mızrakçı], [Mızrakçı, Kılıççı, Büyücü, Köylü, Bebek]

Örnek Çıktı

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

kod

(?)=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
Test etmedim, ancak örnek çıktısına göre sağ taraftaki karakterleri yansıtmayı unuttun
William Barbosa

@WilliamBarbosa Tamamen farklı bir çözümle düzeltildi.
Ray

1

Haskell ( 736 733 720 bayt)

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

./Stickmanwars ile arayın 2 3 1 3 4 -1 3 2 4 1 0 4 2 1 . -1, iki dizinin sınırlayıcısını belirtir. Umarım bu iyidir.

İlk kod golf yarışmam ve haskell'i gerçek bir uygulama için ilk kez bu dönem üniversitemde öğrendikten sonra kullandım. Muhtemelen en iyi ya da en kısa çözüm olmaya bile yakın değilim ama onu oluştururken eğlendim ve iyi bir egzersizdi :) Eleştiri ve geri bildirim çok takdir ediliyor.

Bunu golf oynadı:

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

Parantez etrafındaki boşluklar gerekli değildir. Seni çok kurtaracak gibi görünüyor.
Ray

ah tamam, beni 3 byte, thx kurtardı :)
Ke Vin

Hayır, çok daha fazlası.
Ray

haklısın, şimdi çok daha fazlasına sahibim.
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

Harika bir meydan okuma! Bunu biraz daha aşağı golf edebilirim. Temelde rakamlar sütununu akıllıca saklıyorum, böylece kolayca birbirine ekleyebiliyorum ve sonra StringHaskell'i kullanarak tüm çevresi dizisini çevirebiliyorum transpose.

Girdi biçimi ([Infants,Villagers,Mages,Swordsmen,Spearmen],[Infants,Villagers,Mages,Swordsmen,Spearmen])

İşte OP'den örnek:

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

Ve işte ikinci dönemdeki rezil ritüel bebek öldürücüye dair en sevdiğim tasvir!

>>>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: Temel sıkıştırma ve base64 kodlaması
  • Rev2: Kaldırılan sıkıştırma / kodlama; küçüldü
  • Rev3: Satır içi ile daha fazla bayt sayısında azalma
  • Rev4: 2. orduda gereksiz girdi iptali kaldırıldı; takas kılıç ustası ve mızrakçı spec maç

Her "çizgi" sağ dolgudan kesilir ve bu yeniden yapılandırılırken tekrar eklenir.

Ben iç kodlama stickmen ön-ters çünkü kod onları render yaparken onları ayrı ayrı tersine çevirmek zorunda kurtardı.

Örnek çalışma:

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

Kod:

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

Piton (476)

Bir öncekinden farklı bir çözücü; daha uzun ama daha işlevsel.

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

Kod:

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])])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.