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


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.