鸭,鸭,鹅!


58

还记得孩子们的游戏“鸭子,鸭子,鹅”吗?没有?我也不。

挑战

  • 无限次地在单独的行上打印单词“ duck”。
  • 打印单词“鹅”。
  • 您的程序结束。

规则

  • 尝试以最少的字节数玩游戏。
  • 至少必须有一只鸭子。
  • 列表末尾必须只有一只鹅。
  • 每行上只能有一只鸟。没有空行。
  • 输出字符串的大小写无关紧要。
  • 一行内的空格很好。
  • 您的程序必须完成。
  • 您的程序不能始终产生相同数量的鸭子。

玩得开心!


请注意:此问题不是最短代码的重复,以产生不确定的输出

原因包括:

  • 儿童游戏协会
  • 结果字符串的已定义开始和结束要求。另一个挑战中没有指定的输出。
  • 答案对于另一个非重复的挑战,单位字节数。这一项的平均数约为30左右。
  • 根据这一挑战与那个挑战之间的重叠量,任何包含“ random”标签的代码高尔夫问题都是重复的。我们应该全部删除吗?
  • 此挑战的代码答案将与另一挑战匹配(以一种肿的方式),但该挑战的答案与该挑战不匹配。

11
您可以定义不确定吗?是零还是一?
递归

1
请定义随机产生的方式。范围均匀还是呈指数下降?
HyperNeutrino,

@recursive Nope,但让我们一起定义一个可行的...该程序不能始终如一地呈现相同数量的鸭子。
AJFaraday

2
如果说我是明尼苏达州人,而我的印刷是“鸭,鸭,灰鸭”怎么办?:)
Mike Hill

1
@ jpmc26我确定还有其他人。首先,您必须与其他人一起玩。
AJFaraday

Answers:


9

果冻,13个字节

2X“¢;ÆS»ẋ“ʋ¢»

在线尝试!

说明:

2X“¢;ÆS»ẋ“ʋ¢»

2X             Random number (1 or 2)
  “¢;ÆS»       Compressed string equivalent to "duck\n"
        ẋ      Repeat the "duck\n" that random number of times
         “ʋ¢»  Compresses string equivalent to "goose"
               Implicitly concatenated and returned

可读性更高的版本:在线尝试!

将始终返回1或2只鸭子。


恭喜!我真的不知道这是如何工作的!
AJFaraday

@AJFaraday我继续为您添加了解释
-PunPun1000

@ PunPun1000对不起,但是堆栈是什么?果冻是一种默认的编程语言。
user202729 '18

@ user202729糟糕,我的脑袋里塞满了果冻和05AB1E,您能编辑一下以解决该错误吗?抱歉
PunPun1000

果冻中有隐式连接吗?好极了!
MilkyWay90

43

操作Flashpoint脚本语言,48字节

f={s="duck\n";s+([s,""]select random 1)+"goose"}

总是打印一只或两只鸭子。

random 1返回介于0和1之间的(浮点数)数字。该数字作为参数select与array一起传递给[s,""]。然后将随机数舍入为最接近的整数(0或1),然后从数组中选择该索引处的数组元素。

致电:

hint call f

输出:

备用56字节版本:

f={s="duck\n";format[s+"%1goose",[s,""]select random 1]}

3
当有人在PCG上使用它时,我总是很高兴。
Nit

好吧,我忘记了这个游戏的存在。
凯门

38

魔兽世界81字节

这是您可以在《魔兽世界》中运行的宏。

/run for x=1,random(1,9) do SendChatMessage("Duck") end; SendChatMessage("Goose")

11
哦,我的主...我为什么从未想到这一点。
魔术八达通Ur

4
PVCG(编程视频游戏和代码高尔夫球)。闪点行动是一回事,但是哇?我正在等待Minecraft和Factorio的解决方案。
Brain Guider'Mar

2
@AnderBiguri我怀疑Minecraft的性能会比81字节(块?)还差一点;)
克里斯(Chris

5
这应该可以正常工作,并减少到58个字节:/run for x=1,random(1,9)do print("Duck")end print("Goose")
gastropner

35

的Minecraft <1.13,72个 54字节

抱歉,我必须。

说明:

  • 以创意模式创建新的Minecraft世界
  • 找到该世界的保存文件夹,然后将以下代码放入 data/functions/minecraft/ddg.mcfunction
  • /function ddg在游戏机中运行

这个怎么运作:

为世界上的每个实体输出单词“ duck”,然后输出单词“ goose”。由于实体不断产卵和产卵,因此“鸭子”的数量将不一致。我使用它tellraw而不是短得多的方法,say因为它say输出实体的名称,而tellraw输出的却是确切的名称。

execute @e ~ ~ ~ tellraw @a "duck"
tellraw @a "goose"

屏幕截图

在此处输入图片说明

编辑:将{“ text”:“ duck”}更改为“ duck”(与“ goose”相同)


1
美丽。我们在PPCG中需要更多的Minecraft。
BradC

9
值得一提的是,(玩家)是世界上的实体,因此鸭子的数量永远不会为0(即使没有敌意或被动的暴民)。
BradC

1
@BradC应该围绕Minecraft面临全部挑战。
tox123

17

JavaScript,45 44 42 39 37字节

有可能产生溢出错误。

f=_=>`duck
${new Date%2?f():`goose`}`

测试一下

o.innerText=(
f=_=>`duck
${new Date%2?f():`goose`}`
)()
<pre id=o></pre>


14

八度38 33字节

这不是最短的(36个字节),但这是我的最爱。解释在底部。

disp(['duck '+~(1:1/rand)';'goose'])

在线尝试!


一些简短的变化:

原则上,这是可行的(33字节),但是在线解释器超时:

disp(['duck '+~(1:now)';'goose'])

添加一些字节以缩短输出使其变为35或36字节:

disp(['duck '+~(7e5:now)';'goose'])   % Works on octave-online.net
disp(['duck '+~(7.3e5:now)';'goose']) % Works on tio.run

说明:

我只解释最后一个随机数。其他时间相似,但是使用从1月1日开始的天数,即从0000到今天。

rand在时间间隔(0,1)上返回一个随机数。因此,1/rand返回大于1的数字。由于范围1:f,其中f是一个随机浮子大于1是相同的1:floor(f)1:1/rand创建了一个范围1 .. X,其中X> = 1

我将尝试解释这一点,就好像Octave是基于堆栈的语言一样。

      'duck '                           % Push the string 'duck ' to the stack
               (1:1/rand)               % Push a vector 1... floor(1/rand)
              ~(1:1/rand)'              % Negate the vector (making it all zeros)
                                        % and transpose it.
             +                          % Add 'duck ' with the vertical vector of zeros
                                        % to implicitly duplicate the string r times
     [                    ;'goose']     % Push the string 'goose' and concatenate
                                        % vertically with the rest
disp(                              )    % Display it all.

disp(['duck '+~pwd';'goose'])?不确定这是否足够“不确定”
Luis Mendo

12

Perl 5,20个字节

首先是实际的26个字节:

鸭子在粘上之前先穿1至9次。

say"Duck
"x(1+$^T%9),Goose

在线尝试!

但是,如果您有很多内存和时间,那么这个20字节的版本(如Chris所建议的)也可以工作:

say"Duck
"x$^T,Goose

这也假定Perl 5将解决2038年问题,否则将在1秒20年内失效。


如果更改1+$^T%9为just $^T,它将仍然有效,并节省了4个字节。
克里斯(Chris

@chris您显然比我有更多的记忆。不过,我会接受您的建议,因为可以使用合理的计算机。谢谢。
Ton Hospel '18

12

Python 2中36个 34字节

print"duck\n"*((id(id)%5)+1),"goose"

在线尝试!

Kevin Cruijssen的建议使我们达到了34个字节:

print"duck\n"*-~(id(id)%5),"goose"

3
欢迎来到该网站,并且是一个不错的第一答案!
Caird coinheringaahing

欢迎来到PPCG!您可以通过更改((id(id)%5)+1)-~(id(id)%5)摆脱括号来打高尔夫球两个字节。阅读所有语言的高尔夫技巧Python高尔夫技巧可能很有趣。入住愉快!
凯文·克鲁伊森

1
id(id)不能id(0)还是我失去了一些东西?
乔纳森·弗雷希

@Johnathan,在id(0)几台不同的计算机上查看表明这是一个常数。
user2699

1
稍微更直观,不再需要调用任何字节id([])。每次程序运行时,这应该初始化一个不同的列表,从理论上讲,这将始终导致不同的内存地址。
jpmc26,2016年

11

Z Shell(+ wget和Netpbm), 168 160 150 148 145 135 120字节

d(){wget -O- bit.ly/$1|jpegtopnm|pamscale -w 64 -h 64};d DckDkGo|pnmtile 64 $[(RANDOM&7+1)*64]|pnmcat -tb - <(d g005eGG)

这不是最短的解决方案,但我想对此挑战给予一些启发(受@AlexG解决此其他问题的启发)。

此脚本在标准输出上生成一个PPM图像,该图像在底部包含1-8张鸭子的图片和底部的鹅的图片。它从Wikipedia上下载了两个原始图片,因此必须要有Internet访问。

通过pnmtojpeg将示例输出转换为JPEG :

在此处输入图片说明


1
这完全使我开心!
AJFaraday

我刚刚意识到,您是提出与我联系的其他挑战的同一个人。xD好吧,很高兴您喜欢这个!= D
lucasb

是的,在我的高尔夫挑战代码中有一些主题:)我绝对应该为绘画回答提供奖励积分。
AJFaraday

这不是获取外部资源的标准漏洞吗?
MilkyWay90

10

R,35个字节

cat(rep("duck
",rexp(1)+1),"goose")

在线尝试!

rexp()从指数衰减函数产生一个随机数。+1确保至少一只鸭子。第一行之后的所有行都包含一个前导空格(这是的默认分隔符cat),但这是允许的。


1
输出一只以上鸭子的可能性exp(-1)约为36.8%。
朱塞佩

它要求在每一行上打印它。我认为您应该在“鸭子”中添加“ \ n”
斯图尔特·史蒂文森

3
@stuartstevenson在这里,我使用文字换行符,而不是\n短一个字节。如果您访问“在线试用!” 链接,您可以看到效果是相同的。
user2390246 '18

在DOS / Windows框中,该换行符仍然是两(2)个字节。0x0d0a
点亮

10

Bash39 38 37字节

sed s/[0-9]/duck\\n/g<<<$RANDOM\goose

在线尝试!

打印数量等于在[0,32767]上均匀分布的整数中的位数的鸭子(因此,经常会出现五只鸭子(很多鸭子))。

每个@ -1字节都感谢@Chris和@sch指出对引号没有影响的引号。


1
欢迎来到PPCG!
Steadybox

1
你可以通过你只要取代摆脱单引号的保存一个字节\n\\n
克里斯(Chris

1
好主意。您可以使用bash构造而不用30字节的sed 做类似的事情
Digital Trauma

1
sed s/[0-9]/duck\\n/g<<<$RANDOM\goose可以删除一个字节
sch

1
sed不完全便携。在某些平台上,您可能只用一个反斜杠就可以了\n。在其他情况下,无论您做什么,都不会换行。
三胞胎

9

纯Bash(无外部实用程序),25

根据@SophiaLechner的答案,这也会打印出很多鸭子

@OlivierDulac使用存储在$参数中的脚本外壳PID的想法可节省5个字节。

echo "${$//?/duck
}"goose

在线尝试


1
如果我们假设您启动一个程序,则每次它将获得一个不同的pid。很多时候,它将是5位数字,但并非总是如此。因此:更改RANDOM$剃除5个字节?一个人也可以做一串很长的鸭子:yes duck|head -n $$;echo goose
奥利维尔·杜拉克

@OlivierDulac是的,我认为$$可以接受-谢谢!
Digital Trauma'3

别客气!我发布了其他版本(yes duck | head -n $$;echo goose)作为替代版本(比您的版本更长,但是一个鸭子就可以得到5个额外的字符^^)
Olivier Dulac


8

Bash + Coreutils,36个 27字节

yes duck|sed $$q;echo goose

打印太多的鸭子(介于2和之间cat /proc/sys/kernel/pid_max),然后打印一只鹅。

由于Digital Trauma和Olivier Dulac节省了九个字节。

在线尝试!(但请注意,它有时可能会被截断)

长度相同,但没有echo

yes duck|sed $${agoose'
q}'

在线尝试!

a是中的附加命令sed,然后q退出。两者都只在$$与PID对应的行上运行。


Bash具有取模功能,但是会增加大小。试试看head -n $((1+(RANDOM % 5)))
Tripleee

@tripleee因为这是代码高尔夫球,所以增加输出的大小比增加代码的大小更可取。与您在其他地方看到的十亿只或更多只鸭相比,132767只鸭子是完全合理的;)
克里斯(Chris

1
当然,只是希望有帮助,以防万一有人真的想在实践中应用这项突破性的研究。像,TIO。44个字节,带一些空格。
人间

@OlivierDulac使用建议$$,而不是$RANDOM我的回答。我认为您可以使用相同的方法来节省5个字节。哦,也可以尝试sedyes duck|sed 1$$q;echo goose
数字创伤

其实yes duck|sed $$q;echo goose是好的-我不认为你的脚本将永远得到一个PID <1
数字创伤

7

PowerShell35 30 28字节

,"duck"*((Random)+1)
"goose"

在线尝试!(修改版)

生成一系列Get-Random项目。它可能需要一段时间。这增加了一个+1以确保我们至少得到一个duck。修改后的版本还包含-maximum标志,5因此您可以看到程序按预期工作(修改后的版本将在之前打印1、2、3或4 ducks goose)。

数组和孤立goose字符串留在管道上,隐式Write-Output函数免费为我们提供换行符分隔的值。

您不知道对我而言,不将最后一行更改为“灰鸭”有多困难...


该变体听起来很有趣,绝对值得进行代码挑战……我建议您等待几天,然后将其发布为您自己的挑战:)
AJFaraday

1
@AdmBorkBork,这位明尼苏达州人加入了该群组,只需+1您的灰鸭。
Milwrdfan

0..(random)|%{'duck'};'goose'看起来像29,并且还会在鹅之前生成[int] :: MaxValue(21亿只)鸭子。(并0..0印有鸭子)
TessellatingHeckler,

@TessellatingHeckler谢谢,但是我刚才想出了一个28字节的版本。:)
AdmBorkBork



6

Brachylog24 21字节

-3个字节,感谢Outgolfer的Erik

"duck"ẉ4ṙ0∧"goose"w∨↰

在线尝试!

为了庆祝本月语言,我写了第一篇短文。这种语言的控制流程很酷。

这个怎么运作:

"duck"ẉ4ṙ0∧"goose"w∨↰
"duck"ẉ                 print duck with a new line
       4ṙ               choose a random number in the range is [0, 4]
         0              verify it equals zero
          ∧             and (short circuits)
           "goose"w     print goose without a newline
                   ∨    or (if it did not equal zero)
                    ↰   repeat the procedure

因此,如果我正在阅读此说明,它是从左至右,从下至上读取的?
AJFaraday

2
该语言尝试仅使用程序的第一行来查找逻辑真相。我的程序说“验证第二行,然后打印鹅”。然后第二行说“打印鸭子,然后验证0到4的随机数是否为0,或者再次验证此行”,因此从技术上讲,从左到右只是第一行,然后您从那里调用的所有谓词
PunPun1000

太酷了,发现新语言的工作原理非常有趣。它确实到达了我的收件箱,但是我不确定是因为我提出了问题还是因为我已经在这里发表评论了。
AJFaraday

您可以像这样将两个谓词合并并绑住我。
暴民埃里克(Erik the Outgolfer)

6

Geometry Dash World 2.2编辑器 -4个对象

图片几何破折号

说明:

BG触发是当前2.2的随机触发,因此它会切换组ID 1或2。

第一个“ DUCK”的组ID为1,这使其有50%的机会被删除或不被删除(切换)。

在此级别中,没有任何对象具有组ID 2,因此有50%的机会显示2个“ DUCK”。

如何重现此内容:

第一个“ DUCK”的组ID为1。

在此处输入图片说明

鹅和第二只鸭子没有群组编号 在此处输入图片说明

内部随机触发。 在此处输入图片说明


我感受到了这一挑战的主题
本杰明·厄克特

@BenjaminUrquhart什么?
MilkyWay90

也有《魔兽争霸》,《我的世界》以及其他一些游戏的参赛作品。
本杰明·厄克特

2
@BenjaminUrquhart更好地找到更多游戏来回答
MilkyWay90

5

05AB1E15 14字节

'Ðœ₁Ωи`.•zíΘ•»

在线尝试!

将先打印2、5或6只鸭子,然后再打印鹅。

-1个字节,感谢@Emigna使用'来表示单个压缩字(鸭子)


1
'Ðœ因为鸭是一个单词,所以可以使用。
Emigna

1
击败我的:['ÐœTΩ#].•zíΘ•»
魔术章鱼缸

@MagicOctopusUrn我真的很喜欢您的无限循环方法。您的答案肯定更符合挑战的精神(或者应该是什么?),因为它可以输出无数的鸭子。
Kaldo

@Kaldo仍然会丢失15个字节;)
魔术八爪鱼

1
备用14次方:'Ðœ₁Ω.D.•zíΘ•»
魔术八达通


5

视网膜,17字节

?\\K`duck
K`goose

在线尝试!

在线尝试!

以相同的概率打印1或2只鸭子。

说明

?\\K`duck

将工作字符串设置为,duck并在其后加上换行符(\)进行打印。然后将其包装在另一个输出阶段中,但是该阶段已应用了随机标志(?),因此仅以50%的概率进行打印。

K`goose

更换duckgoose,这是在节目的结尾隐式打印。

这是一个有趣的选择,它可以打印1只鸭子,概率为50%,2只鸭子,概率为25%,3只鸭子,概率为12.5%...:

\K`duck
?+\G`
K`goose

5

Linux上的Vim(脚本), 46 43个字节(4946 :(在行首)

.!date +0\%N\%s6
s/6.*/goose
s/\d/duck\r/g

执行作为vim -S filename或粘贴到运行vim:每行之前。


2
欢迎来到PPCG!您应该可以使用\dover [0-9]。另外,看起来vim不需要结尾的换行符,所以它可以是45个字节:)
H.PWiz

欢迎来到PPCG!
Steadybox


5

Befunge 9838个 30 25字节

"esooG"v>:#,_@
"Duck"a<?<

在线尝试!

  • 感谢@JoKing剥离了无用的蹦床
  • 切换到Befunge 98以缩短新行-现在可以Duck放在单个字符串中

1
您不需要#在第二行上
Jo King

和“技术上”,whitespace within a line is fine因此您可以删掉一些引号(即使输出看起来很奇怪)
Jo King

@JoKing谢谢,看我的编辑。
文森特

5

T-SQL70 44 43字节(许多鸭子)

while rand()<.9print'duck'print'duck
goose'

感谢@Zac Faragher!

修订版,54 43 40字节(1或2只鸭子)

谢谢@BradC!

if rand()<.5print'duck'print'duck
goose'


我似乎无法使它在SQL Fiddle中正常运行,但在LINQPad和SSMS中也可以正常工作。

不知道这是否是SQL Fiddle的已知限制,还是我做错了什么


真好 下到61,如果你改变selectprint并替换最后'duck'select'goose''duck(linebreak)goose'(用文字断行,当然)
BradC

实际上,您只需花while rand()<.5print'duck'print'duck(linebreak)goose'43
即可。– BradC

很好,谢谢@BradC。除了添加char(13)之外,还有另一种方式来表示字符串中的换行符吗?
大概

是的,只要在字面上加引号,我就会编辑您的帖子以显示给您(注释不显示收益)。
BradC

1
再保存3个字节:将第一个更改whileif。(随机)打印一只或两只鸭子,(我认为)仍然可以满足挑战。
BradC

5

Powershell- 31 30字节

警告:您很可能最终会遇到很多鸭子。Random包括0到0的值Int32.MaxValue,这取决于您数字的随机性,这可能是很多问题。

1..(Random)|%{"Duck"};"Goose"

您不需要$在前面(Random)在线尝试!
AdmBorkBork

@AdmBorkBork感谢您的收获!
SomeShinyObject



4

Befunge

57 35个字节(整个字段的周长为19x3 17x2个字符)感谢karhell的改进。

55+"kcud",,,,,#v?
  @,,,,,"goose"<

第二行将duck和换行符放在堆栈上(向后),并将其作为字符串输出。在有75%的机会返回起点并再次打印鸭子之后,有25%的机会(当问号决定下降时)打印鹅并停下来。


如果有50%的几率鹅是可以接受的,55+"kcud",,,,,#v?(linebreak here) @,,,,,"goose"< 会减少你的代码到35个字节
karhell

甜蜜的环绕。您说得对,谢谢,我稍后再发布更新!
rael_kid
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.