Piem Validatorプログラム


11

「ユーザーが望むものまたは入力したもの」という文字列変数がパイムかどうかをチェックできる関数を定義するプログラムを作成します。(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でなければなりませんか?いいえ、質問テキストは修正されていません
  • 楽しいボーナスはそれ自体が解決策である可能性がありますあなたの解決策が解決策である場合、* 0.5のボーナスが得られます
  • 議論のために、_は常に句読点ですか?句読点かそうでないかを決めることができます
  • 「あらゆる種類の句読点」が何を意味するのかは不明です、つまり、。 ''?!;;()
  • 数字を数える必要がありますか?そして、法律の罰金は虚偽でしょうか?数字は文字として扱う必要があります。Law's fine = False; Law 's fine = True

コメント

  • APLソリューションはバイト単位でカウントする必要があります
  • ソリューションがpiの100桁以上で機能する場合、* 0.8のボーナスが得られます
  • 関心が高いため、終了日は1日先です。

6
何桁処理する必要がありますか?
マリヌス14

5
「piemと呼ばれる変数」 -そう、パラメータの名前をしなければならないことpiem?これにより、現在のすべての回答が不正確になります。
インゴバーク14

2
楽しいボーナスは、それ自体が解決策である可能性があります。
イギリス茶14

5
関心事として、PIの0はどのように解釈されるべきですか?スキップまたは10文字の単語?
MickyT 14

3
非常に重要な質問に答えないのは残念ですが、終了日にはすでに編集しています。
インゴ・バーク

回答:


3

APL(39)

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

APLインタープリターのpi定数が提供するすべての数字を99の制限まで使用します。私の場合(Dyalog APL 14 32ビット)は16桁でした。64ビットバージョンには、おそらくより多くの桁があります。ただし、与えられた例が機能するには16桁で十分です。

確認できる数字がすべて真であっても、それ以上の単語を含む文字列は失敗します。(この記事の執筆時点では、他の投稿でも同じことが言えます。)たとえば、10桁しかなかった場合、「How I want to drink」は失敗します。これは修正できますが、14文字のコストがかかります:

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

そのバージョンは、最初のN桁が正しい任意の文字列を受け入れます。


あなたのコードは短編ですが、Unicodeではありません...あなたが勝利に値するかどうかを考えなければなりません、javascriptのバージョンはこれよりほんの少し長いです...とにかく私はこの答えを支持しました。
Caridorc 14

1
私はあなたのスコアが近いと60だと思うので@marinus、疑問が提出は、文字またはバイトで得点するかどうかを指定しませんが、デフォルトでは(タグウィキごとに)バイトである
マーティン・エンダー

1
適切なエンコーディングを考えると、文字ごとに1バイトです。結局のところ、APLはUnicodeに数十年前から存在します。
マリヌス14

1
@marinusフェアポイント!実際に機能する特定の(既存の)エンコーディングを知っていますか?
マーティンエンダー

2
@MartinBüttner:IBMコードページ907は1つですが、負荷があります。
マリヌス14

7

JavaScript (169)(140)(137)(135)(63)17桁のパイ

私のバージョンではLaw's fineLaw ' 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桁のみを使用しています。
flawr 14

@IngoBürk何が機能するかを確認するだけで、どうもありがとう。
flawr 14

すみません、気にしないでください。それはうまくいかないようです。:/ forこの方法でループを追加することはできません。
インゴバーク14

しかし、機能するのは初期化r=0してからループするだけr+=s[a].length!=p[a]です(;最後は省略できます)。その後、を返し!rます。
インゴバーク14

7

ルビー、113 101 79(98 * 0.8)

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

説明

  • 入力は、ラムダへの引数として取得されます。を期待していStringます。
  • Piは999小数まで計算され、.削除された文字列に変換されます。
  • 句読点は詩から削除され、個々の単語に分割されます。"Let's"は2つの単語としてカウントされます:"Let""s"
  • を使用Array#mapして、各単語を単語のサイズに変換し、それらをに連結しますString
  • 正規表現を使用して、作成された2つStringのが同じ文字で始まるかどうかを確認します。

100桁以上の処理にボーナスを適用しました。_このソリューションでは、句読点として処理されません。


_句読点として扱わないことに注意してください。
マーティンエンダー14

よく見分けられます。議論のために、_ 常に句読点はありますか?などの文章はどうですかMy nickname on Stack Overflow is britishtea_500
イギリス茶14

それはただの観察でした。OPは、ここの詳細について正確には特定していません。
マーティンエンダー14

けっこうだ。問題で指定されるまで、今のところ答えを残します:)
britishtea 14

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文字の単語として)

それはパイの桁数のために働く場合は、0.8のボーナスを得る
Caridorc

1

パイソン- 130 127 116 - PIの17桁

同様に@flawrの答えLaw ' s fineLaw's fineの両方にtrueを返します。

プログラムから12文字を削除してくれた@Emilに感謝します。

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変数に保存せず、ラムダを使用して関数を定義することにより、12文字を保存できます。
エミール14

1

Java、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、17桁のpi、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

CJam、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');

空白を削除します。
ローハンジュンジュンワラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.