
shadowjack
02.04.2017
15:24:46
Совершенно нет. Какая разница, будешь ты на стеке или в аккумуляторе собирать результат?

Александр
02.04.2017
15:25:26
просто будет в теле функции не перемешано всё
в конце всегда ответ
в середине итерируемое значение

Google

Александр
02.04.2017
15:25:57
сначала - магическое значение n

shadowjack
02.04.2017
15:27:35
Задача такая: в банкомате есть купюры $100, 50 и 20. withdraw(n) должна вернуть спискок из трех элементов [n100, n50, n20] где nXX - количество купюр, которыми можно разменять n. Суммарное количество купюр должно быть минимально из всех вариантов.
Можешь попробовать сделать свой вариант. Задачка с codewars.

Александр
02.04.2017
15:29:27
а nil?
если нельзя разменять?

shadowjack
02.04.2017
15:29:53
nil я возвращаю если разменять нельзя но по условиям задачи этого не требудется.

Александр
02.04.2017
15:34:43
def withdraw(amount, {n100, n50, n20}) when amount >= 100, do: withdraw(amount - 100, { n100 + 1, n50, n20 })
def withdraw(amount, {n100, n50, n20}) when amount >= 50, do: withdraw(amount - 50, { n100, n50 + 1, n20 })
def withdraw(amount, {n100, n50, n20}) when amount >= 20, do: withdraw(amount - 20, { n100, n50, n20 + 1})
def withdraw(amount, _) when amount > 0, do: nil
def withdraw(_, res), do: res

Dmitry
02.04.2017
15:34:45
Я бы сделал кейворд лист
00 = [0, 0], 10 = [1,3], 20 = [0, 1] и так до 90
А потом бы просто приписал вначале количество сотен

Александр
02.04.2017
15:34:50
не проверял пока
неправильно считает у меня =)
130 не выдаст

shadowjack
02.04.2017
15:42:48
def withdraw(amount, {n100, n50, n20}) when amount >= 100, do: withdraw(amount - 100, { n100 + 1, n50, n20 })
def withdraw(amount, {n100, n50, n20}) when amount >= 50, do: withdraw(amount - 50, { n100, n50 + 1, n20 })
def withdraw(amount, {n100, n50, n20}) when amount >= 20, do: withdraw(amount - 20, { n100, n50, n20 + 1})
def withdraw(amount, _) when amount > 0, do: nil
def withdraw(_, res), do: res
не правильно работает. Контрпример: 230
Ну и уменя она написана в общем виде - для любого набора купюр (с некоторыми ограничениями) считает.

Google

shadowjack
02.04.2017
15:46:18

Александр
02.04.2017
15:50:20
defmodule Test do
def withdraw(amount, {n100, n50, n20}) when amount > 0 and rem(amount, 100) == 0, do: withdraw(amount - 100, { n100 + 1, n50, n20 })
def withdraw(amount, {n100, n50, n20}) when amount > 0 and rem(amount, 20) == 0, do: withdraw(amount - 20, { n100, n50, n20 + 1})
def withdraw(amount, {n100, n50, n20}) when amount >= 50, do: withdraw(amount - 50, { n100, n50 + 1, n20 })
def withdraw(amount, _) when amount > 0, do: nil
def withdraw(_, res), do: res
end
iex(4)> Test.withdraw(130, {0,0,0})
{0, 1, 4}
iex(5)> Test.withdraw(230, {0,0,0})
{1, 1, 4}
тесты на codewars прошёл
с ума сойти там одно из решений с документацией =)

shadowjack
02.04.2017
15:56:52
Да, такие решения есть. Но мне моё все равно больше нравится.

Александр
02.04.2017
15:57:23
ты там под таким же ником?

shadowjack
02.04.2017
15:59:38
https://www.codewars.com/users/dmitryplatonov
Я там все задачки на 4 и 5 кю решил и стал дорешивать на 6-й (более легкие).

Александр
02.04.2017
16:02:01
зафоловвил тебя и клан добавил

Aldar
02.04.2017
16:03:20
тэкс алина еще не приходила)

shadowjack
02.04.2017
16:07:50

Александр
02.04.2017
16:08:06
да давно зареган просто

Aldar
02.04.2017
16:09:22
https://www.codewars.com/users/hardliner
добавьте в клан

Александр
02.04.2017
16:09:48
там ты сам у себя в профиле пишешь
pro.elixir напиши
и всех увидишь

shadowjack
02.04.2017
17:09:10
Ого у нас там уже банда - 7 человек.
Сегодня сделал первый заказ на upwork.

Google

shadowjack
02.04.2017
17:14:03
Кстати занял 3-е место в тесте на unix 8) походу одна ошибка из 40. Думал, что все правильно ответил.
По питону в 20%, по сетям в 10%.
В смысле в топ 20% и топ 10% соответственно.

Alex
02.04.2017
17:31:07
топ10, как правило, достигается изучением вопросов (с ответами), которые щедро разбросаны на просторах интернетов
мне кажется нет смысла сдавать там больше 3-4 тестов

shadowjack
02.04.2017
17:44:20
Не, настроить инстанс на Digital Ocean, и чуть поправить простой сайт (сделать валидацию мыла в форме обратной связи и чтоб оно мыло реально осылало).
Мне без сделанных работ никто не эликсире не даст работу.

عاصم بن حارث
02.04.2017
17:45:41

Alexey
02.04.2017
17:45:58
замкнутый круг

عاصم بن حارث
02.04.2017
17:46:49
?

Dmitry
02.04.2017
17:55:00
defmodule Test do
@cache %{
0 => [0,0,0],
20 => [0,0,1],
40 => [0,0,2],
60 => [0,0,3],
80 => [0,0,4],
50 => [0,1,0],
70 => [0,1,1],
90 => [0,1,2],
10 => [1,1,3],
30 => [1,1,4],
}
def withdraw(10), do: nil
def withdraw(30), do: nil
def withdraw(number) when rem(number, 10) != 0, do: nil
def withdraw(number) do
index = rem(number, 100)
[h|t] = @cache[index]
[div(number-h*100,100)]++t
end
end

عاصم بن حارث
02.04.2017
17:56:35
defmodule Test do
@cache %{
0 => [0,0,0],
20 => [0,0,1],
40 => [0,0,2],
60 => [0,0,3],
80 => [0,0,4],
50 => [0,1,0],
70 => [0,1,1],
90 => [0,1,2],
10 => [1,1,3],
30 => [1,1,4],
}
def withdraw(10), do: nil
def withdraw(30), do: nil
def withdraw(number) when rem(number, 10) != 0, do: nil
def withdraw(number) do
index = rem(number, 100)
[h|t] = @cache[index]
[div(number-h*100,100)]++t
end
end
однако! ?


shadowjack
02.04.2017
18:06:40
Ну раз пошла такая пьянка
defmodule ATM do
@bills [100, 50, 20]
# Insructions say that you can assume that it's always possible to exchange
# n with 100, 50 and 20 bills. This is (currently) not the case,
# and random tests will generate invalid test cases with wrong checks.
# So here is workaround
def withdraw(10), do: [0, 0, 0]
def withdraw(30), do: [0, 0, 1]
# Let's make it general so it will work with any bills
def withdraw(n) do
withdraw(n, @bills)
end
defp withdraw(0, []), do: []
defp withdraw(_, []), do: nil
defp withdraw(n, [hd | tl]) do
w = withdraw(rem(n, hd), tl)
cond do
is_list(w) -> [div(n, hd) | w]
# backtrack if above fails
n >= hd && (w1 = withdraw(rem(n, hd) + hd, tl)) -> [div(n, hd) - 1 | w1]
# backtrack failed too
true -> nil
end
end
end
можно еще упростить немного. is_list(w) -> заменть на w ->

عاصم بن حارث
02.04.2017
18:12:43
вариант 1 нагляднее, не?

shadowjack
02.04.2017
18:14:52
вариант 1 это какой?

عاصم بن حارث
02.04.2017
18:17:31

Александр
02.04.2017
18:19:47
@cache - не очень название, это же не кэш (сама идея с предварительным вычислением - хорошая)

Google

Александр
02.04.2017
18:20:18
и надо было отсортировать значения

shadowjack
02.04.2017
18:21:26
Ну хз. Нагляднее наверное да. Только тестами как покрывать? Вернее как удостовериться что все случаи проверены?

عاصم بن حارث
02.04.2017
18:22:09

Александр
02.04.2017
18:23:15

عاصم بن حارث
02.04.2017
18:23:37

shadowjack
02.04.2017
18:25:52
Ну не знаю, много ручных констант -> вероятность ошибки.
Как по мне.
Плюс не понятно как генерализовать на общий случай.

عاصم بن حارث
02.04.2017
18:29:03
Ну не знаю, много ручных констант -> вероятность ошибки.
бывает. но, например, в задачах, которые мне иногда приходится решать, много тригонометрии ))) крайне редко приходится их вычислять, крайне реееедко! все задается в виде массива предвычисленных значений... ни каких вычислительных циклов )))
обычно, квант в 1 градус... как следствие имеем массив [0..360] зачений ))) индекс - это градусы, а значение - это рез-тат ф-ции в градусе = индексу ))))

Admin
ERROR: S client not available

shadowjack
02.04.2017
18:33:12
Premature optimization is the root of all evil (c) Donald Knuth

Alexey
02.04.2017
18:35:03
ты ембеддер чтоли

عاصم بن حارث
02.04.2017
18:35:14

shadowjack
02.04.2017
18:35:35
Ой, это не Кнут а Хоар сказал, а Кнут процитировал.

عاصم بن حارث
02.04.2017
18:42:27

shadowjack
02.04.2017
18:42:57
Где глупость-то?

عاصم بن حارث
02.04.2017
18:44:01
Где глупость-то?
Premature optimization is the root of all evil (c) Donald Knuth
вот это, глупость. (имхо, конечно)

shadowjack
02.04.2017
18:45:25
Я не буду комментировать

عاصم بن حارث
02.04.2017
18:46:55

Google

Александр
02.04.2017
18:48:31
что будет если в реальной задаче добавиться ещё одна монета?
эту предварительную табличку придётся пересчитать
плюс поменять алгоритм

عاصم بن حارث
02.04.2017
18:49:27

Александр
02.04.2017
18:49:38
то есть некоторая дополнительная сложность есть
вот я пиарил тут на днях icfpc
там как раз такие задачи любят давать
ааа я не тут пиарил =)

عاصم بن حارث
02.04.2017
18:51:41
что будет если в реальной задаче добавиться ещё одна монета?
если применительно к данной конкретной задаче, то да!
в моем случае НЕТ, это как в байке:
Рисуются два круга, одни маленький, а другой большой. В каком круге БОЛЬШЕ градусов? -конечно в большом )))
[0..360] и заданный квант отсчета - ничего не надо перерасчитывать )))

Александр
02.04.2017
18:52:12
в общем https://docs.google.com/document/d/1eYVXS7UlLEp9JX13g_vF6yxQ3vm9-p1Q7xqD1-ymmMY/edit?usp=sharing
тут я немного информации собрал о предыдущих соревнованиях, предлагаю ознакомится (предлагаю начать с ЖЖ adept) и кому интересно начать усиленно готовится

shadowjack
02.04.2017
18:52:51
Ну соревнования это такое... Не знаю, не моё мне кажется.

Александр
02.04.2017
18:53:10
там не спортивное программирование
там длиться 3 суток мероприятие
дают сложную задачу
и в последующие дни могут её изменить

عاصم بن حارث
02.04.2017
18:53:55
Сореванование - забава для самолюбия и завышенных амбиций.

Александр
02.04.2017
18:54:01
потому говнокод одноразовый как на codeforces не получится писать
суть существования жизни на земле - борьба

عاصم بن حارث
02.04.2017
18:55:35
ну ещё и проверка своих знаний и умений + сравнение с другими
Если утрировать, то: если не сравнил с другими, то и писать не следует ))) А знания и умения надо УМЕТЬ применить, а не бахвалиться ими... Знаю супер-пупер теоретиков, но как кодеры г-но на палке. Знаю, так же, молчунов не "соревновашек", пишут так, что по-доброму завидно. (кажется не удачная аналогия)

Александр
02.04.2017
18:55:58
нет, откуда такой вывод?

shadowjack
02.04.2017
18:55:58
Ну кто-то может на это три дня убить. А кто-то нет. Что мы сравним, количество свободного времени?