C90 (gcc), 46 바이트
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
입력은 명령 행 인수 (인수 당 하나의 정수)를 통해 종료 코드 를 통해 출력됩니다 .
온라인으로 사용해보십시오!
작동 원리
r 은 전역 변수입니다. 유형은 기본적으로 int 이며 전역 인 경우 기본값은 0 입니다.
함수 인수 c의 기본값은 int 입니다. n 개의 부울 배열에 대해 정수 n + 1 을 유지합니다 . main 의 첫 번째 인수 는 항상 실행 파일의 경로입니다.
함수 인수 v 는로 선언됩니다 int**
. 의 실제의 형태 V가 될 것입니다 char**
,하지만 우리는 문자 만 말해 각 인수의 최하위 비트 검사 것이기 때문에 0 (코드 포인트 48 )과 1 (코드 포인트 49 ) 떨어져,이 작은 엔디안에 문제가되지 않습니다 기계.
while 루프 는 c를 감소 시키고 0 과 비교합니다 . 일단 C가 도달 0을 , 우리는 루프의 탈옥 수 있습니다. 배열에 0 이없는 경우에만 필요합니다 .
1 을 0<--c
반환 하는 한 c 번째 명령 줄 인수 ( )를 가져 와서 포인터 ( )를 역 참조하여 첫 문자를 추출합니다 . 우리는 비트 AND 부울의 수행 조건이 돌아 있도록하고, 문자 (과 그 뒤에 이어지는 세 개의 쓰레기 바이트)의 코드 포인트를 0 번 0가 발생 루프에서 파괴.v[c]
*
0<--c
명령 라인 인자 인 반면, 나머지 경우에, 1 , r++
증분 연구를 하여 1 이렇게 후행의 수를 세고, 1 '을들.
마지막 c=r
의 계산 된 값을 저장 R 에 C를 . 기본 설정으로 컴파일러는 할당을 최적화하고 제거합니다. 실제로 movl %eax, -4(%rbp)
명령을 생성합니다 . ret
EAX 레지스터의 값을 반환 하므로 원하는 출력을 생성합니다.
이 코드는 않습니다 하지 반환 C99, 작업을 0 에서 주요 의 끝 경우 주가 에 도달한다.
01100
?