계수 검증


12

모두가 참이고 두 개의 숫자와 결과를 갖는 모듈로 나머지 계산으로 구성된 수학 표현식의 목록이 주어지면 목록의 n모든 명령문에 대해 참인 첫 번째 숫자 를 산출 해야합니다.

예를 들면 다음과 같습니다.

[m % 3 = 0, m % 4 = 1, m % 5 = 3]여기서 %는 모듈로 연산자입니다.

들어 n= 3, 순서에 맞게 처음 3 개 숫자 (0에서 계산)이 있습니다 33, 93, 153, 따라서 귀하의 결과는 (당신까지 포맷)이 될 것입니다.

규칙 / IO

  1. 당신은 양수 n와 진리의 목록을 취합니다 . 물론 필요한 것은 모듈로 연산의 RHS와 결과입니다.
  2. n진리 목록의 숫자는 항상 1-> 2 ^ 31-1 범위 에 있으며 결과도 마찬가지입니다.
  3. 편리한 형태로 입력하고 편리한 형태로 출력합니다. 예를 들어, input : 3 [3 0, 4 1, 5 3]및 output : 33 93 153입니다.
  4. 솔루션이 수학적으로 가능하다는 것이 보장됩니다.
  5. 입력 소스는 파일, 함수 매개 변수, stdin 등에서 올 수 있습니다. 출력도 동일합니다.
  6. 허점이 없습니다.
  7. 이것은 코드 골프이므로 가장 낮은 바이트 수가 이깁니다.

테스트 케이스

# Input in the form <n>, <(d r), (d2 r2), ...>
# where <d> = RHS of the modulo expression and <r> the result of the expression. Output in the next line.

5, (3 2), (4 1), (5 3)
53 113 173 233 293

3, (8, 0), (13, 3), (14, 8)
120 848 1576

의사 코드에서 참조 구현

n = (an integer from stdin)
truths = (value pairs from stdin)
counter = 0

while n != 0 {
    if matches_criterias(counter, truths) {
        print counter
        n -= 1
    }

    counter += 1
}


@flawr 편집 : 다른 질문은 많은 것을 금지하고 한 용어 만 인쇄합니다. 이것이 더 이상 복제인지 확실하지 않습니다 ....
Yytsi

1
@flawr 그 도전에는 시간 제한이 있습니다. 중국의 나머지 정리에 의존하지 않는이 문제를 해결하는 골퍼 방법이 있습니다.
Dennis

예, 알고 있습니다. 이것이 바로 연결 한 이유입니다.
flawr

0유효한 결과는?
Neil

답변:


6

젤리 , 7 바이트

%⁼⁴
0ç#

이것은 전체 프로그램입니다. 인수는 제수, 목표 계수 및 솔루션 수의 순서로 나옵니다.

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

작동 원리

0ç#  Main link.
     Left argument: D (array of divisors)
     Right argument: M (array of target moduli)
     Third argument: n (number of solutions)

0ç#  Execute the helper link with k = 0, 1, 2, ... as left argument and D as the
     right one until n of them return 1. Yield the array of matches.


%⁼⁴  Helper link. Left argument: k. Right argument: D

%    Compute k % d for each d in D.
 ⁼⁴  Compare the result with M.

4

펄 6 , 33 바이트

{grep((*X%@^b)eqv@^c,0..*)[^$^a]}

시도 해봐

입력은 ( number-of-values, list-of-divisors, list-of-remainders )

넓히는:

{   # bare block lambda with placeholder parameters 「$a」 「@b」 「@c」

  grep(

    # WhateverCode lambda:
    (

      *        # the value being tested

      X%       # cross modulus

      @^b      # with the divisors ( second parameter )

    )

    eqv        # is that list equivalent with

    @^c        # the expected remainders ( third parameter )

    # end of WhateverCode lambda

    ,

    0 .. *     # Range of all Integers starting with 0

  )[ ^$^a ]    # grab up-to 「$a」 values ( first parameter )
               # ( 「^$a」 is the same as 「0 ..^ $a」 )
}

4

자바 스크립트 (ES6), 71 68 바이트

a=>f=(n,m=0)=>n?a.some(x=>m%x[0]-x[1],++m)?f(n,m):[m,...f(n-1,m)]:[]

간단한 재귀 함수. 다음과 같이 배열에서 첫 번째와 n두 번째 카레를 사용하여 사용하십시오 .

g=a=>f=(n,m=0)=>n?a.some(x=>m%x[0]-x[1],++m)?f(n,m):[m,...f(n-1,m)]:[]
g([[3, 2], [4, 1], [5, 3]])(5)

4

자바 스크립트 (ES6), 74 70 69 바이트

정수로의 입력을 받고, n그리고 어레이 a[modulo, remainder]구문을 무두질와 어레이 (n)(a).

n=>a=>eval('for(i=r=[];a.some(([b,c])=>i%b-c)||--n*r.push(i);i++);r')

테스트 사례


3

하스켈, 47 바이트

n#l=take n[i|i<-[0..],all(\(d,r)->mod i d==r)l]

사용 예 : 3 # [(8,0),(13,3),(14,8)]-> [120,848,1576].


3

파이썬, 67 바이트

lambda n,r:[k for k in range(2**32)if all(k%d==m for d,m in r)][:n]

당신은 필요합니다 range(2**31). 또한 아주 좋습니다. 나는이 대답을 독립적으로 생각해 냈습니다.
mbomb007

3

자바 스크립트 (ES6), 72 70 바이트

a=>g=(n,i,r=[],m=a.some(e=>i%e[0]^e[1]))=>n?g(n-!m,-~i,m?r:[...r,i]):r

조건 배열을 먼저 처리하고 결과 수를 두 번째로 조정합니다. 편집 : 0을 처리하지 않고 2 바이트를 절약했습니다.


2

수학, 42 바이트

#2~ChineseRemainder~#+Range[0,#3-1]LCM@@#&

명명되지 않은 함수, 양의 정수 목록을 반환하고 세 개의 입력 : 모듈러스 목록, 나머지 목록 및 n반환 할 정수 수를 입력합니다. 예를 들어, 두 번째 테스트 사례는

#2~ChineseRemainder~#+Range[0,#3-1]LCM@@#&[{8,13,14},{0,3,8},3]

를 반환합니다 {120, 848, 1576}.

내장 #2~ChineseRemainder~#은 가장 작은 음이 아닌 솔루션을 제공합니다. 원하는 모든 해를 구하기 위해이 숫자를 Range[0,#3-1]LCM@@#에 더합니다. 이는 n모든 계수 중 최소 공통 배수의 음이 아닌 배수입니다.

Mathematica는 내가 아는 한 지연 평가 된 무한 목록을 가지고 있지 않으므로이 구현은 함수 이름의 길이와 함께 음수가 아닌 정수를 하나씩 테스트 한 것보다 짧았으며 ChineseRemainder같은 테스트 Mod[k,{8,13,14}]=={0,3,8}는 완벽하게 작동 하더라도 잘.


2

PHP, 97 바이트

지금까지 가장 긴 답변. 그러나 100 미만으로 얻을 수있어서 기쁩니다.

for($a=$argv;++$k;)for($i=$v=2;$m=$a[$i++];$v>$argc/2&&$a[1]-->0?print$k._:0)$v+=$k%$m==$a[$i++];

별도의 명령 줄 인수에서 입력을
받고 밑줄로 구분되고 뒤에 나오는 일치 항목을 인쇄합니다.
루프는 끊어지지 않습니다. 온라인 테스터에게는 거의 적합하지 않습니다.

처럼 실행하십시오 php -r 'code' <n> <modulo1> <result1> <modulo2> <result2> ....

고장

for($a=$argv;++$k;)         // loop $k up from 1
    for($i=$v=2;                // $i = argument index, $v=2+ number of satisfied equations
        $m=$a[$i++];            // loop through modulo/result pairs
        $v>$argc/2                  // 2. if $v>argument-count/2
        &&$a[1]-->0                 // and match count not exhausted
            ?print$k._                  // print match
            :0                          // else do nothing
        )
            $v+=$k%$m==$a[$i++];    // 1. if $k%modulo==result, increment $v

노트

$argc==count($argv). 세 쌍의 경우 8 개의 인수가 있습니다 : filename $argv[0], n= $argv[1]및 그 위 의 modulo/ result쌍. $v=23 번 증가하면 5>가 나타납니다 $argc/2.

깨끗한 출구를 한 바이트를 추가 교체 &&$a[1]-->0?print$k._와 함께 ?$a[1]--?print$k._:die.



1

SmileBASIC, 102 바이트

DEF V N,M
FOR K=1TO N@L
T=T+1F=0FOR J=1TO LEN(M)F=F||T MOD M[J-1]-M[J]J=J+1NEXT
ON!F GOTO @L?T
NEXT
END

제가 ONSB에서 사용한 적이 처음 입니다. 내가 대신 여기에서 사용 한 이유 는 동일한 줄에 IF F GOTO@L넣어 ?T1 바이트를 절약 할 수 있기 때문입니다.


1

파이썬, 59 바이트

lambda n,m:[i for i in range(2**31)if all(map(eval,m))][:n]

m 다음과 같은 문자열 형식의 표현식 목록입니다. ["i % 4 == 1", ...]

온라인으로 사용해보십시오 (짧은 범위에서 실제로 완료됩니다)


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