给我编码一个cookie


16

挑战

根据输入编码一种ASCII cookie。

输入值

  • 饼干种类。这是三个字符串之一:“普通”,“巧克力”或“坚果”。可以是函数参数,stdin(或最接近的等效参数)或文件参数。

输出量

  • ASCII cookie。见下文。

一定是

     ___
    /   \
    |   |
    \___/

对于普通输入,

     ___
    /. .\
    | . |
    \___/

最后输入巧克力

     ___
    /^  \
    |^ ^|
    \___/

用于坚果输入。

其他资讯

  • 这是我的第一个挑战,这很简单。建设性的反馈意见非常感谢。
  • 使用任何手段来这样做。
  • 尾随空格很好。
  • 这是一场标准高尔夫挑战赛,因此在9天(2015年8月12日,星期三)结束时最短的比赛获胜。

谢谢!

获胜者是Jakube使用Pyth的41个字节。谢谢所有参加的人。我现在要自己承担一些更复杂的挑战。


7
这很好,但实际上却很简单。通过要求用户输入每种类型的cookie的直径或数量,可以大大改进它。根据示例,巧克力片和坚果是否必须放在适当的位置?(直径可变,它们可能是随机的。)也就是说,发布后更改挑战是一种不好的形式。我建议您1.保持原样,或2.删除它,再考虑一下,和/或将其发布在meta.codegolf.stackexchange.com/q/2140/15599中,然后稍后重新发布。
级圣河

1
允许多次浇头可能是使这种情况变得更有趣的另一种方法。再说一次,看起来简单的挑战通常会引起很多参与。顺便说一句,其中两个cookie在示例输出中具有领先的空格。那可能不是故意的吗?
Reto Koradi

1
我进行了较小的编辑以取消缩进,因此所有cookie都具有相同的前导空格。我认为四个前导空格是格式问题,不是必需的吗?您应指定是否允许前导/尾随换行符。我建议禁止不必要的空格,但允许使用可选的尾随换行符。
水平河圣

1
可以使用功能吗?
2015年

1
@steveverrill 睁开眼睛后,这似乎只是您要编写雪人代码的简化版本。进一步的要求,例如上述可变直径,将真正改善它。
manatwork 2015年

Answers:


4

Pyth,42 41字节

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

在线尝试:常规输入/测试套件

说明:

 "..."                      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 . "]

7

Ruby,73岁

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

这是一个匿名lambda函数。它在测试程序中:

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

puts g.call(gets)

它只使用cookie类型的第一个字母(大写),并将其取模3来获得range的索引0..2。然后,它返回代表cookie的字符串,并在正确的位置嵌入适当的字符串。


ord如果您为整个字符串调用该方法,您认为该方法能做什么?我的第一个想法是格式化:->s{" ___\n/%1$s \\\n|%1$s %1$s|\n\\___/"%'^. '[s.ord%3]}
manatwork

算了吧。再次tr证明时间更短:->s{' ___↵/% \↵|% %|↵\___/'.tr ?%,'^. '[s.ord%3]}
manatwork

@manatwork谢谢您的建议。我错过了s[0] --> s,尝试它从来没有发生过。您的代码似乎无法为巧克力盒提供正确的答案,因为巧克力片与坚果的位置不同。尽管如此,那里还是有一些有用的想法,我将在稍后讨论。我没用过tr%以前。
水平河圣

哎呀 你是对的。那是一个快速尝试BC(咖啡之前)的方法。太早注意到芯片位置的差异。:((顺便说一句,“%”与tr的语法无关。只是我用作占位符的cookie艺术中没有涉及的字符。)
manatwork 2015年

4

Python 2.7.6,99字节

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

该算法依赖于以下事实:hash(cookie)%3给出0时cookie = "Plain",1时cookie = "Nut和2时cookie = "Chocolate。如果有人知道缩短此代码的方法,请在评论中让我知道。



“使用任何手段做到这一点。” 是的,允许使用可选参数。
The_Basset_Hound 2015年

好的,但我想我仍然会坚持第一个,而将第二个保持原样。
Loovjo 2015年

@BetaDecay我只是不认为可选参数确实符合代码高尔夫的精神。我真的不知道为什么,我只是认为不应该这样做。现在它们的长度相同,我删除了可选参数版本。
Loovjo

3
@Loovjo使用奇怪和不寻常的方法是代码高尔夫的全部精神:)
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);}

我打完高尔夫球后的解释。

使用示例:

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

3

CJam,49个48字节

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

CJam解释器中在线尝试。

怎么运行的

" ___
/"

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.

最后,CJam自动将所有元素打印在堆栈上。


3

Javascript(ES6),90

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

这是一个匿名箭头功能。它使用输入的长度来确定要绘制哪个cookie。

说明:

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

去测试:

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"))

3

脑干, 481 447 436字节

为什么不使用BrainFuck?该程序可能可以打更多的高尔夫球,但是我认为它很简洁。

,>++++++[-<---------->]<-------[----------->>>-<<+<[-->->+<<]]>>>+>>++.<+++++++++[->>>>>>>++++++++++<+++++<++++++++++++++<++++++++++<+++++<++++++++++<+++<]++++++++++>+++.>+++++...>++>++>-->+>++++<<<<<<<.<<<[->>>>>>.>>>.<<<<<.>>>>>.<<.<<<<.>>>>>.<<<<.>>>>>.<<<<<.>>>>.<<<<<.>>>>.<<...>.<<<<<<]>[->>>>>.<<...>>>.<<<<.>>>>>.<<<<...>>>>.<<<<<.>>>>.<<...>.<<<<<]>[->>>>.>>>>.<<<<<<..>>>.<<<<.>>>>>.>>.<<<<<<.>>>>>>.<<.<<<<<.>>>>.<<...>.<<<<]

3

具有缩进和换行符的C#

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

打高尔夫球(225个字符)

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]

1
为什么不String C= Console.ReadLine(),E=...等等?
rpax

嘿@rpax,您的评论帮助我修剪了2个字符。谢谢。
Merin Nakarmi

2

C#6,105字节

所以几乎不到100个字节,不知道从哪里压缩最后几个字节:C

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

2

Pyth,58 54 53 52 50字节

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

我认为这不能打更多。我真的试图将其压缩到50个字节以下


快速简便的方法是". . . " -> *". "3
Sp3000

如果您有兴趣,我发现了一个不错的方法(42个字节)
2015年

2

JavaScript(ES6),72个字节

大约就这么简单...每行新行都计为1个字节。

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

演示版

由于是ES6,此演示目前仅在Firefox和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>


2

Commodore 64 BASIC,181字节

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

笔记:

代替反斜杠\,使用SHIFT-M字符,对于斜杠/-SHIFT-N和对于管道|-SHIFT-T。使用SHIFT-Z(卡片菱形标志)^。实际上,字符并不重要,因为它们每个都占用一个字节。

因为在C64上,每个命令(PRINT,INPUT,THEN等)在内存中占用2个字节(甚至在IIRC中甚至占一个),所以值得尝试使用BASIC语言(但是,它占用了比我预期更多的字节)。

通过在键入程序之前(38909字节)和之后(38728字节),使用以下方法测量可用内存来计算程序大小: PRINT FRE(0)+65536命令,从而 181个字节的差异。

使用此工具测试了代码并准备了屏幕截图:http//codeazur.com.br/stuff/fc64_final/(GPL)。

屏幕截图:

C64屏幕截图1

C64屏幕截图2


2

Lua 5.3,113 字节 112字节

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

它使用了很多三元运算符和字符串连接,我挤出了所有不属于输出本身的空格。


2

Java的258 217个字符/字节


打高尔夫球

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

原版的

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

1

LUA 270个字符270个字节

    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

这是我对任何挑战的第二个答案
亚历克斯·艾伦

可以取出“您想要哪种类型的Cookie”,这不是必需的。那将占用39个字节。
The_Basset_Hound 2015年

这是一个代码高尔夫挑战。尝试稍微缩短代码。例如,您不需要初始打印,缩短cookiec,在ifs期间删除空格,删除那些不必要的io.read()s,cookie的第一行和最后一行始终是相同的,..
Jakube 2015年

@BassetHound删除了打印声明
Alex

@Jakube将cookie缩短为c
Alex Allen

1

LOLCODE 265个字符

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.