Pull to refresh
24
0
Send message
Понимаю тех, кто минусует — жуткое решение.

Стоило включить мозг на 5 минут, отвлекшись от того, что хотел решить быстрее (кстати о стрессе на собеседовании), и тут же стало ясно как решить правильнее.

для пояснения пишу с комментариями:

w =: 0 5 3 5 1 2     NB. исходные данные
s =: >./\ - [        NB. функция для подсчёта "дыр" слева-направо.
+/ (f w) <. f&.|. w

NB. >. - это поиск максимума.
NB. / - это between, т.е. вставка максимума между всеми элементами списка - т.е. по сути поиск глобального максимума.
NB. но если мы пишем /\ - то это between, но с сохранением промежуточных результатов, т.е. бегущий максимум.    >./ w это 5, а >./\ w  это 0 5 5 5 5 5 . всё отлично, но только данный подход считает так, как будто стены нет слева, а вот справа есть. для этого ниже делается реверс.

NB. &. - это применение одной функции, потом глагола, потом инверсной.
NB. |. - revers списка.
NB. т.е. f&.|. w - это будет: развернуть список, потом применить к нему f, а потом ещё раз развернуть. т.е. в данном случае, чтобы подсчитать впадины справа налево.
NB. в итоге: считаем дырки слева направо, потом справа-налево и берём меньшие значение для каждой дырки.



Решение на J

Не судите строго — основной текст и заморочка — это обрезание краёв. Пойду спрошу у гуру как это сделать.

      f =: 3 : '>. /> +/ each (<@((-.@((i.@{.@I. , (({:@I.) + i.@(# - {:@I.))) (4 : ''1 x } y'') ]))@(1&>) # ]))("1) (-/~) y'
      f 2 5 1 2 3 4 7 7 6
10
      f 2 5 1 3 1 2 1 7 7 6
17


Интересно было бы узнать у автора — а чем twitter лучше чем амазон? Дилетанский взгляд конечно: но в амазоне какие-то новые технологии делают, a что делают в твиттере — я не известно.
Не так уж и много, так как в большинстве случаев программа или функция на APL была однострочной.
С другой стороны предтавьте сколько бумаги бы ушло на отладку на BASIC.

А с третьей стороны, бумага тут используется просто чтобы не снимать ЭЛТ монитор, так что не всё так страшно.
Ещё очень хочется запостить видео о программировании на APL в 1975м году, но, как я понял, тут посты с видео не особо привествуются.
Была выбрана опция «безлимит внутри сети+», тариф не помню. С помощью этой утилиты выбирал не столько себе, сколько жене и остальным родственникам, так как у них звонки более разнообразны: там разные варианты получились.
Перепешите, пожалуйста и давайте сравним. На моё решение я потратил минут 30, из них минут 10 заглядывал в мануал, так как это по сути вторая программа написанная мной на Q, но, если вы говорите, что сподручнее — то вы потратите на решение значительно меньше времени.
Согласен, я бы тоже не понял, например разворачивание оракла, для решения подобной задачи. Именно из-за этого и решил написать пост.
Зато не страшно и легко писать подобные бессмысленные комментарии.
В дополнение к ссылкам крайне рекомендую J Reference Card for 6.02
www.jsoftware.com/jwiki/HenryRich?action=AttachFile&do=view&target=J602_RefCard_color_letter_current.pdf

Без такой таблицы поиск нужных глаголов, в процессе изучения, может очень растянуться.
Вместо
    ({~ /:) (? (5 $ 0))
0.221507 0.293786 0.691701 0.72826 0.839186

можно использовать более компатную запись используя диадный /:
   (/:~) (? (5 $ 0))
0.20044 0.467931 0.855224 0.872516 0.904106


12 ...
19

Information

Rating
3,984-th
Registered
Activity