2015-07-17 2 views
3

Учитывая, что число в 0-й ячейке ленты заполнено, а остальные все просто используются как ячейки скреста (т.е. все они начинаются с 0 и являются временными - I неважно, что с ними происходит), я хотел бы заменить 0-ю ячейку 0 или 1. 0, если четно, 1, если нечетно.Выяснение того, является ли число в ячейке четным или нечетным

В общем, что я хочу сделать, это (в C-эск псевдокод):

cell[0] = (cell[0] % 2) 

Я знаю, что существует divmod algorithm определяется следующим образом:

Если не нужно сохранить п, использовать этот вариант:

# >n d 
[->-[>+>>]>[+[-<+>]>+>>]<<<<<] 
# >0 d-n%d n%d n/d 

Однако, так как X % 2 == X & 1, т. Е. X mod 2 - самый правый бит X, я думаю, что divmod может быть излишним с точки зрения сложности вычисления.

Есть ли лучший алгоритм/метод для определения, является ли ячейка четной или нет?

ответ

0

Вы должны проверить модуль, чтобы узнать, четный или нечетный. Это самый простой способ. Но я бы с осторожностью относился к этому алгоритму divmod, который вы опубликовали. Он должен работать при проверке по модулю 2, но если я правильно помню, не пытайтесь разделить на 1, используя его.

На ПК вы можете просто И число с 1 (при условии, что это целое число). Но у мозгового уклона нет оператора И, поэтому вам придется пройти долгий путь. Вы знаете, что компьютер хранит номера в двоичном формате, но это не проблема мозгового увлечения. Это не дает вам массив двоичных значений для управления. Это дает массив чисел, которые вы можете только увеличение, уменьшение или сравнить 0.

5

Вам нужен алгоритм, который держит только паритет, вы могли бы сделать это так:

result=0 
while(n > 0) { 
    result++; 
    n--; 
    if(n > 0) { 
    result--; 
    n--; 
    } 
} 

Чтобы проверить п без теряет свою ценность, вам необходимо скопировать его: скопировать из а в в и с, затем перейти C к A. вы можете проверить B и сохранить п в А. Вот код Brainfuck:

[->+<] # move @0 to @1 
> # goto @1 
[-<+ # if @1 then decrements @1 and increments @0 
> # goto @1 
[->+>+<<] # if @1 then move @1 to @2 and @3 
>> # goto @3 
[-<<+>>] # if @3 then move @3 to @1 
< # goto @2 
[<-<->>[-]] # if @2 then decrements @0, decrements @1 and sets 0 into @2 
< # go to @1 
] # continue loop if @1 is not null 
< # goto @0 

световую форму:

[->+<]>[-<+>[->+>+<<]>>[-<<+>>]<[<-<->>[-]]<]< 
2

N четным или нечетным:

>,    load m1 with N 

[-[->]<]+  set m0 = 1 if odd 
       set m1 = 1 if even 
+0

Можете ли вы объяснить, как это работает? Кроме того, не будет ли это идти дальше, чем m0 (что приводит к неопределенному поведению)? –

+0

Я играл с этим в течение нескольких дней, получил его от 11 до 9 команд. Наверное, ясно, как это работает. – 6502asm

2

Вот версия, которая полностью решает P:

ли N четным или нечетным?

>,    ~load m1 with N (not counted for golf scoring) 
>>+>+<<<  ~set 'trail of breadcrumbs' so we can figure out 
        where P is 
[-[->]<]+  ~if N is odd set m0 = 1 
>>>[>]   ~figure out where P is 
<[-<]<[-]<  ~go back to m1 and zero out if N is even 

Указатель P заканчивается m0 нечетное: m0 = 1 даже: m0 = 0

 Смежные вопросы

  • Нет связанных вопросов^_^