2016-12-12 11 views
1

brainf * ck에서 '!'모양을 계산하는 카운터를 만들려고합니다. 주어진 입력에서 '!' 'ok'를 3 번 ​​인쇄해야합니다. 그렇지 않으면 아무것도 인쇄해야합니다. 이 내 코드입니다 : '!'Brainf에서 x == y로 계산 * ck

+++ //0:'3' 
[>++++++++++ ++++++++++ ++++++++++ +++ // a loop which compare each char in the given text with the '33*+'which means '!' saved in cell 1:'33' 
>,< 
[->-<] <-] //and reducing the 3 in cell 0 -1 
>>>++++++++++ ++++++++++ ++++++++++ // char 'o' in 2 
    ++++++++++ ++++++++++ ++++++++++ 
    ++++++++++ ++++++++++ ++++++++++ 
    ++++++++++ ++++++++++ + 
> ++++++++++ +++++++++ ++++++++++ // char 'k' in 3 
    ++++++++++ +++++++++ ++++++++++ 
    ++++++++++ +++++++++ ++++++++++ 
    ++++++++++ +++++++ 
<<<[->]>>.>. // if false ok won't be printed . 

이제 위의 문제가 카운터 카운터 각 문자 및뿐만 아니라 , 그래서 여기에 내 질문 Brainf * ck에서 지정할 수 있습니까?

답변

1

BF에는 비교 연산자가 하나만 있습니다. 0과 비교하는 것 (각각 과 ] 명령을 사용).

평등을 비교하려면 다른 숫자에서 하나의 숫자를 빼고 결과가 0인지 확인해야합니다. 두포 구현으로 랩핑을 허용하는 경우 (0에서 1을 빼면 최대 값이됩니다) 그 다음 당신은 하나 개의 번호가 있으므로 같은 다른 형태 빼기 때문에 정말 쉽게 (값을 가정을 세포 0에 있고 1) :

>[<->-]<

이 셀 0의 결과로 종료, 세포 0 포인터 셀 1은 0으로 설정됩니다.

값이 0인지 여부는 간단합니다. 뺄셈의 결과가 셀에 0, 여전히 포인터로, 당신은이 작업을 수행 할 수 있습니다 : 당신의 브레인 퍽 구현 포장을 지원하지 않는 경우

[ if the current value is not 0 your code goes here return back to cell 0 [-] clear cell 0 so the "loop" exits after only one iteration ] exit the loop after only one iteration (if cell 0 was originally nonzero) and leave cell 0 with the value 0 inside

, 당신은 한 번에 한 단계해야 . 각 숫자에서 하나를 빼고 각 단계에서 둘 중 하나가 0인지 확인하십시오 (값을 복사하여 소멸되지 않도록하고 다음 반복을 수행 할 수 있음을 기억하십시오). 값 중 하나가 0이 되 자마자 루프를 종료하십시오. 값이 같으면이 값은 모두 0이어야합니다. 나는이 알고리즘의 구현을 당신에게 연습으로 남겨 둘 것이다 :