Piem 유효성 검사기 프로그램


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이어야합니까? 아니요, 질문 텍스트가 수정되지 않았습니다.
  • 재미있는 보너스는 그 자체가 piem 인 솔루션 일 수 있습니다. 솔루션이 piem 인 경우 * 0.5 보너스를받습니다.
  • 논쟁을 위해 _는 항상 구두점입니까? 구두점인지 아닌지 결정할 수 있습니다.
  • "어떤 종류의 구두점"이 무엇을 의미하는지는 확실하지 않습니다 . ' "!! ;; ()
  • 숫자를 세어야합니까? 그리고 법의 벌금은 거짓일까요? 숫자는 글자로 취급해야합니다. Laws fine = False; 법칙 괜찮음 = 참

코멘트

  • APL 솔루션은 바이트 단위로 계산되어야합니다
  • 솔루션이 100 자리 이상의 파이에서 작동하면 * 0.8 보너스를받습니다
  • 큰 관심으로 인해 종료 날짜가 미래에 하루 더 더 있습니다.

6
몇 자리를 처리해야합니까?
marinus

5
"변수는 piem라고"- 파라미터의 이름 있도록 해야piem? 모든 현재 답변이 잘못되었습니다.
Ingo Bürk

2
재미있는 보너스는 그 자체로 해결책이 될 수 있습니다.
britishtea

5
관심의 대상으로 PI의 0을 어떻게 해석해야합니까? 건너 뛰거나 10 글자 단어?
MickyT

3
매우 중요한 질문에 답하지 않고 종료일에 이미 편집 한 것은 부끄러운 일입니다.
Ingo Bürk

답변:


3

APL (39)

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

APL 인터프리터의 pi 상수가 제공하는 모든 숫자를 99로 제한합니다. 필자의 경우 (Dyalog APL 14 32 비트)는 16 자리였습니다. 64 비트 버전에는 더 많은 자릿수가 있습니다. 16 자리이면 주어진 예제가 작동하기에 충분합니다.

확인할 수있는 모든 숫자가 true 인 경우에도 단어의 양보다 많은 문자열은 실패 합니다. (이 글을 쓰는 시점에서 다른 게시물의 경우도 마찬가지입니다.) 예를 들어, 10 자리 숫자 만 있다면 '음료를 원하는 방법'은 실패합니다. 이 문제는 해결 될 수 있지만 14 자입니다.

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

이 버전은 첫 N 자리가 올바른 문자열 을 허용 합니다.


귀하의 코드는 단점이지만 유니 코드는 아닙니다 ... 승리를받을 자격이 있는지 여부에 대해 생각해야합니다 .Javascript 버전이 이것보다 조금 더 길었습니다 ... 어쨌든 나는이 대답을 찬성했습니다.
Caridorc

1
@marinus이 질문은 제출물이 문자 또는 바이트로 점수를 매길 지 여부를 지정하지 않지만 기본값은 바이트 (태그 위키에 따라)이므로 점수는 60에 가깝습니다.
Martin Ender

1
올바른 인코딩이 주어지면 문자 당 1 바이트입니다. APL은 결국 수십 년 전부터 유니 코드보다 앞서 있습니다.
marinus

1
@marinus 페어 포인트! 실제로 작동하는 특정 (기존) 인코딩을 알고 있습니까?
Martin Ender

2
@ MartinBüttner : IBM 코드 페이지 907은 하나이지만로드가 있습니다.
marinus

7

pi의 17 자리에 대한 JavaScript (169) (140) (137) (135) (63)

내 버전 Law's fineLaw ' s fine모두 사실을 반환합니다.

Ingo Bürk와 hsl의 최신 버전 (63)

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

pi의 17 자리 숫자에 대한 새 버전 (135) (Ingo Bü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
}

파이 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

Thanks =) 그동안 나는이 아이디어를 사용하여 그것을 바꾸었지만 이제는 처음 17 자리 만 사용했습니다.
flawr

@ IngoBürk 감사합니다. 무엇이 작동하는지 확인하십시오.
flawr

미안, 신경 쓰지 마 작동하지 않는 것 같습니다. : / for이 방법으로 루프를 추가 할 수 없습니다.
Ingo Bürk

그러나 작동하는 것은 초기화 r=0하고 반복하는 것입니다 r+=s[a].length!=p[a]( ;결국에는 생략 할 수 있음 ). 그런 다음을 반환하십시오 !r.
Ingo Bürk

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"두 단어로 계산됩니다 : "Let""s".
  • 사용 Array#map, 단어의 크기로 각 단어를 변환하는 그들은에 연결할 String.
  • Regexp를 사용하여 작성된 두 String문자가 동일한 문자로 시작 하는지 확인하십시오 .

100 개 이상의 숫자를 처리하는 데 보너스를 적용했습니다. _이 솔루션에서는 구두점으로 처리되지 않습니다.


_구두점으로 취급하지 않습니다 .
Martin Ender

잘 발견되었습니다. 논쟁을 위해 _ 항상 구두점이 있습니까? 무엇과 같은 문장에 대해 My nickname on Stack Overflow is britishtea_500.
britishtea

그것은 단지 관측 일뿐입니다. OP는 여기의 세부 사항에 대해 구체적이지 않습니다.
Martin Ender

그럴 수 있지. 나는 그것이 문제에 명시 될 때까지 지금까지 답을 남겨 둘 것이다 :)
britishtea

bigdecimal을 사용하면 PI 숫자에 제한이 없습니까? Nice (+1)
edc65

4

수학, 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 - 17 자리 PI

마찬가지로 @flawr의 대답 , Law ' s fine그리고 Law'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자를 저장할 수 있습니다 .
Emil

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

파이썬 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

배쉬 및 유닉스 도구, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.