Codifícame una galleta

16

Desafío

Codifique una cookie ASCII de un tipo de acuerdo con la entrada.

Entrada

  • El tipo de galleta. Esta es una de las tres cadenas: "Normal", "Chocolate" o "Nueces". Pueden ser argumentos de función, stdin (o equivalente más cercano) o argumentos de archivo.

Salida

  • Una cookie ASCII. Vea abajo.

Debe ser

     ___
    /   \
    |   |
    \___/

para entrada simple,

     ___
    /. .\
    | . |
    \___/

para el aporte de chocolate, y finalmente

     ___
    /^  \
    |^ ^|
    \___/

para entrada de tuerca.

Otra información

  • Este es mi primer desafío, es tan simple como puede ser. La retroalimentación constructiva es muy apreciada.
  • Use cualquier medio para hacerlo.
  • Los espacios finales están bien.
  • Este es un desafío de código de golf, por lo que gana la entrada más corta al final de 9 días (miércoles 12 de agosto de 2015).

¡Gracias!

El ganador es Jakube usando Pyth con 41 bytes. Gracias a todos aquellos que participaron. Ahora me encargaré de presentar desafíos más complicados.

The_Basset_Hound
fuente
77
Esto es agradable, pero bastante simple como es. Podría mejorarse enormemente al requerir la entrada del usuario para el diámetro o la cantidad de cookies de cada tipo. ¿Los chips de chocolate y las nueces tienen que estar en la ubicación según los ejemplos? (con diámetro variable, quizás podrían ser aleatorios). Dicho esto, es una mala forma de cambiar el desafío después de la publicación. Le sugiero que 1. lo deje como está o 2. bórrelo, piense un poco más y / o publíquelo en meta.codegolf.stackexchange.com/q/2140/15599 y vuelva a publicarlo más tarde.
Level River St
1
Permitir coberturas múltiples podría haber sido otra forma de hacer esto más interesante. Por otra parte, los desafíos de apariencia simple a menudo obtienen mucha participación. Por cierto, dos de las cookies tienen espacio en blanco en la salida de muestra. Eso probablemente no es intencional?
Reto Koradi
1
Hice una edición menor para cancelar la sangría, por lo que todas las cookies tienen el mismo espacio en blanco. ¿Asumo que los cuatro espacios iniciales son un problema de formato y no son obligatorios? Debe especificar si se permiten nuevas líneas iniciales / finales. Sugeriría no permitir espacios en blanco innecesarios, con la excepción de permitir una nueva línea final opcional.
Level River St
1
¿Se permitirán las funciones?
MayorMonty
1
Después de que @steveverrill abrió los ojos , parece ser una versión simplificada de ¿Quieres codificar un muñeco de nieve? . Algunos requisitos adicionales, como el diámetro variable mencionado, realmente lo mejorarían.
manatwork

Respuestas:

4

Pyth, 42 41 bytes

X" ___
/d a\\
|cac|
\___/"G.>"^X .  .^"Cz

Pruébelo en línea: Regular Input / Test Suite

Explicación:

 "..."                      template string
X     G                     replace "a..z" in ^ with:
                   Cz         convert z to an integer (base 256 of ord(char))
       .>"^X .  .^"           rotate "^X .  .^"
                              ["Plain"     -> " .  .^^X", 
                               "Chocolate" -> ".  .^^X ", 
                               "Nuts"      -> " .^^X . "]
Jakube
fuente
7

Rubí, 73

->s{' ___
/'+['^  \
|^ ^','. .\
| . ','   \
|   '][s[0].ord%3]+'|
\___/'}

Esta es una función lambda anónima. Aquí está en un programa de prueba:

g=->s{' ___
/'+['^  \
|^ ^','. .\
| . ','   \
|   '][s[0].ord%3]+'|
\___/'}

puts g.call(gets)

Simplemente usa la primera letra del tipo de cookie (en mayúsculas) y toma el módulo 3 para obtener un índice en el rango 0..2. Luego, devuelve la cadena que representa la cookie, con las cadenas apropiadas incrustadas en los lugares correctos.

Level River St
fuente
¿Qué crees que ordpuede hacer el método si lo llamas para una cadena completa? Mi primera idea fue formatear:->s{" ___\n/%1$s \\\n|%1$s %1$s|\n\\___/"%'^. '[s.ord%3]}
manatwork
Olvídalo. Una vez más trdemuestra ser más corto:->s{' ___↵/% \↵|% %|↵\___/'.tr ?%,'^. '[s.ord%3]}
manatwork
@manatwork gracias por tus sugerencias. Me perdí s[0] --> s, nunca se me ocurrió intentarlo. Su código no parece dar la respuesta correcta para la caja de chocolate, ya que las chispas de chocolate están en diferentes lugares que las nueces. Sin embargo, hay algunas ideas útiles allí, las veré más adelante. No he usado trni %antes.
Nivel River St
Ups Tienes razón. Eso fue un intento rápido BC (antes del café). Demasiado pronto para notar la diferencia de colocación de las fichas. :( (Por cierto, el “%” no tiene nada que ver con trla sintaxis 's es sólo un personaje que no participan en el arte cookie que he utilizado como marcador de posición..)
manatwork
4

Python 2.7.6, 99 bytes

def c(t):n=hash(t)%3;return" ___\n/"+" ^."[n]+" "+"  ."[n]+"\\\n|"+[" ","^ ^"," . "][n]+"|\n\\___/"

Este algoritmo se basa en el hecho de que hash(cookie)%3da 0 cuando cookie = "Plain", 1 cuando cookie = "Nuty 2 cuando cookie = "Chocolate. Si alguien conoce una forma de acortar este código, hágamelo saber en los comentarios.

Loovjo
fuente
"Use cualquier medio para hacerlo". Sí, se permiten argumentos opcionales.
The_Basset_Hound
Está bien, pero creo que seguiré con el primero y dejaré el segundo como está.
Loovjo
@BetaDecay Simplemente no creo que los argumentos opcionales realmente estén en el espíritu del código-golf. Realmente no sé por qué, solo creo que no debería permitirse. Ahora que ambos tienen la misma longitud, eliminé la versión de argumentos opcionales.
Loovjo
3
@Loovjo El uso de métodos extraños e inusuales es todo el espíritu del código golf :)
Beta Decay
3

C: 122

q(char *p){char *t,*m;int i=*p%3;t=i?i%2?". .":"   ":"^  ";m=i?i%2?" . ":"   ":"^ ^";printf(" ___\n/%s\\ \n|%s|\n\\___/",t,m);}

Explicación después de que termine de jugar al golf.

Ejemplo de uso:

 int main(void){
 q("Plain");
 printf("\n");
 q("Nut");
 printf("\n"); 
 q("Chocolate");
 }
Joshpbarron
fuente
3

CJam, 49 48 bytes

" ___
/""^  ^ ^. . ."S7*+6/rci=3/"\
|"*"|
\___/"

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

" ___
/"

e# Push that string.

"^  ^ ^. . ."S7*+6/

e# Push that string, append 7 spaces and split into chunks of length 6.
e# This pushes ["^  ^ ^" ". . . " "      "].

rci

e# Read from STDIN, cast to character, then to integer.
e# "Plain", "Chocolate", "Nuts" -> 'P', 'C', 'N' -> 80, 67, 78

=

e# Select the corresponding element from the array.
e# Arrays wrap around in CJam, so for an array A of length 3,
e# A80= is A2=, A67= is A1= and A78= is A0=.

3/

e# Split into chunks of length 3.

"\
|"*

e# Join those chunks, using that string as separator.

"|
\___/"

e# Push that string.

Al final, CJam imprime automáticamente todos los elementos en la pila.

Dennis
fuente
3

Javascript (ES6), 90

s=>" ___\n/"+(s.length-4?s.length-5?". .\\\n| . ":"   \\\n|   ":"^  \\\n|^ ^")+"|\n\\___/"

Esta es una función de flecha anónima. Utiliza la longitud de la entrada para determinar qué cookie dibujar.

Explicación:

s=>
 " ___\n/" +               //build the first part of the cookie

 (s.length - 4 ?           //if the length is 4, this condition will evaluate to 0, which coerces to false. Otherwise it is true

      s.length - 5 ?            //if the length is 5, this evaluates to false; otherwise true

           ". .\\\n| . " :      //build the unique part of the Chocolate cookie, if length was not 5
           "   \\\n|   "        //build the unique part of the Plain cookie, if length was 5

      : "^  \\\n|^ ^"      //build the unique part of the Nuts cookie, if length was 4
 )

 + "|\n\\___/"             //build the last part of the cookie, and implicitly return the built string

Probar:

f=s=>" ___\n/"+(s.length-4?s.length-5?". .\\\n| . ":"   \\\n|   ":"^  \\\n|^ ^")+"|\n\\___/"

console.log(f("Nuts"))
console.log(f("Plain"))
console.log(f("Chocolate"))
jrich
fuente
3

BrainFuck, 481 447 436 bytes

¿Por qué no BrainFuck ?, el programa probablemente se puede jugar más, pero creo que es bastante bueno.

,>++++++[-<---------->]<-------[----------->>>-<<+<[-->->+<<]]>>>+>>++.<+++++++++[->>>>>>>++++++++++<+++++<++++++++++++++<++++++++++<+++++<++++++++++<+++<]++++++++++>+++.>+++++...>++>++>-->+>++++<<<<<<<.<<<[->>>>>>.>>>.<<<<<.>>>>>.<<.<<<<.>>>>>.<<<<.>>>>>.<<<<<.>>>>.<<<<<.>>>>.<<...>.<<<<<<]>[->>>>>.<<...>>>.<<<<.>>>>>.<<<<...>>>>.<<<<<.>>>>.<<...>.<<<<<]>[->>>>.>>>>.<<<<<<..>>>.<<<<.>>>>>.>>.<<<<<<.>>>>>>.<<.<<<<<.>>>>.<<...>.<<<<]
Por encima de fuego
fuente
3

C # Con sangría y salto de línea

using System;
class Cookie
{
    static void Main()
    {
      String E="",N="",C=Console.ReadLine();
      if(C=="P"){E="   ";N="   ";}
      if(C=="C"){E=". .";N=" . ";}
      if(C=="N"){E="^  ";N="^ ^";}
      Console.Write(" ___ \n/" + E + "\\ \n|" + N + "|\n\\___/");
    }
}

Golfizado (225 caracteres)

using System;class X{static void Main(){String E="",N="",C=Console.ReadLine();if(C=="P"){E="   ";N="   ";}if(C=="C"){E=". .";N=" . ";}if(C=="N"){E="^  ";N="^ ^";}Console.Write(" ___ \n/" + E + "\\ \n|" + N + "|\n\\___/");}}[![enter image description here][1]][1]
Merin Nakarmi
fuente
1
¿Por qué no String C= Console.ReadLine(),E=... etc.?
rpax
Hola @rpax, tu comentario me ayudó a recortar 2 caracteres. Gracias.
Merin Nakarmi
2

C # 6, 105 bytes

Así que casi obtuve estos sub-100 bytes, aunque no tengo idea de dónde extraer los últimos bytes: C

string C(string t)=>$" ___\n/{(t[0]=='C'?". .\\\n| . ":t[0]=='N'?"^  \\\n|^ ^":"   \\\n|   ")}|\n\\___/";
Sok
fuente
2

Pyth, 58 54 53 52 50 bytes

+d*\_3p+\/j"\\
|"c@["^  ^ ^"*". "3*d6)Chz3\|"\___/

No creo que se pueda jugar más al golf. Realmente estaba tratando de reducir esto en menos de 50 bytes

Downgoat
fuente
Una rápida y fácil es". . . " -> *". "3
Sp3000
Si está interesado, encontré un buen método para hacerlo en 42 bytes .
Jakube
2

JavaScript (ES6), 72 bytes

Tan simple como parece ... las nuevas líneas se cuentan como 1 byte cada una.

f=s=>` ___
/${s[4]?s[5]?`. .\\
| . `:`   \\
|   `:`^  \\
|^ ^`}|
\\___/`

Manifestación

Como es ES6, esta demostración solo funciona en Firefox y Safari por ahora.

f=s=>` ___
/${s[4]?s[5]?`. .\\
| . `:`   \\
|   `:`^  \\
|^ ^`}|
\\___/`

// Snippet stuff

A.innerHTML = f("Nuts");
B.innerHTML = f("Plain");
C.innerHTML = f("Chocolate");
<p>Nuts</p>
<pre id=A></pre>

<p>Plain</p>
<pre id=B></pre>

<p>Chocolate</p>
<pre id=C></pre>

rink.attendant.6
fuente
2

Commodore 64 BASIC, 181 bytes

10 INPUT A$
20 IF A$="PLAIN" THEN B$="/   \":C$="|   |"
30 IF A$="CHOCOLATE" THEN B$="/. .\":C$="| . |"
40 IF A$="NUTS" THEN C$="/^  \":C$="|^ ^|"
50 PRINT" ___":PRINT B$:PRINT C$:PRINT"\___/"

Notas:

En lugar de barras invertidas, \se han utilizado los caracteres SHIFT-M, para barras diagonales /- SHIFT-N y para canalizaciones |- SHIFT-T. SHIFT-Z (signo de diamante de tarjeta) se utilizó para^ . De hecho, los caracteres no importan ya que todos ocupan un byte cada uno.

Debido a que en C64 cada comando (PRINT, INPUT, THEN, etc.) toma 2 bytes en la memoria (o incluso uno, IIRC), valió la pena probar el lenguaje BASIC (sin embargo, tomó más bytes de lo que esperaba).

El tamaño del programa se calculó midiendo la memoria libre antes de escribir el programa (38909 bytes) y después (38728 bytes), utilizando PRINT FRE(0)+65536 comando, dando 181 bytes de diferencia.

Código probado y capturas de pantalla preparadas con esta herramienta: http://codeazur.com.br/stuff/fc64_final/ (GPL).

Capturas de pantalla

C64 captura de pantalla 1

Captura de pantalla 2 de C64

Voitcus
fuente
2

Lua 5.3, 113 bytes 112 bytes

c=io.read()print(' ___\n/'..(c=='plain'and'   \\\n|   'or c=='nut'and'^  \\\n|^ ^'or'. .\\\n| . ')..'|\n\\___/')

Utiliza mucho el operador ternario y la concatenación de cadenas, y eliminé todo el espacio en blanco que no es parte de la salida en sí.

Muddmaker
fuente
2

Java 258 217 caracteres / bytes


Golfed

class C{public static void main(String[] a){p(" ___");if(a[0].equals("Chocolate")) {p("/. .\\");p("| . |");}if(a[0].equals("Nut")){p("/^  \\");p("|^ ^|");}p("\\___/");}static void p(String s) {System.out.println(s);}}

Original

class C {
    public static void main(String[] a) {
        p(" ___");
        if(a[0].equals("Chocolate")) {
            p("/. .\\");
            p("| . |");
        }
        if(a[0].equals("Nut")){
            p("/^  \\");
            p("|^ ^|");
        }
        p("\\___/");
    }
    static void p(String s) {
        System.out.println(s);
    }
}
OverCoder
fuente
1

LUA 270 caracteres 270 bytes

    c = io.read()
    if c == "plain" then
    print" ___"
    print"/   \\"
    print"|   |"
    print"\\___/"
    io.read()
    elseif c == "chocolate" then
    print" ___"
    print"/. .\\"
    print"| . |"
    print"\\___/"
    io.read()
    elseif c == "nut" then
    print" ___"
    print"/^  \\"
    print"|^ ^|"
    print"\\___/"
    end
Alex Allen
fuente
esta es mi segunda respuesta a cualquier desafío
Alex Allen
Se puede extraer el "Qué tipo de cookie quieres", no es necesario. Eso saca 39 bytes allí mismo.
The_Basset_Hound
Este es un desafío de código de golf. Intenta acortar un poco tu código. Por ejemplo, usted no necesita la impresión inicial, acortar cookiea c, espacios en blanco eliminar durante la IFS, eliminar las innecesarias io.read()s, la primera y última línea de una cookie es siempre la misma, ....
Jakube
@BassetHound eliminó la declaración impresa
Alex Allen
@Jakube acortó la cookie a c
Alex Allen
1

LOLCODE 265 caracteres

HAI
I HAS A T
GIMMEH T
VISIBLE " ___"
BOTH SAEM T AN "Chocolate", O RLY?
YA RLY
VISIBLE "/. .\"
VISIBLE "| . |"
OIC
BOTH SAEM T AN "Nut", O RLY?
YA RLY
VISIBLE "/^ ^\"
VISIBLE "|^  |"
OIC
BOTH SAEM T AN "Plain", O RLY?
YA RLY
VISIBLE "/   \"
VISIBLE "|   |"
OIC
VISIBLE "\___/"
KTHXBYE

Run

OverCoder
fuente