2017-12-13 23 views
0

저는 오늘 "코드 파트 2의 출현"을 해결하는 코드가 있습니다. https://adventofcode.com/중복 모듈 찾기/단순화

나는 현재 많은 모듈러스 조건을 하드 코딩 했으므로 조건 수를 줄이는 간단한 방법이 있습니까?

x % 2 == 0을 이미 확인한 경우 일반적으로 x % 4 == 0을 건너 뛸 수 있습니다. 그러나 추가 작업이있을 때 어떻게 단순화 할 것인지 생각해 내는데 어려움이 있습니다. 찾을 수있는 제안이나 자료가 있습니까?

if (delay % 6 == 0) 
{ 
    return false; 
} 

if ((delay +1) % 2 == 0) 
{ 
    return false; 
} 

if ((delay +2) % 4 == 0) 
{ 
    return false; 
} 

if ((delay + 4) % 6 == 0) 
{ 
    return false; 
} 

if ((delay + 6) % 14 == 0) 
{ 
    return false; 
} 

if ((delay + 8) % 8 == 0) 
{ 
    return false; 
} 

if ((delay + 10) % 14 == 0) 
{ 
    return false; 
} 
if ((delay + 12) % 10 == 0) 
{ 
    return false; 
} 
if ((delay + 14) % 10 == 0) 
{ 
    return false; 
} 
if ((delay + 16) % 14 == 0) 
{ 
    return false; 
} 
if ((delay + 18) % 10 == 0) 
{ 
    return false; 
} 
if ((delay + 20) % 10 == 0) 
{ 
    return false; 
} 
if ((delay + 22) % 22 == 0) 
{ 
    return false; 
} 
if ((delay + 24) % 22 == 0) 
{ 
    return false; 
} 

if ((delay + 26) % 18 == 0) 
{ 
    return false; 
} 

if ((delay + 28) % 14 == 0) 
{ 
    return false; 
} 

if ((delay + 32) % 14 == 0) 
{ 
    return false; 
} 

if ((delay + 36) % 16 == 0) 
{ 
    return false; 
} 

if ((delay + 40) % 14 == 0) 
{ 
    return false; 
} 

if ((delay + 44) % 32 == 0) 
{ 
    return false; 
} 

if ((delay + 50) % 18 == 0) 
{ 
    return false; 
} 

if ((delay + 56) % 26 == 0) 
{ 
    return false; 
} 
if ((delay + 58) % 26 == 0) 
{ 
    return false; 
} 
if ((delay + 60) % 26 == 0) 
{ 
    return false; 
} 

if ((delay + 62) % 22 == 0) 
{ 
    return false; 
} 

if ((delay + 64) % 26 == 0) 
{ 
    return false; 
} 

if ((delay + 66) % 26 == 0) 
{ 
    return false; 
} 

if ((delay + 68) % 26 == 0) 
{ 
    return false; 
} 

if ((delay + 70) % 26 == 0) 
{ 
    return false; 
} 

if ((delay + 74) % 26 == 0) 
{ 
    return false; 
} 
if ((delay + 76) % 26 == 0) 
{ 
    return false; 
} 
if ((delay + 80) % 26 == 0) 
{ 
    return false; 
} 

if ((delay + 88) % 26 == 0) 
{ 
    return false; 
} 

doSomeComputation... 
+0

정확히 무엇이 문제입니까, 숫자가 나눌 수 있는지 확인하십시오. – styx

+0

'x % 2 == 0'을 넘길 때'x % 4 == 0'을 건너 뛸 수 없습니다. – Sefe

+0

@Sefe OP가 의미하는 바는'x % 2 == 0'을 테스트하고 리턴하면 4로 나눌 수있는 것이 모두 2로 나눌 수 있기 때문에'x % 4 == 0'을 테스트 할 필요가 없다는 것입니다 – juharr

답변

0

나는 항상 delay이 음수가 아닌 것으로 가정합니다. 입력에 의해 보장되지 않는다면 수정 전화를 수정하는 버전으로 대체 할 수 있습니다 (this answer). 말했다, 당신이 게시 된 논리는 이것으로 복제 될 수있다 : 그것을 생성하는 방법의

const int lcm = 1441440; 
int[] residues = new int[] 
{ 
    1924, 
    92644, 
    132964, 
    223684, 
    354724, 
    395044, 
    616804, 
    657124, 
    788164, 
    878884, 
    1009924, 
    1050244, 
    1181284, 
    1272004, 
    1312324, 
    1403044 
}; 
if (!residues.Contains(delay % lcm)) return false; 

설명 : lcm는에 의해 모딩하는 숫자의 least common multiple입니다. WolframAlpha 또는 기타 여러 가지 방법으로 질문 할 수 있습니다. 상수 잔기는 단순히 모든 잔기 mod lcm을 반복하고 어떤 것이 이미 작성했는지 논리를 통과하는지 확인하는 것으로 얻을 수 있습니다. 다음 코드는 내가 그들을 인쇄 할 때 사용한 것이다. 여기서 함수 myPass은 위에서 제공 한 로직 일 뿐이다.

for (int i = 0; i < 1441440; ++i) 
    if (myPass(i)) 
     Console.WriteLine("i = {0}", i); 

작동하는 이유에 대한 설명 : delay는 정수이고 m은 양의 정수이고 nm로 나누어 양의 정수의 경우는, 다음 delay % m의 값은 (delay % n) % m과 같다. 예 : 정수 delaydelay % lcm == 1924이 있다고 가정합니다. 그런 다음 delay % 6(delay % lcm) % 6과 같으며 1924 % 64입니다. 마찬가지로 delay % lcmif의 다양한 조건을 모두 충족하는지 테스트 한 잔여 물 목록의 값이 i 인 경우 delay도 일치합니다. 왜냐하면 - 무엇이든간에 m 특히 if에 대한 테스트가 진행되었습니다. 우리는 이미 i % m이 조건과 일치한다는 것을 이미 알고 있다는 것을 알았습니다. 이제는 (delay % m) == (delay % lcm) % m) == i % m입니다.

참고 :이 방법은 조건 집합이 작은 모듈의 많은 잔여 물을 제외하기 때문에 가능합니다. 예를 들어 큰 소수와 비교되는 외곽 조건이 하나있는 경우 잔류 물 목록이 너무 커서 처리하기가 쉽지 않습니다.