Chương trình xác nhận Piem


11

Viết chương trình xác định hàm có thể kiểm tra xem một biến chuỗi có tên là "bất cứ thứ gì bạn muốn hoặc được người dùng nhập vào" có phải là một piem hay không. (piem = một câu chuyện hoặc bài thơ trong đó độ dài từ đại diện cho các chữ số của số pi ( từ Wikipedia ))

Vài ví dụ:

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

Bạn nên xóa bất kỳ loại dấu câu hoặc dòng mới trước khi xử lý. Golf mã thuần túy, chiến thắng ngắn nhất

Ngày kết thúc: tối ngày 1/10/2014

Câu trả lời khác nhau

  • Chúng ta cần xử lý bao nhiêu chữ số? Nhiều hơn 10
  • Là một vấn đề đáng quan tâm, 0 nên trong PI nên được giải thích như thế nào? Bỏ qua hoặc 10 chữ cái? 10 chữ cái
  • "một biến gọi là piem" - vậy tên của tham số phải là piem? Không, không, văn bản câu hỏi đã được sửa
  • Phần thưởng thú vị có thể là một giải pháp tự nó là một piem Nếu giải pháp của bạn là một piem bạn nhận được * 0,5 phần thưởng
  • Vì lợi ích của tranh luận, là _ luôn luôn chấm câu? Bạn có thể quyết định nếu đó là dấu câu hoặc nếu nó không
  • Không rõ nghĩa của "bất kỳ loại dấu câu" nghĩa là gì. '"?! ;; ()
  • Vậy chữ số nào nên tính? Và tiền phạt của Luật sẽ là sai? Chữ số nên được coi là chữ cái, Law 'fine = false; Luật tốt = Đúng

Bình luận

  • Giải pháp APL nên được tính bằng byte
  • Nếu giải pháp của bạn hoạt động với hơn 100 chữ số pi, bạn nhận được * 0,8 tiền thưởng
  • Bởi vì sự quan tâm lớn, ngày kết thúc là một ngày nữa trong tương lai.

6
Chúng ta cần xử lý bao nhiêu chữ số?
bến tàu

5
"một biến được gọi là piem" - vậy tên của tham số phảipiem? Điều đó làm cho tất cả các câu trả lời hiện tại không chính xác.
Ingo Bürk

2
Một phần thưởng thú vị có thể là một giải pháp mà bản thân nó là một piem.
Anh

5
Là một vấn đề đáng quan tâm, 0 nên trong PI nên được giải thích như thế nào? Bỏ qua hoặc 10 chữ cái?
MickyT

3
Thật là xấu hổ khi bạn không trả lời những câu hỏi rất quan trọng, nhưng bạn đã chỉnh sửa trong một ngày kết thúc.
Ingo Bürk

Câu trả lời:


3

APL (39)

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

Nó sử dụng tất cả các chữ số mà hằng số pi của trình thông dịch APL cung cấp, đến giới hạn 99. Trong trường hợp của tôi (Dyalog APL 14 32-bit) là 16 chữ số. Phiên bản 64 bit có nhiều chữ số hơn. 16 chữ số là đủ để các ví dụ đã cho hoạt động, mặc dù.

Các chuỗi có nhiều hơn số lượng từ đó sẽ thất bại , ngay cả khi tất cả các chữ số mà nó có thể kiểm tra là đúng. (Điều tương tự cũng đúng với các bài viết khác, như bài viết này.) Ví dụ: nếu chỉ có 10 chữ số, thì 'Cách tôi muốn uống' sẽ thất bại. Điều này có thể được sửa, nhưng với chi phí 14 ký tự:

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

Phiên bản đó sẽ chấp nhận bất kỳ chuỗi nào trong đó N chữ số đầu tiên là chính xác.


Mã của bạn là mã ngắn nhưng không phải là Unicode ... Tôi sẽ phải suy nghĩ xem bạn có xứng đáng giành chiến thắng hay không, phiên bản javascript chỉ dài hơn một chút so với điều này ... Dù sao tôi cũng nêu lên câu trả lời này.
Caridorc

1
@marinus Câu hỏi không chỉ định liệu các bài nộp nên được ghi bằng ký tự hay byte, nhưng mặc định là byte (theo wiki thẻ), vì vậy tôi nghĩ rằng điểm của bạn gần với 60.
Martin Ender

1
Với mã hóa đúng, nó là 1 byte cho mỗi ký tự. APL có trước Unicode sau nhiều thập kỷ.
bến tàu

1
@marinus Điểm công bằng! Bạn có biết bất kỳ mã hóa cụ thể (hiện có) nào thực sự hoạt động không?
Martin Ender

2
@ MartinBüttner: IBM codepage 907 là một, nhưng có rất nhiều tải.
bến tàu

7

JavaScript (169) (140) (137) (135) (63) cho 17 chữ số pi

Trong phiên bản của tôi Law's fineLaw ' s finetrả lại cả hai đúng.

Phiên bản mới nhất (63) của Ingo Bürk và hsl

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

Phiên bản mới (135) cho 17 chữ số pi (Cảm ơn 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
}

Phiên bản cũ (169) cho 32 chữ số pi:

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;
}

Bạn có thể lưu 3 byte với:1e15*Math.PI+"2384626433832795"
xem

Cảm ơn =) Trong khi đó tôi đã thay đổi nó bằng ý tưởng này nhưng giờ chỉ sử dụng 17 chữ số đầu tiên.
flawr

@ IngoBürk Cảm ơn bạn rất nhiều, chỉ cần kiểm tra những gì hoạt động.
flawr

Xin lỗi, đừng bận tâm. Điều đó dường như không hoạt động. : / forVòng lặp không thể được thêm theo cách này.
Ingo Bürk

Nhưng những gì không hoạt động là khởi tạo r=0và sau đó chỉ lặp đi lặp lại r+=s[a].length!=p[a](bạn có thể bỏ qua ;phần cuối). Sau đó, trở về !r.
Ingo Bürk

7

Ruby, 113 101 79 (98 * 0.8)

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

Giải trình

  • Đầu vào được lấy làm đối số cho lambda. Nó mong đợi a String.
  • Pi được tính đến 999số thập phân và biến thành Chuỗi với phần .bị loại bỏ.
  • Dấu chấm câu được xóa khỏi bài thơ và nó được chia thành các từ riêng lẻ. "Let's"được tính là hai từ: "Let""s".
  • Sử dụng Array#mapđể chuyển đổi từng từ thành kích thước của từ, ghép chúng thành a String.
  • Sử dụng Regapi, kiểm tra xem hai Strings được tạo có bắt đầu bằng cùng một ký tự không.

Tôi đã áp dụng tiền thưởng để xử lý hơn 100 chữ số. _không được xử lý như dấu câu trong giải pháp này.


Lưu ý rằng bạn không coi _là dấu câu.
Martin Ender

Cũng phát hiện ra. Để tranh luận, _ luôn luôn là dấu câu? Những gì về câu như My nickname on Stack Overflow is britishtea_500.
britishtea

Đó chỉ là một quan sát. OP không chính xác cụ thể về các chi tiết ở đây.
Martin Ender

Đủ công bằng. Tôi sẽ để lại câu trả lời cho đến bây giờ cho đến khi nó được chỉ định trong vấn đề :)
britishtea

Sử dụng bigdecimal bạn không có giới hạn về chữ số PI? Nice (+1)
edc65

4

Toán học, 123 byte * 0.8 = 98.4

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

Gần như đệ trình dài nhất cho đến nay, nhưng:

  • Nó hoạt động cho bất kỳ số chữ số của Pi.
  • Nó loại bỏ tất cả các ký tự ASCII cần thiết và ngắt dòng, mà không tách các từ ở những nơi đó.
  • Nó xử lý chính xác 0 chữ số trong Pi (dưới dạng 10 chữ cái)

nếu nó hoạt động với số chữ số của Pi, bạn sẽ nhận được tiền thưởng 0,8
Caridorc

1

Python - 130 127 116 - 17 chữ số của pi

Như trong câu trả lời của @flawr , Law ' s fineLaw's finecả hai đều trả về True.

Cảm ơn @Emil vì đã xóa 12 ký tự khỏi chương trình.

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

Bạn có thể lưu 12 ký tự bằng cách không lưu ltrong một biến và bằng cách xác định hàm bằng lambda.
Emil

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

trăn 3, 17 chữ số của pi, 104

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

Bạn có thể thay thế ;bằng một dòng mới để dễ đọc. Ngoài ra, một số không gian có thể được gỡ bỏ.
tomsmeding

1

Con trăn 3 - 129

Không tính đến dấu câu:

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

Và bây giờ cho một giải pháp T-SQL lớn :)

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

Điều này tạo ra một hàm có giá trị bảng nội tuyến sử dụng CTE đệ quy để phát hiện ranh giới từ.

Tạo một hàm vô hướng để nhai nó thông qua các từ và PI đến 31 số thập phân (0 đầu tiên). Nó được gọi theo cách sau

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

0

CJam, 40

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

Không rõ nghĩa của "bất kỳ loại dấu câu" nào; giải pháp này loại bỏ các ,.'"?!;;ký tự.


0

Công cụ Bash và unix, 111

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

0

NodeJS 32 chữ số 230 byte

Tôi không thể rút ngắn hơn với 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');

xóa khoảng trắng.
Rohan Jhunjhunwala
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.