Kod mi ciasteczko

16

Wyzwanie

Zakoduj rodzaj pliku cookie ASCII zgodnie z danymi wejściowymi.

Wejście

  • Rodzaj ciasteczka. Jest to jeden z trzech ciągów: „Zwykły”, „Czekoladowy” lub „Orzechy”. Mogą to być argumenty funkcji, standardowe (lub najbliższy odpowiednik) lub argumenty pliku.

Wynik

  • Plik cookie ASCII. Patrz poniżej.

Musi być

     ___
    /   \
    |   |
    \___/

dla zwykłego wejścia,

     ___
    /. .\
    | . |
    \___/

na wkład czekoladowy i na koniec

     ___
    /^  \
    |^ ^|
    \___/

dla wejścia nakrętki.

Inne informacje

  • To moje pierwsze wyzwanie, jest tak proste, jak to tylko możliwe. Konstruktywne opinie są bardzo mile widziane.
  • Wykorzystaj do tego wszelkie środki.
  • Spacje końcowe są w porządku.
  • Jest to wyzwanie dla golfistów, więc wygrywa najkrótszy start pod koniec 9 dni (środa, 12 sierpnia 2015).

Dziękuję Ci!

Zwycięzcą jest Jakube używający Pyth z 41 bajtami. Dziękujemy wszystkim, którzy uczestniczyli. Zadam teraz sobie zadanie wymyślenia bardziej skomplikowanych wyzwań.

The_Basset_Hound
źródło
7
To miłe, ale raczej proste. Można to znacznie poprawić, wymagając od użytkownika podania średnicy lub ilości plików cookie każdego typu. Czy chipsy czekoladowe i orzechy muszą znajdować się w miejscu według przykładów? (o zmiennej średnicy, być może mogą być losowe.) To powiedziawszy, zła forma zmiany wyzwania po opublikowaniu. Sugeruję, abyś 1. zostawił go takim, jaki jest, lub 2. usunął go, przemyślał nieco więcej i / lub opublikował go w meta.codegolf.stackexchange.com/q/2140/15599, a następnie opublikował później.
Level River St
1
Zezwolenie na wielokrotne polewy mogłoby być innym sposobem na uczynienie tego bardziej interesującym. Z drugiej strony proste wyzwania często wymagają dużego udziału. BTW, dwa ciasteczka mają wiodącą białą spację na wyjściu próbki. To chyba nie jest zamierzone?
Reto Koradi
1
Dokonałem drobnej zmiany, aby anulować wcięcie, aby wszystkie pliki cookie miały tę samą wiodącą białą spację. Zakładam, że cztery wiodące spacje są problemem formatowania i nie są wymagane? Należy określić, czy dozwolone są wiodące / końcowe znaki nowej linii. Sugerowałbym, aby nie dopuszczać niepotrzebnych białych znaków, z wyjątkiem dopuszczenia opcjonalnego końcowego znaku nowej linii.
Level River St
1
Czy funkcje będą dozwolone?
MayorMonty
1
Kiedy @steveverrill otworzyło mi oczy , wydaje się, że jest to tylko uproszczona wersja Czy chcesz zakodować bałwana? . Niektóre dalsze wymagania, takie jak wspomniana zmienna średnica, naprawdę by to poprawiły.
manatwork

Odpowiedzi:

4

Pyth, 42 41 bajtów

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

Wypróbuj online: Regular Input / Test Suite

Wyjaśnienie:

 "..."                      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
źródło
7

Ruby, 73

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

To anonimowa funkcja lambda. Oto w programie testowym:

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

puts g.call(gets)

Po prostu używa pierwszej litery typu pliku cookie (wielkimi literami) i przyjmuje modulo 3, aby uzyskać indeks w zakresie 0..2. Następnie zwraca ciąg reprezentujący plik cookie, a odpowiednie ciągi są osadzone w odpowiednich miejscach.

Level River St
źródło
Jak myślisz, co ordmoże zrobić metoda, jeśli wywołasz ją dla całego ciągu? Moim pierwszym pomysłem było sformatowanie:->s{" ___\n/%1$s \\\n|%1$s %1$s|\n\\___/"%'^. '[s.ord%3]}
manatwork
Zapomnij o tym. Po raz kolejny trokazuje się być krótszy:->s{' ___↵/% \↵|% %|↵\___/'.tr ?%,'^. '[s.ord%3]}
manatwork
@manatwork dziękuję za sugestie. Tęskniłem s[0] --> s, nigdy nie przyszło mi do głowy, aby spróbować. Twój kod wydaje się nie dawać właściwej odpowiedzi na czekoladowe pudełko, ponieważ chipsy czekoladowe są w innych miejscach niż orzechy. Niemniej jednak istnieje kilka przydatnych pomysłów, przyjrzę się im później. Nie korzystałem trani %wcześniej.
Level River St
Ups Masz rację. To była szybka próba BC (przed kawą). Za wcześnie, aby zauważyć różnicę w rozmieszczaniu żetonów. :( (BTW, „%” nie ma nic wspólnego ze trskładnią. Jest tylko postacią nie związaną ze sztuką ciasteczek, której użyłem jako symbol zastępczy.)
manatwork
4

Python 2.7.6, 99 bajtów

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

Algorytm ten opiera się na fakcie, że hash(cookie)%3daje 0 kiedy cookie = "Plain", 1 kiedy cookie = "Nuti 2 kiedy cookie = "Chocolate. Jeśli ktoś zna sposób na skrócenie tego kodu, daj mi znać w komentarzach.

Loovjo
źródło
„Aby to zrobić, użyj wszelkich środków.” Tak, opcjonalne argumenty są dozwolone.
The_Basset_Hound
Okej, ale myślę, że nadal będę trzymać pierwszego i zostawię drugi tak, jak jest.
Loovjo,
@BetaDecay Po prostu nie sądzę, że opcjonalne argumenty naprawdę są w duchu golfa kodowego. Naprawdę nie wiem dlaczego, po prostu uważam, że nie powinno się na to pozwolić. Teraz, gdy oba mają tę samą długość, usunąłem wersję argumentów opcjonalnych.
Loovjo,
3
@Loovjo Dziwne i nietypowe metody są całym duchem golfa :)
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);}

Wyjaśnienie po zakończeniu gry w golfa.

Przykład zastosowania:

 int main(void){
 q("Plain");
 printf("\n");
 q("Nut");
 printf("\n"); 
 q("Chocolate");
 }
Joshpbarron
źródło
3

CJam, 49 48 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

" ___
/"

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.

Na koniec CJam automatycznie drukuje wszystkie elementy na stosie.

Dennis
źródło
3

JavaScript (ES6), 90

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

Jest to anonimowa funkcja strzałki. Wykorzystuje długość danych wejściowych, aby określić, który plik cookie ma zostać narysowany.

Wyjaśnienie:

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

Testować:

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
źródło
3

BrainFuck, 481 447 436 bajtów

Dlaczego nie BrainFuck ?, program może być bardziej golfowy, ale myślę, że jest całkiem fajny.

,>++++++[-<---------->]<-------[----------->>>-<<+<[-->->+<<]]>>>+>>++.<+++++++++[->>>>>>>++++++++++<+++++<++++++++++++++<++++++++++<+++++<++++++++++<+++<]++++++++++>+++.>+++++...>++>++>-->+>++++<<<<<<<.<<<[->>>>>>.>>>.<<<<<.>>>>>.<<.<<<<.>>>>>.<<<<.>>>>>.<<<<<.>>>>.<<<<<.>>>>.<<...>.<<<<<<]>[->>>>>.<<...>>>.<<<<.>>>>>.<<<<...>>>>.<<<<<.>>>>.<<...>.<<<<<]>[->>>>.>>>>.<<<<<<..>>>.<<<<.>>>>>.>>.<<<<<<.>>>>>>.<<.<<<<<.>>>>.<<...>.<<<<]
AboveFire
źródło
3

C # Z wcięciem i łamaniem linii

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

Gra w golfa (225 znaków)

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
źródło
1
Dlaczego nie String C= Console.ReadLine(),E=... itd.?
rpax,
Hej @rpax, Twój komentarz pomógł mi przyciąć 2 znaki. Dzięki.
Merin Nakarmi
2

C # 6, 105 bajtów

Więc prawie otrzymałem te poniżej 100 bajtów, choć nie mam pojęcia, skąd wycisnąć kilka ostatnich bajtów: C

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

Pyth, 58 54 53 52 50 bajtów

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

Nie sądzę, że można więcej grać w golfa. Naprawdę próbowałem zgnieść to do 50 bajtów

Downgoat
źródło
Szybkim i łatwym jest". . . " -> *". "3
Sp3000,
Jeśli jesteś zainteresowany, znalazłem dobrą metodę, aby to zrobić w 42 bajtach .
Jakube,
2

JavaScript (ES6), 72 bajty

Mniej więcej tak proste, jak to tylko możliwe… nowe wiersze są liczone jako 1 bajt.

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

Próbny

Ponieważ jest to ES6, to demo działa na razie tylko w Firefox i Safari.

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>

lodowisko. dozorca 6
źródło
2

Commodore 64 BASIC, 181 bajtów

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

Uwagi:

Zamiast ukośników odwrotnych \zastosowano znaki SHIFT-M, dla ukośników /- SHIFT-N, a dla potoków |- SHIFT-T. Zastosowano SHIFT-Z (diamentowy znak karty) ^. W rzeczywistości znaki nie mają znaczenia, ponieważ wszystkie zajmują jeden bajt.

Ponieważ na C64 każda komenda (PRINT, INPUT, THEN itd.) Zajmuje 2 bajty pamięci (lub nawet jeden, IIRC), język BASIC był wart wypróbowania (jednak zabrał więcej bajtów niż się spodziewałem).

Rozmiar programu obliczono mierząc wolną pamięć przed wpisaniem programu (38909 bajtów) i po (38728 bajtów) za pomocą PRINT FRE(0)+65536polecenia, co daje 181 bajtów różnicy.

Testowany kod i zrzuty ekranu przygotowane za pomocą tego narzędzia: http://codeazur.com.br/stuff/fc64_final/ (GPL).

Zrzuty ekranu:

Zrzut ekranu C64 1

Zrzut ekranu C64 2

Voitcus
źródło
2

Lua 5.3, 113 bajtów 112 bajtów

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

Wykorzystuje dużo trójskładnikowego operatora i konkatenacji ciągów, a ja wyciąłem wszystkie białe znaki, które nie są częścią samego wyjścia.

Muddmaker
źródło
2

Java 258 217 znaków / bajtów


Grał w golfa

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);}}

Oryginalny

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
źródło
1

LUA 270 znaków 270 bajtów

    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
źródło
to moja druga odpowiedź na wszelkie wyzwania
Alex Allen,
„Jaki typ pliku cookie chcesz” można usunąć, nie jest to konieczne. To zabiera 39 bajtów właśnie tam.
The_Basset_Hound
To wyzwanie dla golfa. Spróbuj nieco skrócić swój kod. Np. Nie potrzebujesz wstępnego wydruku, skracaj cookiego c, usuwaj białe znaki podczas ifs, usuwaj te niepotrzebne io.read()s, pierwsza i ostatnia linia ciasteczka jest zawsze taka sama, ...
Jakube
@BassetHound usunął instrukcję drukowania
Alex Allen
@Jakube skrócił plik cookie do c
Alex Allen
1

LOLCODE 265 znaków

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
źródło