소스 코드에서 소수가없는 2017 숫자인지 확인


41

제가이 도전을해온 몇 년 중 2017 년이 첫 번째 해였습니다. 따라서 질문은 소수와 속성에 관한 것입니다.

당신의 임무는 임의의 큰 양의 정수를 입력으로 취하고 그 숫자가 2,017-friable 인지 여부, 즉 그 숫자의 가장 큰 소수가 2,017 이하 인지 여부를 출력하거나 반환하는 프로그램이나 함수를 생성하는 것 입니다.


일부 예제 입력 및 출력 :

1 (has no prime factors)
true

2 (= 2)
true

80 (= 2 x 2 x 2 x 2 x 5)
true

2017 (= 2017)
true

2019 (= 3 x 673)
true

2027 (= 2027)
false

11111 (= 41 x 271)
true

45183 (= 3 x 15061)
false

102349 (= 13 x 7873)
false

999999 (= 3 x 3 x 3 x 7 x 11 x 13 x 37)
true

1234567 (= 127 x 9721)
false

4068289 (= 2017 x 2017)
true

여러분의 프로그램은 말 그대로 출력이없는 truefalse- 어떤 truthy 또는 falsy 값, 실제로 true와 false의 경우 일관성있는 모든 두 개의 서로 다른 출력은 괜찮이다.


그러나 소스 코드에는 소수 를 사용할 수 없습니다 . 프라임은 두 가지 유형으로 제공됩니다.

  • 소수 리터럴을 나타내는 문자 또는 문자 시퀀스.

    • 문자는 2, 3, 5, 및 7번호가 유효한 토큰입니다 언어로 불법입니다.

    • 숫자 141가 포함되어 있기 때문에 불법 41하더라도, 1하고 4그렇지 않으면 유효합니다.

    • CJam 또는 Befunge와 같이 일반적으로 11 및 13으로 사용되는 언어에서는 문자 BD(또는 bd) 문자 가 불법입니다.

  • 소수의 유니 코드 값이 있거나 인코딩에 소수의 바이트가 포함 된 문자

    • %)+/5;=CGIOSYaegkmq캐리지 리턴 문자뿐만 아니라 ASCII에서 문자 가 유효하지 않습니다.

    • ó인코딩에 UTF-8 문자 가 있으므로 문자 가 잘못되었습니다 0xb3. 그러나 ISO-8859-1에서 인코딩은 간단합니다 0xf3. 이는 합성이므로 괜찮습니다.

모든 언어에서 위의 작업을 수행하는 가장 짧은 코드가 이깁니다.


참고 사항 : "friable"은 이러한 맥락에서 과거와 설명이없는 "부드러운"에 비해 개선 된 것입니다.
Greg Martin

1
진실되고 허위적인 가치가 일관되어야합니까? 아니면 그들이 진실하거나 거짓 인 한 다양 할 수 있습니까?
Luis Mendo

10
=대부분의 표준 언어를 배제 하는 부족 ...
Neil

4
Y 챌린지가없는 do X의 경우 -1입니다. 다소 불필요한 캐릭터 제한 세트 뒤에 숨겨져있는 것은 매우 사소합니다.
Downgoat

1
나는 그들이 임의로 커지는 것에 대한 부분을 좋아하지 않습니다. 그들이 2 ^ 31-1까지 올라가면 더 좋을 것입니다.
Bijan

답변:


37

젤리 , 8 바이트

44‘²!*ḍ@

온라인으로 사용해보십시오! 테스트 케이스 11111 이상은 TIO에 비해 너무 많은 것입니다.

확인

$ source="34,34,fc,82,21,2a,d5,40"
$ xxd -ps -r > 2017.jelly <<< $source
$ xxd -g 1 2017.jelly
0000000: 34 34 fc 82 21 2a d5 40                          44..!*.@
$ eval printf '"%d "' 0x{$source}; echo # Code points in decimal
52 52 252 130 33 42 213 64
$ test_cases="1 2 80 2017 2019 2027 11111 45183 102349 999999 1234567 4068289"
$ for n in $test_cases; do printf "%11d: %d\n" $n $(jelly f 2017.jelly $n); done
      1: 1
      2: 1
     80: 1
   2017: 1
   2019: 1
   2027: 0
  11111: 1
  45183: 0
 102349: 0

테스트 케이스 999999 가 13 시간 동안 실행되었습니다. 2025 컴퓨팅에 대해 비관적입니다 ! 4068289 ...

작동 원리

44‘²!*ḍ@  Main link. Argument: n

44        Yield 44.
  ‘       Increment to yield 45.
   ²      Square to yield 2025.
          Note that no integers in [2018, ..., 2025] are prime numbers.
    !     Take the factorial of 2025.
     *    Raise it to the n-th power.
          This repeats all prime factors in 2025! at least n times, so the result
          will be divisible by n if (and only if) all of its prime factors fall
          in the range [1, ..., 2025].
      ḍ@  Test the result for divisibility by n.

22
당신은 숫자에 잔인합니다. :)
Greg Martin

3
@GregMartin 바. 크기 6 의 입력이 몇 시간 동안 메모리를 차지하고 충돌 하는 대답 (다른 언어로)을 보았습니다 . 나는 단지 말할 것이다 : (2^n)!. 이것은 또한 6 크기의 입력에 대해 요구되지만 적어도 입력은 2 진이 아닌 10 진수 알파벳입니다.
John Dvorak

이 13 바이트 아닌가요? 데니스 당신은 내가 여기서 실수를 저지른 사람이라고 확신합니다. hahah 😬
Albert Renshaw

7
@AlbertRenshaw 실제로 UTF-8에서는 13 바이트이지만 Jelly는 각각 1 바이트로 이해하는 모든 문자를 인코딩 하는 사용자 지정 코드 페이지 를 사용합니다.
Dennis

3
@Dennis는 설명이있을 줄 알았습니다. 감사합니다!
Albert Renshaw

11

젤리 , 8 자, UTF-8 14 바이트

Æf½ṀḤ<90

온라인으로 사용해보십시오!

젤리는 일반적으로 프로그램에 자체 코드 페이지를 사용합니다. 그러나 대부분의 주요 관련 내장 Æ은 코드 포인트 13 인로 시작합니다. 별로 도움이되지 않습니다. 운 좋게도, 인터프리터는보다 친숙한 인코딩을 갖는 UTF-8도 지원합니다.

확인

이 프로그램은 UTF-8로 다음과 같은 16 진 덤프를합니다.

00000000: c386 66c2 bde1 b980 e1b8 a43c 3930  ..f........<90

모든 바이트가 복합인지 확인 :

$ for x in c3 86 66 c2 bd e1 b9 80 e1 b8 a4 3c 39 30; do factor $((0x$x)); done
195: 3 5 13
134: 2 67
102: 2 3 17
194: 2 97
189: 3 3 3 7
225: 3 3 5 5
185: 5 37
128: 2 2 2 2 2 2 2
225: 3 3 5 5
184: 2 2 2 23
164: 2 2 41
60: 2 2 3 5
57: 3 19
48: 2 2 2 2 3

모든 유니 코드 코드 포인트가 복합인지 확인 :

$ perl -Mutf8 -E '$a = ord, print `factor $a` for split //, "Æf½ṀḤ<90"'
198: 2 3 3 11
102: 2 3 17
189: 3 3 3 7
7744: 2 2 2 2 2 2 11 11
7716: 2 2 3 643
60: 2 2 3 5
57: 3 19
48: 2 2 2 2 3

숫자로 구문 분석 된 유일한 토큰은 90입니다. 아무도 9, 0, 그리고 90주요 없습니다.

설명

여기서 주요 수학 통찰력은 45²이 2025이며 2017 년 (현재 연도)과 2027 년 (다음 주) 사이에 깔끔하게 떨어집니다. 따라서 숫자의 모든 주요 요소의 제곱근을 취하여 45를 초과하는지 확인할 수 있습니다. 불행히도, 45리터럴로 인해 쓸 수 없으므로 5대신 두 배로 늘려서 90과 비교해야합니다.

Æf½ṀḤ<90
Æf        In the list of prime factors,
  ½       taking the square root of each element
   Ṁ      then taking the largest element
    Ḥ     and doubling it
     <90  produces a result less than 90.

2
Jelly가 UTF-8을 사용하기 위해 플래그 (1 바이트)를 필요로하지 않습니까?
Luis Mendo

@LuisMendo : 명령 줄 인터프리터는 사용하지만 Try It Online의 인터프리터! 다르게 구성되어 있으며 필요하지 않습니다. 따라서 이것은 프로그램을 원하는 방식으로 해석하는 통역사를 선택하는 경우입니다. (어쨌든 문제의 플래그 u는 합성이므로 점수를 무효화하는 것이 아니라 점수를 변경하는 것입니다.)

10

Mathematica, 62 58 55 바이트

마지막 3 바이트는 마틴 엔더 때문입니다!

#4<4||#<44*46&&#6[#^-1#4]&[Divisors[#][[6-4]],,,#,,#0]&

이름 기능 양의 정수 인수를 복용하고 반환 True또는 False.

#4<4진실한 기본 사례 인 재귀 알고리즘 (우리 True는 imput 1 에서만 반환해야 하지만 여분의 기본 사례는 괜찮습니다). 그렇지 않으면, 우리는 입력의 두 번째로 작은 제수 (필수)를 Divisors[#][[6-4]]; 2024 ( 44*46) 보다 크면로 종료하고 False, 그렇지 않으면 입력에서이 작은 소인수 ( 입력 이 허용되지 않으므로 시간 으로 표시해야 함)로 나눈 입력 에서 함수를 재귀 적으로 ( #6set to 사용) 호출합니다 .#0##^-1#4/

구조적 전반부 #4<4||#<44*46&&#6[#^-1#4]&여섯 개 인수 익명 함수는 인수로 호출되고 Divisors[#][[6-4]], Null, Null, #, Null, 및 #0; 이 문자에 금지 주위를 얻는 것입니다 2, 3하고 5.

ais523의 Jelly 답변 에서 영감을 얻은 으로 대체 8018-6000하여 4 바이트를 절약 한 이전 버전 (Martin Ender도 ais523 의견에서 영감을 얻은 것으로 보입니다) :44*46

#<4||Divisors[#][[6-4]]<44*46&&#0[Divisors[#][[6-4]]^-1#]&

이것은 매우 불쾌했습니다 : 나는 여전히 이러한 제한에 따라 Mathematica에서 변수를 설정하는 방법을 모르겠습니다! 두 =e에서 Set허용되지 않습니다. 피 +)도 문제 였지만 더 바이트의 비용으로 해결하려면 너무 열심히하지.


변수 대신 람다 매개 변수를 설정할 수 있습니다. (그렇다고 말한 #2것은 허용되지 않기 때문에 람다가 중첩되는 방식에주의해야하며 괄호가 없으면 어려울 수 있습니다.)

@ ais523의 제안을 구현하면 3 바이트가 절약됩니다. 입력이 1 (또는 3)보다 큰지 확인하기 전에 #4<4||#<44*46&&#6[#^-1#4]&[Divisors[#][[6-4]],,,#,,#0]&시도 Divisors[#][[2]]하기 때문에 많은 경고를 던지지 만 결과는 여전히 정확합니다.
마틴 엔더

오, 이건 정말 교활 해요
Greg Martin

7

하스켈, 48 47 바이트

\n->[snd$[product[1..44*46]^n]!!0`divMod`n]<[1]

기본적으로 Dennis 'Jelly answer 의 번역입니다 . xnor은 바이트를 저장했습니다.

금지되어 […]!!0있기 때문에 괄호로 사용 하고 in 및 금지 때문에 +를 사용합니다 .)snddivModmmodrem


divMod와 함께 멋진 트릭! 난 당신이를 대체 할 수 있다고 생각 !!0<1과 함께 <[1]. 그러나 그것은 그것을 사용 단락있어 보이는 div등을 [\p n->p^n`div`n*n>p^n-1]!!0$product[1..44*46].
xnor

또한 \n->[0|p<-[product[1..44*46]^n],0<-[p,p-n..0]]출력이 일관성을 유지하기 만하면되는를 사용합니다.
xnor

@ xnor 별도의 답변으로 게시물을 올리십시오. 제 생각에는 저와 완전히 다른 것 같습니다 ^^
Lynn

6

파이크, 10 8 7 9 바이트

P_Z|hwMX<

여기 사용해보십시오!

Dennis의 2025 생성 방식을 사용하여 1 바이트 절약

P         -     factors(input)
 _        -    reversed(^)
  Z|      -   ^ or 0
    h     -  ^[0] or 1
        < - ^ < V
     wM   -  ⁴45 (ord("M")-32)
       X  -  ^**2

5

Brachylog , 9 10 바이트

*$ph$r*<90

온라인으로 사용해보십시오!

기본적으로 다른 답변과 동일한 알고리즘을 사용합니다. $ph첫 번째 h소인수 ( )를 찾습니다 $p. Brachylog의 주요 요인 목록이 가장 큰 것부터 가장 작은 것까지가 가장 큰 요인입니다. 그런 다음 제곱근 ( $r), 이중 ( *)을 가져와 90 ( <90) 보다 작은 지 테스트합니다 .

1에는 소인수가 없으므로 첫 번째 소인수가 없으므로 입력을 두 배로 늘려야했습니다. 이는 2의 추가 소수를 추가하여 숫자가 2017 년 가능 여부에 영향을 미치지 않지만 1을 처리 할 때 실패를 방지합니다.


5

실제로 9 바이트

τyM:44u²≥

많은 바이트에 대해 Dennis에게 감사합니다!

온라인으로 사용해보십시오!

설명:

τyM:44u²≥
τyM        largest prime factor of 2*input (doubled to deal with edge case of n = 1)
   :44u²   2025 (2027 is the next prime after 2017, so any number in [2017, 2026] can be used here - 2025 is very convenient)
        ≥  is 2025 greater than or equal to largest prime factor?

5

매스 매 티카, 66 74 바이트

U+F4A1금지 사항 을 지적 해 주신 Dennis에게 감사합니다 .

Fold[Function[{x,d},And[x,Tr[Divisors@d^0]>6-4||d<44*46]],0<1,Divisors@#]&

설명:

Divisors@#: 첫번째 인수의 정수 제수 목록 #.

0<1: 골프 용 True(문자 사용 금지 e)

Divisors@d^0: {1, 1, ..., 1}의 제수와 길이가 같은 양식 목록 d.

Tr: 단순 목록 Tr의 경우 해당 목록의 합계를 반환합니다. 따라서 Tr[Divisors@d^0]의 제수를 반환합니다 d.

Function[{x,d},And[x,Tr[Divisors@d^0]>6-4||d<44*46]]: 두 개의 인수가있는 익명 함수 xd. 아이디어는 그것 d의 제수 #이며 우리는 그것이 복합적인지 또는 작은 지 2017(포함) 인지를 테스트합니다 . 2017-마찰성은이 조건을 만족하는 모든 제수와 같습니다. ais523이 발견 한 것처럼 소수 이하 2017는 소수보다 작습니다 2025. 로 그렉 마틴 지적, 그것보다 작은 지 여부를 테스트에 충분하다 2024=44*46. 인수 x는 지금까지 만난 모든 제수가이 특성을 만족시키는 지 여부에 대한 누적 기 역할을합니다. 그런 다음 시작 값 Fold#가진 모든 제수를 통해이 기능 을 남겼습니다.True우리는 둘 다에 대한 액세스 권한이 있기 때문에 Map도를 /@.


1
제한을 극복하는 방법!
Greg Martin

2

05AB1E , 10 바이트

fθ46n99-›È

true이면 1을, 그렇지 않으면 0을 반환합니다.

온라인으로 사용해보십시오!

설명

f          # Push the list of prime factors (ordered)
 θ         # Get the last element
  46n99-   # Push 2017 (46² - 99)
        >  # Push 1 if the last prime factor is greater than 2017, 0 otherwise
         È # Is the resulting number even ? Transforms 1 to 0 and 0 to 1.
           # Implicit display

PPCG에 오신 것을 환영합니다!
Martin Ender

1

MATL , 15 바이트

t:\~ftZp*44QU<A

02017-frifriable 또는 2017-friable에 대한 출력 1.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

이 프로그램 은 모든 바이트가 복합인지 확인합니다.

설명

t       % Implicit input n. Duplicate
:       % Range [1 2 ... n]
\       % Modulo. Gives 0 for divisors of n
~f      % Indices of zero values
t       % Duplicate
Zp      % Is-prime. Gives 1 for primes, 0 for composites
*       % Multiply
44QU    % 44, add 1, square: 2025
<       % Less than, element-wise
A       % True (1) if all entries are nonzero

1

배쉬, 144 바이트

ASCII 인코딩 :

{
printf '[ '
`tr D-Z _-z <<<KFH`tor $1|tr -d :|`tr B-Z _-z <<<JUH`p -o '[0-9]*$'
printf ' -lt $[24*86-46] ]'
}|tr \\n \ |`tr B-Z _-z <<<EDVK`

쉘에서 일반적으로 종료 코드는 성공 (0) 또는 실패 (0이 아님)를 나타냅니다.

이것은 실제로 다른 철자입니다

[ factor $1|tr -d :|grep -o '[0-9]*$' -lt 2018 ]

우리는 factor $1|grep -o '[0-9]*$'; 는 tr -d :입력 =에 대한 특별한 경우입니다 1.

이 표현 $[6*6*69-466]은 2018 년으로 평가됩니다.

tr명령 이름을 사용하고 명령 대체 를 사용 하는 것은 까다로 웠습니다 . 중첩 형식을 사용할 수 없으므로 $( )결과를 평가하기 위해 다른 Bash로 파이핑했습니다.

시험 결과:

$ for i in 1 2 80 2017 2019 2027 11111 45183 102349 999999 1234567 4068289; do printf '%d %s\n' $i `./105241.sh $i  && echo true || echo false`; done
1 true
2 true
80 true
2017 true
2019 true
2027 false
11111 true
45183 false
102349 false
999999 true
1234567 false
4068289 true

문자 코드 확인 :

$ grep -v '^#' ./105241.sh | perl -n -Mutf8 -E '$a = ord, print `factor $a` for split //, $_' | grep -v ': .* ' | wc -l
0




0

Braingolf , 11 바이트 [매우 비경쟁]

VRp#ߢ-?0:1

온라인으로 사용해보십시오!

ߢ숫자 가 있는 나사로 인해 읽을 수 없지만 여전히 통역사에서 작동합니다.

나는 이것을 쓸 때 문자 제한을 알지 못했지만 이상한 유니 코드 문자를 2017에서 2018로 변경하기 만하면되었습니다.

2018은 소수가 아니며 어떤 소수 <= 2018<= 2017

설명

VRp#ߢ-?0:1  Implicit input from command-line args
VR            Create stack2, return to stack1
  p           Split last item into prime factors, push each one to stack in asc order
   #ߢ         Push 2018
     -      Subtract last 2 items (highest prime factor - 2017)
      ?     If last item > 0..
       0    ..push 1
        :   Else..
         1  ..Push 1
            Implicit output of last item on stack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.