Вдохновленный xkcd .
Ваша задача - определить, будет ли число составлять хорошую комбинацию в игре 2048 . Ваш ввод будет числом, таким как:
8224
И выводом будет то, будет ли это число составлять хорошую комбинацию 2048 года, что для этого ввода будет true
или, yes
или 1
или любым другим способом, будет указывать на положительный результат.
Для тех , кто не знаком с игрой, вот простое объяснение: полномочия двух расположены на сетке, как это: [2] [2]
. Плитки можно перемещать в любом направлении, и если встречаются две одинаковые плитки, они становятся следующей степенью двойки (поэтому [2] [2]
при перемещении влево или вправо становится [4]
). Или вы можете просто попробовать игру здесь .
Что означает «хорошая комбинация 2048»? Это означает любое число, которое, если бы оно было в игре «2048», могло бы быть объединено в одно число. (Ноль означает пустой пробел , и при необходимости его можно проигнорировать.) Обратите внимание, что числа могут состоять из нескольких цифр! Однако числа не должны меняться между ходами. Вот несколько примеров / тестовых случаев («Хорошее» означает хорошую комбинацию, а «Плохое» означает плохое):
- Хорошо: 8224 (8224 -> 844 -> 88 -> 16)
- Хорошо: 2222 (2222 -> 44 -> 8)
- Хорошо: 22048 (22048 -> 448 -> 88 -> 16)
- Плохо: 20482 (нельзя комбинировать внешние 2, а также нельзя комбинировать 2048 и 2)
- Хорошо: 20482048 (20482048 -> 4096)
- Плохо: 210241024 (210241024 -> 22048, но теперь это [2] [2048] и не может быть объединено, так как числа не могут меняться между ходами)
- Хорошо: 2048 (это уже одно число)
- Плохо: 2047 (это не степень 2)
- Плохо: 11 (в игре нет 1)
- Хорошо: 000040000000 (нули - это пустые места)
Разные правила:
- Входные данные могут быть откуда угодно, например, STDIN, аргумент функции, файл и т. Д.
- Вывод также может быть где угодно, например, STDOUT, возвращаемое значение функции, файл и т. Д.
- Не обращайте внимания на размер сетки -
22222222
все равно выведите true. - Число не является максимальным для того, что может быть числом s, если оно является степенью двойки. Поэтому возможные числа - это любая степень двух, больше 0.
- Для тех, кто обеспокоен тем, что нули вызывают двусмысленность, это не так. Например,
22048
может быть проанализирован как[2] [2048]
или[2] [2] [0] [4] [8]
. Первый не работает, но второй работает, поэтому он должен вывести true. - Это код-гольф , поэтому выиграет самый короткий код в байтах!
1
22048
должен выводить,good
но это не так. Вы не можете комбинировать2
с2048
сеткой,4x4
если все числа должны быть разделены, вы получите 5 ячеек. так, может быть, вы должны удалить0
? Также ваш 5-й пример, кажется, недействительным, так как игра останавливается на2048
:)Ответы:
GolfScript, 137 символов
Ввод должен быть дан на STDIN. Выход
0
/1
для плохих / хороших чисел. Большая часть кода необходима для анализа возможных входных данных.Эта более короткая версия (113 символов) выполняет простой сдвиговый тест, который не будет работать правильно для ввода, как
224422
.Все тестовые случаи можно проверить онлайн .
источник
Python:
457422 символовФункция f (s) получает строку цифр и выдает соответственно «хорошо» или «плохо». Я решил не использовать 0 в качестве пробелов, потому что пробелы не имеют смысла в игре, и они создают неоднозначность при разборе строк (это 22048 хорошо или плохо?). Используются только числа до 2048, но это можно изменить без добавления символов. По цене 10 символов или около того я также могу распечатать все шаги объединения чисел. И я понимаю, что этот код еще не в гольфе; не волнуйтесь, поправки идут.
источник
Haskell:
285 254 253 237 230227использование - просто загрузите его в ghci и передайте строку в h.
Код:
Комментарий:
i
это проверка, является ли число степенью 2, это будет переигрываться языками с немного изменяющимся тоном.%
рекурсивно генерирует все разборы, которые являются списками степеней 2 или 0.c
сворачивает тайлы.l
рекурсивно проверяет, являются ли плитки разборными слева или хорошо.g
проверяет, являются ли плитки разборными слева или справа. Число плиток не ограничено - например,h ((show (2^200))++(show (2^200)))
возвращает значение true для 2 плиток с пометкой «1606938044258990275541962092341162602522202993782792835301376».Отредактировано, чтобы исправить ошибку, из-за которой она не правильно свернула «88222288888» вправо, но также нашла больше возможностей для игры в гольф.
источник
Perl, 175-336 байт
Сохраняя только основные вещи в целости:
[ 64 и 256 приводят к некоторым плохо разрешимым неоднозначностям, с которыми жадное сопоставление не может справиться ... но это хороший счетчик байтов. ]
источник
Delphi
572582 персонажаОтредактированный код, предел установлен на 2 ^ 30, поэтому он не будет превышать значение MaxInt в Delphi.
Golfed
Ungolfed
РЕДАКТИРОВАТЬ
Поэтому мне стало любопытно, и я подумал, сколько из этих комбинаций подойдет для головоломки, и проверил ее.
Для других, кому тоже любопытно, сделайте тест тоже;)
Но хорошо, вот результаты:
20736 combinations were tested and 1166 were great combinations
Я должен сказать комбинации с 3 - мя или более нулей были пропущены (имеет смысл правильно?)
Комбинация почти уникальна, то есть комбинации
2248
,8224
,8422
и4228
все были подсчитана как большая комбинация.источник
Mathematica - 218 байт
Безголовая версия:
Internal\
Магия PartitionRagged` берется из этого вопроса .Это решение обрабатывает произвольные размеры сетки и произвольно большие числа.
Вот 195-байтовая версия, которая работает так же, как и в реальной игре, только с 4 тайлами (так и
f[22222222]
естьFalse
):где я заменил
с
источник
DeleteCases
похоже, он удаляет самые левые пары, такf[88222288888]
что не получится?DeleteCases
просто удалите нули и числа, которые не являются степенью двойки. Фактическое свертывание пар осуществляется по правилу//. {a___, x_, x_, b___} :> {a, 2 x, b}
, которое работает для этого числа и наоборот. На самом деле я не совсем уверен в том порядке, в котором Mathematica применяет эти замены, но это работает.Хаскелл - 260
263f
это функция. Примеры:Небольшое объяснение:
p
возвращает все способы разбить список.q
фильтрует те, которые состоят только из степеней 2 (исключая 1, но включая 0).c
пытается свернуть строку.r
выполняет итерацию вправо и влево до тех пор, пока не останется только 1 элемент или строка не может быть изменена.источник
c
Хотя есть ошибка , попробуйте «222244442222» - она возвращает true, но в игре это не сворачивается. Нужно смириться с(2*x):c s
.