UniLecs #133_1. Pac-Man
UniLecsЗадача: смоделируем нашу версию игры Pac-Man. Pac-Man играет на прямоугольном поле N*M, где двигается слева направо, потом спускается на след.строку и идет справа налево, и так до самого конца. За каждый свой ход он съедает по одной точке. Необходимо определить, сколько точек сьел Pac-Man в точке (x, y) игрового поля (включая саму точку), где x - строка, а y - столбец.
Входные данные: N, M - размеры игрового поля от 1 до 10^6. (X, Y) - координаты искомой точки на поле.
Вывод: кол-во съеденных точек в точке (X, Y)
Пример: N = M = 3, (X, Y) = (2,1)
* * *
* * *
* * *
Answer: 6
Реализация:
- @jinxonik, C++: 1.3 балла (0.3 балла за анимацию)
Похоже Евгений потратил больше времени на анимацию, чем на само решение :)
https://gist.github.com/jin-x/8b1a7033734191f75cc694ecaf3f368b
Test:
https://www.onlinegdb.com/SJ706PwoQ
https://repl.it/@jin_x/UniLecs-133-pacmancpp
2. @mrmeison, JS: 1 балл
3. @abdujabbor1987, Python: 1 балл
4. @FutorioFranklin, Python: 1 балл
Сначала найдём кол-во звёздочек, которые будут съедены в любом случае, они будут находиться на строках от 1 до x (нумерацияначинается с 1) и до x не включая и на столбцах m. Их количество будет равно m*(x-1). Далее учитываем в какую сторону будет двигаться пакмен в зависимости от чётности x, если x - чётное, то движение идёт справа налево, количество звёзд будет m-y+1, если нечётное, то y. Суммируем оба выражения и упрощаем.
5. @TEXHIK, Julia: 1 балл
6. @pakrulin, JS: 1 балл
https://jsbin.com/pajiyupoye/edit?js,console
7. Andrew Bystrov, Java: 1 балл
Сначала найдем количество строчек, которые полностью съел pac man. Теперь посмотрим на строчку row, и определим, в какую сторону двигался pac man в этой стороне. Это надо для того, чтобы знать, сколько точек съел pack man в последней строчке.
https://gist.github.com/AndrewBystrov/a1c3348f82b8f7beecde0de10cb4ee12
8. @akolosov364, JS: 1 балл
Можно смело умножать количество строк на искомый столбец - 1. Так как они гарантированно будут пройдены. Остается добавить последнюю строку. Если поселдняя строка будет нечетной то маршрут будет с право на лево, иначе - слева на право.
https://gist.github.com/KolosovAO/ed32fa8c2c66bf54e4c4df65ca4f50ac
Test:
https://repl.it/@AlieksieiKoloso/task133
9. @Shoxrux_NUU, C++: 1 балл
10. @my_diamonds_dancing, Python, C#: 1,1 балл
https://github.com/myDiamondsDancing/UniLecs-Tasks/blob/master/Task%20133.py
C#:
https://github.com/myDiamondsDancing/UniLecs-Tasks/blob/master/Task%20133.cs
11. @LexxWanderlust, Swift: 1 балл
https://gist.github.com/Onezza/157eba7a378c89fb2f9b2abf248e00de#file-pac-man-swift-4-2
Test:
https://repl.it/@Onezza/InsistentPrevailingSandbox
12. Антон, Rust: 1 балл
Пусть нам надо найти количество точек, съеденных Pac-Man-ом при прохождении до точки на пересеченииrow
-ой строки иcol
-ой колонки. Очевидно, при этом предыдущиеrow - 1
строк уже пройдены тем или иным способом, поэтому съедено как минимумrect = width * (row - 1)
точек. Количество же точек, съеденных наrow
-ой строке, зависит от того, в каком направлении Pac-Man движется.
Еслиrow
— нечётное число, то Pac-Man прошёл чётное количествоrow - 1
строк и начинает проходитьrow
-ую строку от начала. Тогда количество точек, съеденных в последней строке, очевидно, равноlastline = col
. Если жеrow
— чётное число, то Pac-Man прошёл нечётное количествоrow - 1
строк и потому проходит последнюю строку от конца. При этом он проходит черезwidth - col
клеток и останавливается на последней клетке, съедая точку в ней, поэтому всего Pac-Man съедает на последней строкеlastline = width - col + 1
точек.
https://gist.github.com/AnthonyMikh/8328a5e13120e5680930d718736e4cb6
Test:
https://play.rust-lang.org/?gist=48f322aad4d479c0bc0a0741f73197d5
13. @P9oSi, C#: 1 балл
https://gist.github.com/P9os/bea9c09d94e1fabd8174c935f8c8f9d0
14. @LostInKadath, Python: 1 балл
Pacman eats points on a field with dimensions (width, height) = (cols, rows).It starts from (1, 1) and runs from left to right.The second row it runs from right to left, the third one - from left to right, and so on.Find the number of eaten points, if Pacman stops in the point (row, col).The solution is pretty easy. We count full eaten rows (that is `row-1`).Then we analyze the current row: if its number is odd, Pacman runs from left to right and has eaten `col` points.Otherwise, Pacman runs from right to left and has eaten `cols-col+1` points.
https://gist.github.com/LostInKadath/4b68f4fff2804f0f482cbcad697949e3
15. @egormasharskii, Python: 1 балл
https://gist.github.com/myegor/ad82d25a7c78889673b3a7b73bba4f5b
16. @rustem_b, Dart, Hy, Python, Julia, Perl: 1.4 балла
В каждом ряду Pacman собирает N шариков, значит что бы узнать сколько шариков Pacman соберёт в полностью пройденных рядах нужно умножить количество рядов, которое Pacmanу нужно нужно пройти полностью (row - 1
), на количество столбцов (N
)
Плюс оставшиеся шарики, так как герой ходит "змейкой" (сначала слева направо), то в нечётных рядах он соберётcol
шаров, в чётных рядахN - col + 1
(т. к. герой движется справа налево)
https://gist.github.com/RustemB/dcdc5ff97bc9d0fe13dd0858e0189d6e
17. @kirillmotrichkin, Python: 1 балл
Задача решается одной формулой: складываем площади, прямоугольник без ряда, в котором находится пакман и пройденные клетки ряда, в котором находится пакман. Если ряд нечётный, то пройденные клетки слева от пакмана, иначе - справа
https://gist.github.com/superkiria/8ba678bd28207c90eb0dc46f6ddf355d
Test:
https://repl.it/@superkiria/unilecs133-pacman
18. @lPestl, JS, C#, C++, F#, Visual Basic: 1.7 балла (1.4 + 0.3 за визуализацию)
JS c визуализацией:
https://jsfiddle.net/lPestl/owaspg3v/3/
C#:
С++:
F#:
Visual Basic:
19. @voodoo_woodpecker, Python: 1.3 балла (визуализация)