В своих расчетах Мэпл использует числа как аргументы, то есть оперирует только числами, а знаки математических действий являются неизменяемым условием его программы. Существует ли оператор, который превращает знаки действий в аргументы?
Короче говоря, можно ли с помощью Мэпла решать задачи такого, например, вида: Даны пять троек (3,3,3,3,3). Расставить знаки действий между тройками так, чтобы результатом было число 1000.
Знаки действий: + - * / ^ sqrt !
Как оперировать знаками действий?
Модератор: Admin
-
- Сообщения: 1366
- Зарегистрирован: Вс дек 04, 2011 11:07 pm
Re: Как оперировать знаками действий?
Как со скобками? Допустимо ли, например, выражение sqrt(3+3) ?berg писал(а):В своих расчетах Мэпл использует числа как аргументы, то есть оперирует только числами, а знаки математических действий являются неизменяемым условием его программы. Существует ли оператор, который превращает знаки действий в аргументы?
Короче говоря, можно ли с помощью Мэпла решать задачи такого, например, вида: Даны пять троек (3,3,3,3,3). Расставить знаки действий между тройками так, чтобы результатом было число 1000.
Знаки действий: + - * / ^ sqrt !
-
- Сообщения: 1366
- Зарегистрирован: Вс дек 04, 2011 11:07 pm
Принципиально
Принципиально. Пожалуйста, покажите возможную композицию.berg писал(а):Допустимо и со скобками и без них.
Это не принципиально.
Скажем, это подходит(3+3)*3^(3^3) ? А это -
(3+3)*(3^3)^3 ?
Из-за отсутствия времени привожу набросок одной идеи, решающей вашу задачу. Правда, для получения нужного результата можно ждать очень долго, хотя идея работает, если решение существует, ибо не всегда такого типа задачи имеют решение. Данная процедура допускает различные интересные модификации и обобщения. Успеха.
> P := proc(x, y, z, t, h, Res) local a,b,c,n,k;
a:=["+","-","*","^","/"]; n:=rand(1..4);
for k to 10^6 do b := cat(convert(x, string), convert(a[n()], string), convert(y, string), convert(a[n()], string), convert(z, string), convert(a[n()], string), convert(t, string), convert(a[n()], string), convert(h, string));
try c:= parse(b) catch :next end try; print(c);
if c = Res then return b end if end do end proc:
> P(3, 3, 3, 3, 3, 1000);
-240
2187
246
87
240
====
> P := proc(x, y, z, t, h, Res) local a,b,c,n,k;
a:=["+","-","*","^","/"]; n:=rand(1..4);
for k to 10^6 do b := cat(convert(x, string), convert(a[n()], string), convert(y, string), convert(a[n()], string), convert(z, string), convert(a[n()], string), convert(t, string), convert(a[n()], string), convert(h, string));
try c:= parse(b) catch :next end try; print(c);
if c = Res then return b end if end do end proc:
> P(3, 3, 3, 3, 3, 1000);
-240
2187
246
87
240
====
Для вашего случая можно даже проще;
> P := proc(x, y, z, t, h, Res) local a, b, c, n, k;
a := ["+", "-", "*", "^", "/"]; n := rand(1..4);
for k to 10^6 do b := cat(convert(x, string), a[n()], convert(y, string), a[n()], convert(z, string), a[n()], convert(t, string), a[n()], convert(h, string));
try c := parse(b) catch : next end try;
if c = Res then return b end if end do end proc:
> P(3,3,3,3,3,240);
"3*3^3*3-3"
> P := proc(x, y, z, t, h, Res) local a, b, c, n, k;
a := ["+", "-", "*", "^", "/"]; n := rand(1..4);
for k to 10^6 do b := cat(convert(x, string), a[n()], convert(y, string), a[n()], convert(z, string), a[n()], convert(t, string), a[n()], convert(h, string));
try c := parse(b) catch : next end try;
if c = Res then return b end if end do end proc:
> P(3,3,3,3,3,240);
"3*3^3*3-3"
Ув. Berg! Сергей46 предложил интересную идею, реализованную процедурно. Со своей стороны можно обратить внимание на подобного рода процедуру Choice Аладьева для Mathematica, с которой познакомился на его мастер-классе в 2008. Вот ее краткое описание.
Процедура Choice предназначена для вычисления кортежей целых чисел, разделенных знаками арифметических операций, с помощью которых можно получать требуемое целое число. Вызов Choice[R, n1, n2, n3, …, nj] возвращает строку формата S = "m1 O[1] m2 O[2] … mj O[j]" такую, что ToExpression[S] ≡ R, где mk – целое из кортежа {n1, n2, n3, …, nj} и O[k] – арифметическая операция из {"+", "–", "*", "/", "^"}; k=1..j.
Учитывая ваш интерес к подобным вопросам, решил вас проинформировать.
Процедура Choice предназначена для вычисления кортежей целых чисел, разделенных знаками арифметических операций, с помощью которых можно получать требуемое целое число. Вызов Choice[R, n1, n2, n3, …, nj] возвращает строку формата S = "m1 O[1] m2 O[2] … mj O[j]" такую, что ToExpression[S] ≡ R, где mk – целое из кортежа {n1, n2, n3, …, nj} и O[k] – арифметическая операция из {"+", "–", "*", "/", "^"}; k=1..j.
Учитывая ваш интерес к подобным вопросам, решил вас проинформировать.
Прошу прощения, переписывая текст из конспекта, автоматически или по инерции сделал ошибку. Должно быть так:
Процедура Choice предназначена для вычисления кортежей целых чисел, разделенных знаками арифметических операций, с помощью которых можно получать требуемое целое число. Вызов Choice[R, n1, n2, n3, …, nj] возвращает строку формата S = "m1 O[1] m2 O[2] … mj" такую, что ToExpression[S] ≡ R, где mk – целое из кортежа {n1, n2, n3, …, nj} и O[k] – арифметическая операция из {"+", "–", "*", "/", "^"}; k=1..j.
Процедура Choice предназначена для вычисления кортежей целых чисел, разделенных знаками арифметических операций, с помощью которых можно получать требуемое целое число. Вызов Choice[R, n1, n2, n3, …, nj] возвращает строку формата S = "m1 O[1] m2 O[2] … mj" такую, что ToExpression[S] ≡ R, где mk – целое из кортежа {n1, n2, n3, …, nj} и O[k] – арифметическая операция из {"+", "–", "*", "/", "^"}; k=1..j.
In[2030]:= Choice[125, 1, 2, 3, 4, 5]
Out[2030]= "1^2^4*5^3"
Правда, в большинстве случаев требуется немало времени, при отсутствии решения имеем бесконечный цикл. Процедура Choice давалась для иллюстрации программной обработки особых ситуаций (раздел курса "Программная обработка особых и ошибочных ситуаций").
Out[2030]= "1^2^4*5^3"
Правда, в большинстве случаев требуется немало времени, при отсутствии решения имеем бесконечный цикл. Процедура Choice давалась для иллюстрации программной обработки особых ситуаций (раздел курса "Программная обработка особых и ошибочных ситуаций").