มันเป็นนายกหรือไม่? ไม่มีคณิตศาสตร์ [ปิด]


14

เขียนโปรแกรมหรือฟังก์ชั่นในภาษาใด ๆ ที่บอกว่าอินพุตเป็นตัวเลขเฉพาะหรือไม่

  • อินพุตเป็นสตริงที่แทนจำนวนธรรมชาติใน base-10
  • เอาต์พุตเป็นหนึ่งในสองสตริง "Prime" หรือ "Not !!" ซึ่งระบุอินพุตได้อย่างถูกต้อง
  • ตัวดำเนินการทางคณิตศาสตร์ตัวดำเนินการ bit-wise ตัวแปรที่เป็นตัวเลขและค่าคงที่ "ทั่วไป" สิ่งต่าง ๆ "โดยทั่วไปไม่อนุญาตให้ใช้ทุกที่ในโปรแกรมของคุณ คุณควรใช้การทำงานของสตริงเพื่อทำการ "คำนวณ" ที่จำเป็นทั้งหมด
  • คุณสามารถเปรียบเทียบความยาวสตริง (ซึ่งเป็นตัวเลข) - แต่ -10 กับคะแนนของคุณหากคุณไม่ต้องการ
  • โปรแกรมของคุณควรทำงานกับอินพุตความยาวใด ๆ (ให้หน่วยความจำและเวลาเพียงพอ)
  • จำนวนไบต์ต่ำสุด (UTF-8) ชนะ

ขอบเขตของจำนวนคืออะไร มันจะเป็นลบหรือไม่? ศูนย์? มันสามารถมีจุดทศนิยม?
Justin

หากมีคะแนนโบนัสนั่นไม่ใช่รหัส - กอล์ฟ
Peter Taylor

เพิ่ม "ธรรมชาติ" เพื่อระบุขอบเขตในอินพุต
เก่ง

ฉันหวังว่าจะประหลาดใจกับการจัดการสตริงที่ชัดเจนอย่างบ้าคลั่ง (ฉันคิดว่าเป็นการเขียนโค้ดเพื่อ "ลดค่า" สตริงเพื่อที่ฉันจะได้วนซ้ำ - และฉันถูกฉีกขาดระหว่างการหารยาวของสตริงและการลบสตริงซ้ำ ... ) แทนฉัน รู้สึกประหลาดใจกับการจับคู่ที่ยอดเยี่ยมของ regex ตัวน้อย! บางทีฉันอาจต้องถามคำถามอีกครั้งไม่อนุญาตให้ regex ดูว่าฉันได้สิ่งที่ยอดเยี่ยมกว่านี้อีกไหม? แต่ฉันไม่คิดว่าสิ่งใดจะสามารถเข้าใกล้ความกะทัดรัดของ regex นั้นได้
เก่ง

ที่จะได้รับ "สิ่ง wonderfull มากขึ้น" บางทีคุณอาจจะพยายามทำให้มันเป็นความนิยมประกวด การเปลี่ยนคำถามตัวเองมักจะขมวดคิ้วเมื่อ และฉันไม่แน่ใจว่าคุณควรตั้งคำถามใหม่หรือเปลี่ยนแปลงอะไรเพียงเพราะมีบางสิ่งเกิดขึ้นกับสิ่งที่คุณไม่ได้คิด - ฉันคิดว่ามันเกิดขึ้นบ่อยครั้งที่นี่ นอกจากนี้กฏการดัดเป็นส่วนหนึ่งของกีฬา :)
daniero

คำตอบ:


7

Ruby, 64 - 10 = 54

puts ('1
'..gets).map{?1}*''=~/^1?$|^(11+?)\1+$/?'Not!!': :Prime

สิ่งนี้วนซ้ำจากสตริง '1' (บวกขึ้นบรรทัดใหม่) ไปยังสตริงอินพุตโดยใช้วิธีการวนซ้ำของสตริงในตัวซึ่งรูบี้มีลักษณะแย่มากเช่นการเพิ่ม 1 แต่ไม่สร้างตัวแปรตัวเลขระดับสูงทางเทคนิค ณ จุดใด ๆ . มันใช้ความจริงที่ว่าจะมีการวนซ้ำ n สำหรับอินพุตของ n เพื่อสร้างสตริงที่มีความยาว n จากนั้นใช้นิพจน์ทั่วไปเพื่อพิจารณาว่าสตริงนั้นสามารถจัดกลุ่มเป็นสตริงย่อยที่เหมือนกันได้หรือไม่


"1" ใน "map {? 1}" เป็น Fixnum หรือไม่ - ถ้าเป็นเช่นนั้นคุณอาจต้องเปลี่ยนเป็น "map ('1') ฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับนิพจน์ได้หรือไม่ 1 ยกเว้นคำแนะนำบางอย่างที่ใน Ruby รุ่นเก่ากว่าจะส่งคืนรหัส ASCII และตอนนี้จะส่งคืนสตริง .
เก่ง

? 1 เหมือนกับ '1' มันเป็นสตริงตัวอักษร 1 ตัว ฉันสามารถแทนที่อินสแตนซ์ทั้งหมดของ 1 แต่ตัวแรกเป็นอักขระอื่นได้
ประวัติศาสตร์ประจำ

โอเค - ฉันไม่พบการก่อสร้างที่อธิบายได้ทุกที่!
เก่ง

ฉันเลือกสิ่งนี้ว่า "ผู้ชนะ" เนื่องจากมันไม่ได้ใช้เพื่อหลีกเลี่ยงแม้แต่คำใบ้ของคณิตศาสตร์
เก่ง

3
ไม่มีหมวกปลายสำหรับ Abigail? สำหรับความอัปยศ. นี่คือพอร์ตที่ตรงของโซลูชัน perl 1998: catonmat.net/blog/perl-regex-that-matches-prime-numbers
skibrianski

16

ทับทิม: 52 - 10 = 42

ใช้รูปแบบของการจับคู่ที่สำคัญที่มีชื่อเสียง

puts ?_*gets.to_i=~/^(_|(__+?)\2+)$/?"Not!!":"Prime"

เพียงเพื่อให้ชัดเจน: ?_*gets.to_iคือการดำเนินการสตริงที่ผนวก"_"ตัวเองnครั้งโดยที่nคือหมายเลขอินพุต อย่างที่ฉันเห็นมันไม่มีการเปรียบเทียบความยาวสตริงดังนั้นควรเป็นไปตามเกณฑ์โบนัส 10 ตัวอักษร


1
ฉันไม่คุ้นเคยกับ Ruby ดังนั้นแก้ไขให้ถูกต้องหากฉันทำผิด แต่ "to_i" ไม่แปลงสตริงเป็นจำนวนเต็มใช่หรือไม่ ไม่ใช่ว่าผมไม่รัก brillient ตรวจสอบที่สำคัญในเอก ...
เก่ง

1
@ ยอดจริงฉันไม่คิดว่า "แปลง" ไม่ใช่คำที่ถูกต้อง แต่วิธีคืนค่า int ใช่ แต่ฉันก็ยังไม่ได้ใช้ต่อไปArithmetic operators, bit-wise operators, numeric variables and constantsและคุณไม่สามารถจริงๆเรียกวิธีการจำแนกเป็น"math-stuff" in general.. ?
daniero

@daniero ฟังดูสมเหตุสมผล - บางทีอยู่ตรงขอบสเป็ค
เก่ง

3

Perl 52-10 = 42

การดำเนินงาน

print((('-'x$ARGV[0])=~/^.$|^(..+?)\1+$/)?Not:Prime)

การสาธิต

$ seq 1 10|xargs -I{} bash -c "echo -n '{} '  && perl Prime.pl {} && echo"
1 Not
2 Prime
3 Prime
4 Not
5 Prime
6 Not
7 Prime
8 Not
9 Not
10 Not

4
1 ไม่ได้เป็นนายกจริง ๆ
elixenide

ใช้ดัชนีอาเรย์ตัวเลข - ดังนั้นที่ขอบของข้อมูลจำเพาะ
เก่ง

ใช้popแทน$ARGV[0]บันทึก 4 ตัวอักษรลบดัชนีอาร์เรย์ตัวเลข
mob

1

ECMAScript 6, 159 - 10 = 149

ดูเหมือนงาน regex I / O ด้วยprompt/ alertตามปกติ

for(s=prompt(u=""); /[^0]/.test(s); )
  s=s.replace(/(.)(0*)$/,(_,d,t)=>u+="x"," 012345678"[d]+t.replace(/0/g,"9"))
alert(/^((xx+)\2+|x?)$/.test(u)?"Not!!":"Prime")

ห่วงในขณะที่ลดจำนวนทศนิยมโดยหนึ่งแต่ละการทำซ้ำอย่างหมดจดโดย regex regex สุดท้ายตรงกับสตริงที่ประกอบด้วยจำนวนประกอบของ x's โดยการจับคู่หนึ่งปัจจัยแรกแล้วอีกครั้งโดยการทำซ้ำปัจจัยแรกหนึ่งสำหรับส่วนที่เหลือของสตริง


ฉันชอบฟังก์ชั่นการลดสตริง - ชัดเจนและรัดกุม
เก่ง

1

Javascript 266

function N(a){function b(a){return P.every(function(b){if(n=b,i=a.length,j=b.length,j>i) return;if(j==i) return 1;while(n.length<i)n+=b;return n.length!=i})}if(q=A,A!=a)for(;q.length.toString()!=a;)b(q)&&P.push(q),q+=A;console.log(b(q)?"Prime":"Not!!")}A="0",P=[A+A]

สร้างฟังก์ชั่นที่เรียกว่า N ซึ่งจะพิมพ์ผลลัพธ์ที่ต้องการ รุ่นที่ไม่ได้แก้ไขจะมีลักษณะเช่นนี้ ฉันใช้มือลดขนาดเพื่อทำความสะอาดตัวแปรแล้ววิ่งผ่าน uglify แล้วย่อมืออีกครั้ง

// A a string of "0" for using to generate long strings
// P is the store for all known primes
A="0", P=[A+A];
function N(val) {
  function _isPrime(str) {
    // go through all the known primes and return true
    // if we don't match on any of them
    return P.every(function(prime) {
      // prime is some known string whose length is a prime number
      tsr = prime, strlen = str.length, primelen = prime.length;
      // if the string we're checking has fewer chars than
      // this then it's not a prime
      if(strlen < primelen) return 0;
      // if the string we're checking has the same number of chars
      // as the the prime we're checking against then it is a prime
      if(primelen == strlen) return 1;
      // Keep incrementing our temporary string with the prime we're
      // checking. we'll break out of the loop once the temporary string
      // is greater than or equal to the string we're testing
      while(tsr.length < strlen) {
        tsr += prime;
      }
      return !(tsr.length == strlen)
    });
  }
  // start with a string of one unit
  nstr = A
  if(A!=val) {
    // keep incrementing the string so that we can compile a list
    // of known primes smaller than this value
    while(nstr.length.toString() !== val) {
      if(_isPrime(nstr)) {
        P.push(nstr);
      }
      nstr += A;
    }
  }
  console.log(_isPrime(nstr) ? "Prime" : "Not!!");
}

ทดสอบโดยใช้ตัวอย่างนี้:

for(var X=0;X<10;X++) {
  console.log('checking: ' + X);
  N(X.toString());
}

1
ฉันไม่แน่ใจว่าฉันเห็นวิธีการทำงาน แต่ฉันเห็นตัวแปรตัวเลข (i) และตัวดำเนินการทางคณิตศาสตร์ (i ++)
เก่ง

โอ้ไม่ได้ตระหนักว่าฉันไม่สามารถทำอะไรแบบนั้นได้ .. จะเขียนมันคืนนี้
Sugendran

โดยทั่วไปฉันจะสร้างอาร์เรย์ของสตริงที่มีความยาวเป็นจำนวนเฉพาะ ดังนั้นเมื่อฉันได้รับการป้อนฉันยังคงเพิ่มตัวละครในสตริงจนกว่าค่าความยาวสำหรับสตริงที่ตรงกับการป้อนข้อมูล จากนั้นฉันก็ใช้สายนี้และดูว่าฉันสามารถหารมันด้วยจำนวนเฉพาะเท่าไรก็ได้ ถ้าฉันทำไม่ได้มันจะต้องมีความสำคัญ และโดยการหารฉันหมายความว่าฉันใช้สายหลักที่รู้จักและเพิ่มเข้าไปในตัวเองความยาวของสตริงนั้นเท่ากับหรือใหญ่กว่าสตริงที่มีปัญหา
Sugendran

ผมได้ปรับปรุงรหัสก็จริงช่วยลดจำนวนของตัวอักษรเล็กน้อย :)
Sugendran

เย็น. ดูเหมือนความคิดเดียวกันกับ regex แต่มีประสิทธิภาพมากขึ้นและแสดงตรรกะที่แท้จริงอย่างชัดเจน
เก่ง

0

Bash 66 - 10 = 56

การดำเนินงาน

[[ -z `printf %$1s|grep -P "^(..+?)\1+$"` ]]&&echo Prime||echo Not

การสาธิต

$ seq 1 10|xargs -I{} bash -c "echo -n '{} '  && ./Prime.sh {}"
1 Prime
2 Prime
3 Prime
4 Not
5 Prime
6 Not
7 Prime
8 Not
9 Not
10 Not

ข้างต้น 1 ไม่สำคัญ
เก่ง

0

Python 3, 109-10 = 89

print(['Not','Prime'][(lambda i:not any(' '*i==(' '*u)*v for u in range(i)for v in range(i)))(int(input()])

ไม่ได้เปรียบเทียบความยาวของสตริง แต่รวมถึงสตริง กากบาทที่โพสต์จากการทำซ้ำตรวจสอบว่าหมายเลขนั้นเป็นจำนวนเฉพาะโดยไม่ต้องใช้เลขคณิตหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.