당신의 임무는 숫자를 다른 숫자로 나눌 수 있는지 여부를 결정하는 프로그램이나 함수를 작성하는 것입니다. 문제는 숫자의 모든 숫자가 주어지지 않았더라도 가능한 한 빨리 답변을 제공해야 한다는 것 입니다.
프로그램은 정수 D ≥ 2를 입력 한 다음 일련의 숫자를 입력으로 사용해야 합니다. 이들은 최소 유효 자릿수부터 시작하여 다른 정수 N ≥ 1 의 자릿수를 나타냅니다 . 최초의 시점에서 N 중 하나가 있어야합니다 또는 안 의한 divisble 수 D , 프로그램 출력해야 적절한 대답 하고 종료합니다. 입력의 끝에 도달하면 전체 N 을 D 로 나눌 수 있는지 여부를 출력해야합니다 .
다음은 N 에 허용되는 입력 형식 목록입니다
(포함되지 않은 것을 허용해야한다고 생각하는 경우 주석 남기기).
-
표준 입력 : 숫자는 별도의 줄에 제공됩니다.
입력 끝 은 EOF 또는 특수 값입니다.
종료 는 함수가 리턴되거나 프로그램이 종료 됨을 의미합니다. -
아날로그 입력 : 키 스트로크 또는 각 숫자를 나타내는 10 개의 버튼;
입력 끝은 특수한 값입니다.
종료 는 함수가 리턴되거나 프로그램이 종료 됨을 의미합니다. -
전역 상태의 함수 : 연속 숫자로 반복해서 호출됩니다.
입력 끝은 특수한 값입니다.
종료 는 함수가 널이 아닌 값을 리턴 함을 의미합니다. 전역 상태를 사용하는 경우 , 함수가 여러 번 작동 하도록 값이 리턴 된 후 재설정되거나 그렇지 않으면 재설정 되어야합니다 . -
Curried function : 다음 숫자 또는 값으로 호출 할 다른 함수를 반환합니다.
입력 끝은 특별한 값이거나 인수없이 함수를 호출하는 것입니다.
종료 는 함수가 다른 함수가 아니라 응답을 반환 함을 의미합니다. -
GUI 프롬프트 또는 유사 : 반복적으로 표시됩니다.
입력 끝 이 “취소”또는 이와 동등한 값이거나 특수 값입니다.
종료 는 프롬프트가 중지되는 것을 의미합니다. -
반복자 함수 : 입력은 호출 될 때 다음 숫자를 리턴하는 상태 저장 오브젝트 또는 함수
입니다. 입력 끝은 예외 또는 특수 값입니다.
종료 는 반복자가 호출을 중지 함을 의미합니다.
D 및 출력에 대한 입력은 허용 가능한 표준 방법을 통해 가능합니다 .
테스트 사례 :
2; 6 => true
5; 6 => false
20; 0 3 => false
20; 0 4 => true
100; 1 => false
100; 0 0 => true
100; 0 2 => false
4; 2 4 => false
4; 2 5 => true
4; 2 [eof] => false
4; 4 [eof] => true
625; 5 5 => false
625; 5 7 2 => false
625; 5 7 3 6 => false
625; 5 7 3 4 => true
7; 9 3 4 [eof] => false
7; 9 3 4 5 [eof] => true
140; 0 3 => false
140; 0 4 5 [eof] => false
140; 0 4 5 1 [eof] => true
14; 4 5 1 4 [eof] => false
14; 4 5 1 4 1 [eof] => true
답변
자바 스크립트 (ES6), 70 바이트
입력 형식 : 카레 기능
−1
0
1
p=>(q='',g=(d,t=k=z=!~d||(q=d+q,p))=>k--?g(d,t-=(k+q)%p<1):t?t-z&&g:1)
어떻게?
p
q
n
0≤k<p
x≥p
m≥1
0≤k<p
x=mp+k
Therefore, if
(1)is equal to
0for all
0≤k<p, it will also be equal to
0for any
k≥pand the answer is true.
For the same reason, if
(1)is greater than
0for all
0≤k<p, the answer is false.
If the results of
(1)혼합되어 있으며 아직 결정할 수 없으며 더 많은 자릿수가 필요합니다.
큐또는 EOF 통지.
댓글
p => ( // p = divisor
q = '', // q = dividend stored as a string, initially empty
g = ( // g() = curried function taking:
d, // d = next digit
t = // t = number of iterations yielding a non-zero value
k = // k = total number of iterations to process
z = // z = copy of k
!~d || // if d == -1 (meaning EOF), use only 1 iteration
// so that we simply test the current value of q
(q = d + q, p) // otherwise, prepend d to q and use p iterations
) => //
k-- ? // decrement k; if it was not equal to zero:
g( // do a recursive call to g():
d, // pass the current value of d (will be ignored anyway)
t -= (k + q) % p < 1 // test (k + q) % p and update t accordingly
) // end of recursive call
: // else:
t ? // if t is greater than 0:
t - z && g // return 0 if t == z, or g otherwise
: // else:
1 // return 1
) //
답변
배치, 177 169 바이트
@set n=
@set g=1
:l
@set/ps=
@if %s%==- goto g
@set n=%s%%n%
@set/ae=%1/g,g*=2-e%%2,g*=1+4*!(e%%5),r=n%%g
@if %g% neq %1 if %r%==0 goto l
:g
@cmd/cset/a!(n%%%1)
취하고 d
커맨드 라인 파라미터로서 그리고 판독 숫자 n
와 각 행에 -
EOF를 표식으로한다. 1
분할 할 수없는 0
경우 출력 합니다 . 설명:
@set n=
n
빈 문자열로 초기화 하십시오.
@set g=1
g
이다 gcd(d, 10**len(n))
:l
루프 읽기 숫자를 시작하십시오.
@set/ps=
다음 자리를 읽으십시오.
@if %s%==- goto g
EOF에서 처리를 중지하십시오.
@set n=%s%%n%
다음 자리를 앞에 추가하십시오 n
.
@set/ae=%1/g,g*=2-e%%2,g*=1+4*!(e%%5),r=n%%g
증가하고 계산 된 g
지금 업데이트하십시오 .len(n)
n%g
@if %g% neq %1 if %r%==0 goto l
r
0이 아닌 경우 는 의 인수로 d
나누지 n
않기 때문에 확실히 나누지 않습니다. 경우 제로 우리는 여부 만 알고 분할 하는 경우 등호 , 그렇지 않은 그렇다면, 루프를 계속합니다.g
d
r
d
n
g
d
:g
EOF에서 자릿수 판독 루프를 해제하십시오.
@cmd/cset/a!(n%%%1)
결과를 계산하고 암시 적으로 출력합니다.