Большинство Android-смартфонов позволяют пользователю использовать образец пальца, чтобы открыть свой телефон:
Определенные закономерности законны, а другие невозможны. При заданном шаблоне входных данных верните истину или ложь, указывающие, является ли данный шаблон ввода допустимым или нет.
вход
Сетка обозначена построчно с 1 по 9:
1 2 3
4 5 6
7 8 9
Входные данные - это число, состоящее из узлов, посещенных от первого до последнего. Например, приведенный выше рисунок является 12357.
Ввод может быть десятичным числом, строкой или списком чисел. Он не будет содержать 0, потому что нет узла 0.
Поправка: индексирование 0-8 допускается, так как многие языки индексируют от 0. Если вы используете 0-8, необходимо указать это в начале вашего ответа и соответствующим образом скорректировать контрольные примеры.
правила
Каждый узел изначально не посещается и может быть посещен только один раз. Любой шаблон, который посещает узел более одного раза, является ложным.
Истинный шаблон должен содержать как минимум один удар, поэтому минимум 2 узла.
Невозможно пропустить не посещенный узел напрямую в соответствии с другим. Например, 13 ложно, потому что 2 не посещается и находится в прямой линии.
Можно только пропустить посещенный узел. 42631 является примером этого.
В противном случае линии могут пересекаться. Например, 1524 - это правда.
Предположим, ширина узла незначительна и игнорирует практические вопросы (толщина пальца и т. Д.). Таким образом, 16 - это правда, хотя в действительности это может быть немного сложнее.
Тестовые случаи
1 -> false
12 -> true
13 -> false
16 -> true
31 -> false
33 -> false
137 -> false
582 -> true
519 -> true
1541 -> false
12357 -> true
15782 -> true
19735 -> false
42631 -> true
157842 -> true
167294385 -> true
297381645 -> false
294381675 -> true
Это код-гольф , поэтому выигрывает наименьшее количество байтов.
источник
Ответы:
JavaScript (ES6), 64 байта
Принимает ввод как массив чисел. Ложные значения равны 0 или NaN . Истинные значения являются строго положительными целыми числами.
Контрольные примеры
Показать фрагмент кода
Как?
преамбула
Две цифры располагаются вертикально, горизонтально или по диагонали, если:
ИЛИ они оба четные и их сумма равна 10 (рисунок 2)
Кроме того, цифра, стоящая между двумя противоположными цифрами n и p , равна (n + p) / 2 .
Отформатированный исходный код
Отслеживание предыдущих цифр
Флаги для посещенных цифр хранятся с отрицательными индексами во входном массиве a , чтобы они не сталкивались с его исходными элементами.
Если p установлено в -n :
Если текущая цифра n ранее не была выбрана,
a[-n] ^= -n
будет установлен флаг, иevery()
цикл будет продолжен на следующей итерации. В противном случае он сбросит флажок и немедленно прервет цикл.Если p установлено в undefined :
a[undefined] ^= undefined
приводит к 0 , что также приводит к сбою цикла.Обнаружение противоположных цифр
Следующее выражение используется для проверки того, являются ли текущая цифра n и предыдущая цифра -p противоположными цифрами, как определено в преамбуле:
что эквивалентно:
Примечание. В JS результат по модулю имеет тот же знак, что и дивиденд.
Это можно интерпретировать как:
Следовательно, это выражение возвращает 1, если и только если n и -p являются противоположными цифрами или они являются одной и той же нечетной цифрой. Поскольку цифра не может быть выбрана дважды, об этом последнем случае все равно правильно заботятся.
Если это выражение возвращает 1 , мы тестируем a [p / 2] (где p теперь равно отрицательной сумме цифр), чтобы узнать, посещалась ли ранее «промежуточная цифра». В противном случае мы проверяем [0], который гарантированно верен.
О первой итерации
Первая итерация - это особый случай, в котором нет предыдущей цифры, и мы хотим, чтобы она была безусловно успешной.
Мы достигаем этого, инициализируя p в 1 , потому что для любого n в [1 .. 9] :
(1 * n) % 5
не может быть отрицательным~(1 - n)
не может быть равным 9Оригинальный ответ, 90 байт
Удалено из этого поста, чтобы оно не стало слишком многословным. Вы можете увидеть это здесь .
источник
!!a[1]&
наa[1]&&
, так как может быть возвращено любое истинное значениеa[1]*
еще короче.)has a node directly in line
, я не понимал, что это будет так просто ...?a[-n]^=1:0
с&&a[-n]^=1
на -1, не может проверить (на мобильный)32-битный машинный код x86,
6260 байтHexDump:
Он получает длину списка в
ecx
и указатель на первый элемент вedx
и возвращает результат вal
:Есть 8 строк, которые содержат узел в середине:
Я сгруппировал их по разнице между большим и меньшим числом.
Затем я преобразовал это в двумерную таблицу поиска, индексированную по полуразнице и меньшему числу:
Это делает «волшебное» растровое изображение 32 битами. Чтобы проиндексировать его, код помещает его в стек. Затем он извлекает один байт, используя один индекс, и из этого байта извлекает один бит, используя другой индекс. Все это с помощью одной инструкции:
Если растровое изображение показывает, что в середине есть узел, его легко вычислить - прибавьте половину разницы к меньшему числу.
Источник сборки:
источник
bt byte ptr [esp + eax], ebx
.cdq
вместо ,xor edx, edx
какeax
равно нулю. Кроме того , вы можете сложитьdec eax
вbt [esp + eax - 1], ebx
который такой же длины , но затем позволяет удалитьinc ebx
позже. Это должно сэкономить вам два байта.Python 2 ,
14013111410499 байт-2 байта благодаря Джонатану Фреху
-5 байтов благодаря Часу Брауну
Попробуйте онлайн!
Объяснение:
Попробуйте онлайн!
Только 8 пар узлов имеют узел между ними. Пара узлов может быть представлена в виде одного целого числа по формуле
2^a-2^b-1
. Это число может быть сокращено повторением по модулю:(2**n+~2**l)%21%15%9==5
сначала проверяется, присутствует ли такая пара, затемv-{l+n>>1}==v
проверяется(a+b)/2
, не был ли посещен промежуточный узел, который задан , и еще неq
вызвано NameError. Используя цепное сравнение между этими парами, следующее сравнение выполняется только тогда, когда вернулось предыдущееTrue
.источник
Желе ,
24 22 1918 байт-2, так как нам больше не нужно обрабатывать пустой список
-1, переключаясь с соединения
j@
на конкатенацию;
(пропущенный элемент не должен встречаться в середине для используемого метода, находясь в начале трио, это хорошо )-2 переход от
P¬aSH
кoSH
(OK, чтобы иметь два результата , так как мы сплющить, половина1
является ,0.5
который отфильтровывает в любом случае, и имеющие несколько равных результатов не влияет на используемом методе либо)-1 Благодаря г Xcoder (0-индексированному вход разрешен)
Монадическая ссылка, содержащая список целых чисел
[0,8]
и возвращающая истинное значение (1
), если оно разрешено, и значение Falsey (0
), если нет.Попробуйте онлайн! или посмотрите набор тестов .
Как?
Просматривает каждую соседнюю пару 0-индексированных узлов в списке ввода. Если целочисленное деление на три из двух отличается на 2, они находятся в верхнем и нижнем рядах, если по модулю на три из двух отличается на 2, они находятся в левом и правом столбцах. Сумма таких пар, разделенная на две, представляет собой либо нулевой индексированный средний узел линии с тремя узлами, либо нецелое значение - поэтому эти значения сначала вставляются перед 0-индексированной парой, а затем фиктивные узлы (как
0.5
или3.5
) удаляются, результирующий список списков сглаживается, а затем дедуплицируется (для получения сохраненных в порядке, уникальных записей) и, наконец, сравнивается с входными данными - для легкого пролистывания все это в конечном итоге будет неактивным, а незаконным один из них добавит недостающие средние узлы и / или удалит повторяющиеся узлы (обратите внимание, что для входного списка длиной 1 не требуется специальный регистр, поскольку у него нет соседних пар):Предыдущий метод
Желе ,
3635 байтПопробуйте онлайн! или посмотрите набор тестов .
Как?
Подобно вышеописанному, но создает все возможности трехузловой линии и выполняет поиск (вместо проверки при использовании divmod для проверки и деления пополам суммы для среднего узла).
Сначала построим список из трех узловых линий:
Сейчас принимается решение:
источник
Stax , 28 байт
Запустить его
Это производит 0 для ложного, и положительные целые числа для истинного. Соответствующее представление ascii той же программы таково.
Общая идея состоит в том, чтобы рассчитать несколько необходимых условий для законных образцов смахивания и умножить их все вместе.
источник
Y
реестра.v
и включить в1
качестве ложного значения.2
и выше правдивы.JavaScript, 112 байт
Может быть, какой-то язык на основе регулярных выражений должен быть короче. Но я не знаю
Показать фрагмент кода
Благодаря Нилу, измените,
)(?!
чтобы|
сохранить 3 байта.источник
144
.Сетчатка 0.8.2 , 98 байт
Под влиянием ответа ТШ . Я попытался «перефразировать» его, чтобы он был противоположным, сопоставляя недопустимые пролистывания, затем «Anti-grepping».
Попробуйте онлайн
источник
Шелуха ,
2520 байтПринимает список целых чисел с индексацией на основе 0. Возвращает 0 или 1. Попробуйте онлайн!
объяснение
Я украл некоторые идеи из ответа Jonathan Allan's Jelly . Идея та же: вставьте новый «средний узел» между каждой соседней парой, отфильтруйте те, которые не являются реальными узлами, удалите дубликаты и сравните с исходным списком. Если исходный список содержит дубликаты, результат ложный. Если список пропускает не посещенный узел, то он присутствует в обработанном списке между соответствующей парой, и результатом является ложь. Если входные данные являются одноэлементными, обработанный список будет пустым, и результат будет ложным. В противном случае это правда.
источник
C ++,
267256 байтЧтобы проверить, не пропускает ли шаблон невидимый узел, он выполняет несколько вещей:
d
гдеd
находится числовая разница между текущим узлом и последним узлом.d
это нечетно, тогда нет необходимости проверять, он не может пропустить узел.d
равно4
или8
, то переход между узлами1-9
или3-7
, так что проверьте узел5
d
равно 2, а средний узел ((last_node + current_node)/2
) равен 2,5 или 8, то проверьте средний узелd
6, то же, что и раньше, но с4
,5
или6
Параметры -
int[]
это количество элементов. Возвращает,int
который можно интерпретировать какbool
типисточник
!(d%2)
=>d%2<1
должно работать.int s[]
=>int*s
. Я думаю, что это сработает.Perl, 135 байт (134+
-n
)Слегка негольфированная версия
Выходы через код выхода.
0
правда, любая другая ценность ложная. Согласно мета-консенсусу , вывод STDERR в случае сбоя игнорируется.Вероятно, есть более быстрый способ проверить правило «не перепрыгнуть», чем просто перечислить все возможности.
источник
MATL ,
424139 байтЭто производит
Здесь вы можете прочитать, почему эти выводы являются соответственно правдивыми и ложными. Попробуйте онлайн!
Или проверьте все контрольные примеры с помощью кода нижнего колонтитула, который включает в себя стандартный тест на достоверность / ложность.
источник
Stax ,
73726665 байт CP43779 байт при распаковке,
Запускать и отлаживать онлайн!
или запустите пакетный тест , где
meX
находится заголовок, чтобы Stax мог обрабатывать многострочный ввод.Внедрение без использования hash.Outputs строго положительное число ( на самом деле количество неудачных испытаний) для falsy случаев и
0
для truthy них.объяснение
d
очищает входной стек Вx
любом случае, входные данные являются переменными .4{cAs-5F
генерирует первую часть списка среднего узла.132396978714EE
жестко кодирует вторую часть списка средних узлов.L3/
Собирает все элементы в главном стеке и делит на части, каждая из которых содержит 3 элемента, в результате получается массивa
, который является просто массивом всех недопустимых групп из 3 узлов.{xs:IBc0<A*++cEd:-1=sccHs|M=s{U>m|A**mE
Для каждого неверного списка узлов выполните следующие проверки. Результат проверки проверяетсяand
с помощью**
. Поскольку существует 8 недопустимых списков узлов, результатом этого кода будет массив из 8 элементов. ФиналE
отправляет массив отдельным элементам в главном стеке.xs:I
получить индекс элементов списка узлов во входном массиве.Bc0<A*++
Если индекс «среднего узла» (например,5
в наборе узлов1,5,9
) равен-1
(что означает, что он не существует во входном массиве), измените индекс на9
.cEd:-1=
проверить, являются ли два "терминальных узла" (например,1,5
в наборе узлов1,5,9
) смежными во входном массиве.sccHs|M=
проверить, больше ли преобразованный индекс «среднего узла», чем у двух «терминальных узлов», что включает в себя два случая: «средний узел» отсутствует или «средний узел» идет после двух «терминальных узлов»s{U>m|A
проверяет, являются ли оба индекса «конечных узлов» неотрицательными. (т.е. они оба появляются на входе).Два дополнительных теста выполнены,
x%2<
проверяет, является ли входной массив одноэлементным.xu%x%=!
проверяет, были ли узлы, которые были посещены дважды.В главном стеке 10 результатов теста (по одному на каждый из списка недопустимых узлов, плюс два дополнительных теста).
L|+
собирает 10 элементов и добавляет их.|a
мог также использоваться, который просто проверяет, есть ли какие-либо истинные элементы в массиве.Неявный вывод.
источник
Java,
375355 байт-20 байт благодаря Захари
Это порт этого ответа, и он работает на тех же принципах
источник
int v(int s[]){int[]m=new int[10];int i=1,p=s[0],d,n,l=s.length;if(l<2)return 0;for(;i<l;++i){m[p]=1;if(m[s[i]]!=0)return 0;d=(d=p-s[i])<0?-d:d;if(d%2==0){n=(p+s[i])/2;if((d==4||d==8)&&n==5&&m[5]==0)return 0;if((d==2)&&(n==2&&m[2]==0||n==5&&m[5]==0||n==8&&m[8]==0))return 0;if(d==6&&(n==4&&m[4]==0||n==5&&m[5]==0||n==6&&m[6]==0))return 0;}p=s[i];}return 1;}
должен работать (порядок операций)(d==2)
на простоd==2
, я не замечал этого раньше.d%2==0
=>d%2<1
Pyth , 33 байта
Тестирование.
Использует индексирование на основе 0.
объяснение
Альтернативный подход для 34 байтов :
источник
Japt , 35 байт
Попробуйте онлайн!
Слегка разгромленный и как это работает
Портировал идею из этого решения Jelly , с некоторым различием в определении потенциальных скачков:
/3
или%3
.%3
и проверяет, равна ли разница 0 или 2. Если разница равна 0, две ячейки выровнены по вертикали, и непереходы все еще имеют свойство(X+Y)%2 != 0
.источник
Python 2 , 97 байт
Основано на ответе ovs, но на 2 байта короче и менее загадочно. Просто конвертирует индексы в 2d координаты и проверяет четность. Предполагает 0-8 индексов.
Попробуйте онлайн!
источник