음의 정수 정수 챌린지이지만 프라임 타임입니다!


12

나는 이 질문 에 대해 이야기하고 있으며 약간 혼란 스럽다면 살펴보십시오.

주요 업무

당신의 작업은 연결 된 정수를 내림차순으로 출력하지만 칠 때마다 최대 정수를 늘리는 것입니다 1 (이 질문에서는 1이 소수로 간주됩니다) . 이것은 첫 번째 질문과 다르지 않지만 여기에 까다로운 부분이 있습니다. 출력 된 모든 숫자 는 소수 일 수 있습니다 . 공백이나 줄 바꿈없이 단일 문자열로 묶입니다. 입력 값도 소수 입니다.

예:

1
21
321
5321
75321
1175321
Valid output:
1213215321753211175321

입력

코드는 하나의 입력 만받을 수 있습니다 : 인쇄 할 가장 높은 소수. 이 입력은 어디서나 올 수 있습니다 (그래픽, STDIN). 당신이하는 보장 입력이 소수이다.

산출

결과 번호를 출력해야합니다. 카운트 다운을 계속 유지하여이 숫자를 얻을 수 있으며 소수 인 경우에만 숫자를 세고 모든 결과를 하나의 숫자로 연결하십시오. 마지막 숫자 "행"(예 7, 5, 3, 2, 1:)은 완전히 인쇄해야합니다. 읽을 수있는 한 출력은 무엇이든 (숫자, 문자열, 그래픽)이 될 수 있습니다. 테스트 사례를 확인하기위한 동일한 정규식 패턴이 적용됩니다.

^(\D*(\d)+\D*|)$

출력이이 패턴과 일치하지 않으면 코드가 유효하지 않은 것입니다.

규칙

  • 입력은 소수이므로 원치 않거나 필요하지 않은 한 오류 처리를 포함하지 마십시오.
  • 출력은 완전히 연결된 숫자 일 수 있으므로 줄 바꿈이 아닌 다른 항목으로 나눌 수 없습니다.
  • 알고리즘은 N표시 되는 첫 번째 인스턴스 (예 : 17in 1175321)를 확인하는 것이 아니라 N실제 숫자로 첫 번째 인스턴스를 확인 해야합니다.
  • 귀하의 의견은 긍정적입니다. 원하거나 필요로하지 않는 한 취급을 추가하지 마십시오.

테스트 사례

Input: -2, 0
Output: Any, or none (number isn't positive)

Input: 9
Output: Any, or none (number isn't prime)

Input: 1
Output: 1

Input: 7
Output: 121321532175321

Input: 23
Output: 1213215321753211175321131175321171311753211917131175321231917131175321

우승자

이것은 이므로 바이트 길이가 가장 짧은 코드 작성자가 승리합니다!


8
나는 도전을 바꾸는 것을 제안하지는 않지만, 1정의에 의해 프라임 이라고 생각하지 않습니다 .
Outgolfer Erik

3
1. 테스트 케이스가 있으면 1스펙이 모순 되므로 입력 번호가 소수임을 " 보장 "합니다. 2. 출력 사양에는 여러 모순과 모호성이 포함되어 있습니다. " 마지막 숫자"행 "(예 : 7, 5, 3, 2, 1)을 완전히 인쇄 해야합니다."다른 것들은 그렇지 않습니까? " 테스트 사례를 확인하기위한 동일한 정규식 패턴이 적용됩니다. " "" 출력은 완전히 연결된 숫자 일 수 있으므로 정규식과 모순 되는 것은 없습니다 . 그러나 정규 표현식은 빈 문자열을 허용하기 때문에 어쨌든 명확하지 않으며 입력 할 수있는 것이 없습니다.
피터 테일러

1
1. " 단일 후행 줄 바꿈이 허용됩니다. "는 임의의 수의 후행 문자 를 허용하는 정규식 패턴과 중복 / 일치하지 않습니다 . 2. 나중에 단일 숫자를 출력하도록 요청하기 때문에 " 정수를 출력하는 것입니다 "라는 소개문이 잘못되었습니다. 3. 시퀀스와 결과에 대한 전체 설명이 혼란 스러워요. 사람들은 기본적으로 예제 (시퀀스 목록 및 테스트 사례)를 연구하여 의미를 역 엔지니어링해야합니다. 마지막 도전은 또한 이러한 문제가 있었고, 나는 당신이 거부 제안 제안 편집에서 거기에 해결했습니다 ... :(
smls

5
임의로 1을 소수로 만드는 요점은 무엇입니까?
Xanderhall

1
음의 정수 정수 챌린지이지만 소수 일 때마다 더 빨라집니다.)
SplittyDev

답변:


5

젤리 , 9 바이트

ÆR1;;\UFV

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

작동 원리

ÆR1;;\UFV  Main link. Argument: n

ÆR         Prime range; yield all primes up to n.
  1;       Prepend the "prime" 1.
    ;\     Cumulative concatenation; yield all prefixes of the prime range.
      U    Upend; reverse each prefix.
       F   Flatten the resulting 2D array.
        V  Eval. This casts the integer array to string first, thus concatenating
           the integers.

젤리를 읽을 때 다른 방법보다는 질문을 이해하면 골프에 대해 배우는 데 너무 깊이 빠져 있습니다. (이것은 실제로 읽을 수있는 젤리 프로그램입니다. 나를위한 유일한 혼란스러운 점 V은 목록에있는 이상한 특별한 경우였습니다 .)

5

처리, 161 바이트

int p(int n){for(int k=1;++k<=sqrt(n);)if(n%k<1)return 0;return 1;}void t(int n){for(int i=1,j;i<=n;i++){if(p(i)<1)continue;for(j=i;j>0;j--)print(p(j)<1?"":j);}}

한 기능은 우선 순위 검사를 수행하고 다른 기능은 인쇄를 수행합니다. 에 의해 전화t(7)

언 골프

첫 번째 기능은 우선 순위 점검을 수행합니다. 이 방법으로 더 많은 바이트가 저장되므로 int대신 대신을 반환합니다 boolean. ( int않고 boolean, 0대신 false, 1대신 true)

int Q103891p(int n){
  for(int k=1;++k<=sqrt(n);)
    if(n%k<1)return 0;
  return 1;
}

두 번째 함수는 문자열을 인쇄합니다. 소수가 아닌 경우 모든 숫자를 반복하며 다음 반복으로 건너 뜁니다. 프라임 인 경우 다른 for루프 내부의 인쇄로 계속 진행됩니다 . 다시 말하지만 숫자가 소수이면 인쇄합니다. 그렇지 않으면 인쇄하지 않습니다.

void Q103891(int n){
  for(int i=1,j;i<=n;i++){
    if(p(i)<1)continue;
    for(j=i;j>0;j--)
      print(p(j)<1?"":j);
  }
}

5

젤리 , 12 바이트

ÆR;@1
ÇÇ€UVV

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

그것이 전혀 1없었다면 내 코드는 ÆRÆRUVV7 바이트에 불과했을 것 입니다.

강화 된 설명 :

ÇÇ€UVV Main link. Arguments: z.
Ç      Run link1 on z.
 ǀ    Run link1 on z's elements.
   U   Reverse z's elements.
    V  Flatten z.
     V Concatenate z's elements.

ÆR;@1 Link 1. Arguments: z.
ÆR    Range of primes [2..z].
    1 Integer: 1.
  ;@  Concatenate x to y.

아일랜드 사람 (데니스라고 불린다)은 어떻게 든 나를 롤 아웃했다 .


4

05AB1E , 19 바이트

LDpÏX¸ì€Lí˜ÐXQsp+ÏJ

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

설명

L                     # range [1 ... input]
 DpÏ                  # keep only primes
    X¸ì               # prepend a 1
       €L             # map: range [1 ... n]
         í            # reverse each sublist
          ˜           # flatten list to 1D
           Ð          # triplicate
            XQ        # check elements in one copy for equality with 1
              sp      # check elements in one copy for primality
                +     # add the above lists giving a list with true values at indices
                      # comtaining 1 or a prime
                 Ï    # keep only those elements of the unmodified copy of the list
                  J   # join

DpÏ진술에 놀랐습니다 . 잘 하셨어요!
devRicher

2

Brachylog , 17 바이트

y:{e1|e#p}f@[rcw\

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

그보다 짧아 질 수는 없습니다 ...

설명

y                      The list [0, ..., Input]
 :{      }f            Find all...
   e1                     ...elements that are 1 (there is 1)...
     |                    ...or...
      e#p                 ...elements that are prime...
           @[          Take a prefix of the result
             rc        Reverse it and concatenate it into a number
               w       Write to STDOUT
                  \    Backtrack: try another prefix

2

GameMaker 언어, 169 바이트

주요 기능 (68 바이트)

b=""for(i=1;i<=argument0;i++){c=i while(j)b+=string(p(c--))}return b

기능 p (46 바이트)

for(a=0;a<argument0;a++)while q(++b){}return b

기능 q (55 바이트)

n=argument0 for(i=2;i<n;i++)if!(n mod i)p=1return p|n=1

GML을 사용 니스, 사람
FireCubez

@FireCubez 감사합니다 :) 나는 그것을 많이 사용했습니다. 실제로 내가 배운 첫 번째 프로그래밍 언어였습니다.
Timtech

1

MATL , 15 바이트

Zq"1@ZqP]1v!VXz

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

Zq      % Implicit input. Push array of primes up to that value
"       % For each prime in that array
  1     %   Push 1
  @     %   Push current prime
  Zq    %   Push array of primes up to that
  P     %   Reverse
]       % End
1       % Push 1
&h      % Concatenate all stack horizontally
V       % Convert to string
Xz      % Remove spaces. Implicit display

1

펄 6 , 41 바이트

{[~] flat [\R,] 1,|grep *.is-prime,2..$_}

( 온라인으로 시도하십시오. )

설명:

  • 1, |grep(*.is-prime, 2..$_): 1과 소수의 순서 ... (1 2 3 5)
  • [,] ...: 쉼표 연산자를 사용하여 줄입니다 ( "fold") ... (1 2 3 5)
  • [\,] ...: 중간 결과 ( 삼각형 축소 )로 ...((1) (1 2) (1 2 3) (1 2 3 5))
  • [\R,] ...: 메타 연산자를 쉼표에 적용하십시오 ...((1) (2 1) (3 2 1) (5 3 2 1))
  • [~] flat ...: 목록 중첩을 제거하고 문자열 연결 연산자를 접습니다. 1213215321

(이것은 이전 도전에 대한 나의 대답을 기반으로 합니다.)


1

수학, 61 바이트

ToString/@(1<>Prime@Range[Range@PrimePi@#,0,-1]/.Prime@0->1)&

이름없는 함수는 정수 인수를 취하고 문자열을 반환합니다. 입력이 소수가 아닌 경우 가장 가까운 소수로 "반올림"합니다. 입력이 양수가 아닌 경우 1 인 척합니다.

이 구현은 Martin Ender의 답변 에서 비슷한 이전 도전에 대한 불쾌한 트릭을 사용합니다 (이 오래된 개는 새로운 트릭을 배울 수 없다고 말합니다) : <>중첩 된 정수 목록을 평평하게하기 위해 학대 합니다.

문제의 중첩 목록은 적절한 길이 ( PrimePi@#입력, 최대 소수까지 입력 가능) 로 해당 답변과 유사한 중첩 목록을 생성하는 것으로 시작합니다 . 다음, Prime각 소자에인가된다. 예를 들어, 53 번째 소수 인 입력의 경우 코드 Range[Range@PrimePi@#,0,-1]수율 이 각 요소에 {{1,0},{2,1,0},{3,2,1,0}}적용 Prime되고 {{2,Prime[0]},{3,2,Prime[0]},{5,3,2,Prime[0]}}1 번째, 2 번째 및 3 번째 소수가 각각 2, 3 및 5이므로 생성됩니다. Martin Ender의 접근 방식에 더 많은 오류를 추가 할 수 있다는 사실에 자부심을 느낍니다. Mathematica는 글을 쓸 때마다 불평합니다 Prime[0].

Prime[0]문제는 아니지만 괜찮습니다. /.Prime@0->1모두 1s 로 바꿉니다 . 그리고 우리는 1앞면을 원하기 때문에 ""Martin Ender의 답변을 간단히로 대체하여 1실제로 바이트를 절약합니다.


0

PHP, 72 바이트

for(;$n<$argv[1];print$s=$n.$s)for($i=2;$i>1;)for($i=++$n;--$i&&$n%$i;);

재치 -r

고장

for(;$n<$argv[1];               // loop $n up to argument:
    print$s=$n.$s)                  // 2. prepend $n to $s, print $s
    for($i=2;$i>1;)                 // 1. find next prime: break if $i<2
        for($i=++$n;--$i&&$n%$i;);      // if $n is prime, $i is 1 after loop (0 for $n=1)

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