Какие общие советы у вас есть для игры в гольф в TI-BASIC для калькуляторов серии TI-83/84 +? Я ищу идеи, которые могут быть применены к задачам кода-гольфа и которые, по крайней мере, несколько специфичны для TI-BASIC (например, «удалить комментарии» - это не ответ).
Пожалуйста, оставьте один совет за ответ.
Ответы:
Ваш калькулятор достаточно умен для определения конца строки, поэтому вы можете опустить немало символов.
For(
циклы имеют такой синтаксис -For(variable, start, end, increment)
, но вы можете опустить приращение, и он будет использовать 1:и вы можете опустить завершающие скобки (в конце строк) по всей доске:
Проверено на моем калькуляторе TI-84 Silver Edition
Если вы думаете, что это более чем одна идея (вывод окончаний), я разделю их
источник
not(iPart(B))+(A=5
может быть(A=5)+not(iPart(B
.{lists}
,"strings"
и[[matrices]]
). Выражения будут автоматически закрываться, когда вы достигнете новой строки, двоеточия (заменитель новой строки; однако не применяется к строкам, так как они могут содержать двоеточия) или стрелку присваивания переменной (→
набирается с помощью кнопки STO ▶ ` ). Такая странная особенность языка.использование
Ans
Если вы будете использовать только выражение в следующей строке, не сохраняйте его в переменной! Специальная переменная Ans - это однобайтовый токен, в котором хранится значение последнего вычисленного выражения. Таким образом:
может быть
сохраняя два байта.
источник
Используйте таблицу поиска, закодированную в числах с плавающей точкой
Немного продвинутый совет:
Маленькие справочные таблицы полезны для гольф-кода: очень часто нам нужна функция, которая отображает, например, от 0 до 1, от 1 до 2, от 2 до 1, а все остальное на 0. Однако массивы TI-BASIC не подходят для этого: с одной стороны, они основаны на одном, а с другой, значение не может быть извлечено до тех пор, пока не будет сохранен массив
Ans
или переменная списка.В моем ответе здесь , я храню небольшую таблицу поиска в постоянной волшебной в основе 11. Просто перечислите значения , которые вы хотите использовать,
преобразовать в полезную форму
напишите в нужной вам базе (база 11)
и преобразовать в базу 10
Подход кратчайшего массива на 8 байт длиннее!
TI-BASIC сохраняет только числа с плавающей запятой до 14 десятичных цифр, поэтому вы можете хранить до 44 битов, но только до 14 десятичных цифр.
Эту технику часто можно усовершенствовать, используя поиск методом грубой силы, чтобы найти магическую константу, а не кодирование по основанию N. Я все еще нахожусь в процессе игры над ответом выше, но легендарный гольфист TI-BASIC Weregoose использовал этот метод для генерации различий между числами, взаимно простыми с 30 (то есть повторяющимся списком
6, 4, 2, 4, 2, 4, 6, 2
) в вики / форуме TI-BASIC Разработчик с этим фрагментом:Магическая константа 576 была найдена с помощью Mathematica, но если у вас нет копии, используйте скрипт на вашем любимом языке.
источник
Положите повторяющиеся выражения уравнения переменных.
EX:
Может быть:
Примечание: трудно найти хорошее применение для этого, но это не значит, что вы должны забыть переменные уравнения: P
Источник: http://tibasicdev.wikidot.com/selfmodify
-c4ooo от Омнимага
источник
n
к первому выражению вместе сRemainder(
функцией.Пропустить ненужную инициализацию переменной
В настоящее время принято решение разрешить запуск всего кода на новом интерпретаторе. Мы можем воспользоваться этим - все неинициализированные действительные переменные начинаются
0
с TI-BASIC иXmin
начинаются как возможно полезное значение-10
. Так что, если вам когда-нибудь понадобится взять промежуточный итог в программе, которая не принимает входные данные от Ans, или вам действительно нужен всего-10
один байт, этот совет может вам помочь.источник
Меньшая генерация списка
Если вам нужен список
{1,2,...,N}
, где N, скажем, 42, очевидный способ создать егоТем не менее, на один байт меньше, чем это аккуратно, используя команду
binomcdf(
(кумулятивное биномиальное распределение).Это работает только тогда, когда N является константой, поскольку экономия достигается за счет замены N-1 его значением в коде.
Есть два случая, которые позволяют еще более короткий код.
Если у вас уже есть список
L1
измерения N:Если вы не заботитесь о заказе:
источник
seq(X,X,1,N
даже когдаN
он не постояненcumSum(1 or rand(N
.Устранить операторы End для блоков If в конце программы
Сохраняет два байта: один для конца и один для перевода строки. Это также позволяет вам использовать подразумеваемый Disp в последней строке, часто сохраняя дополнительный байт.
Может быть:
источник
Знай свои идиомы
Вот некоторые фрагменты, которые я обычно использую в коде гольф:
not(not(Ans
илиAns and 1
. Какой из них использовать, зависит от необходимых скобок.int(e^(Ans
. Сохраняет открытую пареню1+(Ans
. Очень полезно, потому что TI-BASIC имеет одноосновные массивы.{0,1}
для{1,-1}
:cos(πAns
. Сохраняет один байт1-2Ans
.tanh(ᴇ9Ans
-int(-Ans
1+int(log(Ans
{Re,Im}
:imag(Ans{i,1
seq(inString("...",sub(Ans,X,1)),X,1,length(Ans
(где...
находится строка поиска)ΔList(cumSum(Ans
ΔList(cumSum(Ans)-Ans
L1
уникальны:SortA(L1:min(ΔList(L1
1+sum(not(cumSum(Ans=X
median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
источник
tanh(ᴇ9Ans
тот работает.Если вы обнаружите, что используете
Затем вы можете использовать (чтобы сохранить байт):
Это происходит потому , что при удалении переменной (
G
), она становится его значение по умолчанию, в этом случае0
. Затем вы можете поставить еще одну строку послеDelVar
оператора, без новой строки . Будьте внимательны при размещении критических контрольных операторов сразу послеDelVar
оператора.(Проверено на TI-84)
источник
Какие переменные списка использовать?
При использовании списков избегайте списков
L₁
по умолчаниюL₆
в пользу именованных списков с однобуквенными именами:ᶫA
черезᶫZ
(гдеᶫ
маленькая буква L).Либо один стоит два байта для ссылки (хотя
L₁
это один токен, это двухбайтовый токен), но при сохранении значений в списке вы можете удалитьᶫ
символ, сохранив байт:может быть
Калькулятор проверяет тип данных выражения при решении, где хранится результат.
Аналогично,
Input A
илиPrompt A
будет хранить вᶫA
если пользователь вводит список вместо числа.Несколько других команд могут использоваться без
ᶫ
, хотя большинство из них редко используются в гольфе. Например,Matr►list(
позволяетᶫ
удалить его в третьем, четвертом и более высоком аргументах.Общее правило состоит в том, что если команда принимает имя переменной списка, а не выражение списка , и если нет альтернативного синтаксиса, который мог бы поместить туда переменную другого типа, то команда могла бы работать с
ᶫ
отключенным значением.Это не работает с изменением одной записи списка:
1→ᶫA(3
не может быть изменено на1→A(3
.Конечно, лучшая переменная списка для использования всегда
Ans
.источник
Input A
" сохраняется,ᶫA
если пользователь входит в список. "Это означает, что многие из моих программ довольно легко ломаются. Тогда хорошо, что у меня все равно не так многоInput
программ, в основном у меня есть либо небольшие инструменты без проверки ошибок, либо полные игры, которые используютGetKey
вместоInput
.A
и проверить, изменилось ли оно послеInput A
.Знайте свои переменные затраты назначения
Если вы используете время
B
выражения -byteN
, следует ли назначать его переменной?Ans
стоит1+N
использовать байты (по одному на разрыв строки и по одному на каждый раз, когда он используется, поэтому используйте Ans, когда(B-1)*(N-1)>2
. Может быть только одинAns
на строку, поэтому попробуйте все значения дляAns
которые могут быть полезны.Реальные переменные (например
X
)3+N
байты стоимости , поэтому используйте их, когда(B-1)*(N-1)>4
.Перечислите переменные стоимости
3+2N
байтов, поэтому используйте их, когда(B-2)*(N-1)>5
.Переменные уравнения наименее полезны: им нужны
4+2N
байты. Используйте их, когда(B-2)*(N-1)>6
.Когда функция вычисляется в виде списка, сохраните ее в виде списка, а не в виде переменной уравнения, подобной
u
; это экономит один байт.Имейте в виду, что наличие или отсутствие закрывающих скобок часто может привести к тому, что сохранение выражений будет выгодным, если они переставлены.
Теперь я буду противоречить самому себе и скажу, что в одной строке нужно писать как можно больше кода. Зачем? Обычно, когда в строке длинное повторяющееся выражение, его можно упростить.
источник
int (rand over randInt (
X + int (Yrand равен или меньше байтов, чем randInt (X, Y, поскольку randInt - это 2-байтовый токен. Некоторые потенциальные преимущества:
X + может быть опущен, когда нижняя граница равна 0, сохраняя два байта
X + необходим перед randInt (в любом случае, в определенных ситуациях, например, случайным образом из функции шага, такой как {2,5,8,11}
X + int (Yrand (N может использоваться как randInt (X, Y, N, чтобы сгенерировать список из N случайных чисел).
Инициализация графического экрана
Чтобы использовать такие функции, как Линия (легко с пиксельными координатами, необходимо инициализировать оси графического экрана квадратными пикселями и удалить оси:
зажим
Где N - число или алгоритм, а U и L - верхняя и нижняя границы
Есть N в списке
Подробнее Список математики
Выход
Disp и текст (могут быть объединены в цепочку, поэтому Disp A, B будет отображать A, а затем B в отдельных строках и текст (28,40, A, B будет печатать A рядом с B в одной строке).
Технология из оптимальной петли движения
Многие из этих оптимизаций являются частью технологии, используемой для перемещения символа по экрану в наименьшем количестве байтов.
http://tibasicdev.wikidot.com/movement
Списки размеров токенов
http://tibasicdev.wikidot.com/tokens
За помощь в подсчете очков
источник