Có phải là một nguyên tố? w / o toán [đóng]


14

Viết chương trình hoặc hàm bằng bất kỳ ngôn ngữ nào cho biết đầu vào là số nguyên tố.

  • Đầu vào là một chuỗi đại diện cho một số tự nhiên trong cơ sở 10.
  • Đầu ra là một trong hai chuỗi "Prime" hoặc "Not !!" trong đó xác định chính xác đầu vào.
  • Toán tử số học, toán tử bit khôn ngoan, biến số và hằng số, "công cụ toán học" nói chung, v.v ... không được phép ở bất cứ đâu trong chương trình của bạn. Bạn nên sử dụng các thao tác chuỗi để thực hiện tất cả các "tính toán" cần thiết.
  • Bạn có thể so sánh độ dài chuỗi (là số) - nhưng -10 với điểm của bạn nếu bạn không.
  • Chương trình của bạn sẽ hoạt động trên bất kỳ đầu vào độ dài nào (được cung cấp đủ bộ nhớ và thời gian).
  • Số byte thấp nhất (UTF-8) thắng.

Các giới hạn trên số là gì? Nó có thể là tiêu cực? Số không? Nó có thể chứa một dấu thập phân?
Justin

Nếu nó có điểm thưởng, thì đó không phải là môn đánh gôn
Peter Taylor

Đã thêm "tự nhiên" để chỉ định giới hạn trên đầu vào.
Wally

Tôi đã hy vọng sẽ ngạc nhiên với một số thao tác chuỗi rõ ràng điên rồ (cá nhân tôi đã suy nghĩ về việc viết mã để "giảm" một chuỗi để tôi có thể lặp - và tôi đã bị giằng xé giữa phép chia chuỗi dài và phép trừ chuỗi lặp lại ...), thay vào đó tôi đã ngạc nhiên với trận đấu tuyệt vời regex unary Prime! Có lẽ tôi cần phải hỏi lại câu hỏi không cho phép regex để xem liệu tôi có nhận được những thứ tuyệt vời hơn nữa không? Nhưng tôi không nghĩ bất cứ điều gì sẽ có thể đến gần với sự ngắn gọn của regex đó.
Wally

Để có được "nhiều thứ tuyệt vời hơn", có lẽ bạn có thể thử biến nó thành một cuộc thi nổi tiếng . Thay đổi câu hỏi nói chung là nhăn mặt mặc dù. Và tôi không chắc bạn nên đưa ra một câu hỏi mới hoặc thay đổi bất cứ điều gì chỉ vì ai đó nghĩ ra điều gì đó mà bạn không nghĩ tới - tôi nghĩ điều đó xảy ra khá thường xuyên ở đây. Ngoài ra, uốn cong quy tắc là một phần của môn thể thao :)
daniero

Câu trả lời:


7

Hồng ngọc, 64 - 10 = 54

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

Điều này lặp lại từ chuỗi '1' (cộng với một dòng mới) đến chuỗi đầu vào, sử dụng phương pháp lặp chuỗi tích hợp của Ruby trông rất giống như thêm 1, nhưng về mặt kỹ thuật không tạo ra một biến số cấp cao ở bất kỳ điểm nào . Nó sử dụng thực tế là sẽ có n lần lặp cho một đầu vào của n để tạo ra một chuỗi có độ dài n, sau đó sử dụng một biểu thức chính quy để xác định xem chuỗi đó có thể được nhóm thành các chuỗi con giống nhau hay không.


Là "1" trong "bản đồ {? 1}" có phải là Fixnum không? - nếu vậy, bạn có thể phải thay đổi nó thành "map ('1')? Tôi không thể tìm thấy bất kỳ tài liệu nào về biểu thức? 1 ngoại trừ một số gợi ý rằng trong các phiên bản cũ hơn của Ruby, nó trả về mã ASCII và bây giờ nó trả về một chuỗi .
Wally

? 1 giống như '1', đó là một chuỗi ký tự 1 ký tự. Tôi có thể thay thế tất cả các trường hợp của 1 nhưng lần đầu tiên bằng bất kỳ ký tự nào khác.
lịch sử

Ok - tôi không thể thấy rằng việc xây dựng được mô tả tốt ở bất cứ đâu!
Wally

Tôi chọn đây là "người chiến thắng" vì nó vượt ra ngoài để tránh ngay cả một gợi ý của toán học.
Wally

3
Không có mũ để Abigail? Vì xấu hổ. Đây là một cổng thẳng của giải pháp perl năm 1998: catonmat.net/blog/perl-regex-that-matches-prime-numbers
skibrianski

16

Hồng ngọc: 52 - 10 = 42

Sử dụng một biến thể của biểu thức chính phù hợp nổi tiếng đó.

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

Nói rõ hơn: ?_*gets.to_ilà một phép toán chuỗi nối "_"vào chính nó n lần, trong đó n là số đầu vào. Như tôi thấy, không có độ dài chuỗi nào được so sánh, do đó sẽ thỏa mãn tiêu chí thưởng 10 ký tự.


1
Tôi không quen thuộc với Ruby, vì vậy hãy sửa tôi nếu tôi sai, nhưng không "to_i" chuyển đổi chuỗi thành số nguyên? Không phải là tôi không thích người kiểm tra chính sáng chói trong Unary
Wally

1
@Wally Tôi không nghĩ "convert" không phải là từ đúng, nhưng phương thức trả về một int, vâng. Tuy nhiên, tôi không sử dụng bất kỳ cách nào sau đây Arithmetic operators, bit-wise operators, numeric variables and constantsvà bạn thực sự không thể phân loại gọi một phương thức là "math-stuff" in general..?
daniero

@daniero Nghe có vẻ hợp lý - có lẽ ngay ở rìa của thông số kỹ thuật.
Wally

3

Perl 52-10 = 42

Thực hiện

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

Bản giới thiệu

$ 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 không thực sự là một nguyên tố.
elixenide

Sử dụng một chỉ số mảng số - vì vậy ở cạnh của thông số kỹ thuật.
Wally

Sử dụng popthay vì $ARGV[0], lưu 4 ký tự, xóa chỉ số mảng số
mob

1

ECMAScript 6, 159 - 10 = 149

Âm thanh như một nhiệm vụ cho regex. I / O với prompt/ alertnhư bình thường.

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")

Vòng lặp while giảm số thập phân cho mỗi lần lặp hoàn toàn bằng regex. Regex cuối cùng khớp với một chuỗi bao gồm một số tổng hợp của x, bằng cách khớp đầu tiên một yếu tố, sau đó là một yếu tố khác bằng cách lặp lại yếu tố đầu tiên một cho phần còn lại của chuỗi.


Tôi thích chức năng giảm chuỗi - rõ ràng và súc tích.
Wally

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]

Tạo một hàm gọi là N sẽ in kết quả mong muốn. Phiên bản chưa hoàn thành trông như thế này. Tôi đã làm một bàn tay rút gọn để dọn sạch một số biến và sau đó chạy nó qua uglify và sau đó dùng tay rút lại nó.

// 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!!");
}

Đã thử nó bằng đoạn mã này:

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

1
Tôi không chắc chắn tôi thấy cách thức hoạt động của nó, nhưng tôi thấy một biến số (i) và một toán tử số học (i ++).
Wally

Ồ, không nhận ra rằng tôi không thể thực hiện một vòng lặp như thế .. sẽ viết lại vào tối nay.
Sugendran

Về cơ bản tôi đang sản xuất một chuỗi các chuỗi có độ dài là số nguyên tố. Vì vậy, khi tôi nhận được một đầu vào, tôi tiếp tục thêm các ký tự vào một chuỗi cho đến khi giá trị độ dài cho chuỗi khớp với đầu vào. Sau đó tôi lấy chuỗi này và xem liệu tôi có thể chia đều cho bất kỳ số nguyên tố đã biết nào không. Nếu tôi không thể thì nó phải là một nguyên tố. Và bằng cách chia tôi có nghĩa là tôi lấy chuỗi nguyên tố đã biết và tiếp tục thêm nó vào chính nó, độ dài của chuỗi bằng hoặc lớn hơn chuỗi trong câu hỏi.
Sugendran

Tôi đã cập nhật mã, nó thực sự làm giảm số lượng ký tự một chút :)
Sugendran

Mát mẻ. Nó trông giống như ý tưởng giống như regex, nhưng hiệu quả hơn và hiển thị rõ ràng logic thực tế.
Wally

0

Bash 66 - 10 = 56

Thực hiện

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

Bản giới thiệu

$ 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

Như trên, 1 không phải là số nguyên tố.
Wally

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.