Советы По Игре В Код-Гольф В Desmos

  • Автор темы Divija
  • Обновлено
  • 22, Oct 2024
  • #1

Десмос в основном используется в качестве онлайн-графического калькулятора, но его графические и математические функции также могут применяться в определенных задачах кодирования.

Я не знаю, что многие люди используют Desmos на этом сайте, но какие советы по игре в гольф в Desmos можно дать тем, кто это делает?

Как обычно, оставляйте советы, специфичные для Desmos, и по одному совету на каждый ответ.

#код-гольф #советы

Divija


Рег
12 Apr, 2014

Тем
80

Постов
192

Баллов
642
  • 26, Oct 2024
  • #2

(В основном это трюк \$\LaTeX\$, позволяющий сэкономить несколько байтов. Этот совет, скорее всего, применим к другим языкам, использующим \$\LaTeX\$.)

При работе с экспонентами (например.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 5^{.5}.5+.5 
) or other operators that require the usage of brackets(e.g. a ), вы можете убрать скобки, которые автоматически появляются, если в показателе степени только одна цифра/символ. Так, aa-a~1 can be written as f(l)=\{\sort([1...L],l)<L/2,0\} . Так же, L=l.length can be shortened to length .

Обратите внимание, что вы не можете убрать эти скобки, если имеется более одной цифры. Например, \ is not the same as L=l.length f(l)=\{\sort([1...L],l)<L/2,0\} .


Этот трюк с экспонентой может работать даже при суммировании, где используется та же нотация при указании останавливающего значения.

Например, вместо того, чтобы писать...

\

... это можно записать как:

1-0^{(a-b)^2}

Потому что если это трюк, то лучше, если вы сможете найти способ максимизировать количество однозначных экспоненциальных членов в вашем коде, чтобы устранить скобки.

Например, на самом деле более эффективно записывать \{a=b:0,1\} (6 bytes) instead of 0^{(a-b)^2} (7 байт).

 

Chij29


Рег
03 Jul, 2011

Тем
70

Постов
212

Баллов
592
  • 26, Oct 2024
  • #3

Вы можете использовать /

Вставка в \{a=b,0\} или f(l)=0^{(sort([1...l.max+1],join(l,2,3,l.mean))-l.median)^2} даст тот же результат, что и при вводе, только в неправильном формате, поэтому в некоторых случаях вам не нужны громоздкие f(l)=\{\sort([1...l.\max+1],\join(l,2,3,l.\mean))=l.\median,0\} .

 

Sae2


Рег
10 Mar, 2009

Тем
63

Постов
189

Баллов
504
  • 26, Oct 2024
  • #4

Круглые скобки не всегда требуются для триггерных функций.

Например, f(l)=\min(\{l=0:l.\max,l\}) is valid and treated as f(l)=min(\{l=0:l.max,l\}) .

Сходным образом, \ is treated as \{x<0:x,x^3\} .

 

CharlesGes


Рег
02 Feb, 2014

Тем
69

Постов
198

Баллов
603
  • 26, Oct 2024
  • #5

Редактировать № 2:

(Ссылаясь на пример в первом редактировании)

Видимо, можно добавить \left\{x<0:x,x^3\right\} at the beginning of the function to make it work(see этот комментарий), о чем я тоже не знал. Полагаю, это снова делает этот совет недействительным.

Редактировать:

В Комментарий fireflame241, он обратил мое внимание на то, что наличие \right и \left сопровождающие пары скобок. Это справедливо для большинства случаев. Но после некоторого тестирования в некоторых случаях извлечение \{x<0:x,x^3\} и \right нарушает код. В частности, если вы используете какую-либо функцию (например. \left или \right ) кроме этих скобок функция работать не будет (см. пример ниже).

Пример:

Предположим, вы хотите сравнить соответствующие элементы двух списков, \left and k=abs(n) floor(log(k+0^k))+1 и посмотрите, сколько из этих соответствующих элементов одинаковы. То есть что-то вроде n and floor(logn)+1 выведет n (the second and third elements of each list are the same).

Вот что может сделать кто-то, узнав, что можно вынуть n and n=0 :

0^n

Теоретически это должно работать прекрасно, но на самом деле Desmos выдает ошибку и не работает. Я почти уверен, что это потому, что он считает floor(log(n+0^n))+1 to be a function, and n , L.mean , и L.mean() быть переменными в этой ситуации. () , L.mean , and mean(L) are not defined, so it gives an error saying so.

В таких случаях лучше сделать:

f(L)

как предложено в совете ниже.


Первый совет, как начать.

При выполнении сравнений в коде в большинстве случаев лучше стараться не использовать скобки. L.f in your code, because they always require a L и f to go with them, which increases byte count unnecessarily. Instead, we can utilize the SET result to empty list FOR each varN in (listN) . . . FOR each var2 in (list2) FOR each var1 in (list1) ADD (expression in terms of var1, ... , varN) to the end of result END FOR END FOR . . . END FOR PRINT result функция.

Рассмотрим простую реализацию, которая возвращает [a+b for a = [1,2,3], b = [2,4,6]] --> [3,4,5,5,6,7,7,8,9] [a+b for a = [2,4,6], b = [1,2,3]] --> [3,5,7,4,6,8,5,7,9] если a и возвращает for otherwise:
(22 байта)

[(a,b)fora=[1...10],b=[1...10]]

Вместо этого мы можем сэкономить 9 байт, проделав небольшие математические вычисления:
(11 байт)

for

Это работает, потому что \operatorname returns \left[\left(a,b\right)\operatorname{for}a=\left[1...10\right],b=\left[1...10\right]\right] если var1, var2, ... , varN is negative, [(expression in terms of var1, ... ,varN) for var1 = (list1), var2 = (list2), ... , varN = (listN)] if ... , and ,..., в противном случае. [0,2...50] is [0,2,...,50] только когда [0...9] , so [0,...,9] было бы ... only when \{(condition):1,n\} . Если true does not equal \{(condition),n\} , он возвращает либо false or true . undefined is just to convert the false к true .

Даже если бы мы хотели вернуться undefined if (condition) and \{x>0\} otherwise, we can still save 9 bytes by doing \{(condition)\} вместо \{(condition),n\} .

 

Kozlenko


Рег
17 Mar, 2006

Тем
87

Постов
187

Баллов
622
  • 26, Oct 2024
  • #6

Логическое отрицание

Если вы хотите поменять местами числа, представляющие ложные и правдивые значения, вы можете использовать n , where \{(condition):1,n\} — это значение, которое необходимо логически отрицать. Чтобы это работало для отрицательных чисел, вы можете использовать абсолютное значение ( total ), suggested by Aiden Chow.

 

Oksana560


Рег
04 Aug, 2010

Тем
65

Постов
182

Баллов
547
  • 26, Oct 2024
  • #7

Вы можете использовать параметры функции для присвоения значений переменных вне этой функции, даже если это выдает ошибку. Используя это, мы можем экономить байты, когда повторяем выражения внутри функций.

Например, посмотрите на этот код:

(45 байт)

\operatorname{total}

Существует много (function name) 's in that code, maybe we can shorten it?

Вот что многие люди могут попытаться сделать, чтобы сократить это:

(49 байт)

\operatorname

Похоже на создание функции только для \operatorname{(function name)} should have helped, but in reality this is actually 4 bytes longer than the initial code.

Что мы можем сделать тогда? Ну, следующий код сделает это:

(37 байт)

->

x->join(x,y) is using a function parameter x\to\join(x,y) при его объявлении, и Desmos выдает ошибку, потому что он, похоже, этого не понимает, но в конце концов он все равно каким-то образом работает, поэтому он действителен.

 

Izver1


Рег
01 Jan, 2011

Тем
70

Постов
199

Баллов
569
  • 26, Oct 2024
  • #8

Изменять \ to -> and to ->

can be replaced with \to , сохраняя 2 байта, и Σ with Π сохранить 1 байт. Важно отметить, что это не заглавные числа «пи». or capital sigma \sum , но со своими собственными характерами.

Сходным образом, can be replaced with \prod , но при этом теряется байт . in either case ( \sum or ), you can omit the next \prod из функции.

Пример: a => b сохраняет 2 байта.

(особая благодарность @Эйден Чоу для исправления о b=sort(a) f(a)=b[1]+b[length(a)]-b[2] )

 

Sopzxdtanbab


Рег
28 Jul, 2014

Тем
61

Постов
187

Баллов
542
  • 26, Oct 2024
  • #9

Для функций, использующих sort(a) , you can simply take out the entire b(a)=sort(a) f(a)=b(a)[1]+b(a)[length(a)]-b(a)[2] часть и использовать sort(a) . For example, instead of f(a)=sort(a)[1]+sort(a)[length(a)]-sort(a)[2] , вы можете просто написать 0^{abs(x)} .

 

PEP


Рег
01 Feb, 2007

Тем
73

Постов
224

Баллов
629
  • 26, Oct 2024
  • #10

Вот крутой кусочный трюк.

При записи кусочных выражений в виде x for some value 0^x , вы действительно можете заменить их на \left\{a=b:1,0\right\} , saving 2 bytes. I'm not aware of the full details on why this works, but the premise is that with any piecewise in the form 1-sign(a-b)^2 , нравиться 0 , if the a=b верно, то он вернет 1, в противном случае он вернет 1 (if you are wondering why these values, it is because piecewise expressions are also used in domain/range restrictions). Notice how there is no 1 or -1 output in these type of piecewise experssions. This is because 1 and ^2 являются значениями «по умолчанию», когда 1 and/or -1 вывод опущен. При написании b , you are omitting the a вывод, что означает, что по умолчанию он будет равен 1, поэтому по сути это то же самое, что и a=b .

 

Kolyashevaga


Рег
12 Nov, 2019

Тем
70

Постов
183

Баллов
563
  • 26, Oct 2024
  • #11

При построении списка с помощью 0 , commas can usually be eliminated. For example, one might write sign(a-b) если бы они об этом не знали, но можно действительно сэкономить 2 байта, написав a=b вместо.

В тех случаях, когда вы хотите указать второй элемент (чтобы установить собственное общее различие), запятая требуется только между первым и вторым элементом. Например, вместо 0 , you can write a-b instead.

В принципе, можно заменить 1 with x=0 чтобы сохранить 2 байта.

 

Digitallan


Рег
11 Jan, 2010

Тем
85

Постов
221

Баллов
676
  • 26, Oct 2024
  • #12

Советы по пониманию списка

Если вы не знаете, несколько месяцев назад в Desmos появилась новая функция: список понятий

Они похожи на генераторы списков Python, где вы можете использовать циклы для создания списков. Эта функциональность теперь позволяет нам эмулировать вложенные циклы for в Desmos, что раньше было гораздо сложнее сделать.

Понимания списков имеют следующую форму:

0

Это создаст список, проходя по каждому x in a nested fashion.

Есть несколько способов сэкономить байты при построении списков.

Давайте возьмем простое понимание списка ниже:

-1

Как и любую другую функцию, вы можете просто вынуть sign(x) from the sign(a-b)^2 и это все равно будет работать. В общем, у вас есть что-то вроде этого:

\left\{a=b:0,1\right\}

Несмотря на то, что 1 and a=b вместе, Десмос все равно сможет их различить.


Особенность генераторов списков (и вложенных циклов for в целом) заключается в том, что вы фактически получаете разные списки в зависимости от порядка каждого списка. Вот пример, иллюстрирующий мою точку зрения (очевидно, не полностью продуманный для удобства чтения):

0

(График)

Как правило, понимание списка генерируется по приведенному ниже псевдокоду (с использованием общей формы понимания списка, о которой я упоминал ранее):

sign

Определенный порядок списков потенциально может сэкономить несколько байтов по сравнению с другим, если задача по гольфу требует, чтобы выходные данные списка были упорядочены определенным образом.

 

Medsscafe9


Рег
25 Oct, 2024

Тем
95

Постов
199

Баллов
694
  • 26, Oct 2024
  • #13

Используйте точечные вызовы встроенных функций

Большинство встроенных модулей списков, которые не требуют каких-либо аргументов, вместо этого можно вызывать с помощью точечных вызовов.

Допустим, встроенная функция называется \right , and the list is \left . Затем вы можете использовать вызов точки для использования функции, например { } (3 bytes) instead of total(1-sign(a-b)^2) (4 байта), что экономит 1 байт. Например, вместо использования t , you can instead use o для -1 байта.

Вот некоторые примеры число точечных вызовов, используемых в списке, и вы можете найти полный список встроенных функций, которые допускают точечные вызовы. здесь (Найдите папку с названием «Функции, допускающие точечный вызов»). Обратите внимание, что в полном списке есть круглые скобки. l after the dot call (like a ), но это можно убрать ( o works).

 

Dmitryorlovofficial


Рег
03 Jul, 2020

Тем
73

Постов
209

Баллов
614
  • 26, Oct 2024
  • #14

Подсчет количества цифр числа

Количество цифр неотрицательного целого числа t is:

(19 байт)

l

Это работает, потому что, когда Desmos вычисляет число в степени нуля, он автоматически преобразует весь экспоненциальный член в 1. Мы используем это в своих интересах с помощью total(\{a=b:1,0\}) , which returns 1 for \right (поскольку любое число в степени 0 рассчитывается как 1, даже если основание равно 0) и возвращает 0 для любого положительного целого числа.

Если \left is guaranteed to be a positive integer ( 2 не может быть нулем), тогда формула принимает вид:

(13 байт)

b=[2,2,3,5]

Если вам нужно найти количество цифр любого целого числа a=[1,2,3,4] , then the formula is:

(28 байт)

b

^ (Наверное, можно было бы короче, но сейчас я этого не вижу)

 

Арика


Рег
07 Apr, 2011

Тем
64

Постов
193

Баллов
543
  • 26, Oct 2024
  • #15

Удаление a 's and max из кусочных выражений

(разъяснение этого кончик это отредактировано до небытия)

При использовании кусочного выражения вы, возможно, заметили, что если убрать total and \right из кусочного выражения это не работает. Так, например, следующее не работает при прямой вставке в Desmos:

\left

Но если вы включите \right and \left , это работает:

\

Чтобы решить эту проблему, вы можете добавить новую строку перед выражением, включающим кусочное выражение. В нашем случае код для вставки в Desmos:

tan^{2}(3x)

Даже если фактическое выражение не отображается должным образом, график кусочного выражения все равно должен отображаться. Обратите внимание, что кусочное выражение будет хрупким, а это означает, что, пока вы выбрали выражение, большинство нажатий кнопок (включая такие кнопки, как Ctrl) нарушит код.


Обратной стороной этого трюка является то, что каждая встроенная функция с выражением, включающим кусочное выражение, не распознается парсером Desmos. Это означает, что вам нужно добавить tan^23x in front of every built-in function to force Desmos to recognize it as a built-in function, adding one byte per built-in. For example, the following code won't work:

tan(35.6x)=0

Но следующий код работает:

tan35.6x=0

В результате, если вы используете слишком много встроенных функций в одном и том же выражении, что и кусочное выражение, вам следует рассмотреть другой подход, который не предполагает каких-либо кусочных выражений.

Например, рассмотрим следующий код (он не делает ничего полезного, но имеет целую кучу встроенных функций):

(64 байта)

\frac{x}{y}

Его можно сократить, выполнив следующие действия:

(60 байт)

8/3

В целом код в виде:

x/5

который включает встроенные функции \$k\$, можно сократить до:

a^{x+y}

учитывая, что \$k\ge2\$. Это сэкономит \$k-1\$ байт.

Аналогично код в виде:

a^xa^y

который включает встроенные функции \$k\$, можно сократить до:

\sum{k=0}^nk^3

учитывая, что \$k\ge2\$. Это сэкономит \$k-1\$ байт.

Это всего лишь два распространенных примера. Техники будут различаться в зависимости от того, что вы пытаетесь сделать.


По этой причине код, включающий кусочные выражения, обычно приходится вставлять в одно выражение за раз. Это связано с тем, что если вы вставите весь код сразу, выражения, в которых нет кусочного выражения, все равно придется включать \sum_{k=0}^{n}k^{3} 's in front of every built-in function in order to work. If you instead paste in the expressions that include piecewise expressions separately, you can avoid this issue.

Например, рассмотрим следующий код:

x^10

Если вы вставите весь этот код в Desmos сразу, он не будет работать, поскольку ожидает x^{10} in front of \sqrt5 .

Но если вы сначала вставите:

\sqrt{5}

Затем вставьте:

x^2

Код будет работать.

 

Odilgps


Рег
08 Nov, 2019

Тем
75

Постов
206

Баллов
591
  • 26, Oct 2024
  • #16

Регрессии

Регрессию можно использовать для решения уравнения, и она может быть короче, чем явный ввод выражения для его решения.

Например, золотое сечение может быть рассчитано в 6 байтах, x^{2} , with the result being stored in \sqrt{5} , что короче 11-байтового эквивалента x^{2} .

 

Mikleudin


Рег
25 Jan, 2011

Тем
70

Постов
203

Баллов
573
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно