Emociones enteras

12

Escriba un programa o función que "reaccione" a un número entero dado n (entrada a través del parámetro de función / args / stdin)

Al programa no le importan los números negativos, le gustan los pares, no le gustan los números impares y teme al número 13.

Debería mostrar lo siguiente:

si n <0:

 --------------------------
 |                        |
 |                        |
(|      _          _      |)
 |                        |
 |                        |
 |                        |
 |                        |
 |       oooooooooo       |
 |                        |
 |                        |
 |                        |
 --------------------------

si n% 2 == 0 yn> -1:

 --------------------------
 |                        |
 |                        |
(|      ^          ^      |)
 |                        |
 |                        |
 |                        |
 |     o            o     |
 |       oooooooooo       |
 |                        |
 |                        |
 |                        |
 --------------------------

si n% 2 == 1 yn> -1 yn! = 13:

 --------------------------
 |                        |
 |                        |
(|      >          <      |)
 |                        |
 |                        |
 |                        |
 |                        |
 |       oooooooooo       |
 |     o            o     |
 |                        |
 |                        |
 --------------------------

si n == 13:

 --------------------------
 |                        |
 |                        |
(|     (O)        (O)     |)
 |                        |
 |                        |
 |       oooooooooo       |
 |       o        o       |
 |       oooooooooo       |
 |                        |
 |                        |
 |                        |
 --------------------------

La solución más corta en bytes gana.

Markuz
fuente
2
13 es extraño. ¿Solo sacamos una cara? Los negativos son pares e impares ...
@ MartinBüttner, en ese caso, la primera regla sobre números negativos es completamente innecesaria. La única prioridad que realmente requiere todas las reglas es que las primeras y las últimas tengan prioridad sobre las medias.
Peter Taylor
@PeterTaylor oops, buen punto.
Martin Ender
@StandardToaster Edité las condiciones de salida para evitar malentendidos
Markuz

Respuestas:

4

CJam - 169

S24*aB*2li_D=3{_0<2{_2%}?}?\;:X"^^<>__":s"(O)"a2*+2/=~6X3=-{S*_@+_,C\-S*2*+@@++}:F~t7'o5*_7F:MtX3={5Mt6'o_7Ft}*X2<{X2*6+'o_5Ft}*{" |"\+'|+}%S'-26*+aa2*\*_3=1>"()"\*3\tN*

Pruébalo en http://cjam.aditsu.net/

Explicación de alto nivel:

S24*aB*crea una matriz llena de espacios, ya que la cara sin bordes
li_D=3{_0<2{_2%}?}?\;:Xlee el número y lo convierte en 0 (par), 1 (impar), 2 (negativo) o 3 (13), almacenándolo en X
X"^^<>__":s"(O)"a2*+2/=~selecciona los tipos de ojos (2 cuerdas)
{S*_@+_,C\-S*2*+@@++}:F- función F toma 2 cadenas (digamos S1, S2) y un número (decir N) y hace que una cadena 24-char contiene N espacios, S2, otros espacios, S1, N espacios
2 (eyes) 6X3=- (F)~tpone el línea de los ojos en la matriz
7'o5*_7F:Mtpone el línea de boca común en la matriz, y también la guarda en M
X3={5Mt6'o_7Ft}*si X es 3, coloca a M nuevamente en la matriz, 2 líneas más arriba, y coloca los lados de la boca en medio
X2<{X2*6+'o_5Ft}*si X es 0 o 1, coloca las esquinas de la boca en la posición apropiada
{" |"\+'|+}%agrega bordes verticales y un espacio a la izquierda en cada línea
S'-26*+aa2*\*agrega los bordes horizontales
_3=1>"()"\*3\tagrega las orejas
N* agrega separadores de nueva línea

aditsu renunció porque SE es MALO
fuente
4

Rubí, 241 224

f=->n{s=" #{?-*26}
"
s+=" |#{' '*24}|
"*11+s
s[84]=?(
s[110]+=?)
s[233,12]=m=?O*12
s[91,3]=s[102,3]=n<0?' _ ':n==13?(s[177,12]=m;s[205]=s[216]=?O;'(O)'):(s[203+d=n%2*56]=s[218+d]=?O;" #{n%2<1??^:b=?>} ")
s[103]=?<if b
$><<s}

Esto define una función que se llamará like f[13]. Estoy seguro de que hay mucho margen de mejora, similar a lo que Ventero me ayudó a hacer aquí .

Básicamente, primero estoy construyendo el marco áspero y conecto las orejas y la boca. Luego coloco los ojos dependiendo del número. Mientras trabajo con los personajes para ponerlos en los ojos, también cuido las diferentes bocas para que no tenga que verificar el tipo de número nuevamente. Finalmente, necesito arreglar el ojo derecho para números impares, porque el código anterior pone la misma cadena en ambos ojos.

Martin Ender
fuente
4

C # - 349 bytes

Ciertamente no va a ganar ningún premio, sino una forma diferente de hacer las cosas.

Golfizado:

class P{static void Main(string[]A){int j=64,i,r=0,n=int.Parse(A[0]);for(var f=(n<0?"IDID-TDTD-":n==13?"HDHD(IDIDOJDJD)SDSD(TDTDOUDUD)KIRI JHSJo":n%2<1?"IDID^TDTD^HIHIoUIUIo":"IDID>TDTD<HKHKoUKUKo")+@"JJSJoCBZM BB[M|BA[N-ADAD(\D\D)AA\N AA]N"+"\n";j++<78;)for(i=64;i++<93;System.Console.Write(f[r]))for(r=0;f[r++]>i|f[r++]>j|i>f[r++]|j>f[r++];r++);}}

Menos golfizado:

class P
{
    static void Main(string[]A)
    {
        int j=64,i,r=0,n=int.Parse(A[0]); // everything is offset by 65 in this program

        for(
            var f=(n<0?"IDID-TDTD-": // this string describes a set of rectangles (x1,y1,x2,y2,ch)
                n==13?"HDHD(IDIDOJDJD)SDSD(TDTDOUDUD)KIRI JHSJo":
                n%2<1?"IDID^TDTD^HIHIoUIUIo":
                "IDID>TDTD<HKHKoUKUKo"
                )+@"JJSJoCBZM BB[M|BA[N-ADAD(\D\D)AA\N AA]N"+"\n";

            j++<78;) // the loop then prints the rectangles to the screen
            for(i=64;i++<93;System.Console.Write(f[r]))
                for(r=0;f[r++]>i|f[r++]>j|i>f[r++]|j>f[r++];r++);
    }
}
VisualMelon
fuente
3

Python 2 - 255

No muy corto, pero lo publicaré de todos modos:

n=input()
o='o'
S='  '
w=y=7*S
b=' '+'-'*26+'\n'
p=' |%19s     |\n'
E=p%y*2
v=S+o*10+S
u=z=o+6*S+o
A=a='^ '
if n%2:A='< ';a='> ';u=y;w=z
if n<0:A=a='_ ';u=w=y
if n==13:A=a='(O)';u=w=v;v=S+o+S*4+o+S
print b+E+'(|%8s%11s     |)\n'%(a,A)+E+p%u+p%v+p%w+E+b

¡Echo de menos la asignación de elementos para cadenas en Python! :( Entonces uno podría comenzar con la matriz de caracteres y simplemente modificar los ojos y la boca.

Falko
fuente
Originalmente, aprendí Ruby para un desafío PPCG similar en el que necesito cadenas inmutables precisamente por ese motivo. : D
Martin Ender
Puede hacer b=bytearray()y luego b+'mystring'generará un bytearray mutable, que se imprime de la misma manera que cualquier otra cadena.
Veedrac
3

Pitón 2, 257

No es un ganador, sino un enfoque alternativo, ¡se acercó bastante! Espero poder exprimir algunos caracteres más. Construye todas las líneas pieza por pieza, utilizando subcadenas comunes para realmente exprimir los bytes.

X,Z=R=" |"
Q=X*5
Y=X*7
A=X+"-"*26
B=R+X*24+Z
n=input()
a,b,c,d,e,f,g=((("^>^<o  o "+Q)[n%2::2],"OO  ()o")[n==13],"__"+Q)[n<0]
for F in(A,B,B,"(|"+Q+e+a+f+Y+X+e+b+f+Q+"|)",B,B,R+Y+g*10+Y+Z,R+Q+c+X+g+Y+X+g+X+c+Q+Z,R+Y+"o"*10+Y+Z,R+Q+d+Y+Q+d+Q+Z,B,B,A):print F
Claudiu
fuente
2

CJam, 202

[S'-26*N]:Z[S'|:PS24*PN]:RR'(PS5*qi:XD=X0<-X2%2*+:Y[" ^ "_" > ""(O)"" - "__]=S8*Y[" ^ ""   "" < ""(O)"" - "__]=S5*P')NRRXD=[SPS7*'oA*S7*PN]:QR?Y[[SPS5*'oSC*'oS5*PN]:T_R[SPS7*'oS8*'oS7*PN]RRR]=QY2=TR?RRZ
Ypnypn
fuente