Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Заблокирован

Своя версия игры 2048

06.07.2021, 09:26. Показов 3436. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Витя решил создать свою версию игры 2048. Оригинальная игра на таблице оказалась слишком сложной, поэтому Витя решил начать с простого.

Игра состоит из одной вертикальной полоски бесконечной длины, на которую сверху последовательно падают n кубиков. На каждом из этих кубиков написано число 2 или 4. Когда кубик падает на другой кубик с точно таким же числом x, они объединяются в один кубик с числом 2x и этот процесс продолжается.

Помогите Вите и напишите бота, который запустит эту игру и выведет конечную конфигурацию кубиков.

Входные данные
В первой строке входного файла дано одно положительное целое число n (1≤n≤105).

Во второй строке входного файла даны n целых чисел a1, ..., an — числа, записанные на кубиках, которые будут последовательно падать сверху. (ai=2 или ai=4)

Выходные данные
В первой строке выведите одно положительное целое число k — количество кубиков в конечной конфигурации.

Затем, во второй строке выведите ровно k целых чисел b1, ..., bk. bi должно обозначать число, написанное на i-м кубике сверху.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.07.2021, 09:26
Ответы с готовыми решениями:

allocator своя версия
Доброго времени суток. Мне нужно написать class allocator на подобии стандартного. Он должен содержать следующие методы: Method void*...

Своя версия программы rm
Всем привет, нужно написать такую программу: Напишите свою версию программы rm, используя вызов unlink. Ваша программа должна проверять,...

Своя версия функции strcmp()
В книге дано задание, создать свою версию функции strcmp(). Подскажите как можно это реализовать, учитывая тот фактор что строки нужно...

9
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
06.07.2021, 10:38
cjsfkmse, можно так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
n = int(input())
a = list(map(int, input().split()))
res = [a[0]]
for num in a[1:]:
    res.append(num)
    while len(res) > 1:
        tmp = res.pop()
        if tmp == res[-1]:
            res[-1] *= 2
            n -= 1
        else:
            res.append(tmp)
            break
print(n)
Добавлено через 8 минут
Можно "убрать" циклическое определение len():
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n = int(input())
a = list(map(int, input().split()))
res = [a[0]]
k = 1
for num in a[1:]:
        res.append(num)
        k += 1
        while k > 1:
            tmp = res.pop()
            if tmp == res[-1]:
                res[-1] *= 2
                n -= 1
                k -= 1
            else:
                res.append(tmp)
                break
print(n)
0
 Аватар для avdivo
303 / 213 / 112
Регистрация: 03.12.2016
Сообщений: 409
06.07.2021, 14:39
chelovek333,
Python
1
2
3
4
5
6
7
8
9
10
11
n = int(input())
cubes = input().split()[:n]
 
line = []
for one in cubes:
    line.insert(0, int(one))
    while len(line) > 1 and line[0] == line[1]:
        line[0] = line.pop(1) * 2
 
print (len(line))
print (*line)
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
06.07.2021, 16:00
avdivo, немного поправил ваш код. Вставка в начало списка очень затратная операция. Намного эффективнее добавлять элемент в конец списка.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
input()
cubes = input().split()
 
line = []
for one in cubes:
    tmp = int(one)
    while line and line[-1] == tmp:
        line.pop()
        tmp *=  2
    line.append(tmp)
 
print(len(line))
print(*reversed(line))
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
06.07.2021, 21:00
Цитата Сообщение от unfindable_404 Посмотреть сообщение
Вставка в начало списка очень затратная операция. Намного эффективнее добавлять элемент в конец списка.
- странно... Почему? Особенность Питона?
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
06.07.2021, 22:31
Цитата Сообщение от Catstail Посмотреть сообщение
Почему? Особенность Питона?
Насколько мне известно, это особенность любых "массивоподобных" объектов.
Добавление в конец имеет сложность O(1), а вставка в начало O(n).
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
07.07.2021, 00:35
Цитата Сообщение от Catstail Посмотреть сообщение
- странно... Почему? Особенность Питона?
Не только: в любом ЯП добавление в начало массива предполагает собой сдвиг всех имеющихся элементов вправо, разумеется удостоверившись, что позволяет capacity.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
07.07.2021, 05:21
Цитата Сообщение от Arsegg Посмотреть сообщение
в любом ЯП добавление в начало массива предполагает собой сдвиг всех имеющихся элементов вправо, разумеется удостоверившись, что позволяет capacity.
- массива - да, но не списка!

Цитата Сообщение от unfindable_404 Посмотреть сообщение
особенность любых "массивоподобных" объектов. Добавление в конец имеет сложность O(1), а вставка в начало O(n).
- но мы-то работаем не с массивоподобными объектами, а со списками! Список (связный список) - это не массив! И, если на то пошло, то при разумной организации списка (если хранить ссылку на начало и на конец), то добавление в начало и в конец будут иметь сложность O(1). Добавление в середину - O(n) (за счет поиска места вставки, т.к. в настоящих списках сдвига элементов не происходит никогда).

В языках с "простыми" списками добавление в начало - простая операция, добавление в конец - затратная. Именно так и обстоят дела в Лиспе и Хаскелле:

Lisp
1
2
3
4
5
6
7
;; вставка в начало списка
 
   (cons 'a  '(b c d))  => (a b c d)  ;; один вызов встроенной функции cons
 
;; вставка  в конец
 
   (append '(a b c) '(d)) => (a b c d) ;; append - рекурсивная функция сложноcти O(n) - проход по первому арг. до конца
Haskell
1
2
3
4
5
6
7
-- вставка в начало списка
 
   1:[2,3,4] => [1,2,3,4] - встроенная (быстрая) операция (:) - однократный вызов
 
-- вставка в конец
 
   [1,2,3]++[4] => [1,2,3,4] - проход по первому аргументу до конца
Понятно, что в Лиспе и Хаскелле списки - элементарные структуры. А в Питоне список "наворочен". Но в этом-то и дело! Если связный список (как объект) имеет ссылку на начало и на конец, то добавить элемент что в конец, что в начало - это O(1).
1
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
07.07.2021, 10:53
Цитата Сообщение от Catstail Посмотреть сообщение
А в Питоне список "наворочен".
Насколько я помню, списки (list) в Python'е реализованы на динамическом массиве. Понимаю, если бы была Scala с ее односвязными списками (там добавление в начало как раз таки O(1)).
Вот в collections.deque добавление в начало и в конец дека будет O(1), т. к. это двусвязный список в своем представлении со всеми вытекающими: индексация O(N) и т. п.
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
07.07.2021, 11:02
Цитата Сообщение от Arsegg Посмотреть сообщение
списки (list) в Python'е реализованы на динамическом массиве.
- если так, то понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.07.2021, 11:02
Помогаю со студенческими работами здесь

Симуляция игры 2048
Ошибка во втором цикле функции RemoveToRight, почему-то не суммирует как написано, спасибо #include <iostream> #include...

Игры аналог 2048
Добрый день. разбираю игру 2048. Нашел готовую но не могу уменьшить размер выскакивающих цифр. плиз поомгите найти где он уменьшается? файл...

Создание игры 2048
Рябят, дали задание написать игру 2047 на C. Плиз напишите код

Перевод кода игры 2048 с С# на С++
Есть код на с#, помогите перевести на с++ пожалуйста using System; using System.Collections.Generic; using System.ComponentModel; ...

Пример создания игры 2048
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Пример практической реализации игры по мотивам темы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru