首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dotty Strings评价

Dotty Strings评价
EN

Code Golf用户
提问于 2015-04-26 15:19:56
回答 12查看 2.1K关注 0票数 30

编写一个只包含字符.:的奇数长度字符串的程序。在初始空堆栈的帮助下,从该字符串生成一个数字,如下所示:

对于字符串中的每个字符c(从左到右).

  • 如果c为.,且堆栈中的元素少于2个,则在堆栈上推1。
  • 如果c是.,并且堆栈有2个或多个元素,则从堆栈中弹出两个顶部的值,并将它们的和推到堆栈上。
  • 如果c为:,且堆栈中的元素少于2个,则在堆栈上推送2。
  • 如果c是:,并且堆栈有2个或多个元素,则从堆栈中弹出两个顶级值,并将它们的产品推到堆栈上。

得到的数字是堆栈顶部的值。您的程序应该将这个数字打印到stdout (带有可选的尾换行符)。

(一点分析表明,除非字符串的长度为偶数,否则只剩下一个数字,这就是我们忽略这些数字的原因。实际上,堆栈从来没有超过2个元素。)

例如,::...:.:.的号码是9:

代码语言:javascript
复制
  2   1   2   2    /______ stack just after the character below is handled
2 2 4 4 5 5 7 7 9  \
: : . . . : . : .  <-- string, one character at a time

作为正常检查,下面是长度为1、3和5的所有字符串的数字:

代码语言:javascript
复制
. 1
: 2
... 2
..: 1
.:. 3
.:: 2
:.. 3
:.: 2
::. 4
::: 4
..... 3
....: 2
...:. 4
...:: 4
..:.. 2
..:.: 1
..::. 3
..::: 2
.:... 4
.:..: 3
.:.:. 5
.:.:: 6
.::.. 3
.::.: 2
.:::. 4
.:::: 4
:.... 4
:...: 3
:..:. 5
:..:: 6
:.:.. 3
:.:.: 2
:.::. 4
:.::: 4
::... 5
::..: 4
::.:. 6
::.:: 8
:::.. 5
:::.: 4
::::. 6
::::: 8

是以字节为单位的最短程序获胜。打破平局是较早的帖子.

  • 您可以假设输入总是有效的,即只包含长度为奇数的.:的字符串。
  • 与编写程序不同,您可以编写一个接受有效字符串并打印或返回生成数字的函数。
EN

回答 12

Code Golf用户

发布于 2015-04-26 16:45:13

><> (鱼类),33字节

代码语言:javascript
复制
ib%1-i:1+?\~n;
5a*)?*+40.\b%1-0@i

简单明了,小技巧/优化。

解释:

  • 信息:i =下一个输入字符的代码点,如果到达输入端,则为-1a = 10;b = 11;) = >
  • 第一个输入字符的i编码点,
  • b%1- top_of_stack mod 11 - 1掩蔽48 ('.') , 56 (':')1 , 2
  • i:1+?\~n;,如果输入结束,则打印最后一个结果并终止
  • 否则:
  • b%1-掩码输入到1 , 2
  • 两个数字下的0@推送0
  • i5a*)读取下一个输入,并将其屏蔽到0 , 1,与50相比
  • 如果1 (':')将前两个元素相乘,创建堆栈0积
  • 始终添加创建堆栈的前两个元素,即[0 sum][0+product=product]
  • 40.跳转(循环)回到(4,0)位置,我们的点4i:1+?\~n;
票数 10
EN

Code Golf用户

发布于 2015-04-26 16:47:41

JavaScript (ES6),65

我们只使用堆栈中的两个单元格。

开始在s0中设置一个值。

然后,在输入字符串中的每个奇数位置(从0开始计数),在s1中放一个值。

在每一个偶数位置,执行一个calc (加或乘)并存储导致s0。

因此,忘记堆栈,只使用2个变量,a和b。

代码语言:javascript
复制
f=s=>[...s].map((c,i)=>(c=c>'.',i&1?b=1+c:i?c?a*=b:a+=b:a=1+c))|a

快速测试

代码语言:javascript
复制
for(i=0;i<128;i++)
{
  b=i.toString(2).replace(/./g,v=>'.:'[v]).slice(1)
  if(b.length&1) console.log(b,f(b))
} 

输出

代码语言:javascript
复制
"." 1
":" 2
"..." 2
"..:" 1
".:." 3
".::" 2
":.." 3
":.:" 2
"::." 4
":::" 4
"....." 3
"....:" 2
"...:." 4
"...::" 4
"..:.." 2
"..:.:" 1
"..::." 3
"..:::" 2
".:..." 4
".:..:" 3
".:.:." 5
".:.::" 6
".::.." 3
".::.:" 2
".:::." 4
".::::" 4
":...." 4
":...:" 3
":..:." 5
":..::" 6
":.:.." 3
":.:.:" 2
":.::." 4
":.:::" 4
"::..." 5
"::..:" 4
"::.:." 6
"::.::" 8
":::.." 5
":::.:" 4
"::::." 6
":::::" 8
票数 5
EN

Code Golf用户

发布于 2015-04-26 17:52:42

C,104个字节

代码语言:javascript
复制
k[2],n;f(char*c){for(n=0;*c;)k[n]=*c++-58?n>1?n=0,*k+k[1]:1:n>1?n=0,*k*k[1]:2,k[1]=n++?k[1]:0;return*k;}

这太长了。

票数 5
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/49232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档