Snowman Bowling


29

(relacionado / inspirado por: Dibuja una formación de bolos )

Un pasatiempo divertido en los meses de invierno es realizar bolos de muñeco de nieve, usando una pelota grande (como una pelota de baloncesto) y pequeñas figuras de muñeco de nieve. Recreemos esto en ASCII.

Cada muñeco de nieve consta de lo siguiente:

(.,.)
( : )

Aquí está la alineación de los diez "alfileres" del muñeco de nieve

(.,.) (.,.) (.,.) (.,.)
( : ) ( : ) ( : ) ( : )
   (.,.) (.,.) (.,.)
   ( : ) ( : ) ( : )
      (.,.) (.,.)
      ( : ) ( : )
         (.,.)
         ( : )

Estos "pines" están etiquetados de 1a 10como

7 8 9 10
 4 5 6
  2 3
   1

Hasta ahora, tan estándar. Sin embargo, a diferencia de los bolos normales, los alfileres del muñeco de nieve simplemente se aplanan y no se quitan por completo. Esto lo hace alguien que necesita aplanar manualmente la nieve de cualquier pin que haya sido golpeado. Un muñeco de nieve aplanado está representado por _____(cinco guiones bajos), con un espacio en blanco arriba. Aquí hay un ejemplo con los 1 3 5 6 9 10pines aplanados (lo que significa que solo 2 4 7 8quedan los pines)

(.,.) (.,.)
( : ) ( : ) _____ _____
   (.,.)
   ( : ) _____ _____
      (.,.) 
      ( : ) _____

         _____

Entrada

  • Una lista de enteros desde 1hasta 10 en cualquier formato conveniente que represente qué pines se golpearon y, por lo tanto, deben aplanarse.
  • Cada número solo aparecerá como máximo una vez, y los números pueden estar en cualquier orden (ordenados, sin clasificar, ordenados descendentes): su elección, lo que haga que su código sea más golfoso.
  • Se garantiza que la entrada tenga al menos un número entero.

Salida

La representación artística ASCII resultante de los pines del muñeco de nieve, con los pines correctos aplanados.

Reglas

  • Las nuevas líneas o espacios en blanco iniciales o finales son opcionales, siempre que los caracteres se alineen correctamente.
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Si es posible, incluya un enlace a un entorno de prueba en línea para que las personas puedan probar su código.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

Ejemplos

1 3 5 6 9 10

(.,.) (.,.)
( : ) ( : ) _____ _____
   (.,.)
   ( : ) _____ _____
      (.,.) 
      ( : ) _____

         _____

1 2 3

(.,.) (.,.) (.,.) (.,.)
( : ) ( : ) ( : ) ( : )
   (.,.) (.,.) (.,.)
   ( : ) ( : ) ( : )

      _____ _____

         _____

1 2 3 4 5 6 8 9 10

(.,.)
( : ) _____ _____ _____

   _____ _____ _____

      _____ _____

         _____

18
Código de golf ? No código de bolos ?
Mark

¿Podemos tomar los números de entrada indexados desde 0? Y si es posible, tome los valores de entrada sin espacios como 0123456789 en lugar de 1 2 3 4 5 6 7 8 9 10?
Teal pelican

Perfecto: D me permite hacer un intento más fácil en> <>
Teal pelican

44
No apruebo aplanar muñecos de nieve.

Me identifico como un muñeco de nieve y encuentro este aplanamiento.
conquistador

Respuestas:


7

05AB1E , 45 44 bytes

TF"(.,.)( : )"„ _5×{«4ä2ä¹N>åè})4L£Rvyø»}».c

Pruébalo en línea!

Explicación

TF                                           # for N in [0 ... 9] do:
  "(.,.)( : )"                               # push string
              „ _                            # push the string " _"
                 5×                          # repeat it 5 times
                   {                         # sort
                    «                        # concatenate the strings
                     4ä                      # split the string in 4 parts
                       2ä                    # split the list in 2 parts
                         ¹N>åè               # if index+1 is in the input, push the first part
                                             # else push the second part
                              }              # end loop
                               )             # wrap stack in a list
                                4L£          # split list in parts of size 1,2,3,4
                                   R         # reverse list
                                    v        # for each list in list of lists
                                     yø      # transpose the list
                                       »     # join by spaces and newlines
                                        }    # end loop
                                         »   # join by newlines
                                          .c # centralize

46

Muñeco de nieve 1.0.2 , 157 bytes

(()("789:045600230001"4aG::48nSdU][:#:]eq]/nM;AsI[:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI;:"  "wRdUaC;bI\#**\;aMaZ:" "aJ1AfL;aM;aM1AfL"
"aJ1AfL*))

Pruébalo en línea!

Cuando vi este desafío, supe que tenía que responder en el idioma perfecto ...

Esta es una subrutina que toma la entrada como una matriz de números y las salidas como una cadena a través del permavar actual.

Envuelto para "legibilidad" / estética:

(()("789:045600230001"4aG::48nSdU][:#:]eq]/nM;AsI[
:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI
;:"  "wRdUaC;bI\#**\;aMaZ:" "aJ1AfL;aM;aM1AfL"
"aJ1AfL*))

Versión ungolfed / comentada:

}
1wR`
3wR`aC`
5wR`aC`
6wR`aC`
9wR`aC`
*

((
    )(
    "789:045600230001"  // pin layout data
    4aG                 // split into groups of 4; we need each row twice
    :                   // map over groups of 2 output lines
        :               // map over pins (or whitespace)
            48nS        // subtract ascii '0'
            dU][        // duplicate the pin; we need it in the if{}
            :           // if (pin) {
                #:]eq]/nM;AsI[:"_____"wR["     "wR/aC;:"( : )"wR["(.,.)"wR/aC;bI
            ;:          // } else {
                "  "wRdUaC
            ;bI         // }
            \#**\       // maneuver the permavars around to discard pin
        ;aM
        aZ:" "aJ1AfL;aM
    ;aM
    1AfL                // flatten (simulate a flatmap)
    "
"aJ                     // join on newline
    1AfL                // flatten again into a single string
    *
))

#sP

17
Prácticamente el único contexto que se conocerá como "el lenguaje perfecto"
,:

2
Un muñeco de nieve matando a su propia especie ... ¡Monstruo!
RudolfJelin

10

apilada , no competitiva, 118 bytes

Agregué deepmapy algunas otras cosas después de este desafío, junto con toneladas de correcciones de errores. Pruébalo aquí!

@a((7 8 9 10)(4 5 6)(2 3)(1)){e:('(.,.)
( : )' ' 
_'5 hrep)a e has#'  'hcat
}deepmap{e i:' 
 'i 3*hrep e,$hcat#/!LF+}map

Sin golf

{ a :
  ((7 8 9 10) (4 5 6) (2 3) (1))
  { e :
    (
      '(.,.)' LF '( : )' + + 
      ' ' LF '_' + + 5 hrep
    ) @possible
    a e has @ind
    possible ind get @res
    '  ' @padding
    res padding hcat return
  } deepmap
  { e i:
    ' ' LF ' ' + + i 3 * hrep
    e ,
    $hcat insert!
    LF +
  } map
} @:bowl

(1 2 3 4 6 10) bowl out

Salida:

(.,.) (.,.) (.,.)       
( : ) ( : ) ( : ) _____ 
         (.,.)       
   _____ ( : ) _____ 

      _____ _____ 

         _____ 

Este lenguaje se ve genial. El ejemplo de Fisher-Yates en la wiki es hermoso.
Jordan

@ Jordan muchas gracias! eso significa mucho para mí :)
Conor O'Brien

7

Python 2, 248 243 241 226 224 223 221 210 206 200 177 bytes

-5 gracias a @Rod

-15 nuevamente gracias a Rod

-1 usando el cálculo del espacio nuevamente desde Rod

Parece más largo debido a más líneas y sangrías, pero sorprendentemente 11 bytes más cortos.

Estoy seguro de que esto será inferior a 200 ...

Tenía razón, pero no sin 23 bytes de pistas serias de @ Pietu1998. ¡Muchas gracias!

i,z=input(),0;m=['']*10;n=m[:]
for x in range(11):m[x-1],n[x-1]=('(.,.)',' '*5,'( : )','_'*5)[x in i::2]
for y in 10,6,3,1:
 for q in m,n:print' '*3*z+' '.join(q[y-4+z:y])
 z+=1

Pruébalo en línea!

Toma la entrada como una lista de enteros. Demasiado grande en 248 pero funciona.



6

C # 233 221 213 203 bytes

El método toma una matriz int a como la lista de pines caídos

string S(int[]a){string o="",x=o,y=o,z=o;for(int i=10;i>0;){var c=a.Contains(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;if(i==7|i<5&i--!=3){o+=$"{z}{x}\n{z}{y}\n";x=y="";z+="   ";}}return o;}

envuelto

string S(int[]a){string o="",x=o,y=o,z=o;for(int i=10;i>0;)
{var c=a.Contains(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":
"( : ) ")+y;if(i==7|i<5&i--!=3){o+=$"{z}{x}\n{z}{y}\n";x=y="";
z+="   ";}}return o;}

expandido

string S(int[] a)
{
    string o = "", x = o, y = o, z= o;
    for (int i = 10; i > 0;)
    {
        var c = a.Contains(i);
        x = (c ? "      " : "(.,.) ") + x;
        y = (c ? "_____ " : "( : ) ") + y;

        if (i==7|i<5&i--!=3)
        {
            o += $"{z}{x}\n{z}{y}\n";
            x = y = "";
            z += "   ";
        }
    }
    return o;
}

eliminó algunos bytes por sugerencias en los comentarios de Ghost, raznagul y auhmaan.


2
Bienvenido a PPCG!
AdmBorkBork

¡bonito! Puede guardar algunos bytes (¿5?) Si coloca i-- en for y cambia new[]{7,4,2,1}.Contains(i--)ai<9&&i%3==1||i==2
Ghost

Puede mejorar eso en dos más (para -7) coni==7||i<5&&i!=3
Ghost

@Ghost gracias! lo derribó un poco más usando ors y ands que no son de cortocircuito, y aún disminuyendo con la referencia final a ii==7|i<5&i--!=3
Erresen

Puede guardar algunos bytes reemplazándolos var o="";var x=...por string o="",x=""....
raznagul

5

Lote, 262 bytes.

@echo off
for /l %%i in (1,1,10)do set s%%i=( : ) 
for %%i in (%*)do set s%%i=_____ 
set l=call:l 
%l%%s7%%s8%%s9%%s10%
%l%"   %s4%%s5%%s6%
%l%"      %s2%%s3%
%l%"         %s1%
exit/b
:l
set s=%~1
set s=%s:( : )=(.,.)%
echo(%s:_____=     %
echo(%~1

Nota: Las líneas 2, 3 y 4 terminan en un espacio, y también genera un espacio final en cada línea. Estos se pueden eliminar a un costo de 5 bytes. Funciona creando las variables s1 ... s10 como las mitades inferiores de los muñecos de nieve, y luego alisando las dadas como argumentos de línea de comandos. Las filas apropiadas se imprimen dos veces, la primera vez con las mitades inferiores reemplazadas por las mitades superiores. Esto ahorra 18 bytes sobre el uso de dos conjuntos de medias variables superior e inferior.


1
Esa es una respuesta ingeniosa.
AdmBorkBork

4

JavaScript, 154 149 bytes

f=
a=>`6 7 8 9
_3 4 5
__1 2
___0
`[r='replace'](/\d|_/g,m=>++m?~a.indexOf(m)?'_____':'( : )':'   ')[r](/.*\n?/g,m=>m[r](/ : |_/g,s=>s=='_'?' ':'.,.')+m)


I.oninput=()=>O.innerHTML=f(JSON.parse(`[${I.value.match(/\d+/g)}]`))
I.oninput()
<input id=I value="1 3 5 6 9 10"><pre id=O>


3

Pyth, 63 bytes

j.ejm+**3k;j;db)_CcR[1 3 6).e:*T]btMQ@m*T]*5d,d\_kc2"(.,.)( : )

Un programa que toma la entrada de una lista de enteros e imprime el resultado.

Banco de pruebas

[Explicación más tarde]


3

Pyth, 51 bytes

El código contiene algunos no imprimibles, así que aquí hay un xxdhexdump.

00000000: 6a6d 2e5b 3233 5f6a 3b6d 4063 323f 7d6b  jm.[23_j;m@c2?}k
00000010: 5172 2235 2035 5f22 392e 2220 3b5b 8db2  Qr"5 5_"9." ;[..
00000020: 1778 a822 6472 4673 4d50 4253 2d34 2f64  .x."drFsMPBS-4/d
00000030: 323b 38                                  2;8

Pruébalo en línea.

Sin imprimibles, 52 bytes

jm.[23_j;m@c2?}kQr"5 5_"9").,.() : ("drFsMPBS-4/d2;8

Pruébalo en línea.


2

Javascript 178 169 bytes

Esencialmente un puerto de mi respuesta C #.

Toma una matriz int como la lista de "pines" aplanados;

f=a=>{o=x=y=z="";for(i=10;i>0;){c=a.includes(i);x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;if(i==7|i<5&i--!=3){o+=z+x+"\n"+z+y+"\n";x=y="";z+= "   ";}}return o}

Envuelto:

f=a=>{o=x=y=z="";for(i=10;i>0;){c=a.includes(i);
x=(c?"      ":"(.,.) ")+x;y=(c?"_____ ":"( : ) ")+y;
if(i==7|i<5&i--!=3){o+=z+x+"\n"+z+y+"\n";x=y="";
z+= "   ";}}return o}

Ampliado y explicado:

// function f takes parameter a (an array of ints) 
f = a => {

    // four strings:
    // o: output
    // x: top row of snowmen
    // y: bottom row of snowmen
    // z: padding to indent the snowmen
    o = x = y = z = "";

    // loop from 10 to 1 (the pins)
    // remove the "afterthought" decrement - we can do that later
    for (i = 10; i > 0;) {

        // set the boolean c to whether the current pin has been flattened
        c = a.includes(i);

        // prefix x and y with the appropriate "sprite"
        // using a ternary if on c
        x = (c ? "      " : "(.,.) ") + x;
        y = (c ? "_____ " : "( : ) ") + y;

        // determine if we've reached the end of a row (i equals 7, 4, 2 or 1)
        // use non shortcircuit operators to save bytes and ensure we hit the final i, because...
        // we also decrement i here 
        // (we didn't do this in the for loop declaration to save a byte)
        if (i == 7 | i < 5 & i-- != 3) {

            // concatenate our rows x & y,
            // prefixing them with the padding z,
            // postfixing them with a newline
            o += z + x + "\n" + z + y + "\n";

            // reset x and y rows
            x = y = "";

            // increase our padding for next time
            z += "   ";
        }
    }

    // return our final string (no semicolon to save a byte)
    return o
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.