Pomóż mi z moją dekoracją na Halloween

13

Zbliża się Halloween, a ja jeszcze nie udekorowałem domu, więc potrzebuję twojej pomocy, aby wykonać to zadanie

Wejście
Wejście będzie listą 4 cyfr, przy czym każda cyfra reprezentuje część dekoracji:

EMBU
||||
|||+-upper decoration
||+-bottom decoration
|+-mouth/nose
+-eyes

Oczy:
0 - °
1 - ¯
2 - -
3 - ^
4 -'

Usta / nos
0 - v
1 - w
2 - o
3 - _
4 --

Dekoracja dna
0 - nic
1 - szkielet
2 - dynia

Dekoracja górna
0 - nic
1 - latający nietoperz
2 - nietoperz spoczynkowy
3 - pająk

Wynik

Szkielet:
(EME)
​ _|_ ​
/[|]\
​ | ​ ​
​ / \ ​

Dynia
​ , ​
(EME)

Latający nietoperz
​ ​
​ ^"^ ​

Odpoczywający nietoperz
​ ​ () ​
​ ​ ´` ​

Pająk
​ | ​
​ .|. ​
​ :": ​

  • Każda dekoracja ma szerokość 5 znaków
  • Górne dekoracje zaczynają się od góry
  • Niższe dekoracje zaczynają się od dołu
  • Jeśli pająk znajduje się nad dynią lub nie ma dekoracji dolnej, długość wstęgi wyniesie 3, a jeśli znajdzie się nad szkieletem, długość wstęgi wyniesie 1
  • Gdy dolna dekoracja ma 0pierwsze 2 cyfry, nie mają znaczenia
  • Pomiędzy każdą dekoracją będzie pusta kolumna

Przykład
Wejście
3123 ??02 1021 0310
Wyjście

   |     ()             ​
​   |     ´`   ^"^       ​
​  .|.              (°_°)
​  :":               _|_ ​
​                   /[|]\
​   ,           ,     |  ​
​ (^w^)       (¯v¯)  / \ ​

Końcowe spacje na końcu każdej linii są opcjonalne
Dozwolony jest końcowy znak nowej linii na końcu całego wyniku

Kryteria wygranej
To jest więc wygrywa najkrótsza odpowiedź

Pręt
źródło
Czy dane wejściowe są zawsze prawidłowe, więc nie 9999?
Karl Napf
@KarlNapf tak, dane wejściowe zawsze będą ważne
Rod

Odpowiedzi:

4

JavaScript (ES6), 319 315 bajtów

let f =

s=>[0,1].map(i=>s.map(([A,B,C,D],x)=>+(z=i?D:C)&&[...'01/21/5015/41211/91/65'.split`/`[z-(i?C+D-13?1:-2:-2)]].map((n,y)=>a[(i?y:6-y)*4+x]=' '+('      ^"^   ()   ´`  / \\   |   .|. /[|]\\ _|_ ('+(e='°¯-^'[A])+'vwo_-'[B]+e+')  ,   :": ').substr(p+=n*5,5),p=0)),a=Array(28).fill`      `)&&a.join``.match(/.{24}/g).join`
`

console.log(f(["3123","0002","1021","0310"]));

Arnauld
źródło
5

Java, 829 , 798

Tak. Znacząco poprawiony dzięki Kevinowi Cruijssenowi i corvus_192.

s->{String[]e=s.split(" ");char c[][]=new char[8][e.length*6],t,u,h='|';int y,x=2,i=0,j;for(String l:e){y=0;char[]p=l.toCharArray(),z=c[y];int a=p[0],b=p[1],f=p[2],d=p[3],k=x-1,m=x+1;t=a<49?'°':a<50?'¯':a<51?45:a<52?'^':39;u=(char)(b<50?b+70:b<51?111:b<52?95:39);if(d>50){z[x]=h;if(f!=49){y=2;c[1][x]=h;c[2][x]=h;}z=c[y];z[k]=46;z[m]=46;z=c[++y];z[k]=58;z[m]=58;z[x]=34;}if(d==50){z[x]=40;z[m]=41;c[++y][x]='´';c[y][m]=96;}if(d==49){z=c[++y];z[k]=94;z[x]=34;z[m]=94;}if(f>49){y=6;c[y][x]=44;}if(f>48){y=f>49?7:3;z=c[y++];z[x]=u;z[k]=t;z[m]=t;z[x-2]=40;z[x+2]=41;}if(f==49){z=c[y++];z[x]=h;z[k]=95;z[m]=95;z=c[y];z[x]=h;z[k]=91;z[m]=93;z[x-2]=47;c[y++][x+2]=92;c[y++][x]=h;c[y][k]=47;c[y][m]=92;}x+=6;}for(;i<8;i++){s="";for(j=0;j<c[0].length;){t=c[i][j++];s+=t<1?' ':t;}System.out.println(s);}};

wersja bez golfa

static void makeDecorations(String s){
    String[]e=s.split(" ");
    char c[][]=new char[8][e.length*6],t,u,h='|';
    int x=2,i=0,j,y;
    for(String l:e){
        y=0;
        char[]p=l.toCharArray(), z=c[y];
        int a=p[0],b=p[1],f=p[2],d=p[3],k=x-1,m=x+1;
        t=a<49?'°':a<50?'¯':a<51?45:a<52?'^':39;
        u=(char)(b<50?b+70:b<51?111:b<52?95:39);
        if(d>50){z[x]=h;
            if(f!=49){y=2;
                c[1][x]=h;
                c[2][x]=h;
            }
            z=c[y];
            z[k]=46;
            z[m]=46;
            z=c[++y];
            z[k]=58;
            z[m]=58;
            z[x]=34;
        }
        if(d==50){
            z[x]=40;
            z[m]=41;
            c[++y][x]='´';
            c[y][m]=96;
        }

        if(d==49){
            z=c[++y];
            z[k]=94;
            z[x]=34;
            z[m]=94;}
        if(f>49){
            y=6;
            c[y][x]=44;
        }
        if(f>48){
            y=f>49?7:3;
            z=c[y++];
            z[x]=u;
            z[k]=t;
            z[m]=t;
            z[x-2]=40;
            z[x+2]=41;
        }
        if(f==49){
            z=c[y++];
            z[x]=h;
            z[k]=95;
            z[m]=95;
            z=c[y];
            z[x]=h;
            z[k]=91;
            z[m]=93;
            z[x-2]=47;
            c[y++][x+2]=92;
            c[y++][x]=h;
            c[y][k]=47;
            c[y][m]=92;
        }
        x+=6;
    }
    for(;i<8;i++){
        s="";
        for(j=0;j<c[0].length;){
            t=c[i][j++];s+=t<1?32:t;
        }
        System.out.println(s);
    }
}

Ulubiona dekoracja (która najwyraźniej wygląda bardziej zła na mojej konsoli): szkielet terminatora

(-w-) 
 _|_  
/[|]\ 
  |   
 / \
dpa97
źródło
Możesz zaoszczędzić trochę bajtów, definiując lambda zamiast pełnej metody
corvus_192,
1
To początkowe „Tak” rozśmieszyło mnie mocno, nie wiem dlaczego.
Magic Octopus Urn
+1! Niektóre rzeczy, na które możesz grać w golfa: char[][]c=new char[8][e.length*6];char t,u,h='|';-> char c[][]=new char[8][e.length*6],t,u,h='|';; '-'może być 45; '^'może mieć 94; Miejsce można usunąć tutaj if(f>48) {:; I jestem pewien, że można grać w golfa o wiele więcej, ale to trochę za dużo, aby zagrać w bardziej złożone golfa. :)
Kevin Cruijssen
Kevin i Corvus: dzięki, spróbuję później, kiedy będę miał czas. Jestem pewien, że można go upuścić poniżej 800, szczególnie w przypadku lambda.
dpa97
2

Ruby 2.3.1, 777 752 bajtów

Edycja_0: Całkowicie przegapiłem pewne zmienne użycie gry w golfa i kilka innych rzeczy.

@o=Array.new;$*.each_with_index do|j,i|a,e,n,b,u,q,r,z,y=0,j[0].to_i,j[1].to_i,j[2].to_i,j[3].to_i,['°','¯','-','^',"'"],['v','w','o','_',"-"],Array.new(7," "),"     ";g,h=[z,["(#{q[e]}#{r[n]}#{q[e]})","​ _|_ ​","/[|]\\","​  | ​ ​","​ / \\ ​"],["     ","​  ,  ","(#{q[e]}#{r[n]}#{q[e]})"]],[z,["​     ​","​ ^\"^ ​"],["​ ​ () ", "​ ​ ´` "],["​ .|. ​","​ :\": ​"]];2.times{h[3].unshift("  |  ​")}unless b==1;if b<1 && u<1;@o.push(z);elsif b<1;u<3 ? (a=5):(a=3);a.times{h[u].push(y)};@o.push(h[u]);elsif u<1;b==1 ? (a=2):(a=4);a.times{g[b].unshift(y)};@o.push(g[b]);elsif u>0;2.times{h[u].push(y)}if u<3&&b>1;@o.push(h[u]+g[b]);end;@o.push(z);end;@o.transpose.each do|v|;v.each do |w|;print w;end;print"\n";end

Przyjmuje N liczby zmiennych dekoracji. Z pewnością można z tym zrobić więcej golfa. Nie znam się na wielu sztuczkach Ruby, ale oto szansa! Cieszę się również, że mogę to rozwiązać.

Nie grał w golfa

@output = Array.new
$*.each_with_index do |j, i|
  # output decoration combo
  s = 0

  # set up vars for decoration input
  e = j[0].to_i
  n = j[1].to_i
  b = j[2].to_i
  u = j[3].to_i

  # Setup decorations/misc
  eyes = ['°','¯','-','^',"'"]
  nose = ['v','w','o','_',"-"]
  nothing = Array.new(7, " ")
  skeleton = ["(#{eyes[e]}#{nose[n]}#{eyes[e]})", "​ _|_ ​", "/[|]\\", "​  | ​ ​", "​ / \\ ​"]
  pumpkin = ["     ", "​  ,  ", "(#{eyes[e]}#{nose[n]}#{eyes[e]})"]
  fbat = ["​     ​", "​ ^\"^ ​"]
  rbat = ["​ ​ () ", "​ ​ ´` "]
  spider = ["​  |  ​", "​ .|. ​", "​ :\": ​"]
  spider.unshift("  |  ​") unless b == 1
  a = "     "
  bot = [nothing, skeleton, pumpkin]
  top = [nothing, fbat, rbat, spider]

  # if bottom and upper are empty
  if b < 1 && u < 1
    @output.push(nothing)
  # if bottom is empty
  elsif b < 1
    u < 2 ? (s = 3) : (s = 5)
    s.times {top[u].push(a)}
    @output.push(top[u])
  # if upper is empty
  elsif u < 1
    # put in white space before the decorations
    b == 1 ? (s = 2) : (s = 5)
    s.times {bot[b].unshift(a)}
    @output.push(bot[b])
  # if there's an upper decoration
  elsif u > 0
    # put in the top deco
    2.times {top[u].push(a)} if u < 3 && b > 1
    @output.push(top[u] + bot[b])
  end
  # Input the empty column
  @output.push(nothing)
end

# Transpose the array of arrays so that
# instead of outputting each line of a single each decoration
# what's output is each line of each decoration.
# Example:
# [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
# [[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5]]
@output.transpose.each do |data|
   data.each do |data1|
     print data1
   end
   print "\n"
end

Następujące:

ruby deco_g.rb 0000 0001 0002 0003 1110 1111 1112 1113 2220 2221 2222 2223 3310 3312 3321 3323

Wyprowadza to:

          ()    |                 ()   .|.                ()    |           ()          |
   ^"^    ´`    |          ^"^    ´`   :":         ^"^    ´`    |           ´`   ^"^    |
               .|.  (¯w¯) (¯w¯) (¯w¯) (¯w¯)                    .|.  (^_^) (^_^)        .|.
               :":   _|_   _|_   _|_   _|_                     :":   _|_   _|_         :":
                    /[|]\ /[|]\ /[|]\ /[|]\                         /[|]\ /[|]\
                      |     |     |     |     ,     ,     ,     ,     |     |     ,     ,
                     / \   / \   / \   / \  (-o-) (-o-) (-o-) (-o-)  / \   / \  (^_^) (^_^)
metropolia
źródło
1

Python 2, 331 bajtów „”

B,I,l,s=' '*5,'  |  ',' .|. ',' :": '
r=[]
for x in inputtt:m,n,b,u=(int(y)for y in x);e="°¯-^'"[m];H='('+e+"vwo_-"[n]+e+')';r+=[[[B,B,'  () ',[I,l,I][b]][u],[B,' ^"^ ','  ´` ',[I,s,I][b]][u],[[B,l][u==3],H][b==1],[[B,s][u==3],' _|_ '][b==1]]+[[B]*3,['/[|]\\',I,' / \ ',],[B,'  ,  ',H]][b]]
print'\n'.join(map(' '.join,zip(*r)))

Pobiera dane wejściowe jako listę ciągów

-

Przykład

Wejście: ["1212","4321","0123","1102","0020","1010","0101","2113"]

Wynik:

  ()          |     ()                     .|. 
  ´`   ^"^    |     ´`               ^"^   :": 
(¯o¯)        .|.              (¯v¯)       (-w-)
 _|_         :":               _|_         _|_ 
/[|]\                         /[|]\       /[|]\
  |     ,     ,           ,     |           |  
 / \  ('_') (°w°)       (°v°)  / \         / \ 
TFeld
źródło