Кілька порад тут:
Константи:
На сторінці констант Esolangs є надзвичайно корисний список найкоротших способів створення конкретних значень. Я вважаю, що я консультую цю сторінку хоча б двічі за програму.
Початок всього:
+++[[<+>>++<-]>]
При цьому встановлюється стрічка у форматі 3 * n ^ 2, який виглядає так
3 6 12 24 48 96 192 128 0 0 '
Чому це так важливо?
Спустимось до списку:
- 3 і 6 нудні
- 12: близько 10 (нова лінія) або 13 (повернення вагона). Також можна використовувати для лічильника на 0-9
- 24: Близько до 26, кількість літер в алфавіті
- 48: ASCII для
0
- 96: Близько до 97, ASCII для
a
- 196 і 128: 196-128 = 64, близько 65, ASCII для
A
.
З цього одного алгоритму ми починаємо практично кожну послідовність у діапазоні ASCII, а також лічильник для кожного та новий рядок у простому досяжності.
Практичний приклад:
Друк усіх великих і малих літер і цифр.
За допомогою алгоритму:
+++[[<+>>++<-]>]<<[-<->]<<<<++[->>+.>+.<<<]<--[>>.+<<-]
Без:
+++++++++++++[->+++++++>++>+++++>++++>+<<<<<]>+++++>[-<+.>>.+<]>>---->---[-<.+>]
Ми витрачаємо більшість байтів, просто ініціалізуючи стрічку у другому прикладі. Частина цього компенсується додатковими рухами в першому прикладі, але цей спосіб явно має перевагу.
Кілька інших цікавих алгоритмів у тому ж ключі:
3 * 2 ^ n + 1:
+++[[<+>>++<-]+>]
Tape: 4 7 13 25 49 65 197 129 1 0'
Це компенсує значення на 1, що забезпечує кілька речей. Це робить 12 повернення вагона, 64 - фактичним початком великого алфавіту, а 24 - ближче до 26.
2 ^ n:
+[[<+>>++<-]>]
Tape: 1 2 4 8 16 32 64 128
Оскільки 64 хороший для великих літер, 32 - це ASCII для простору, а 128 може бути використаний як лічильник для 26 (130/5 = 26). Це може зберегти байти в певних ситуаціях, коли цифри та малі літери не потрібні.
Виберіть реалізацію, яка відповідає питанню:
- Негативні клітини майже завжди корисні, і немає причин уникати їх (якщо це не змінить ваш обліковий запис)
- Майже те саме, що з обгортаючими клітинками, тим більше, що багато констант використовують обгортку.
- Довільні розміри комірок корисні для нескінченних математичних послідовностей, таких як обчислення послідовності Фібоначчі нескінченно (
+[[-<+>>+>+<<]>]
) або обробка більших / від'ємних чисел. Мінус полягає в тому, що деякі поширені методи, такі як [-]
і на них [->+<]
не можна покластися, лише на випадок, коли число заперечне.
- EOF як 0, -1 або без змін. 0, як правило, бажано, оскільки ви можете перебирати весь вхід без додаткових перевірок. -1 корисно при переході на масиви. Я ще не знайшов використання для жодних змін :(.
Слідкуйте за тим, що відбувається фрік:
У будь-який час ви повинні мати коментарі щодо того, де має бути вказівник стосовно даних навколо нього, і переконайтеся, що ви знаєте діапазон можливих значень кожної комірки. Це особливо важливо, коли ви розділили вказівник перед циклом, тому що ви хочете потім об'єднати дві можливості разом.
У будь-який момент мій код завалений коментарями до кожного іншого рядка, який виглядає приблизно так:
*0 *dat a_1 ? 0' !0 0*
or
*0 *dat 0' ap1 0 !0 0*
Деякі додаткові поради - присвоїти символам особливі значення. У наведеному вище прикладі, '
де знаходиться вказівник, *
означає повторення в цьому напрямку, ?
означає клітинку з невідомим значенням, !0
означає ненульову клітинку, _
є замінником -
і p
є замінником +
. or
Мається на увазі, що стрічка може бути схожою на представлення, і її потрібно обробляти як таку.
Ваша схема символів не обов'язково повинна бути такою ж, як у мене (яка має кілька недоліків), вона просто повинна бути узгодженою. Це також надзвичайно корисно при налагодженні, оскільки ви можете запустити його до цього моменту і порівняти фактичну стрічку з тією, що у вас повинна бути, що може вказувати на потенційні недоліки у вашому коді.