Это нить полицейского. В потоке грабителя здесь .
Напишите код, который принимает входные данные n
и создает n-by-n "матрицу змей".
Матрица змей - это матрица, которая следует этому шаблону:
3-на-3:
1 2 3
6 5 4
7 8 9
и 4 на 4:
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
Точный формат вывода не является обязательным. Вы можете, например, вывод [[1 2 3],[6 5 4],[7 8 9]]
или что-то подобное.
Вы должны предоставить название языка и регулярное выражение, которое полностью соответствует вашему коду. Вы можете выбрать, насколько подробным должно быть ваше регулярное выражение. В крайнем случае вы можете написать регулярное выражение, соответствующее каждой возможной строке, и в этом случае ваш код будет очень легко взломать. Вы также должны предоставить выходные данные n=4
, чтобы грабители знали точный формат, который вы выбрали.
Вы можете использовать один из вариантов regex, доступных на regex101.com , или вариант Ruby.
- PCRE (PHP)
- Javascript
- питон
- Golang
- Рубин
Вы должны указать, какой из них вы используете.
Заметки:
- Вы должны поддержать любой достаточно большой
n
. Вы можете предположить, что он не переполнит тип данных или память. Если тип данных по умолчанию - 8-разрядные целые числа со знаком, то можно предположитьn<=11
, что если это 8-разрядные целые числа без знака, то можно предположитьn<=15
. - Грабители должны соответствовать выходному формату представления, за исключением начальных / конечных пробелов и новых строк, так как это могло быть удалено форматированием SE.
Критерий победы:
Победителем будет непроверенная заявка с самым коротким регулярным выражением, измеряемым количеством символов.
Если ваше сообщение оставалось без изменений в течение 7 дней, вы можете опубликовать предполагаемое решение и пометить отправку как безопасную.
источник
.
.Ответы:
05AB1E , взломан mbomb007
Надеюсь, весело взломать и не слишком очевидно.
Regex (PCRE):
Выход n = 4:
Оригинальное решение
источник
\w
нет. Вы можете попробовать себя на regex101.{0,2}
на.?.?
-
в последнюю позицию класс char в скобках ([+*\/%-]
), чтобы вам не пришлось его избегать.Python 2 , длина 62, треснувший
Regex (PCRE)
Образец вывода
источник
Желе , длина 6, треснувший
Regex (PCRE)
Образец вывода
источник
G
правильно форматировать вывод. Я близок к решению остальных, но я просто не могу понять, как перевернуть все остальные элементы в массиве с помощью Jelly ...R, длина 14 треснул по планнапу
Надеюсь, я правильно понял это регулярное выражение. То , что я пытаюсь сказать, 77 символов за исключением
<space>
,#
,;
и[
. Я проверил это здесьRegex
Пример вывода n = 4
источник
05AB1E , треснувший по стоимости чернил
Давайте поднимем его на ступеньку выше :)
Надеюсь, хорошая головоломка.
Regex (PCRE)
Выход n = 4
источник
> <> , длина 49, взломан Аароном
Регекс (Javascript)
Пример вывода (n = 4)
Форматирование немного странно, но проверка длины номера сделала бы это намного длиннее. Может быть, ушли немного за борт на регулярное выражение, не уверен!
Изменить: Также я забыл упомянуть, я использую начальный стек (-v флаг) для ввода, а не обычный ввод рыбы. Сожалею!
Оригинальный код:
Аарона намного проще! Сложность моего исходного кода основана на идее использования
n[r]
каждого n-го числа, чтобы перевернуть этот сегмент (строку), а затем распечатать все числа сразу в концеисточник
..
короче.{2}
;)Ом , треснул
Также моя первая задача «Копы и грабители», так что скажите мне, есть ли проблемы с этим шаблоном (тем более что это довольно неизвестный язык).
Regex (PCRE)
Выход (n = 4)
источник
.*
в своем регулярном выражении, это может быть что угодно. Так что, если у языка есть комментарии, они могут написать любую программу с последующим комментарием.PHP, 221 байт ( взломан )
Надеюсь, это достаточно сложно.
Регулярное выражение (PCRE): 16 байт
Нет места, нет комментариев, нет использования base64_decode. Повеселись.
Выход
Оригинальный код
источник
base64_decode
потому что ваше регулярное выражение не запрещает его.6
, которые могут блокироватьсяbase64_decode
.C # net46 ( треснувший )
( http://ideone.com/ работает)
Regex PCRE ароматизатор длина 58 проверен на regex101
Только метод является регулярным выражением. Метод возвращает массив 2d int [,] (int [4,4]) для входа n = 4. Если напечатано выглядит так:
Это мое первое вступление во что-то подобное, дайте мне знать, если я сделал что-то не так. Не пытаясь выиграть с помощью длины регулярного выражения, мне просто интересно посмотреть, насколько хорошо я справился с предотвращением взлома :)
Оригинальный код:
источник
QBasic, регулярное выражение длина 10 ( трещины )
Regex
Должен работать с любым регулярным выражением, но мы назовем это Python.
ПРИМЕЧАНИЕ: мое решение использует неформатированный QBasic; после форматирования код не соответствует регулярному выражению из-за добавления пробелов. (Но я могу вам сказать, что это единственное изменение, которое имеет значение. По-
([A-Z]+ ?. ?)+
прежнему работает на отформатированной версии.)В целях тестирования я использовал QB64 с отключенным форматированием кода (в меню «Параметры»> «Разметка кода»). Если вы не хотите что-то скачивать, вы также можете запустить QBasic онлайн на archive.org (но там вы не можете отключить форматирование).
Образец вывода
источник
\w+\W
можно разделить на\w*
и\w\W
. (\w*
либоnull
(тривиально), либо\w+
(легко пробирается с символом)).
не может быть символом слова. Это может быть строчная буква или цифра. Фактически, это может быть даже заглавная буква, если последний символ программы - один.Python 3, 55 байт (треснувший)
PCRE / Python / Golang.
(Напоминаем, что требуется полное совпадение . Предположим
^
и$
при тестировании.)Образец вывода:
Оригинальное решение:
Надо было обрезать 4 байта: p
источник
)
второй части регулярного выражения(
находится внутри класса символов, начинающегося послеprint
и заканчивающегося до{48}
. Мне тоже понадобилось время, чтобы увидеть это. ;) (В этом отношении предыдущие пары скобок также находятся внутри класса символов.)dc , Regex length 12 Трещины сешумара!
Это регулярное выражение достаточно простое, поэтому я не думаю, что вкус регулярных выражений имеет значение - оно должно работать по всем направлениям. (Обратите внимание на пробел после # в регулярном выражении.)
Я протестировал все четыре варианта на regex101.com (PCRE / PHP, Javascript, Python и Golang), а также версию Ruby на rubular.com. Программа dc соответствует регулярному выражению во всех пяти версиях регулярных выражений.
Программа dc берет свой ввод в stdin и помещает свой вывод в stdout.
Пример вывода для ввода 4 (в конце каждой строки есть пробел):
Оригинальный код (добавляется после взлома)
Это было взломано @seshoumara . Вот мой предполагаемый код:
Объяснение:
Сумма наверху стека теперь является следующим числом, которое мы хотим напечатать:
Легко видеть, что это правильно, если номер строки четный, с тех пор сумма равна просто i.
Для нечетных строк обратите внимание, что i = d * (i / d) + (i% d) = d * (номер строки) + номер столбца. Отсюда следует, что сумма i + d-2 * (номер столбца) -1 равна d * (номер строки) + номер столбца + d - 2 * (номер столбца) - 1 = d * (номер строки + 1) - номер столбца - 1, это число, которое мы хотим поместить в указанные строку и столбец, чтобы обеспечить обратный отсчет в нечетных строках.
Возвращаясь к объяснению сейчас:
источник
#
и `` опущены, чтобы более короткое решение не могло использовать комментарии для достижения 59 байтов? Если это так, то в этом нет необходимости, поскольку в dc существует так много способов добавить команды, которые ничего не меняют, например. повторениеq
команд в конце сценария.32P
короче, чем в[ ]n
любом случае.Bash, длина регулярного выражения 38, трещины ( @kennytm )
Входные данные:
Выход:
источник
PHP
Я надеюсь, что это будет весело! : D
Выход (n = 4)
Уровень 1: PCRE (длина = 17) ( взломано Йоргом Хюльсерманом )
{
так ... нет анонимных функций!v
так ... нетeval()
!;
так ... это должно быть одно утверждение!<
так ... нет,Heredoc
ни несколько блоков PHP!У @ JörgHülsermann был интересный подход, но это не то, что я имел в виду :). Поэтому я ввожу новый уровень сложности (обещаю, что у меня есть код, который подходит для этого, и я не просто возиться с вами):
Уровень 2: PCRE (длина = 23) ( взломано Йоргом Хюльсерманом )
_~|&A-Z
! :)Повеселись!
ОРИГИНАЛЬНОЕ РЕШЕНИЕ
Таким образом, запрещение
$
значащих переменных не может быть доступно обычным способом, но это не означает, что они не могут использоваться вообще! Вы все еще можете использоватьextract()/compact()
для импорта / экспорта переменных в текущую область. :)Тем не менее, есть хитрость:
compact('x')['x']++
не будет работать, потому что переменные в PHP передаются по значению ... за одним исключением! Объекты.Остальное легко.
0
и1
легко образуются путем преобразованияfalse
иtrue
вint
, предваряя их с+
знакомand
иor
с тех пор&
и|
запрещено@
v
может быть сгенерировано с помощьюchr(ord('u') + 1)
, что означает@chr(ord(u) + true)
использование вышеупомянутых обходных путей.chr(ord('a') - 2)
что означаетchr(ord(a) - true - true)
callable
, который может быть строкой, содержащей имя функции. Таким образом, вы можете объединить неопределенные константы и одиночные символьные строки, сгенерированныеord()
для создания имени функции и вызова его следующим образом:array_reverse()
gets(a.rray.chr(ord(a)-true-true).re.chr(ord(u)+true).erse)()
(array
является языковой конструкцией, поэтому она разбивается на неопределенные константыa
иrray
)if ($n = $argv[1] and $i = 0) while ($n > $i++ and do_some and other_stuff or exit)
Логика в читаемом человеком коде будет выглядеть так:
И недружественная версия, которая соответствует регулярному выражению:
<?php if (@extract([x=>(object)[s=>[],i=>+false]])and@define(n,compact(arg.chr(ord(u)+true))[arg.chr(ord(u)+true)][+true]?:+true)and@define(un,chr(ord(a)-true-true))and@define(s,(a.rray.un.chunk)(range(+true,pow(n,true+true)),n)))while((@compact(x)[x]->s[]=s[@compact(x)[x]->i++])and(@compact(x)[x]->s[]=(a.rray.un.re.chr(ord(u)+true).erse)(s[@compact(x)[x]->i++]))and(n>@compact(x)[x]->i)or(@die((json.un.encode)((a.rray.un.filter)(@compact(x)[x]->s)))))?>
источник
V
. Повеселись! :)(array_re.chr(ord(u)+true).erse)()
! :) (... или, по крайней мере, вы могли бы, когда это_
было разрешено)Рубин [трещина]
Первый вызов копов и грабителей. Надеюсь, я не сделал это слишком легко.
РЕДАКТИРОВАТЬ: заменено
\g<1>
на,(?1)
потому что они, очевидно, эквивалентны в PCRE.Регулярное выражение (PCRE)
Выход (n = 4)
(Возвращает массив массивов. Это лямбда, кстати, но может это слишком много?)
источник
JavaScript (взломан)
В первый раз выполняя задачу «Копы и грабители», надеюсь, сделаем это правильно.
Регулярное выражение (JavaScript)
Выход
Массив, равный:
источник
$
заключить регулярное выражение в конец, если сам код заканчивается в конце регулярного выражения. В противном случае я мог бы сделать, например,x=>x.toString().toString().toString().toString()
и потом все, что я хочу после этого..*
самом начале сделали бы это действительно легко. Это может быть любая программа, за которой следует комментарий. По сути, не включайте.*
в свое регулярное выражение.Свифт, регулярное выражение 25 (треснувший)
Хорошо, посмотрим, понял ли я это. Это мой первый пост о копах и грабителях, так что позвольте мне знать, если я все испортил!
Regex
Я использовал вкус javascript на regex101.com
Пример вывода
Оригинальный код
источник
n
в качестве входных данных, но требует жестко закодированной переменной . Если это правильно, то, боюсь, это недопустимо в соответствии с мета-консенсусом.C - регулярное выражение длиной 42 символа - взломано
Регулярное выражение Javascript, используемое в regex101 .
Угадай это будет тривиально ...
Выходные данные разделяются табуляцией
\n
после каждой строки.Мое решение, здесь целые числа 0 - 2 , были получены с помощью
t-t
,t/t
иt
:источник
r
в своем регулярном выражении.Желе , длина 14 трещины
взломан Деннисом
Регулярное выражение Python
Добавлено
m
снова после того, как я позволил ему ускользнуть./
(уменьшить быстро);от
P
(продукта) до`
(монада от диады быстрой);m
(по модулю индексации);v
(Eval Dyad);от
Ḋ
(dequeue) доṫ
(tail); и€
(за каждый быстрый)Для ввода
4
моих выходов:... потому что я отформатировал список списков в виде сетки с
G
.источник
Powershell, 23 байта
Взломанный Мэттом
Оригинальное решение:
Принимает ввод в качестве аргумента и выводит на стандартный вывод
Надеюсь, с этим регулярным выражением все в порядке, я не ожидаю, что его будет слишком сложно взломать, так как я не запутал большую его часть, и регулярное выражение дает немало хороших отправных точек, чтобы заполнить пробелы, есть одна вещь в первом сегменте что очень редко встречается в кодовом гольфе, хотя, которое может кого-то поймать, я думаю, что для того, чтобы сделать это немного более жестким, требуется не жадный матч.
В любом случае, первый вызов полиции
источник
[Array]::Reverse()
вместо переменных$array[9..0]
и$script:r
переменные, которые в основном бесполезны.Рода 0,12 , длина 19 (взломано @KritixiLithos)
PCRE:
Пример вывода (n = 4):
Оригинальный код:
Попробуйте онлайн!
источник
PHP 7 (безопасный)
Оригинальный код
Вторая попытка
Регулярное выражение (PCRE): 29 байт
Нет места, нет комментариев, нет использования base64_decode.
Многие функции не допускаются! подчеркивать
Выход n = 11
Выход n = 4
Выход n = 3
источник
MATL , длина 12 (безопасно)
Regex
Использует вкус Python:
Пример вывода
Для
n=4
:Решение
Чтобы увидеть, как это работает, рассмотрим ввод
n=4
.источник
Желе , длина 17 (безопасно)
Регулярное выражение Python
Затягивая узел, это запрещает еще несколько полезных вещей, для вашей помощи вот запрещенные байты:
чуть менее трети из них!
Для ввода
4
моих выходов:... потому что я отформатировал список списков в виде сетки с
G
.Решение:
Попробуйте онлайн! / regex101
Основной трюк здесь состоит в том, чтобы индексировать в лексикографически отсортированный список перестановок натуральных чисел до n 2 (используя,
œ?
чтобы избежать построения списка длины n 2 ! ), И разбить результат на куски длины n . Вышеупомянутый индекс находится путем формирования его представления в системе факторных чисел, которая является формульной, поскольку «не нарезанная» змея создается путем перестановки элементов в заданном порядке (это может быть легко преобразовано в число сÆ¡
).Решение, которое я представляю, использует
Ŀ
для ссылки на предыдущие ссылки как на монады (заменаÑ
иÇ
), но$
вместо этого можно использовать несколько строк подряд, чтобы «встроить» эти вспомогательные функции. Он также используетr
с тех порḶ
иR
запрещен.источник
Pip , regex длина 3 (безопасно)
Решением является полная программа, которая принимает n в качестве аргумента командной строки. Он не использует никаких флагов командной строки.
Регекс (любой вкус)
Образец вывода
Мое решение
Попробуйте онлайн!
стратегия
Вот код, который мы хотели бы написать:
То есть:
a
вy
i
от 0 доa-1
i
нечетно, переверните y, добавьтеi*a
к каждому элементу, объедините пробел с каждым элементом и напечатайтеСложности
Многие команды и переменные в Pip используют буквы, но некоторые важные не делают:
,
и\,
)+
,-
,*
,%
,++
):
){}
)Как нам обойти эти ограничения:
EN
вместо можно использовать умерат,
; нам просто нужна строка с количеством символов, которое мы хотим, и нам нужно извлечь первый элемент каждого подсписка в структуре, как[[0 "H"] [1 "i"]]
.F
циклов или.y
переменную с помощьюY
оператора ank.X
это умножение строк, иPU
sh (илиPB
«push-back») объединит строку с другой строкой на месте. Чтобы взять длину строки, мы можем ееEN
исчислить и извлечь правильное число из полученного списка._
.конкретика
Строительные блоки нашей программы:
Диапазон
Это
map-unpack(_, enumerate(repeat(space, a)))
в псевдокоде. Распаковка карты аналогична Pythonitertools.starmap
: учитывая список списков, она вызывает функцию для элементов каждого подсписка._
возвращает свой первый аргумент, поэтому_MU
просто получает первый элемент каждого подсписка. Например, если а = 3:... который так же, как
,a
.Инклюзивный ассортимент
Я не уверен, что есть способ сделать это
inclusive-range(1, a)
в одном выражении, но, к счастью, он нужен нам только один раз, поэтому мы можем построить его вy
переменной за три шага.В псевдокоде
yank(enumerate(repeat(space, a).push-back(space)))
:Далее
POy
выскакивает первый элементy
и удаляется, оставляя[[1 " "] [2 " "] [3 " "]]
.В заключение,
То есть
yank(map-unpack(_, y))
: извлечь первый элемент каждого подсписка и вернуть полученный список обратноy
.y
сейчас[1 2 3]
.длина
В псевдокоде
pop(dequeue(enumerate(a.push-back(space))))
. Трудность здесь в том, что перечисление только дает нам числа доlen(a)-1
, но мы хотимlen(a)
. Таким образом, мы сначала вставляем пробелa
, удлиняя его на один символ, а затем беремlen-1
новую строку.математический
Теперь, когда у нас есть способ взять длину строки, мы можем использовать строки для умножения и сложения чисел:
Первый делает
sXaXb
для создания строкиa*b
пробелов, а затем принимает длину; вторая делает,sXaPBsXb
чтобы вставить строкуb
пробелов в строкуa
пробелов, а затем принимает ее длину.Хорошая часть , что все операторы мы используем , здесь (
PU
,PO
,PB
,DQ
,EN
,X
) можно использовать с_
в форме лямбда - выражения. Таким образом, мы можем сопоставить математические преобразования с инклюзивным диапазоном, который мы построили ранее.Нам также необходимо проверить
i%2
внутри цикла, но это легко сделать с побитового И:iBA1
.Положить их вместе
Полный код с некоторыми добавленными пробелами:
источник
-S
?a*b
есть_V_VRVENCGaRLbPU1
,,a
есть_MUENZGa
,aJ" "
естьaJ_VRVk
, иa@i
что - то вроде_V_VRVaZCGi
, хотя я не могу вполне работать старшинство без скобок еще. Кроме того, смутное представление о том, что я могу получить перестановки диапазона (созданные, как указано выше, используя эквивалент,(a*a)
) и использовать их для выбора правильной перестановки для каждой строки.CJam, PCRE, длина 8, трещины
Пример вывода для 4:
источник
CJam, PCRE, длина 9, трещины
Пример вывода для 4:
Теперь
{|}
тоже забанены.источник
me
иmq
для аппроксимации числа, поэтому он был очень длинным (~ 20 Кбайт).Mathematica, длина регулярного выражения 11, неконкурентоспособная , с трещинами
PCRE аромат:
Правильным решением будет функция, которая принимает целое число и возвращает вывод в виде вложенного списка, например:
источник
тинилисп , регулярное выражение длина 3 ( трещины )
Вы можете проверить код tinylisp на сайте Try it online!
Регекс (любой вкус)
Время идти в хардкор.
Выход
Решение определяет функцию, которая принимает один целочисленный аргумент и возвращает такой список (для n = 4):
Мой оригинальный код использует ту же основную идею, которую придумал Брайан МакКатчон, создавая списки и оценивая их. Вот это в одной строке:
Я использовал полный метод construct-and-eval один раз, чтобы определить макрос,
d'
который делает определения похожимиd
, но принимает свои аргументы в виде списка: так что вместо этого(d x 42)
вы можете сделать(d'(x 42))
. Тогда нужно было просто переписать любые списки в определениях, которым может понадобиться пробел:(q(a b))
->(c a(q(b)))
->(c(h(q(a)))(q(b)))
.источник
Python3, длина 162 (треснул!)
Regex:
^([^"' #]){24}"(?1){11}i%n(?1){4}2\*n-(?1){4}i%n(?1){10}i\/n(\)\/\/1)(?1){5}(?2)(?1){3}2\*\(i%n\)(?1){4}[int()2\/]{16}for i in range\(j,(?1){4}\]\)(?1){6}\"\*n\)$
Хорошо, я знаю, это довольно долго. К счастью, это не будет взломано в течение недели ...: D.
Думаю, я нигде не ошибся, что позволило бы получить лазейку в ответах.
Выходной формат
Оригинальный код:
n=int(input());j=0;exec("print([int(i%n+1+(2*n-(2*(i%n)+1))*((((i/n)//1+1)/2)//1)+(2*(i%n)+1)*int(int(i/n)/2))for i in range(j,j+n)]);j+=n;"*n)
источник