2016-07-31 13 views
5

Mam problem z implementacją asemblera *** dla codegolf.se. Udało mi się załadować ciąg znaków do pamięci, znaleźć jego długość wyłapać, wydrukować ciągi n razy itp., Ale nie mogę załadować do pamięci tylko małych liczb. Więc weźmy następującą pętlę, która wykonuje jakąś magię. (Hash marks debugujesz znaczników.)Wydajna implementacja pętli while w brainf ***

#,#[>#<[<]<<#+#>>>[>]#,#]<[<] 

Zaczyna się wskaźnik 512 i zapisuje ciąg jako wartości ASCII na plamy po 512


Now if (z jakiegokolwiek powodu) Chciałbym rozebrać się małe litery to, będzie wyglądać tak w psuedo BF.

#,#[>#<[<]<<#+#>>>[>]#do{,(takes input and assigns it)} 
while(input>=96/*Go arbitrarily to the right for this implementation but 
make sure that the first non-lowercase number is stored at the index*/)# 
//Also be sure to zero out any temporary cells used 
<[<] 

Teraz moje pytanie brzmi, jak mogę wdrożyć taki pętli while a tylko za pomocą spacji na prawo od 512 jako magazynowania i usuwania ich później. Dla ciekawych this jest problem, który chcę rozwiązać w branf ***.

Odpowiedz

1

Twój kod można uprościć do

,[[<]<+>>[>],]<[<] 

(<<+>> jest prawdopodobnie wynikiem użyciu kompilatora online, który zapomina komórkę 255)

i powtarzany, w celu wytworzenia operacji wyprowadzania:

>.[[<]<->>[>]<.>]<[<] 

Jeśli chcesz użyć tylko puste komórki na swój sposób, możesz to zrobić. Ale trzeba będzie ustalić jakiś protokół własnego definiowania następną komórkę, jak oszczędność każdą komórkę danych z poniższej komórce określający odległość do następnego, jak:

[..., 104, 5, x, x, x, x, 108, 3, x, x, 102, 2...] 

[..., 104 , 5 , x, x, x, x, 108 , 3 , x, x, 102 , 2 ...] 
     data pointer    data pointer   data pointer 

gdy x pewne arbitralne, żaden -zero wartość (w przeciwnym razie użyłbyś go). Ta implementacja byłaby w pewnym sensie połączoną listą, ale zauważ, że będzie to przestrzeń i kod drogo.


Zerowanie dół komórki, lub jak to nazwać ich w czystości, można zrobić tak samo zrobiłeś [<] - za pomocą [-]. to zmniejszy wartość komórki, aż osiągnie 0 - a następnie zakończy pętlę. Możesz przerwać ciąg znaków, gdy skończysz - i powrócić podczas czyszczenia każdej komórki, aż trafisz na początek (0 lub inny zarezerwowany numer, który tam umieścisz).