obfuscated C contest 제출일까요? 또는 code golf?
처음에는 이상한 선언입니다. 관련없는 두 선언을 한 줄에 결합하는 것입니다.
int x, y;
이
int x;
int y;
에 해당 것처럼 그래서 C 문법을 거의 사용 특질, 그것은 다행히도, 작은 알려진 그리고
int r;
int countIt(int n) {...}
로 코드와 동일 당신이 할 수있는 그렇게. 이 방법을 쓸 경우
루프는 명확하게 될 것입니다 : n
의 진수 표현에 자리 이상
do {
r += " 2 "[n % 10] & 3;
n /= 10;
} while (n);
그것은 기본적으로 반복합니다. 이제
r += " 2 "[n % 10] & 3;
의 일부입니다. n % 10
은 n
의 하위 자리 10 진수입니다. 이를 문자열 리터럴 (단지 char
의 배열)에 대한 인덱스로 사용하고 문자의 ASCII 코드에서 두 개의 하위 비트를 추출하고 나머지는 버립니다. 나는 원래 프로그램에서이 코드를 복사했는데 그 문자가 공백이 아니라 오히려 특정 인쇄 할 수없는 문자가 ASCII 코드의 두 하위 비트가 정확히 해당 숫자의 "구멍"의 수 2
문자는 빨간색 청어입니다. 위치는 12이지만 문자 0-9가 실제로 사용됩니다.
은 즉,이 부분은 더 명확하게 이런 식으로 쓸 수있다 :
static const int numHoles[10] = {1, 0, 0, 0, 1, 0, 1, 0, 2, 1};
int digit = n % 10;
r += numHoles[digit];
함께 넣어, 우리는이 : 브라우저에서 특수 문자를 사용
int countIt(int n) {
// number of holes in digit 0 1 2 3 4 5 6 7 8 9
static const int numHoles[10] = {1, 0, 0, 0, 1, 0, 1, 0, 2, 1};
int r = 0;
do {
int digit = n % 10;
r += numHoles[digit];
n /= 10;
} while (n);
return r;
};
두 선언이 결합 된 것입니다. 'int x, y;와 똑같은 것은'int x; int y;', 당신이 보여줄 코드는'int r; int countIt (int n) {...}'. 변수 정의와 함수 정의를 병합하는 것은 혼동하는 역할을합니다. 코드에서 그렇게하지 마십시오. 단 한번 설명했을 때 시원할 수도 있습니다. –
와우, 상당히 영리합니다. 무서운, 그러나 우습다. :) –
감사합니다. @IgorTandetnik. 그 끈 부분? –