Нарисуй Войны Stickman


19


Представьте, как я готовлю этот вызов с моими передовыми навыками рисования.

Фон

Войны с Стикманом произошли очень давно, когда доминирующий вид Земли состоял только из палочек. Историки сожалеют о том, что тогда не было художников или камер, мы могли бы использовать некоторые фотографии той войны в современных учебниках истории. Вот где ваши способности кодирования становятся полезными. Stickmen очень легко нарисованы, и Историкам удалось найти некоторые данные о том, сколько stickmen участвовало в войнах ». Теперь вам предстоит воссоздать образ момента прямо перед началом войны!

Вот отважные клюшки, участвовавшие в войне:

  O /
| / | \ /
| |
 / \ Фехтовальщик

 О.А.
/ | \ |
 | |
/ \ | копьеносец

   , 
 .» *.
 'O *  
'\ | /.
, | *
'./ \ *. маг

 О
/ | \
 |
/ \ Сельчанин

 О
/ | \
/ \ Младенец

вход

Получите через стандартный ввод или эквивалентное изображение каждого крупье, который появился на каждой стороне поля битвы. Например, если два Swordmen боролись с правой стороны и два копьеносцев на левой стороне, ваш вход может быть {Sword: 2}, {Spear: 2}, [2,0,0,0,0], [0,2,0,0,0]или "WW", "SS".

Выход

Представление каждого храброго человечка на поле битвы, согласно правилам ниже. Это может быть показано на стандартный вывод или сохранено в файл, что бы ни качало вашу лодку.

правила

  1. С левой стороны будут все стикмены первого массива / строки / объекта, полученные вашей программой.
  2. Эти клюшки должны выглядеть точно так же, как показано выше по этому вопросу.
  3. Порядок левой армии должен быть Infants Villagers Mages Swordsmen Spearmen.
  4. Армия правой стороны будет вести себя точно так же, но с отражением персонажей и порядка.
  5. Каждый крупье будет разделен 1 пробелом.
  6. Каждый класс будет разделен 3 пробелами.
  7. Армии будут разделены на 8 мест.
  8. Так как stickmen не летают, вы должны рисовать землю, используя дефис-минусы -.
  9. Земля должна заканчиваться в той же колонне, где заканчивается последний крупье правой армии.

пример

Давайте предположим, что моя программа ожидает два массива длиной 5, и каждое значение в массиве представляет по порядку Infants Villagers Mages Swordsmen Spearmen.

Ввод: [1,1,2,3,1] [0,0,1,1,1]

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

Заключительные соображения

Обратите внимание, что применяются стандартные лазейки и что маг полностью асимметричен только потому, что.

Результатом ответа, получившего наибольшее количество голосов, станет «изображение обложки» этой задачи. Самый короткий ответ к концу месяца (31.08.2014) будет выбран победителем.

Это , поэтому выигрывает самый короткий код в байтах.


Требуется цитата


7
"маг совершенно асимметричен только потому, что" ... дергался ... ты просто должен был, не так ли? : P
Ручка двери

4
@ Doorknob ¯ \ _ (ツ) _ / ¯
Уильям Барбоза

Можно ли использовать функцию с двумя аргументами массива или вам требуется разбор входных данных из строки?
edc65

TIL о переоценке. Могут ли языки с юникодом использовать тире вместо этого, пожалуйста?
Джон Дворак

1
Между жителем и магом пропала колонна. Также будет ли представление IVMMWWWS SWMнаходиться в пределах «всего, что вам помогает»?
Мартин Эндер

Ответы:


7

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

Редактировать 6 Последнее редактирование было с ошибкой. Ошибка исправлена ​​и укорочена. Это все, что я надеюсь.

Править 5 Наконец-то нашел способ избавиться от умножения на 23 - надоело мне с самого начала. Плюс еще одно изменение ввода (кричать @William, когда его слишком много). Теперь функция ожидает один параметр массива, содержащий 2 подмассива. Без этого изменения это 349 - все еще улучшение

Редактировать 4 Побрить еще несколько байтов и немного изменить формат ввода. В новом формате ввода отсутствующий класс представляется как пустой элемент массива. Так что D([1,,2,3,1],[,3,1,1,2])вместо D([1,0,2,3,1],[0,3,1,1,2]). Я думаю, что это все еще подчиняется правилам.

Редактировать 3 Гольф больше. Никаких изменений в алгоритме, но злоупотребление множеством array.map и локальных функций, чтобы избежать циклов.

Правка 2 сжатия строк, правильный путь ...

Редактировать Добавлено сжатие строк, много работы и мало что получилось. Теперь зеркальные стикмены генерируются из шаблона, а не сохраняются.

Сделал несколько попыток, сначала работает. Быть в гольфе. Н.Б.Колмогоров - дело еще предстоит решить.

Тест в консоли FireFox. Измените 'return' с помощью Add 'alert (...)', чтобы иметь оператор вывода (хотя и не полезный вообще)

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

Выход

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

Гольф-код

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

Код (редактировать 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
}

Ungolfed код (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
}

4

Python 362 353

Редактирование: удаление одного цикла for и использование оператора exec позволило сэкономить 9 байт.

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)

Входные данные:

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

Выход:

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

Заметил, что вы используете строчные буквы Os.
phord

3

С 418 414

Пример ввода:

stickwar.exe IVMMWWWS SWM

Пример вывода:

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

Гольф-код (разрывы строк предназначены только для удобства чтения; это должна быть одна длинная строка кода):

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

Максимальная ширина поля битвы составляет 999 (я мог бы сохранить 2 символа, ограничив его до 99). Я использовал управляющую структуру из 1 байта на каждый выходной символ (не пробел), рисуя цифры снизу вверх.

  • 1 бит для y-координаты («остаться» или «подняться»)
  • 3 бита для смещения по координате х (0 ... 4)
  • 3 бита для выходного символа (к счастью, есть только 8 различных символов)

В структуре управления 5 смещений.

Некоторые другие неясные биты:

  • Код f%27%5переводит символы VWSMIв цифры0, 1, 2, 3, 4
  • Код t*3%12%5+4вычисляет ширину крупье типаt
  • Код t^3|~o||(s=d[5]+p,*s--=46,*s=39)учитывает левую / правую асимметрию
  • Я использую тот факт, что argc=3для генерации флагов направления рисования 1и-1

Ungolfed код:

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

Почему вы не можете включить в версию для гольфа? Кроме того, почему бы не изменить точку *aс запятой после запятой? Это избавляет от предупреждения и имеет такое же количество байтов.
Fsmv

1
C имеет правило «неявного объявления» ; полагаться на это небезопасно, но на практике это работает, поэтому в гольфе это довольно стандартно. Что касается точки с запятой: я использую выражение f=*aв качестве условия остановки; Компилятор может пожаловаться, но я это имею ввиду. Я не могу удалить его, потому что в forсинтаксисе -loop должно быть две точки с запятой.
Анатолий

2

Хаскелл, 556

Формат ввода

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

Порядок: [Младенец, Житель деревни, Маг, Мечник, Копейщик], [Копейщик, Мечник, Маг, Житель деревни, Младенец]

Пример вывода

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

Код

(?)=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
Я не проверял, но согласно вашему примеру вывода вы забыли отразить символы на правой стороне
Уильям Барбоза

@WilliamBarbosa Исправлено совершенно другим решением.
Рэй

1

Haskell ( 736 733 720 байт)

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 2 3 1 3 4 -1 3 2 4 1 0 4 2 1 . -1 обозначает разделитель для двух массивов. Я надеюсь, что все в порядке.

Что ж, это мой первый тест по коду в гольф и первый раз, когда я использовал haskell для реального приложения после того, как изучил его в этом семестре в моем университете. Вероятно, даже близко не быть лучшим или самым коротким решением, но я получал удовольствие, создавая его, и это было хорошее упражнение :) Критика и отзывы очень ценятся.

Гольф это из этого:

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

Пробелы вокруг скобок не обязательны. Это, кажется, спасет вас много.
Рэй

ну ладно, спасли мне 3 байта, спасибо :)
Ke Vin

Нет, намного больше
Рэй

Вы правы, я получил намного больше только сейчас.
Ке Вин

0

Хаскелл, 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

Крутой вызов! Я мог бы сыграть в гольф немного больше. По сути, я храню столбец с цифрами, чтобы я мог легко добавлять их друг к другу, а затем переворачивать весь массив Stringс помощью Haskell transpose.

Формат ввода ([Infants,Villagers,Mages,Swordsmen,Spearmen],[Infants,Villagers,Mages,Swordsmen,Spearmen])

Вот пример из ОП:

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

И вот мое любимое изображение печально известного ритуального детоубийства во время второй эры!

>>>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: элементарное сжатие и base64-кодирование
  • Rev2: Убрано сжатие / кодирование; стало меньше
  • Rev3: Больше уменьшение количества байтов за счет встраивания
  • Rev4: убрано ненужное изменение ввода для 2-й армии; поменялся мечом и копьем, чтобы соответствовать спецификации

Каждая «линия» обрезается от отступов вправо, и это добавляется обратно при восстановлении.

Я предварительно поменял стикмены во внутренней кодировке, потому что это избавило меня от необходимости менять их по отдельности при рендеринге в коде.

Образец прогона:

$ 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=",,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)

Отличный решатель от моего предыдущего; дольше, но более функционально.

$ 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=",,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])])
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.