Piem验证程序


11

编写一个程序,该程序定义一个函数,该函数可以检查名为“您想要或用户输入的任何内容”的字符串变量是否为piem。(piem =故事或诗歌,其中单词长度代表π的数字(来自Wikipedia))

一些例子:

myfunction("I am clearly wrong") # False
myfunction("How I want a drink, alcoholic of course, after the heavy lectures involving quantum mechanics") #True (Taken from Wikipedia)
myfunction("Law ' s fine") # True

在处理之前,您应该删除任何标点符号或换行符。纯粹的代码高尔夫,最短的胜利

结束日期:2014年1月10日晚上

各种答案

  • 我们需要处理几位数?10以上
  • 出于兴趣,如何解释PI中的0?跳过或10个字母的单词?作为10个字母的单词
  • “一个称为piem的变量” –因此参数名称必须为piem吗?不,还没有,问题文本已更正
  • 一个有趣的红利可能是一个解决方案,它本身就是一项艰巨的任务。
  • 为了争辩,_总是标点符号吗?您可以确定它是标点符号还是不是标点符号
  • 目前尚不清楚“ 。'”?!;;()是什么意思。
  • 那么应该算数字吗?法律的罚款是虚假的吗?数字应视为字母,Law的罚款= False;法律罚款=正确

评论

  • APL解决方案应以字节为单位
  • 如果您的解决方案适用于pi的100位数以上,您将获得* 0.8的奖励
  • 由于人们的极大兴趣,结束日期是将来的一天。

6
我们需要处理几位数?
marinus 2014年

5
“一个称为piem的变量” –因此参数的名称必须piem?这使得所有当前答案都不正确。
IngoBürk2014年

2
一个有趣的奖励可能是一个解决方案,它本身就是一个难题。
britishtea

5
出于兴趣,如何解释PI中的0?跳过或10个字母的单词?
MickyT 2014年

3
您没有回答非常重要的问题,但是您已经在结束日期中进行了编辑,这是一种耻辱。
IngoBürk2014年

Answers:


3

APL(39)

{N≡(≢N←≢¨('\w+'⎕S'\0')⍵)↑⍎¨'_. '~⍨99⍕○1}

它使用APL解释程序的pi常数提供的所有数字,最大为99。在我的情况(Dyalog APL 14 32位)中,该数字为16位。64位版本可能具有更多数字。但是,对于给定的示例,16位数字就足够了。

即使单词可以检查的所有数字都是真实的,但字符串数量超过该数量的字符串也会失败。(在撰写本文时,其他帖子也是如此。)例如,如果只有10位数字,则“我想如何喝酒”一个数字将失败。可以解决此问题,但要花费14个字符:

{(≢¨('\w+'⎕S'\0')⍵){∧/(⌊/≢¨⍺⍵)↑∨⌿⍺∘.=⍵}⍎¨'_. '~⍨99⍕○1}

该版本将接受N个数字正确的任何字符串。


您的代码是短裤,但不是Unicode ...我必须考虑一下您是否应该赢得胜利,javascript版本比这更长一点...无论如何,我赞成这个答案。
Caridorc

1
@marinus这个问题没有指定提交内容应按字符还是按字节计分,但是默认值是按字节计(根据标签Wiki),因此我认为您的分数接近60。
马丁安德

1
给定正确的编码,每个字符1个字节。毕竟APL比Unicode要早几十年。
marinus 2014年

1
@marinus公平点!您是否知道可以实际使用的任何特定(现有)编码?
马丁·恩德

2
@MartinBüttner:IBM代码页907是其中之一,但是有很多负载。
马里纳斯

7

pi的17位JavaScript (169)(140)(137)(135)(63)

在我的版本中Law's fine,都Law ' s fine返回true。

IngoBürk和hsl的最新版本(63)

f=s=>!s.split(/\W+/).some((x,i)=>x.length-(Math.PI*1e16+'')[i])

pi的17位数字的新版本(135)(感谢IngoBürk):

f=(s)=>{
s=s.split(/[!"#$%&'()*+, \-.\/:;<=>?@[\\\]^_`{|}~]+/);
p=Math.PI*1e16+'';
    r=0;
    for(a=s.length;a--;)r+=s[a].length!=p[a];
    return !r
}

pi的32位旧版本(169):

f=(s)=>{
s=s.split(/[!"#$%&'()*+, \-.\/:;<=>?@[\\\]^_`{|}~]+/);
p="31415926535897932384626433832795".split('');
    r=1;
    for(a=s.length;a--;)if(s[a].length!=p[a]){r=0};
    return r;
}

您可以使用以下方法保存3个字节:1e15*Math.PI+"2384626433832795"
xem

谢谢=)同时,我使用此想法进行了更改,但现在仅使用了前17位数字。
瑕疵

@IngoBürk非常感谢,仅检查有效的方法。
瑕疵

对不起,没关系。这似乎不起作用。:/ for无法以这种方式添加循环。
IngoBürk2014年

但是有效的方法是初始化r=0然后循环播放r+=s[a].length!=p[a](最后可以省略;)。然后,返回!r
IngoBürk2014年

7

红宝石,113 101 79(98 * 0.8)

require"bigdecimal/math"
x=->p{!(BigMath.PI(999).to_s[2..-1]!~/^#{p.scan(/\w+/).map(&:size)*''}/)}

说明

  • 输入作为lambda的参数。它期望一个String
  • Pi最多可计算到999小数,然后将其.删除后变成字符串。
  • 标点符号已从诗歌中删除,并将其拆分为单个单词。"Let's"被视为两个词:"Let""s"
  • 使用Array#map每个单词转换为文字的大小,将它们连接起来成String
  • 使用Regexp,检查两者是否已创建 String s是否以相同的字符开头。

我已将奖金用于处理100多个数字。_在此解决方案中不作为标点符号处理。


请注意,您不将其_视为标点符号。
Martin Ender 2014年

发现得好。为了争辩,_ 总是标点符号吗?诸如的句子呢My nickname on Stack Overflow is britishtea_500
britishtea

这只是一个观察。此处的操作并不确定具体细节。
Martin Ender 2014年

很公平。我将
暂时

使用bigdecimal,您对PI位数没有限制吗?尼斯(+1)
edc65

4

Mathematica,123个字节* 0.8 = 98.4

f=#&@@RealDigits[Pi,10,Length[d=StringLength/@StringSplit@StringReplace[#,RegularExpression@"[!-.:-?]
"->""]/. 10->0]]==d&;

到目前为止是提交时间最长的,但是:

  • 它适用于Pi的任何位数。
  • 它删除所有必需的ASCII字符和换行符,而无需在这些位置拆分单词。
  • 它可以正确处理Pi中的0位数(作为10个字母的单词)

如果它适用于Pi的位数,您将获得0.8的奖金
Caridorc

1

蟒- 130 127 116 - PI的17位

作为@flawr的回答Law ' s fine并且Law's fine都返回真。

感谢@Emil从程序中删除了12个字符。

import re
f=lambda x:all(j==int("31415926535897932"[i])for i,j in enumerate([len(s)for s in re.findall("[\w]+",x)]))

通过不保存l变量和使用lambda定义函数,可以保存12个字符。
埃米尔(Emil)2014年

1

爪哇185

boolean f(String...s){s=s[0].replaceAll("\\W","~").replaceAll("~+","~").split("~");for(int i=0;i<s.length;){if(s[i].length()!=(int)(Math.PI*Math.pow(10,i++)%10))return 0>1;}return 1>0;}

1

python 3,pi的17位数字,104

import re;f=lambda s:all(map(int.__eq__, map(int, '31415926535897932'), map(len,re.findall('[\w]+',s))))

您可以用;换行符替换,以提高可读性。同样,可以删除多个空格。
tomsmeding

1

Python 3-129

不考虑标点符号:

import math
f=lambda p:all(1if len(p.split(' ')[i])!=int(str(math.pi).replace('.','')[i])else 1for i in range(len(p.split(' '))))

0

T-SQL 488 383

现在是大型T-SQL解决方案:)

CREATE FUNCTION F(@s VARCHAR(MAX))RETURNS CHAR(6) AS BEGIN DECLARE @ CHAR='T',@p VARCHAR(50)='31415926535897932384626433832795028841971693993751',@i INT=0WHILE @='T'AND @s<>''BEGIN SET @i=PATINDEX('%[^a-z0-9]%',@s)IF @i=0RETURN'#True'IF @i-1<>LEFT(@p,1)RETURN'#False'SET @p=STUFF(@p,1,1,'')SET @s=STUFF(@s,1,@i,'')SET @s=STUFF(@s,1,PATINDEX('%[a-z0-9]%',@s)-1,'')END RETURN'#True'END

这将创建一个内联表值函数,该函数使用递归CTE来检测单词边界。

创建一个标量函数,将单词和PI的方式咀嚼为31个小数(第一个0)。通过以下方式调用

SELECT dbo.f('SQL I golf, a large procedure is normal. Hefty not terse') --#True

0

果酱40岁

"
,.'\"?!;:"{-}/S%{,PAV#*iA%=V):V}/]0#)!

目前尚不清楚“任何标点符号”是什么意思。此解决方案删除,.'"?!;;字符。


0

Bash和Unix工具,111

f() { grep ^"$(echo "$@"|grep -Po '[\w]+'|xargs -n1 sh -c 'echo ${#0}'|xargs|tr -d ' ')"<<<31415926535897932; 

0

NodeJS 32位230字节

我不能用JS:D缩短它

var p = "31415926535897932384626433832795", i = 0;
console.log(process.argv[2].split(/[\s,.]+/).every(function(w) {
    if (parseInt(p.charAt(i)) !== w.length) {
        return false;
    }
    i++;
    return true;
}) ? 'True' : 'False');

删除空格。
Rohan Jhunjhunwala
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.