对称瓢虫


22

介绍:

当我们想到瓢虫时,通常会想到带有黑点的红色或深橙色的臭虫。尽管这不是必须的,但是由于黑色带有红色/橙色斑点的瓢虫,或者根本没有斑点的瓢虫,因此我们主要将瓢虫描绘成类似亚洲瓢虫的东西:

在此处输入图片说明

要注意的另一件事是,瓢虫上的斑点几乎总是对称的。这就是挑战所在。

挑战:

给定一个整数n>= 0),请输出以下ASCII样式的瓢虫一次或多次,并在两侧以及两个或多个瓢虫之间均匀分配对称斑点。

这是默认的瓢虫布局:

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

如果为n=0,则按原样输出上面的瓢虫。

n大于零时,我们用小写字母填充ASCII艺术错误的空格o,或用大写字母替换|中间的O。目标是n更改“空”瓢虫,同时仍然产生对称输出(每个瓢虫),并输出尽可能少的瓢虫。

因此,有效的输出为n=1

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

但这将是无效的:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

有效的输出为n=2

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

首先n这是不可能的,以适合单个瓢虫了是n=24。在这种情况下,您必须将其尽可能平均地分为两个瓢虫(您可以选择是将它们彼此相邻输出,还是在另一个瓢虫下方输出-它们之间可以有一个空格或一个换行符)。例如:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

要么:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

挑战规则:

  • n将在的范围内0-1000
  • 您可以选择输出到STDOUT,以String或2D-char数组/列表的形式返回,等等。您的呼叫。
  • 不允许使用前导换行符或不必要的空格。尾随空格和一条尾随换行符是允许的。
  • 如上所述,当需要两个或多个瓢虫时,您可以选择是将它们彼此相邻输出还是彼此下方输出(或两者混合输出)。
  • 当两个或多个瓢虫并排打印时,它们之间允许有一个可选的空格。当两个或两个以上的瓢虫相互打印时,允许在它们之间使用一条可选的换行符。
  • 您可以在序列中的任何步骤选择瓢虫的布局,只要它们是对称的并且等于input即可n
  • 由于目标是进行n更改,并尽可能减少瓢虫,因此在上述级别时,您将开始使用多个瓢虫n=23。这些瓢虫的布局不必相同。实际上,对于某些输入(例如n=25n=50仅举两个),这甚至是不可能的。
  • 另外,有时不可能将点均匀地分布在两个或多个瓢虫之间。在这种情况下,您将必须尽可能平均地分割它们,它们之间的差异最大为1。

因此n=50,请牢记最后两个规则,这将是一个有效的可能输出(其中第一个错误有16个斑点,其他两个有17个斑点):

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

一般规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于您的答案,因此允许您使用STDIN / STDOUT,具有适当参数的函数/方法和返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接。
  • 另外,如有必要,请添加说明。

您对空瓢虫“尽可能少的更改”是什么意思?将n(<24)个字母O / O放在单个瓢虫上时,您需要对其进行n次更改。还是您的意思是从n-1变为n(所以当输入变化1时输出变化尽可能小)?
Heimdall

@Heimdall抱歉,由于措辞不当而造成的混乱。这是当我有这个想法,允许多个字符,当我想到这个挑战的形成一个点,但我放弃了这一点,只是用oO来代替。我改变了措辞。
凯文·克鲁伊森

对于n=50例如,我相信你的意思是第一个漏洞有16个点,其他两个各有17
乔恩·克劳斯

这是我最喜欢的Jimi Hendrix专辑。
恢复莫妮卡iamnotmaynard

@iamnotmaynard也许我遗漏了一些明显的东西,或者您对错误的挑战发表评论了吗?我真的没有看到吉米·亨德里克斯和瓢虫之间的联系..
凯文Cruijssen

Answers:


5

木炭84 81字节

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

在线尝试!链接是详细版本的代码。说明:

Nθ

输入斑点总数。

≔⌈∕∨θ¹¦²³η

计算所需的瓢虫数量。

Fη«

循环遍历每只瓢虫。

≔⁺÷θη‹ι﹪θηζ

计算要放在此瓢虫上的斑点数。

V_¶I@)↘²↙|/←''-↑!

打印瓢虫的头和右翼。

↑⎇›ζ²¹OO²

如果有超过21个斑点,则打印两个斑点,否则打印背面。

§|Oζ

如果斑点的数量是奇数,则打印另一个斑点,否则打印背面的其余部分。

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

将斑点数除以2,然后将它们分布在3、4和3个斑点的三行中。

↙»

移至下一个瓢虫的开头。

‖B←

将画布向左反射,保持背面。


8

Python 2中252个 249 238 212 211 213 209字节

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

在线尝试!

  • 感谢Kevin Cruijssen节省了9个字节
  • 多亏了Xcoder先生,节省了18个字节
  • 由于乔纳森·弗雷希(Jonathan Frech),节省了2个字节

我认为您可以删除.replace('A','|O'[b%2])c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"改为使用?
凯文·克鲁伊森

230个字节通过转动[' o','|O'][i>9]' |oO'[i>9::2]并使用|,而不是逻辑或。同样转向for i in range(11)一条exec语句,保存了4个字节。
Xcoder先生17年

1
抱歉,注释混乱,但将列表理解与循环混合在一起,却删除了不必要的变量,但是增加了218个字节for
Xcoder先生17年

@ Mr.Xcoder非常感谢:)
TFeld

它应该产生最少的瓢虫,不是吗?当我在TIO上输入24至46时,它给出了3个瓢虫,而不是2个。
尼克·马特奥

7

的JavaScript(ES6),183个 186字节

使用与TFeld答案相同的公式在瓢虫之间划分斑点。

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

演示版


6

Befunge,292,279字节

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

在线尝试!

说明

瓢虫的ASCII艺术编码在单个Befunge字符串中,偏移15,以允许保留前15个可打印字符以用于特殊目的。这些特殊字符的前两个代表换行符和该|字符,否则这两个字符将无法打印。第三个未使用,因为它是一个",不能在字符串中使用。接下来的两个代表中心的大景点。其余十个用于机翼上的斑点。

通过查找表将这些特殊字符转换为最终形式,该查找表被写在第一行的第一部分上。

为了便于说明,下面是突出显示各个组成部分的代码:

突出显示执行路径的源代码

*我们先|在查询表中初始化换行符和字符,因为它们是恒定的。
*接下来,我们从stdin中读取斑点的数量,并计算所需的瓢虫的数量。
*然后,我们可以开始一组bug的外部循环,计算要渲染的下一个瓢虫的斑点数。
*对于每个瓢虫,我们计算是否需要显示较大的中心点(如果spots%2 == 1),然后将适当的值写入查找表。
*同样,我们计算是否需要显示另一对大斑点(如果spots/2 > 10),再次更新查找表。我们还计算了每个机翼上所需的剩余光斑。
*查找表初始化的最后一部分是一个循环,该循环计算需要显示哪些小斑点。本质上,算法是:如果为(spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10,则需要显示该点。
*接下来,我们将瓢虫的编码字符串表示形式推入堆栈。从本质上讲,这只是一个简单的字符串,但是当我尝试将其压缩到代码的间隙中时,它变得有些复杂,因此源将形成一个矩形。
*至此,我们准备开始输出循环,一个接一个地处理字符,并通过先前构造的查找表转换特殊情况(点,换行符等)。
*最后,我们检查是否已显示所有必需的瓢虫,否则继续返回到外循环的开始。


很好,我非常喜欢您的瓢虫从1-23开始的每个阶段的模式。与其他答案完全不同。向我+1。您介意添加一个解释(在您进一步打高尔夫球之后)吗?
凯文·克鲁伊森

1
我很高兴您喜欢这些模式。实际上,我花了大量时间尝试不同的组合,以找到在尽可能多的阶段中看起来都不错的算法。现在也为我的回答添加了一些解释。
James Holderness

3

红宝石203个 193 190字节

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

在线尝试!

  • 由于乔丹节省了10个字节

{|m|m.可以替换为{$&.; b=(n-1)/23+1可以替换为b=1+~-n/23; 并x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}可以替换为x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}
约旦

您可以通过使用再节省字节%q{XY},而不是'X'+"Y"做对了前八行和一对夫妇更d=n>0?n/(b=1+~-n/23):b=0代替n>0?d=n/(b=(n-1)/23+1):d=b=0
乔丹

@乔丹·哇,谢谢。
恢复莫妮卡iamnotmaynard
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.