프라임? 수학없이 [폐쇄]


14

입력이 소수인지 알려주는 언어로 프로그램이나 함수를 작성하십시오.

  • 입력은 10 진수의 자연수를 나타내는 문자열 입니다.
  • 출력은 "Prime"또는 "Not !!"두 문자열 중 하나입니다. 입력을 올바르게 식별합니다.
  • 산술 연산자, 비트 연산자, 숫자 변수 및 상수, 일반적으로 "수학"등은 프로그램의 어느 곳에서도 허용되지 않습니다. 필요한 모든 "계산"을 수행 하려면 문자열 연산 을 사용해야 합니다 .
  • 문자열 길이 (숫자)를 비교할 수 있지만 그렇지 않은 경우 점수와 -10을 비교할 수 있습니다.
  • 프로그램은 모든 길이의 입력에서 작동해야합니다 (충분한 메모리와 시간이 주어짐).
  • 최저 바이트 수 (UTF-8)가 이깁니다.

숫자의 한계는 무엇입니까? 부정적 일 수 있습니까? 제로? 소수점을 포함 할 수 있습니까?
— Justin

보너스 포인트가 있다면 코드 골프
— Peter Taylor

입력에 경계를 지정하기 위해 "자연"을 추가했습니다.
— Wally

나는 미친 명시 적 문자열 조작에 놀랐기를 바랐다. (루프 할 수 있도록 문자열을 "감소"하기 위해 코드를 작성하는 것에 대해 개인적으로 생각하고 있었으며 대신 문자열 긴 나누기와 반복되는 문자열 빼기 사이에 찢어졌습니다 ...) 그 멋진 작은 정규식 단항 프라임 매처에 놀랐습니다! 아마도 정규 표현식이 더 멋진 물건을 얻지 못하도록 질문을 다시해야합니까? 그러나 나는 그 정규 표현식의 간결함에 가깝게 올 수 있다고 생각하지 않습니다.
— Wally

"더 멋진 것들"을 얻으려면 아마도 인기 경연 대회를 시도해 볼 수 있습니다 . 질문 자체를 바꾸는 것은 일반적으로 찌그러집니다. 그리고 누군가가 당신이 생각하지 않은 것을 생각해 냈기 때문에 새로운 질문을하거나 무엇이든 바꿔야한다고 확신하지 않습니다. 또한, 규칙 굽힘은 스포츠의 일부입니다 :)
— daniero

답변:


7

루비, 64-10 = 54

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

루비의 내장 문자열 반복 방법을 사용하여 문자열 '1'(개행)과 입력 문자열을 반복합니다.이 방법은 1을 추가하는 것과 끔찍하지만 기술적으로는 높은 수준의 숫자 변수를 생성하지 않습니다. . n을 입력하여 n 길이의 문자열을 생성하는 n 개의 반복이 있다는 사실을 사용하고 정규식을 사용하여 해당 문자열을 동일한 하위 문자열로 그룹화 할 수 있는지 확인합니다.


"map {? 1}"의 "1"이 Fixnum입니까? -그렇다면, 당신은 그것을 "map ( '1')"으로 바꾸어야 할지도 모른다 .
— 월리

? 1은 '1'과 동일하며 1 자 문자열 리터럴입니다. 나는 1의 모든 인스턴스를 다른 문자로 바꿀 수 있습니다.
— 역사가

좋아-나는 그 구조를 어디에서나 잘 묘사 할 수 없었습니다!
— 월리

수학의 힌트조차도 피할 수 없기 때문에 이것을 "승자"로 선택합니다.
— Wally

3
아비가일의 모자 팁이 없습니까? 부끄러움 이것은 1998 perl 솔루션의 직접적인 포트입니다. 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 번 추가되는 문자열 연산입니다 . 여기서 n 은 입력 번호입니다. 내가 본 것처럼 문자열 길이는 비교되지 않으므로 10 자 보너스 기준을 충족해야합니다.


1
나는 루비에 익숙하지 않다. 틀렸다면 나를 수정하지만 "to_i"는 문자열을 정수로 변환하지 않습니까? 나는 단항에서 멋진 프라임 체커를 좋아하지 않는다…
— Wally

1
@Wally 나는 "convert"가 올바른 단어가 아니라고 생각하지만 메소드는 int를 반환합니다. 여전히, 나는 다음 중 하나를 사용하지 Arithmetic operators, bit-wise operators, numeric variables and constants않으며 실제로 메소드 호출을 "math-stuff" in general..?
— daniero

@daniero는 합리적으로 들립니다-아마도 스펙의 가장자리에 있습니다.
— Wally

3

펄 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

숫자 배열 인덱스를 사용하므로 스펙의 가장자리에 있습니다.
— Wally

pop대신 $ARGV[0]4자를 사용 하고 숫자 형 배열 인덱스를 제거하십시오.
— mob

1

ECMAScript 6, 159-10 = 149

정규식 작업처럼 들립니다. 평소 와 같이 prompt/ alert로 I / O.

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

while 루프는 순수하게 정규식에 의해 각 반복마다 10 진수를 감소시킵니다. 마지막 정규 표현식은 먼저 복합 요소 x로 구성된 문자열을 한 요소에 먼저 일치시킨 다음 나머지 요소에 대해 첫 번째 요소 하나를 반복하여 일치시킵니다.


나는 문자열 감소 기능을 좋아합니다-명확하고 간결합니다.
— Wally

1

자바 스크립트 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 ++)가 보입니다.
— Wally

아, 내가 그런 루프를 할 수 없다는 것을 몰랐다. 오늘 밤에 그것을 다시 쓸 것이다.
— Sugendran

기본적으로 길이가 소수 인 문자열 배열을 생성합니다. 따라서 입력을 받으면 문자열의 길이 값이 입력과 일치 할 때까지 문자열에 문자를 계속 추가합니다. 그런 다음이 문자열을 가져 와서 알려진 소수로 균등하게 나눌 수 있는지 확인하십시오. 내가 할 수 없다면 그것은 소수입니다. 그리고 나눈다는 것은 알려진 소수 문자열을 가져 와서 문자열 길이를 문제의 문자열보다 길거나 계속 증가시키는 것을 의미합니다.
— Sugendran

코드를 업데이트했습니다. 실제로 문자 수를 약간 줄입니다.)
— Sugendran

멋있는. 그것은 정규식과 같은 아이디어처럼 보이지만 실제 논리를보다 효율적이고 명시 적으로 보여줍니다.
— Wally

0

배쉬 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은 소수가 아닙니다.
— Wally

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.