代码高尔夫:沙漏
挑战
根据字符数计算最短的代码,根据用户输入输出沙漏。
输入由两个数字组成:第一个数字是大于 1 的整数,表示灯泡的高度,第二个数字是沙漏容量的百分比 (0 - 100)。
沙漏的高度是通过向沙漏的灯泡添加更多的线条来实现的,因此尺寸 2(可接受的最小尺寸)为:
_____
\ /
\ /
/ \
/___\
尺寸 3 将添加更多的线条,使灯泡能够容纳更多的“沙子”。
沙子将使用字符x
绘制。顶部球茎将包含 N% 的“沙子”,而底部球茎将包含 (100 - N)% 的沙子,其中 N 是第二个变量。
“容量”是通过沙漏所包含的空间量 () 来衡量的。如果百分比不准确,则应四舍五入。
沙子是从外向内抽的,如果百分比结果是偶数,则右侧优先。
测试用例
Input:
3 71%
Output:
_______
\x xx/
\xxx/
\x/
/ \
/ \
/__xx_\
Input:
5 52%
Output:
___________
\ /
\xx xx/
\xxxxx/
\xxx/
\x/
/ \
/ \
/ \
/ xxx \
/xxxxxxxxx\
Input:
6 75%
Output:
_____________
\x x/
\xxxxxxxxx/
\xxxxxxx/
\xxxxx/
\xxx/
\x/
/ \
/ \
/ \
/ \
/ \
/_xxxxxxxxx_\
代码计数包括输入/输出(即完整程序)。
The challenge
The shortest code by character count to output an hourglass according to user input.
Input is composed of two numbers: First number is a greater than 1 integer that represents the height of the bulbs, second number is a percentage (0 - 100) of the hourglass' capacity.
The hourglass' height is made by adding more lines to the hourglass' bulbs, so size 2 (the minimal accepted size) would be:
_____
\ /
\ /
/ \
/___\
Size 3 will add more lines making the bulbs be able to fit more 'sand'.
Sand will be drawn using the character x
. The top bulb will contain N percent 'sand' while the bottom bulb will contain (100 - N) percent sand, where N is the second variable.
'Capacity' is measured by the amount of spaces () the hourglass contains. Where percentage is not exact, it should be rounded up.
Sand is drawn from outside in, giving the right side precedence in case percentage result is even.
Test cases
Input:
3 71%
Output:
_______
\x xx/
\xxx/
\x/
/ \
/ \
/__xx_\
Input:
5 52%
Output:
___________
\ /
\xx xx/
\xxxxx/
\xxx/
\x/
/ \
/ \
/ \
/ xxx \
/xxxxxxxxx\
Input:
6 75%
Output:
_____________
\x x/
\xxxxxxxxx/
\xxxxxxx/
\xxxxx/
\xxx/
\x/
/ \
/ \
/ \
/ \
/ \
/_xxxxxxxxx_\
Code count includes input/output (i.e full program).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
C/C++,令人沮丧的 945 个字符......
将输入作为参数:
a.out 5 52%
...以及我们人类的解密版本:
C/C++, a dismal 945 characters...
Takes input as parameters:
a.out 5 52%
...and the decrypted version of this for us mere humans:
Perl,191 个字符
205199191 个字符。第二行和第三行之间需要显式换行。
并在新的 Acme::AsciiArtinator< 的帮助下/a> 模块:
Perl, 191 char
205199191 chars.Explicit newline required between the 2nd and 3rd lines.
And with help of the new Acme::AsciiArtinator module:
Golfscript - 136 个字符(适合推文)
请确保在输入的 % 之后不要有换行符
例如
$ echo -n 3 71%|./golfscript.rb hourglass.gs
您可以像这样设置沙漏动画:
$ for((c=100;c>=0;c-- ));do echo -n "15 $c%"|./golfscript.rb hourglass.gs;echo;sleep 0.1;done;
Golfscript - 136 个字符
确保保存时不要在末尾添加额外的换行符,否则会打印额外的数字
Golfscript - 144 Chars
工作原理
首先做最上面一行下划线,即
2n+1
创建沙漏的上半部分,但使用“_”字符而不是空格,因此对于 3 71%,我们将拥有。
通过将“_”替换为“”来完成上半部分,但保存副本以生成下半部分
通过反转整个内容来创建下半部分
将所有“x”替换为“ ”,然后将“_”替换为“x” '
最后将底行中的 ' ' 替换为 '_'
Roundabout 但对我来说,代码比尝试同时生成两半更短
Golfscript - 136 Chars (Fits in a Tweet)
Be sure not to have a newline after the % for the input
eg
$ echo -n 3 71%|./golfscript.rb hourglass.gs
You can animate the hourglass like this:
$ for((c=100;c>=0;c--));do echo -n "15 $c%"|./golfscript.rb hourglass.gs;echo;sleep 0.1;done;
Golfscript - 136 Chars
Make sure you don't save it with an extra newline on the end or it will print an extra number
Golfscript - 144 Chars
How it works
First do the top line of underscores which is
2n+1
Create the top half of the hourglass, but use '_' chars instead of spaces, so for the 3 71% we would have.
Complete the top half by replacing the "_" with " " but save a copy to generate the bottom half
The bottom half is created by reversing the whole thing
Replacing all the 'x' with ' ' and then then '_' with 'x'
Finally replace the ' ' in the bottom row with '_'
Roundabout but for me, the code turned out shorter than trying to generate both halves at once
Python,213 个字符
Python, 213 char
Rebmu:188 个字符
rJ N 0% rN Wad1mpJ2 S{ \x/ }D0 Hc&[ u[Z=~wA Qs^RTkW[isEL0c[skQdvK2][eEV?kQ[tlQ]]pcSeg--B0[eZ1 5]3]prRJ[si^DspSCsQfhS]eZ1[s+DcA+wMPc2no]]]Va| [mpAj**2]prSI^w{_}Ls+W2 h1tiVsb1n -1 chRVs{_}hLceVn1
它与此处较短的解决方案具有竞争力,尽管它实际上以“天真的”方式解决了问题。或多或少它是在做“沙物理”,而不是利用对称性或旋转矩阵或任何东西。
H
定义了一个用于打印半个沙漏的函数,您向该函数传递一个数字,该数字是在开始打印“x”字符之前要打印的空格数。如果您在上半部分,则沙串是通过交替附加到头部和尾部来构造的。如果您位于底部,它会跳到字符串的中间来选择插入源。评论源位于:http://github.com/hostilefork/rebmu /blob/master/examples/hourglass.rebmu
但 Rebmu 的真正技巧是它是一种精简的方言,不会破坏其宿主语言 (Rebol) 的任何解析规则。您可以通过在中间注入普通代码将其变成世界末日可视化,只要您使用小写代码即可:
>> rebmu [rJ 生日:至今(问“你什么时候出生?”)n:(2012 年 12 月 21 日 - 现在/日期)/(2012 年 12 月 21 日 - 生日)Wad1mpJ2 S{ \x/ }D0 Hc ~[u[Ze?Wa Qs^RTkW[isEL0c[skQdvK2][eEV?kQ[tlQ]]pcSeg--B0[eZ1 5]3]prRJ[si^DspSCsQfhS]eZ1[s+DcA+wMPc2no]]]Va |[mpAj**2]prSI^w{_}Ls+W2h1tiVsb1n -1 chRVs{_}hLceVn1]
噢不! :)
(注意:我能够编写和调试 Rebmu 程序的一个主要原因是我可以随时中断普通编码以使用现有的调试工具等。)
Rebmu: 188 chars
rJ N 0% rN Wad1mpJ2 S{ \x/ }D0 Hc&[u[Z=~wA Qs^RTkW[isEL0c[skQdvK2][eEV?kQ[tlQ]]pcSeg--B0[eZ1 5]3]prRJ[si^DspSCsQfhS]eZ1[s+DcA+wMPc2no]]]Va|[mpAj**2]prSI^w{_}Ls+W2 h1tiVsb1n -1 chRVs{_}hLceVn1
It's competitive with the shorter solutions here, though it's actually solving the problem in a "naive" way. More or less it's doing the "sand physics" instead of exploiting symmetries or rotating matrices or anything.
H
defines a function for printing a half of an hourglass, to which you pass in a number which is how many spaces to print before you start printing "x" characters. If you're on the top half, the sand string is constructed by alternating appends to the head and the tail. If you're on the bottom it picks the insertion source by skipping into the middle of the string. Commented source available at:http://github.com/hostilefork/rebmu/blob/master/examples/hourglass.rebmu
But the real trick up Rebmu's sleeve is it's a thin dialect that doesn't break any of the parsing rules of its host language (Rebol). You can turn this into a Doomsday visualization by injecting ordinary code right in the middle, as long you code in lowercase:
>> rebmu [rJ birthday: to-date (ask "When were you born? ") n: (21-dec-2012 - now/date) / (21-dec-2012 - birthday) Wad1mpJ2 S{ \x/ }D0 Hc~[u[Ze?Wa Qs^RTkW[isEL0c[skQdvK2][eEV?kQ[tlQ]]pcSeg--B0[eZ1 5]3]prRJ[si^DspSCsQfhS]eZ1[s+DcA+wMPc2no]]]Va|[mpAj**2]prSI^w{_}Ls+W2h1tiVsb1n -1 chRVs{_}hLceVn1]
O noes! :)
(Note: A major reason I'm able to write and debug Rebmu programs is because I can break into ordinary coding at any point to use the existing debugging tools/etc.)
哈斯克尔。 285 个字符。 (无副作用!)
使用例如
x 5 50
运行Haskell. 285 characters. (Side-effect-free!)
Run with e.g.
x 5 50
到目前为止,C++ 答案是 592 个字符,仍然具有合理的格式。
如果我决定忘记合理地格式化它,我可以将其低至 531:
A c++ answer, is 592 chars so far, still having reasonable formatting.
If i decide to just forget formatting it reasonably, i can get it as low as 531:
Bash:
639- 373 个字符我想我应该尝试一下 bash(还没有看到太多的代码高尔夫)。 (我的版本:GNU bash,版本 3.2.48(1)-release (i486-pc-linux-gnu))
基于 Mobrule 很好的 Python 答案。
优化必须仍然可用,因此欢迎所有建议!
从命令行启动,例如:
./hourglass.sh 7 34%
Bash:
639- 373 charactersI thought I would give bash a try (haven't seen much code-golfing in it). (my version: GNU bash, version 3.2.48(1)-release (i486-pc-linux-gnu))
Based on Mobrule's nice python answer.
Optimizations must still be available, so all suggestions are welcome!
Start from the command line, e.g. :
./hourglass.sh 7 34%
爪哇; 661 个字符
我需要找到一套更好的高尔夫球杆。
Java; 661 characters
I need to find a better set of golf clubs.
PHP-361
PHP - 361
Python - 272 个字符
Python - 272 chars
Exabyte18的java转换为C#,655字节:
Exabyte18's java converted to C#, 655 bytes:
Ruby,
297254(压缩后)使用
ruby -a -p f.rb
Ruby, 211
运行两者这是 mobrule 在 Ruby 中的杰作。 (仍然没有最后的换行符。:-)
Ruby,
297254 (after compression)Run both with
ruby -a -p f.rb
Ruby, 211
This is mobrule's tour de force, in Ruby. (And still no final newline. :-)