¿Qué consejos generales tiene para jugar al golf en TI-BASIC para las calculadoras de la serie TI-83/84 +? Estoy buscando ideas que se puedan aplicar a problemas de código de golf y que también sean al menos algo específicas para TI-BASIC (por ejemplo, "eliminar comentarios" no es una respuesta).
Por favor, publique un consejo por respuesta.
Respuestas:
Su calculadora es bastante inteligente para inferir el final de las líneas para usted y, por lo tanto, puede omitir bastantes caracteres.
For(
los bucles tienen una sintaxis como estaFor(variable, start, end, increment)
, pero puede omitir el incremento y usará 1:y puede omitir paréntesis finales (al final de las líneas) en todos los ámbitos:
Probado en mi calculadora TI-84 Silver Edition
Si crees que esta es más de una idea (inferir finales), las dividiré
fuente
not(iPart(B))+(A=5
puede ser(A=5)+not(iPart(B
.{lists}
,"strings"
y[[matrices]]
). Las expresiones se cerrarán automáticamente cuando llegue a una nueva línea, dos puntos (un sustituto de la nueva línea; sin embargo, no se aplica a las cadenas, ya que pueden contener dos puntos) o la flecha de asignación variable (→
, escrita con el botón STO ▶ ` ) Una característica tan extraña del lenguaje.Utilizar
Ans
Si solo usará una expresión en la línea siguiente, ¡no la almacene en una variable! La variable especial Ans es un token de un byte que almacena el valor de la última expresión evaluada. Así:
puede ser
ahorrando dos bytes.
fuente
Use una tabla de búsqueda codificada en números de punto flotante
Un consejo un poco avanzado:
Las tablas de búsqueda pequeñas son útiles para el golf de código: muy a menudo necesitamos una función que asigne, por ejemplo, 0 a 1, 1 a 2, 2 a 1, y todo lo demás a 0. Sin embargo, los arreglos TI-BASIC no son adecuados para este propósito: por un lado, están basados en uno, y por otro, un valor no se puede extraer hasta que la matriz se almacene en
Ans
una variable de lista o no.En mi respuesta aquí , guardo una pequeña tabla de búsqueda en una constante mágica en la base 11. Simplemente enumere los valores que desea usar,
convertir a una forma útil
escriba en su base deseada (base 11)
y convertir a base 10
¡El enfoque de matriz más corto es 8 bytes más largo!
TI-BASIC solo almacena flotantes a 14 dígitos decimales, por lo que puede almacenar hasta 44 bits pero solo 14 dígitos decimales.
Esta técnica a menudo se puede mejorar aún más mediante el uso de la búsqueda de fuerza bruta para encontrar una constante mágica en lugar de una codificación de base-N. Todavía estoy en el proceso de jugar golf la respuesta anterior, pero el legendario golfista TI-BASIC Weregoose usó este método para generar las diferencias entre los números coprimos con 30 (es decir, una lista repetida de
6, 4, 2, 4, 2, 4, 6, 2
) en el wiki / foro TI-BASIC Desarrollador con este fragmento:La constante mágica 576 se encontró usando Mathematica, pero si no posee una copia, use un script en su idioma favorito.
fuente
Poner expresiones repetidas ecuaciones variables.
EX:
Puede ser:
Nota: es difícil encontrar un buen uso para esto, pero eso no significa que deba olvidar las variables de ecuación: P
Fuente: http://tibasicdev.wikidot.com/selfmodify
-c4ooo de Omnimaga
fuente
n
a la primera expresión, junto con laRemainder(
función.Omitir inicialización variable innecesaria
El consenso actual es permitir que todo el código se ejecute en un intérprete nuevo. Podemos aprovechar esto: todas las variables reales no inicializadas comienzan
0
en TI-BASIC yXmin
comienzan como el valor posiblemente útil-10
. Entonces, si alguna vez necesita tomar un total acumulado en un programa que no recibe información de Ans, o realmente necesita un-10
byte menos, este consejo puede ayudarlo.fuente
Menor generación de listas
Si necesita una lista
{1,2,...,N}
, donde N es, digamos, 42, la forma obvia de crearla esSin embargo, un byte más pequeño que eso es un hack limpio usando el
binomcdf(
comando (distribución binomial acumulativa).Esto solo funciona cuando N es una constante, porque el ahorro proviene de reemplazar N-1 con su valor en el código.
Hay dos casos que permiten un código aún más corto.
Si ya tiene una lista
L1
de dimensión N:Si no te importa el orden:
fuente
seq(X,X,1,N
incluso cuandoN
no es constantecumSum(1 or rand(N
.Eliminar declaraciones de finalización para bloques If al final de un programa
Guarda dos bytes: uno para el Fin y otro para el salto de línea. También le permite usar el Disp implícito en la última línea, a menudo guardando un byte adicional.
Puede ser:
fuente
Conoce tus modismos
Aquí hay algunos fragmentos que uso comúnmente en el código de golf:
not(not(Ans
oAns and 1
. Cuál usar depende de los paréntesis necesarios.int(e^(Ans
. Guarda un paréntesis abierto1+(Ans
. Muy útil, porque TI-BASIC tiene matrices basadas en uno.{0,1}
a{1,-1}
:cos(πAns
. Ahorra un 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
(donde...
está la cadena de búsqueda)ΔList(cumSum(Ans
ΔList(cumSum(Ans)-Ans
L1
son únicos:SortA(L1:min(ΔList(L1
1+sum(not(cumSum(Ans=X
median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
fuente
tanh(ᴇ9Ans
funciona.Si te encuentras usando
Luego, puede usar (para guardar un byte):
Esto se debe a que cuando elimina una variable (
G
), se convierte en su valor predeterminado, en este caso0
,. Luego, podría poner otra línea después de laDelVar
declaración, sin una nueva línea . Tenga cuidado al colocar declaraciones de control cruciales directamente después de unDelVar
declaración.(Probado en TI-84)
fuente
¿Qué lista de variables usar?
Cuando use listas, evite las listas predeterminadas
L₁
aL₆
favor de listas con nombres de una letra: aᶫA
travésᶫZ
(dondeᶫ
está la pequeña L).Cualquiera de los dos cuesta dos bytes para hacer referencia (aunque
L₁
es un token único, es un token de dos bytes), pero al almacenar valores en una lista, puede soltar elᶫ
símbolo y guardar un byte:puede ser
La calculadora verifica el tipo de datos de la expresión al decidir dónde se almacena el resultado.
Del mismo modo,
Input A
oPrompt A
se almacenará aᶫA
si el usuario ingresa una lista en lugar de un número.Se pueden usar varios otros comandos sin el
ᶫ
, aunque la mayoría de ellos rara vez se usan en el golf. Por ejemplo,Matr►list(
permiteᶫ
que se elimine en sus argumentos tercero, cuarto y superior.La regla general es que, si el comando toma un nombre de variable de lista y no una expresión de lista , y si no hay una sintaxis alternativa que pueda colocar un tipo diferente de variable allí, entonces el comando podría funcionar con
ᶫ
izquierda desactivada.Esto no funciona con la modificación de una sola entrada de una lista:
1→ᶫA(3
no se puede cambiar a1→A(3
.Por supuesto, la mejor variable de lista para usar es siempre
Ans
.fuente
Input A
" almacenaᶫA
si el usuario ingresa a una lista ". Eso significa que muchos de mis programas son bastante fáciles de romper. Entonces es bueno que no tenga tantosInput
programas de todos modos, en su mayoría tengo herramientas pequeñas sin verificación de errores o juegos completos que usan enGetKey
lugar deInput
.A
y verificar si ha cambiado despuésInput A
.Conozca sus costos de asignación variable
Si usa un
B
tiempo de expresión de bytesN
, ¿debería asignarlo a una variable?Ans
cuesta1+N
bytes para usar (uno para el salto de línea y uno para cada vez que se usa, así que use Ans cuando(B-1)*(N-1)>2
. Solo puede haber unoAns
por línea, así que pruebe todos los valores paraAns
eso podrían ser útiles.Las variables reales (p
X
. Ej. ) Cuestan3+N
bytes, así que úselas cuando(B-1)*(N-1)>4
.Enumere los
3+2N
bytes de costo de las variables , así que úselos cuando(B-2)*(N-1)>5
.Las variables de ecuación son las menos útiles: necesitan
4+2N
bytes. Úsalos cuando(B-2)*(N-1)>6
.Cuando una función se evalúa como una lista, almacénela en una lista en lugar de en una variable de ecuación como
u
; Esto ahorra un byte.Tenga en cuenta que la presencia o ausencia de paréntesis cercanos a menudo puede hacer que el almacenamiento de expresiones sea ventajoso si se reorganizan.
Ahora me contradeciré y diré que uno debería escribir código en una línea tanto como sea posible. ¿Por qué? Por lo general, cuando hay una expresión repetida larga en una línea, se puede simplificar.
fuente
int (rand sobre randInt (
X + int (Yrand es igual o menos bytes que randInt (X, Y como randInt es un token de 2 bytes. Algunos beneficios potenciales:
X + se puede omitir cuando el límite inferior es 0, ahorrando dos bytes
X + es necesario antes de randInt (de todos modos en ciertas situaciones, por ejemplo, al azar de una función de paso como {2,5,8,11}
X + int (Yrand (N puede usarse como randInt (X, Y, N para generar una lista de N números aleatorios
Inicialización de pantalla gráfica
Para usar funciones como Línea (fácilmente con coordenadas de píxeles, es necesario inicializar los ejes de la pantalla de gráficos en píxeles cuadrados y eliminar los ejes:
Abrazadera
Donde N es el número o algoritmo y U y L son límites superior e inferior
Es N en la lista
Más listas de matemáticas
Salida
Disp y Text (ambos se pueden encadenar, por lo que Disp A, B mostrará A y B en líneas separadas y Text (28,40, A, B imprimirá A junto a B en una línea
Tecnología desde el bucle de movimiento óptimo
Muchas de estas optimizaciones son parte de la tecnología utilizada para mover un personaje por la pantalla en la menor cantidad de bytes
http://tibasicdev.wikidot.com/movement
Listas de tamaño de token
http://tibasicdev.wikidot.com/tokens
Para ayuda puntuando
fuente