Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 0. fizzbuzz
- easy
- 1. на вход подаётся center_x, center_y, radius, x, y
- определить принадлежит ли точка кругу (граница тоже круг)
- 2. дальше там задания всякие легкие например проверить принадлежность точки кругу.
- возможно ли провести через данные три точки окружность (а хотя лол это не очень легко. придётся загуглить как вообще проводить через три точки прямую) а потом загуглить уравнение прямой.
- 3. дана функция y = k*x^2.
- На вход функции подаётся y, x. На выходе ожидается в точке x. Описать функцию (как угодно) заодно сказать что неверно в задаче.
- medium
- 4. экзотический язык
- (язык операций над списками (найти палиндром))
- (befunge всякие двумерные языки)
- 5. стековый язык
- большинство высокоуровневых языков на самом деле не выполняют команды напрямую, а преобразуются в машинные языки. и так исторически сложилось, что машинные языки являются стековыми. Хотя раньше предлагались и другие идеи, но проще жить со стеком. Предлагается написать программу на таком облегченном (на самом деле несуществующем) языке. Итак в нашем языке присутствует ввод числа или буквы (не важно) и его вывод на экран. Все операции производятся с вершиной стека. При вводе указатель на вершину стека сдвигается на одну позицию вверх число записывается в эту позицию. При выводе наоборот указатель сдвигается вниз.
- Операторы языка (далее одинарные кавычки будут указывать названия или величины которые вы сами указываете):
- ; - комментарий
- read - прочитать один символ.
- write - вывести символ с вершины стека.
- push x - кладёт число х на вершину стека
- push 'x' - кладёт символ х на вершину стека (где х - цифра или буква, но не строка, например можно написать push '1' но не push '11')
- pop - удаляет что-либо с вершины стека
- dup - копирует вершину стека. дублирует получается.
- 'метка': - метка для перехода. то есть последовательность символов без пробела до двоеточия, будут доступны в любом месте программы для перехода, как комманда метка пропускается.
- Изначально доступна одна метка end для перехода в конец программы (т.е. завершения)
- GoTo 'метка' - безусловный переход на указанную метку
- ifNullGoTo 'метка' - переходит на указанную метку если на вершине стека 0
- ifNotNullGoTo 'метка'
- ifEqualGoTo 'метка' - переход если последние два элемента на вершине стека равны
- + складывает 2 значения на вершине стека. сами величины удаляются и на вершину стека кладётся результат сложения
- -, *, / - другие арифместические операторы.
- разве что стоит пояснить про целочисленое деление: 43 / 10 = 4; 4 / 10 = 0
- Если операция запрашивает больше элементов, чем их есть в стеке (например программа начинается с write или в стеке одно число а мы пытаемся сложить) то на вершину стека будет помещен 0.
- Пример ввода\вывода: Пользователь вводит слово "qwer" в консоль.
- программа (у нас нет простого цикла):
- read ; стек: q
- read ; стек: qw
- read ; стек: qwe
- read ; стек: qwer
- write ; стек: qwe
- write ; стек: qw
- write ; стек: q
- write ; стек:
- вывод: rewq
- чтобы вывести в прямой последовательности:
- read ; стек q
- write ; стек
- read ; стек w
- write ; стек
- read ; стек e
- write ; стек
- read ; стек r
- write ; стек
- вывод: qwer
- Очевидно, что программа заранее знает сколько символов будет введено. В реальности нам редко предстаёт такая возможность. Будем считать, что строки вводимые пользователем нуль-детерменированные как в языке C. То есть последний символ 0.
- Пример расчета факториала: пользователь вводит число.
- Программа:
- ;для начала символ с консоли в число
- ;когда пользователь вводит символ '0' мы получаем число 30 (см. http://ru.wikipedia.org/wiki/ASCII)
- ;'1' = 31 и т.д. поэтому вычитаем из числа '0'.
- push 0 ; число в начале стека к которому будем прибавлять цифры из ввода
- read
- ifNullGoTo end ; если сразу конец строки то тут что-то не так и завершаем программу.
- readNumber:
- push '0' ;отнимем '0' получим число
- -
- + ;складываем накопленное число с последней цифрой
- push 10 ;умножим на 10 чтобы прибавить следющую цифру
- *
- read
- ifNullGoTo endOfReadNumber ;tесли 0 то конец ввода и идём дальше
- GoTO readNumber ;иначе в начало цикла
- endOfReadNumber:
- push 10 ; у насв стеке хранится число лишний раз умноженное на 10
- / ; поэтому поделим на 10 и у нас то что нужно
- ; наконец у нас на вершине стека введеное число
- ;по определению факториала 0! = 1. n! = n*(n-1)! так что отдельно обработаем 0
- ifNotNullGoTo getMultipliers
- pop
- push 1
- getMultipliers: ;получаем множетели для факториала
- dup ; берем n c вершины
- push 1 ; записываем
- - ; n - 1
- ifNotNullGoTo getMultipliers ;и так до тех пор пока не остаётся 0
- pop ; убираем 0 - он нам не пригодится
- multiplicate:
- *
- ifNotNullGoTo multiplicate ;перемножаем до тех пор пока есть что перемножать
- pop ; снова убираем 0
- ; и вот у нас на вершине стека факториал. теперь самое сложное вывести его на экран.
- ; попытаюсь объяснить идею на примере
- ; у нас есть число 1234 запишем в стек (1234, 123, 123, 12, 12, 1, 1)
- ; то есть продублируем поделим на 10 и ещё аз продублируем и так до конца
- ; потом вершину выведем на экран следющее число умножим на 10. вычтем и выведем на экран
- ; получаем "1" потом 12 - 1*10 = 2 и т.д. "1234"
- getNumberTop:
- dup
- push 10
- /
- dup
- ifNotNullGoTo getNumberTop
- pop
- pop ; убираем 2 нуля
- print:
- push '0'
- +
- write
- push 10
- *
- ifNullGoTo end
- -
- GoTo print
- Вот такими несложными манипуляциями получаем факториал. К счастью вам не придется работать с числами.
- Вам предлагается задание вывести введеную пользователем строку без повторяющихся символов.
- пример ввода: hello world
- пример вывода: helo world
- Главное описать что вы собираетесь делать. Код второстепенен - все равно нет ни одного компилятора этого языка.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement