Que dicas você tem para jogar golfe no TI-BASIC para as calculadoras da série TI-83/84 +? Estou procurando idéias que possam ser aplicadas a problemas de código-golfe e que também sejam pelo menos um pouco específicas para o TI-BASIC (por exemplo, "remover comentários" não é uma resposta).
Poste uma dica por resposta.
Respostas:
Sua calculadora é bastante inteligente em deduzir o final das linhas para você e, portanto, você pode omitir alguns caracteres.
For(
os loops têm uma sintaxe como esta -For(variable, start, end, increment)
, mas você pode omitir o incremento e ele usará 1:e você pode omitir parênteses finais (no final das linhas) em todo o quadro:
Testado na minha calculadora TI-84 Silver Edition
Se você acha que isso é mais do que uma ideia (inferir finais), então eu as separarei
fonte
not(iPart(B))+(A=5
pode ser(A=5)+not(iPart(B
.{lists}
,"strings"
e[[matrices]]
). As expressões serão fechadas automaticamente quando você alcançar uma nova linha, dois pontos (um substituto para a nova linha; no entanto, não se aplica a cadeias de caracteres, pois elas podem conter dois pontos) ou a seta de atribuição de variável (→
digitada com o botão STO ▶ ` ) Uma característica tão estranha da linguagem.Usar
Ans
Se você usar apenas uma expressão na próxima linha, não a armazene em uma variável! A variável Ans especial é um token de um byte que armazena o valor da última expressão avaliada. Portanto:
pode ser
economizando dois bytes.
fonte
Use uma tabela de pesquisa codificada em números de ponto flutuante
Uma dica um pouco avançada:
Pequenas tabelas de pesquisa são úteis para o código de golfe: muitas vezes precisamos de uma função que mapeie, por exemplo, 0 a 1, 1 a 2, 2 a 1 e tudo mais a 0. No entanto, as matrizes TI-BASIC não são adequadas para esse propósito: por um lado, eles são baseados em um e, por outro, um valor não pode ser extraído até que a matriz seja armazenada
Ans
ou uma variável de lista.Na minha resposta aqui , armazeno uma pequena tabela de pesquisa em uma constante mágica na base 11. Simplesmente liste os valores que você deseja usar,
converter para um formulário útil
escreva na sua base desejada (base 11)
e converter para a base 10
A abordagem de matriz mais curta tem 8 bytes a mais!
O TI-BASIC armazena apenas flutuadores com 14 dígitos decimais, para que você possa armazenar até 44 bits, mas apenas 14 dígitos decimais.
Essa técnica geralmente pode ser aprimorada ainda mais usando a pesquisa de força bruta para encontrar uma constante mágica em vez da codificação base-N. Ainda estou no processo de jogar a resposta acima, mas o jogador de TI TI-BASIC Weregoose usou esse método para gerar as diferenças entre os números de coprime com 30 (ou seja, uma lista repetida
6, 4, 2, 4, 2, 4, 6, 2
) no wiki / fórum TI-BASIC Desenvolvedor com este trecho:A constante mágica 576 foi encontrada usando o Mathematica, mas se você não possui uma cópia, use um script no seu idioma favorito.
fonte
Coloque variáveis de equação de expressões repetidas.
EX:
Pode ser:
Nota: é difícil encontrar um bom uso para isso, mas isso não significa que você deva esquecer as variáveis da equação: P
Fonte: http://tibasicdev.wikidot.com/selfmodify
-c4ooo de Omnimaga
fonte
n
à primeira expressão, junto com aRemainder(
funçãoIgnorar inicialização desnecessária de variáveis
O consenso atual é permitir que todo o código seja executado em um novo intérprete. Podemos tirar vantagem disso - todas as variáveis reais não inicializadas começam
0
em TI-BASIC eXmin
começam como o valor possivelmente útil-10
. Portanto, se você precisar fazer um total em execução em um programa que não recebe informações do Ans ou precisar de um-10
byte a menos, essa dica pode ajudá-lo.fonte
Geração de lista menor
Se você precisar de uma lista
{1,2,...,N}
, onde N é, digamos, 42, a maneira óbvia de criá-la éNo entanto, um byte menor que isso é um hack puro, usando o
binomcdf(
comando (distribuição binomial cumulativa).Isso funciona apenas quando N é uma constante, porque a economia advém da substituição de N-1 pelo seu valor no código.
Existem dois casos que permitem código ainda mais curto.
Se você já possui uma lista
L1
da dimensão N:Se você não se importa com a ordem:
fonte
seq(X,X,1,N
mesmo quandoN
não é constantecumSum(1 or rand(N
.Eliminar instruções End para blocos If no final de um programa
Salva dois bytes: um para o final e outro para a quebra de linha. Ele também permite que você use o Disp implícito na última linha, geralmente salvando um byte adicional.
Pode ser:
fonte
Conheça seus idiomas
Aqui estão alguns trechos que eu costumo usar no código golf:
not(not(Ans
ouAns and 1
. Qual deles usar depende dos parênteses necessários.int(e^(Ans
. Salva um ponto aberto1+(Ans
. Muito útil, porque o TI-BASIC possui matrizes de uma base.{0,1}
para{1,-1}
:cos(πAns
. Salva um byte1-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
(onde...
está a string de pesquisa)ΔList(cumSum(Ans
ΔList(cumSum(Ans)-Ans
L1
são exclusivos:SortA(L1:min(ΔList(L1
1+sum(not(cumSum(Ans=X
median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
fonte
tanh(ᴇ9Ans
esse funciona.Se você estiver usando
Em seguida, você pode usar (para salvar um byte):
Isso ocorre porque quando você exclui uma variável (
G
), ela se torna seu valor padrão, neste caso0
,. Em seguida, você pode colocar outra linha após aDelVar
declaração, sem uma nova linha . Tenha cuidado ao colocar instruções de controle cruciais diretamente após umaDelVar
declaração.(Testado na TI-84)
fonte
Quais variáveis de lista usar?
Ao usar listas, evitar as listas padrão
L₁
atravésL₆
em favor de listas de nomeados com nomes de uma letra:ᶫA
atravésᶫZ
(ondeᶫ
é o pequeno L).Qualquer um custa dois bytes para referência (embora
L₁
seja um único token, é um token de dois bytes), mas ao armazenar valores em uma lista, você pode soltar oᶫ
símbolo, salvando um byte:pode ser
A calculadora verifica o tipo de dados da expressão ao decidir onde o resultado será armazenado.
Da mesma forma,
Input A
ouPrompt A
armazenará paraᶫA
se o usuário inserir uma lista em vez de um número.Vários outros comandos podem ser usados sem o
ᶫ
, embora a maioria deles raramente seja usada no golfe. Por exemplo,Matr►list(
permite que oᶫ
item seja removido em seus terceiro, quarto e superior argumento.A regra geral é que, se o comando usar um nome de variável de lista e não uma expressão de lista , e se não houver uma sintaxe alternativa que possa colocar um tipo diferente de variável, o comando poderá funcionar com o
ᶫ
deixado de fora.Isso não funciona com a modificação de uma única entrada de uma lista:
1→ᶫA(3
não pode ser alterado para1→A(3
.Obviamente, a melhor variável de lista a ser usada é sempre
Ans
.fonte
Input A
" armazena paraᶫA
se o usuário entrar em uma lista. "Isso significa que muitos dos meus programas são muito fáceis de quebrar. Então é bom que eu não tenha tantosInput
programas de qualquer maneira, eu geralmente tenho pequenas ferramentas sem verificação de erro ou jogos completos que usamGetKey
em vez deInput
.A
e verificar se ele foi alterado posteriormenteInput A
.Conheça seus custos variáveis de atribuição
Se você usa tempos de
B
expressão com bytesN
, deve atribuí-lo a uma variável?Ans
custa1+N
bytes a serem usados (um para a quebra de linha e um para cada vez que é usado, use Ans quando(B-1)*(N-1)>2
. Pode haver apenas umAns
por linha; portanto, tente todos os valoresAns
que possam ser úteis.Variáveis reais (por exemplo
X
) custam3+N
bytes, então use-as quando(B-1)*(N-1)>4
.Liste os
3+2N
bytes de custo das variáveis , portanto, use-os quando(B-2)*(N-1)>5
.As variáveis de equação são as menos úteis: elas precisam de
4+2N
bytes. Use-os quando(B-2)*(N-1)>6
.Quando uma função é avaliada em uma lista, armazene-a em uma lista em vez de em uma variável de equação como
u
; isso economiza um byte.Lembre-se de que a presença ou ausência de parênteses próximos muitas vezes pode fazer com que as expressões de armazenamento sejam vantajosas se elas forem reorganizadas.
Agora vou me contradizer e dizer que se deve escrever o código em uma linha o máximo possível. Por quê? Geralmente, quando há uma expressão longa e repetida em uma linha, ela pode ser simplificada.
fonte
int (rand sobre randInt (
X + int (Yrand é igual ou menos bytes que randInt (X, Y como randInt é um token de 2 bytes. Alguns benefícios potenciais:
X + pode ser deixado de fora quando o limite inferior é 0, economizando dois bytes
X + é necessário antes do randInt (de qualquer maneira em determinadas situações, por exemplo, aleatório a partir de uma função de etapa como {2,5,8,11}
X + int (Yrand (N pode ser usado apenas como randInt (X, Y, N para gerar uma lista de N números aleatórios
Inicialização da tela de gráfico
Para usar funções como Linha (facilmente com coordenadas de pixel, é necessário inicializar os eixos da tela do gráfico em pixels quadrados e remover os eixos:
Braçadeira
Onde N é o número ou algoritmo e U e L são limites superior e inferior
É N na lista
Mais Lista de matemática
Saída
Disp e Text (ambos podem ser encadeados, então Disp A, B exibirá A e B em linhas separadas e Texto (28,40, A, B imprimirá A ao lado de B em uma linha
Tecnologia do loop de movimento ideal
Muitas dessas otimizações fazem parte da tecnologia usada para mover um personagem pela tela no menor número de bytes
http://tibasicdev.wikidot.com/movement
Listas de tamanho de token
http://tibasicdev.wikidot.com/tokens
Para obter ajuda na pontuação
fonte