LINUX.ORG.RU
ФорумTalks

[школьная задачка][математикам][тупняк]Папа у Васи силён в математике...

 


0

1

Либо торможу, либо условие «each different letter in this addition problem stands for a different digit» неправильное, и скопировано из других подобных задач, где действительно все цифры разные. А здесь - ну нукак не получается... (два часа уже потратили с женой, пора бы уже)


H E
S E T
T H E
--------------
T E S T

Решение где две буквы используются под одну цифру на даю, - чтобы не вносить биасов. Если интересно рассуждение - дам позже.
Но решение должно быть доступно 6-класснику, т.е. систем уравнений, матриц и других формализмов им не давали: всё основано на чистом рассуждении на пальцах, да чётные/нечётные, LCM, простые они хорошо уже знают)

линукс тут при том - что если постольку сидеть со школьными задачками - то и до линукса не доберёшся.

Ответ на: комментарий от Rakot

Сумма (сорри что не написал). Десятичная (6 классники знают только её).

Подскажу начало, которое похоже верно в любом случае.
Т и во 2й строке в регистре единиц и в результате (того же регистра) может быть только если прибвляется к десятке, т.е. Е=5. Далее я рассуждаю слева направо.


H 5
S 5 T
T H 5
--------------
T 5 S T

siberean
() автор топика
Ответ на: комментарий от hatefu1_dead

Спасибо! Это была моя ошибка: не рассматривал ноль в первом же рассуждении.

Далее у меня получалось (исходя из чётности и ограниченности каждой цифры 9ю) только: из соображений

  05
 650
 005
----
0660

siberean
() автор топика
Ответ на: комментарий от Rakot

> А что мешает E=0?

Спасибо! Ваш намёк тоже привёл к правильному результату.

siberean
() автор топика

интересно, а есть более красивое решение типа как-то хитро повернул и сразу стало все понятно без следования по шагам E=0/5, T=1 и т.п

bender ★★★★★
()
Ответ на: комментарий от bender

Наверное, в виде уравнения записать: 10H+E+100S+10E+T+100T+10H+E=10000T+1000E+10S+T Ну а дальше члены группировать и решать.

Rakot ★★
()
Ответ на: комментарий от siberean

> Десятичная (6 классники знают только её).

А что, записи десятичного числа уже используются ведущие нули, причем в одном числе - 1 ноль, в другом - два?

webhamster
()
Ответ на: комментарий от Deleted

Я же написал: группировать члены. Это позволяет свести одно уравнение к системе из уравнений и неравенств.

Rakot ★★
()

Если допустить, что разными символами можно кодировать одну цифру, то есть аж три решения:

00+000+000=0000 — :) побочное
90+801+190=1081 — самое правдоподобное
45+450+045=0540 — формально правильное

blexey ★★★★★
()

Набросал на коленке решалку-в-лоб (Erlang):

#!/usr/bin/env escript
%%! -smp enable -sname escript
-module(primer).

main(_) -> lists:map( fun(R) -> show(comb(R)) end, bruteforce(dict("0123456789"), []) ).

n(N,CharList) -> [lists:nth(N,CharList)].

comb(Quad) ->
    HE = list_to_integer(n(2,Quad) ++ n(1,Quad)),
   SET = list_to_integer(n(3,Quad) ++ n(1,Quad) ++ n(4,Quad)),
   THE = list_to_integer(n(4,Quad) ++ n(2,Quad) ++ n(1,Quad)),
  TEST = list_to_integer(n(4,Quad) ++ n(1,Quad) ++ n(3,Quad) ++ n(4,Quad)),
  {HE,SET,THE,TEST}.

test({HE,SET,THE,TEST}) -> HE + SET + THE =:= TEST.

show({HE,SET,THE,TEST}) -> io:format("~2.10.0B+~3.10.0B+~3.10.0B=~4.10.0B~n", [HE,SET,THE,TEST]).

dict(Chars) -> [[A,B,C,D] || A <- Chars, B <- Chars, C <- Chars, D <- Chars, A =/= B, B =/= C, C =/= D, D =/= A].

bruteforce([], R) -> R;
bruteforce([Try | More], R) ->
  case test(comb(Try)) of
    false -> bruteforce(More, R);
    true  -> bruteforce(More, R ++ [Try])
  end.

blexey ★★★★★
()
Ответ на: комментарий от bender

Наверное только рассуждением. Да оно не такое длинное.
(я из-за неправильного самого первого предположения сделал неправильные выводы, но рассуждение было аналогичным.
Пройдёмся по максимумам.
1) E=5 или E=0 (для последнего столбца). Даже в случае 5 перенос 1.
2) из второго столбца справа в левый столбец перенесётся максимум двойка (1+2*9+5=24, так как цифр больше 9 нет)
3) в самой левой колонке максимум 2+9+8=19, т.е. Т - либо 1 либо 0.
Остановимся на 1 (0 впереди запретим).
Итак, Т=1.
Но 15 никогда не получится из сложения максимально переносимой 2, единицы и S. Отбрасываем гипотезу е=5 (получилось, мы пошли самым дальним путём).
4) Итак, E=0. Т.е. ТЕ=10, которая получилась из переноса (не более двух)+1(Т)+S. Иначе: 9=S+х.
5) 2H+0=S+10 (второй столбец) => S-чётное.
6) тогда уже из 4: х - нечётное, т.е. двойка переностися на второй столбец не может, остаётся х=1. Откуда S=9-х=8.
7) H ничего не остаётся делать, как быть 9 (18/2)

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


Из правой колонки перенос максимум 1 (даже в случае е=5, который оказался неправильным). Т.е. максимум 1+2*9+5

siberean
() автор топика
Ответ на: комментарий от webhamster

> А что, записи десятичного числа уже используются ведущие нули, причем в одном числе - 1 ноль, в другом - два?

ведущие нули меня тоже напрягали, поэтому и не успокаивался. Почему-то перерешивал все ступени по многу раз, но первое предположение е=5 считал как аксиому. Потому и потерял столько времени.

siberean
() автор топика
Ответ на: комментарий от blexey

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

Мне приходила уже идея писать программу переборов - для другой задачки, которую мы так до конца и не решили, просидев более 2х часов. Хотя, учитель расценил это как 100%, т.е. 4% ошибки было допустимо (видимо другие написали хуже).

Задача такая.
Разложить все числа от 1 до 100 пользуясь цифрами в году 1492, используя 4 базовых операции, степень, кв.корень, скобки и факториал. Цифры можно использовать только по одному разу и каждая цифра обязана присутствовать.

Например для первых
1=1^492
2=1^49*2
3=1^49+2
4=1-4+9-2
5=1+sqrt(49)-2
...

100=(1+49)*2

Я не нашёл решения для 6,17,42,53

siberean
() автор топика

то что е=0 можно понять сразу же, т.к E + T + E = T
а отрицательных вроде как быть не может тут.
или я туплю?

Komintern ★★★★★
()
Ответ на: комментарий от siberean

> Я не нашёл решения для 6,17,42,53

(1+sqrt(4))!+9+2 = 17

oami ★★
()
Ответ на: комментарий от DNA_Seq

Короче, решил.

Если T=1 то E= 0 или 5

Итого получаем:

  H0
 S01
 1HE
-----
10S1

Если E =0 то 2H=xS где x= 1 или 0

S+1+x=10

Если S=8 то H=9

Итого:

  90
 801
 190
----
1081

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от DNA_Seq

Ну а если рассмотреть вариант где E=5 то получаем S= 13 или 14 а S не может быть больше 9

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от siberean

>наверняка заставят обяснить - как получил

А чего там объяснять? Исходник подбиралки вполне самодокументирован.

dict — строит словарь всех допустимых четырехсимвольных комбинаций из заданного набора символов, исключив из него варианты с одинаковыми символами (тут можно уточнять, может я не совсем точно понял условия задачи);
bruteforce — лопатит этот словарь, отбирая список комбинаций, удовлетворяющих условию задачи;
comb — строит из заданной четырехсимвольной комбинации набор проверяемых чисел;
test — проверяет вариант набора чисел;
show — показывает его;
n — выделяет из четырехсимвольной комбинации символ с нужным номером;
main — основная функция, выполняющаяся эрланговским escript.

Результат выполнения:
$ ./primer.sh.erl
90+801+190=1081

Если из dict выбросить ограничения A =/= B, B =/= C, C =/= D, D =/= A, допустив тем самым повторения символов в комбинациях, получим все возможные варианты символьных решений:
00+000+000=0000
90+801+190=1081
45+450+045=0540

blexey ★★★★★
()
Ответ на: комментарий от dimon555

а также ни одна цифра не может быть больше 9 что еще 4 неравенства

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от DNA_Seq

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

blexey ★★★★★
()
Ответ на: комментарий от mukoh

> А это что: 1+sqrt(49)-2 ?

действительно (видимо на тот момент у меня сломался перебиратель корней)

siberean
() автор топика
Ответ на: комментарий от Komintern

> то что е=0 можно понять сразу же, т.к E + T + E = T а отрицательных вроде как быть не может тут. или я туплю?

а е=5? (как самое первое предположение, пока не поняли что не может быть) выше уже обсуждалось

siberean
() автор топика
Ответ на: комментарий от blexey

убедили, зачёт (решение пойдёт для будущего - когда школьникам сразу после введения уравнений и переменных в 5-6 классе сразу же будут давать программирование на эрланге или подобном)

siberean
() автор топика
Ответ на: комментарий от oami

>читерский вариант: 14*sqrt(sqrt(9^2)) = 42

Тоже пойдёт, и вовсе не читерский. Никто не ограничивал на повторение операций

siberean
() автор топика
Ответ на: комментарий от blexey

>Деление и корень используются только в случае получения целых результатов? Или в любом случае

Только целые, как в примерах выше

siberean
() автор топика
Ответ на: комментарий от siberean

>почему? из каких соображений?

Потому что при сложении двух чисел от 0 до 9 результат может быть только от 0 до 19 (с учетом переноса 1 с младшего разряда).

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от siberean

Это где-то в 5м классе и объясняется при решении подобных задачек

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от DNA_Seq

На самом первом этапе рассуждений - ещё не очевидно - сколько там переносится из средней колонки, а сумма 3х чисел может дать и двойку во втором разряде: 9+8+7

siberean
() автор топика
Ответ на: комментарий от siberean

А для того - чтобы понять что двойка быть не может - нужны дополнительные рассуждения, т.е. надо создавать стек, писать варианты, что усложнит решение. Т.е. однозначно сказать одним высказыванием что «T однозначно единица» нельзя.

siberean
() автор топика

Я протащился - как их заставляют выучить квадраты всех чисел до 50ти (в наше время, даже в матшколе, давали, если мне склероз не изменяет, только до 20ти). И с квадратными корнями потом проблем не возникает.

А вчера узнал, что квадрат числа можно вычислить так:

42
убираем единицы до ближайшего круглого и добавляем столько же
->42-2=40
->42+2=44
перемножаем эти два числа (это всегда легче из-за нулика)
1760
прибавляем квадрат однозначного числа, которое вычли/прибавили
1760+2^2=1764.
Выстрее, чем возводить в квадрат оригинальное число.

Этот метод вроде придумал Артур Бенджамин: http://www.ted.com/talks/lang/rus/arthur_benjamin_does_mathemagic.html

Век живи век учись.

siberean
() автор топика
Ответ на: комментарий от siberean

Так это и не нужно. Если в ребусе слагаемые имеют разрядность n а сумма - n+1 то без особых оговорок первая цифра суммы - единица

ещё не очевидно - сколько там переносится из средней колонки

можно попробовать решить с T=2 но подобные задачи как раз и нужны для того чтоб научить обрезать заранее бесперспективные варианты при решении.

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от siberean

В общем если T=2 то S+2+перенос=2E а перенос не может быть больше 3, то есть S получается двузначным

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от siberean

Ничего в этом плохого не вижу, если у школьников будет такое желание. Это ничем не хуже углубленного изучения физики/математики в спецклассах.

blexey ★★★★★
()
Ответ на: комментарий от blexey

Брут форс, только на gforth

Для удобства определил наши переменные:

VARIABLE H

VARIABLE T

VARIABLE E

VARIABLE S

И два слова для наглядности:

: ПРОВЕРКА_ПРИМЕРА H ! T ! E ! S ! S @ E @ T @ H @ DUP 20 * E @ 88 * - S @ 90 * + T @ 900 * - ;

: ПЕРЕБОР 9 BEGIN 9 BEGIN 9 BEGIN 9 BEGIN ПРОВЕРКА_ПРИМЕРА 0 = IF CR .S THEN 1- DUP -1 = UNTIL DROP 1- DUP -1 = UNTIL DROP 1- DUP -1 = UNTIL DROP 1- DUP -1 = UNTIL DROP ;

Вводим ТЕСТ, жмем enter:

<4> 8 0 1 9

<4> 4 5 0 4

<4> 0 0 0 0 ok

Компактненько, скомпилировано на лету, на все затрачено минуты 3, включая упрощение выражения;)

glibych ★★
()
Ответ на: комментарий от glibych

Да, интересно. Довольно коротко. А как бы этот код выглядел в более читабельном, многострочном виде?

blexey ★★★★★
()
Ответ на: комментарий от blexey

Если определить слова русскими синонимами (например так: ": запомнить ! ;" и т.д.), то получим следующий код:

: ПРОВЕРКА_ПРИМЕРА
H запомнить
T запомнить
E запомнить
S запомнить
S считать
E считать
T считать
H считать
дублировать 20 * E считать 88 * - S считать 90 * + T считать 900 * - ;

: ПЕРЕБОР
9 ЦИКЛ
    9 ЦИКЛ
        9 ЦИКЛ
            9 ЦИКЛ
                ПРОВЕРКА_ПРИМЕРА
                0 = ТОГДА вывод_с_новой_строки печать_стека ИНАЧЕ
                1- дублировать
            -1 = КОНЕЦ_ЦИКЛА?
            удалить 1- дублировать
        -1 = КОНЕЦ_ЦИКЛА?
        удалить 1- дублировать
    -1 = КОНЕЦ_ЦИКЛА?
    удалить 1- дублировать
-1 = КОНЕЦ_ЦИКЛА?
удалить ;

Без переопределения слов на русский это будет выглядеть так:

: ПРОВЕРКА_ПРИМЕРА
H !
T !
E !
S !
S @
E @
T @
H @
DUP 20 * E @ 88 * - S @ 90 * + T @ 900 * - ;

: ПЕРЕБОР
9 BEGIN
    9 BEGIN
        9 BEGIN
            9 BEGIN
                ПРОВЕРКА_ПРИМЕРА
                0 = IF CR .S THEN
                1- DUP
            -1 = UNTIL
            DROP 1- DUP
        -1 = UNTIL
        DROP 1- DUP
    -1 = UNTIL
    DROP 1- DUP
-1 = UNTIL
DROP ;

P.S. В примере для организации циклов и вычислений используется стек. Как известно в форте принята на вооружение очень лаконичная обратная польская запись операций, когда сначала вводится то, над чем производятся действия, а затем указывается само действие. К примеру функцию (1+ SIN 30)*2 на форте можно записать так 1 30 SIN + 2 * или так 2 1 30 SIN + *

glibych ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.