โปรแกรมตรวจสอบ 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

คุณควรลบเครื่องหมายวรรคตอนหรือบรรทัดใหม่ใด ๆ ก่อนประมวลผล เพียวรหัสกอล์ฟเป็นการชนะที่สั้นที่สุด

วันที่สิ้นสุด: ตอนเย็นของวันที่ 1/10/2557

คำตอบต่าง ๆ

  • เราต้องจัดการตัวเลขกี่หลัก มากกว่า 10
  • ตามความสนใจ 0 จะต้องตีความของ PI อย่างไร? ข้ามหรือ 10 คำตัวอักษร? เป็นตัวอักษร 10 คำ
  • "ตัวแปรที่เรียกว่า piem" - ดังนั้นชื่อของพารามิเตอร์จะต้องเป็น piem? ไม่มันไม่ได้แก้ไขข้อความคำถาม
  • โบนัสความสนุกอาจเป็นวิธีแก้ปัญหาที่เป็น piem หากโซลูชันของคุณคือ piem คุณจะได้รับ * 0.5 โบนัส
  • เพื่อประโยชน์ในการโต้แย้ง_คือเครื่องหมายวรรคตอนเสมอหรือไม่ คุณสามารถตัดสินใจได้ว่ามันคือเครื่องหมายวรรคตอนหรือไม่
  • ไม่ชัดเจนว่า "เครื่องหมายวรรคตอนใด ๆ " ในที่นี้หมายถึงอะไร ""?! ;; ()
  • ดังนั้นควรนับตัวเลข และความดีของกฏหมายจะผิด? ตัวเลขควรได้รับการปฏิบัติเสมือนเป็นตัวอักษร Law's fine = False กฎหมายดี = จริง

ความคิดเห็น

  • วิธีการแก้ปัญหา APL ควรนับเป็นไบต์
  • หากวิธีการแก้ปัญหาของคุณใช้ 100 pi หลักคุณจะได้รับ * 0.8 โบนัส
  • เนื่องจากความสนใจยิ่งใหญ่วันที่สิ้นสุดจึงเป็นอีกหนึ่งวันในอนาคต

6
เราต้องจัดการตัวเลขกี่หลัก
marinus

5
"ตัวแปรที่เรียกว่า piem" - ดังนั้นชื่อของพารามิเตอร์จะต้องเป็นpiemอย่างไร ที่ทำให้คำตอบปัจจุบันทั้งหมดไม่ถูกต้อง
Ingo Bürk

2
โบนัสความสนุกอาจเป็นคำตอบที่เป็น piem
britishtea

5
ตามความสนใจ 0 จะต้องตีความของ PI อย่างไร? ข้ามหรือ 10 คำตัวอักษร?
มิ

3
เป็นเรื่องน่าละอายที่คุณไม่ได้ตอบคำถามที่สำคัญมาก แต่คุณได้แก้ไขในวันที่สิ้นสุดแล้ว
Ingo Bürk

คำตอบ:


3

APL (39)

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

มันใช้ตัวเลขทั้งหมดที่ค่า pi คงที่ของล่าม APL จนถึงขีด จำกัด 99 ในกรณีของฉัน (Dyalog APL 14 32 บิต) นั่นคือ 16 หลัก รุ่น 64 บิตน่าจะมีตัวเลขมากกว่า แม้ว่าตัวเลข 16 หลักนั้นเพียงพอสำหรับตัวอย่างที่กำหนดให้ใช้งานได้

สตริงที่มีจำนวนคำมากกว่านั้นจะล้มเหลวแม้ว่าตัวเลขทั้งหมดที่สามารถตรวจสอบได้จะเป็นจริง (เช่นเดียวกับการโพสต์อื่น ๆ เช่นเดียวกับการเขียนนี้) ตัวอย่างเช่นถ้ามีเพียง 10 หลัก, 'ฉันต้องการเครื่องดื่ม' จะล้มเหลว สิ่งนี้สามารถแก้ไขได้ แต่มีค่าใช้จ่าย 14 ตัวอักษร:

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

รุ่นนั้นจะยอมรับสตริงใด ๆ ที่มีตัวเลขNแรกถูกต้อง


รหัสของคุณสั้น แต่ไม่ใช่ Unicode ... ฉันต้องคิดว่าถ้าคุณสมควรได้รับ win หรือไม่เวอร์ชันของ javascript นั้นจะยาวกว่านี้นิดหน่อย ...
Caridorc

1
@marinus คำถามไม่ได้ระบุว่าการส่งคะแนนควรทำโดยตัวละครหรือไบต์ แต่ค่าเริ่มต้นคือไบต์ (ตามแท็กวิกิ) ดังนั้นฉันคิดว่าคะแนนของคุณอยู่ใกล้กับ 60
Martin Ender

1
รับการเข้ารหัสที่ถูกต้องคือ 1 ไบต์ต่อตัวละคร APL ถือกำเนิด Unicode เมื่อหลายสิบปีก่อน
marinus

1
@marinus จุดประสงค์! คุณรู้หรือไม่ว่าการเข้ารหัส (ปัจจุบัน) ใดที่ใช้งานได้จริง
Martin Ender

2
@ MartinBüttner: IBM codepage 907 เป็นหนึ่ง แต่มีการโหลด
marinus

7

JavaScript (169) (140) (137) (135) (63) สำหรับ 17 หลักของ pi

ในรุ่นของฉันLaw's fineและLaw ' s fineคืนทั้งจริง

รุ่นใหม่ล่าสุด (63) โดย Ingo Bürkและ hsl

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

รุ่นใหม่ (135) สำหรับ pi 17 หลัก (ขอบคุณ 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
}

รุ่นเก่า (169) สำหรับ pi 32 หลัก:

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ห่วงไม่สามารถเพิ่มด้วยวิธีนี้
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#mapString
  • ใช้ Regexp ตรวจสอบว่าทั้งสองสร้างขึ้นStringเริ่มต้นด้วยอักขระเดียวกัน

ฉันใช้โบนัสเพื่อจัดการตัวเลขมากกว่า 100 หลัก _ไม่ได้รับการจัดการเป็นเครื่องหมายวรรคตอนในโซลูชันนี้


โปรดทราบว่าคุณไม่ได้ใช้_เครื่องหมายวรรคตอน
Martin Ender

เห็นดี เพื่อประโยชน์ในการโต้แย้งเครื่องหมายวรรคตอน_ อยู่เสมอหรือไม่ My nickname on Stack Overflow is britishtea_500สิ่งที่เกี่ยวกับประโยคเช่น
britishtea

มันเป็นเพียงการสังเกต OP ไม่ได้เจาะจงเฉพาะเกี่ยวกับรายละเอียดที่นี่
Martin Ender

ยุติธรรมพอสมควร ฉันจะออกจากคำตอบขึ้นสำหรับในตอนนี้จนกว่าจะมีการระบุไว้ในปัญหา :)
britishtea

ใช้ 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 ที่จำเป็นทั้งหมดและตัวแบ่งบรรทัดโดยไม่ต้องแยกคำในสถานที่เหล่านั้น
  • มันจัดการ 0 หลักใน Pi ได้อย่างถูกต้อง (เป็นคำ 10 ตัวอักษร)

ถ้ามันใช้งานได้กับจำนวนหลักของ Pi คุณจะได้รับโบนัส 0.8
Caridorc

1

Python - 130 127 116 - 17 หลักของ pi

ในขณะที่@flawr 's คำตอบ , 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)]))

คุณสามารถบันทึก 12 ตัวอักษรโดยไม่บันทึกlในตัวแปรและโดยการกำหนดฟังก์ชั่นการใช้แลมบ์ดา
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

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

เครื่องมือทุบตีและยูนิกซ์ 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.