Code-moi un cookie

16

Défi

Codez un cookie ASCII d'une sorte en fonction de l'entrée.

Contribution

  • Le type de cookie. Il s'agit de l'une des trois chaînes: "Plain", "Chocolate" ou "Nuts". Peut être des arguments de fonction, stdin (ou équivalent le plus proche) ou des arguments de fichier.

Production

  • Un cookie ASCII. Voir ci-dessous.

Doit être

     ___
    /   \
    |   |
    \___/

pour entrée simple,

     ___
    /. .\
    | . |
    \___/

pour l'entrée de chocolat, et enfin

     ___
    /^  \
    |^ ^|
    \___/

pour l'écrou.

Les autres informations

  • C'est mon premier défi, c'est aussi simple que possible. Les commentaires constructifs sont grandement appréciés.
  • Utilisez tous les moyens pour le faire.
  • Les espaces de fin sont très bien.
  • Il s'agit d'un défi de golf de code, donc l'entrée la plus courte au bout de 9 jours (mercredi 12 août 2015) l'emporte.

Je vous remercie!

Le gagnant est Jakube utilisant Pyth avec 41 octets. Merci à tous ceux qui ont participé. Je vais maintenant me charger de relever des défis plus complexes.

The_Basset_Hound
la source
7
C'est bien, mais assez simple comme ça. Il pourrait être considérablement amélioré en exigeant la saisie de l'utilisateur pour le diamètre ou la quantité de cookies de chaque type. Les pépites de chocolat et les noix doivent-elles être à l'emplacement selon les exemples? (avec un diamètre variable, ils pourraient peut-être être aléatoires.) Cela dit, c'est une mauvaise forme de changer le défi après la publication. Je vous suggère soit de le laisser tel quel, soit de le supprimer, d'y réfléchir un peu plus et / ou de le poster dans meta.codegolf.stackexchange.com/q/2140/15599 puis de le republier plus tard.
Level River St
1
Autoriser plusieurs garnitures aurait pu être une autre façon de rendre cela plus intéressant. Là encore, les défis simples ont souvent beaucoup de participation. BTW, deux des cookies ont un espace blanc de tête dans la sortie de l'échantillon. Ce n'est probablement pas intentionnel?
Reto Koradi
1
J'ai effectué une modification mineure pour annuler le retrait, de sorte que tous les cookies ont le même espace de tête. Je suppose que les quatre espaces principaux sont un problème de formatage et ne sont pas requis? Vous devez spécifier si les sauts de ligne de début / fin sont autorisés. Je suggérerais d'interdire les espaces inutiles, à l'exception de permettre une nouvelle ligne facultative.
Level River St
1
Les fonctions seront-elles autorisées?
MayorMonty
1
Après que @steveverrill m'a ouvert les yeux , cela semble être juste une version simplifiée de Voulez-vous coder un bonhomme de neige? . Certaines exigences supplémentaires, comme le diamètre variable mentionné, pourraient vraiment l'améliorer.
manatwork

Réponses:

4

Pyth, 42 41 octets

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

Essayez-le en ligne: Regular Input / Test Suite

Explication:

 "..."                      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
la source
7

Rubis, 73

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

Il s'agit d'une fonction lambda anonyme. Le voici dans un programme de test:

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

puts g.call(gets)

Il utilise simplement la première lettre du type de cookie (en majuscules) et le prend modulo 3 pour obtenir un index dans la plage 0..2. Il renvoie ensuite la chaîne représentant le cookie, avec les chaînes appropriées intégrées aux bons endroits.

Level River St
la source
Que pensez-vous que la ordméthode peut faire si vous l'appelez pour une chaîne entière? Ma première idée était le formatage:->s{" ___\n/%1$s \\\n|%1$s %1$s|\n\\___/"%'^. '[s.ord%3]}
manatwork
Oublie. Une fois de plus trs'avère être plus court:->s{' ___↵/% \↵|% %|↵\___/'.tr ?%,'^. '[s.ord%3]}
manatwork
@manatwork merci pour vos suggestions. J'ai raté s[0] --> s, je n'ai jamais pensé à l'essayer. Votre code ne semble pas donner la bonne réponse pour le cas du chocolat, car les pépites de chocolat sont à des endroits différents de ceux des noix. Néanmoins, il y a des idées utiles là-bas, je les examinerai plus tard. Je n'ai pas utilisé trou %avant.
Level River St
Oups. Tu as raison. Ce fut un essai rapide en Colombie-Britannique (avant le café). Trop tôt pour remarquer la différence de placement des jetons. :( (BTW, le «%» n'a rien à voir avectr la syntaxe de. Est juste un personnage non impliqué dans l'art des cookies que j'ai utilisé comme espace réservé.)
manatwork
4

Python 2.7.6, 99 octets

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

Cet algorithme repose sur le fait que hash(cookie)%3donne 0 quand cookie = "Plain", 1 quand cookie = "Nutet 2 quand cookie = "Chocolate. Si quelqu'un connaît un moyen de raccourcir ce code, faites-le moi savoir dans les commentaires.

Loovjo
la source
"Utilisez tous les moyens pour le faire." Oui, les arguments facultatifs sont autorisés.
The_Basset_Hound
D'accord, mais je pense que je vais rester avec le premier et laisser le second tel quel.
Loovjo
@BetaDecay Je ne pense pas que les arguments optionnels soient vraiment dans l'esprit du code-golf. Je ne sais pas vraiment pourquoi, je pense juste que cela ne devrait pas être autorisé. Maintenant qu'ils ont tous deux la même longueur, j'ai supprimé la version des arguments facultatifs.
Loovjo
3
@Loovjo L'utilisation de méthodes étranges et inhabituelles est tout l'esprit du golf de code :)
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);}

Explication après avoir fini de jouer au golf.

Exemple d'utilisation:

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

CJam, 49 48 octets

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

Essayez-le en ligne dans le interpréteur CJam .

Comment ça fonctionne

" ___
/"

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.

À la fin, CJam imprime automatiquement tous les éléments de la pile.

Dennis
la source
3

Javascript (ES6), 90

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

Il s'agit d'une fonction de flèche anonyme. Il utilise la longueur de l'entrée pour déterminer quel cookie dessiner.

Explication:

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

Tester:

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
la source
3

BrainFuck, 481 447 436 octets

Pourquoi pas BrainFuck ?, le programme peut probablement être plus joué au golf, mais je pense que c'est assez soigné.

,>++++++[-<---------->]<-------[----------->>>-<<+<[-->->+<<]]>>>+>>++.<+++++++++[->>>>>>>++++++++++<+++++<++++++++++++++<++++++++++<+++++<++++++++++<+++<]++++++++++>+++.>+++++...>++>++>-->+>++++<<<<<<<.<<<[->>>>>>.>>>.<<<<<.>>>>>.<<.<<<<.>>>>>.<<<<.>>>>>.<<<<<.>>>>.<<<<<.>>>>.<<...>.<<<<<<]>[->>>>>.<<...>>>.<<<<.>>>>>.<<<<...>>>>.<<<<<.>>>>.<<...>.<<<<<]>[->>>>.>>>>.<<<<<<..>>>.<<<<.>>>>>.>>.<<<<<<.>>>>>>.<<.<<<<<.>>>>.<<...>.<<<<]
AboveFire
la source
3

C # avec indentation et saut de ligne

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\\___/");
    }
}

Golfé (225 caractères)

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
la source
1
Pourquoi pas String C= Console.ReadLine(),E=... etc?
rpax
Hé @rpax, votre commentaire m'a aidé à couper 2 caractères. Merci.
Merin Nakarmi
2

C # 6, 105 octets

Donc, j'ai presque presque obtenu ces sous-100 octets, aucune idée d'où presser les derniers octets cependant: C

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

Pyth, 58 54 53 52 50 octets

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

Je ne pense pas que cela puisse être joué davantage. J'essayais vraiment de presser ça en moins de 50 octets

Downgoat
la source
Un rapide et facile est". . . " -> *". "3
Sp3000
Si vous êtes intéressé, j'ai trouvé une bonne méthode pour le faire en 42 octets .
Jakube
2

JavaScript (ES6), 72 octets

À peu près aussi simple que possible… les nouvelles lignes comptent pour 1 octet chacune.

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

Démo

Comme c'est ES6, cette démo ne fonctionne que dans Firefox et Safari pour l'instant.

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
la source
2

Commodore 64 BASIC, 181 octets

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"\___/"

Remarques:

Au lieu de barres obliques inverses, \les caractères SHIFT-M ont été utilisés, pour les barres obliques /- SHIFT-N et pour les canaux |- SHIFT-T. SHIFT-Z (signe de diamant de carte) a été utilisé pour^ . En fait, les caractères n'ont pas d'importance car ils occupent tous un octet chacun.

Parce que sur C64 chaque commande (PRINT, INPUT, THEN, etc.) prend 2 octets en mémoire (ou même un, IIRC), le langage BASIC valait la peine d'être essayé (cependant, il a fallu plus d'octets que ce à quoi je m'attendais).

La taille du programme a été calculée en mesurant la mémoire libre avant de taper le programme (38909 octets) et après (38728 octets), à l'aide de la PRINT FRE(0)+65536commande, ce qui donne 181 octets de différence.

Code testé et captures d'écran préparées avec cet outil: http://codeazur.com.br/stuff/fc64_final/ (GPL).

Captures d'écran:

C64 screenshot 1

C64 screenshot 2

Voitcus
la source
2

Lua 5.3, 113 octets 112 octets

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

Il utilise beaucoup d'opérateur ternaire et de concaténation de chaînes, et j'ai évincé tous les espaces qui ne font pas partie de la sortie elle-même.

Muddmaker
la source
2

Java 258 217 caractères / octets


Golfé

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
la source
1

LUA 270 caractères 270 octets

    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
la source
c'est ma deuxième réponse à tous les défis
Alex Allen
Le "Quel type de cookie voulez-vous" peut être supprimé, il n'est pas nécessaire. Cela prend 39 octets juste là.
The_Basset_Hound
Il s'agit d'un défi de code-golf. Essayez de raccourcir un peu votre code. Par exemple, vous n'avez pas besoin de l'impression initiale, raccourcissez cookieà c, supprimez les espaces pendant les ifs, supprimez ceux inutilesio.read() s , la première et la dernière ligne d'un cookie sont toujours les mêmes, ....
Jakube
@BassetHound a supprimé la déclaration imprimée
Alex Allen
@Jakube a raccourci le cookie en c
Alex Allen
1

LOLCODE 265 caractères

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
la source