Это было вдохновлено частью задачи команды № 6 конкурса ARML 2016 года.
Вот проблема:
Вам дана «последовательность символов подстановки», которая представляет собой последовательность цифр и другого символа. Строка соответствует этой последовательности подстановочных знаков следующим псевдокодом:
w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]
Куда '?' это персонаж по вашему выбору.
С точки зрения регулярных выражений, просто представьте, что '?'
это так '.'
.
Задача состоит в том, чтобы найти все квадратные числа (требование до 1 миллиона), чьи десятичные строковые представления соответствуют этой последовательности символов подстановки. «Подстановочный знак» может быть любым символом ASCII по вашему выбору, если, конечно, это не цифра.
Так , например, 4096
спички 4**6
и , 4*9*
но 4114
не соответствует ни.
вход
Ввод будет дан как последовательность, соответствующая регулярному выражению [0-9?]+
. Это может быть строка, массив символов или байтовый массив символов в ASCII.
Вывод
Выходными данными будет список / набор / массив чисел, которые вы хотите разделить, которые являются идеальными квадратами и соответствуют последовательности символов подстановки.
Примеры допустимых входных данных:
1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]
Примеры действительных результатов:
[1, 4, 9]
1 4 9
1, 4, 9
1-4-9
и т.п.
Характеристики
- Вы не можете использовать встроенные функции для поиска списка квадратов в определенном диапазоне.
- Применяются стандартные лазейки
- Вы должны быть в состоянии обработать до 1 000 000 (1 миллион)
- Если предоставляется вход
1******
, это правильно для печати[1000000]
. Также правильно печатать[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
- Последовательности подстановочных знаков никогда не начинаются с подстановочного знака; то есть они всегда будут соответствовать строкам одинаковой длины.
Тестовые случаи
4**6 -> [4096, 4356]
1**1 -> [1521, 1681]
1** -> [100, 121, 144, 169, 196]
9****9 -> [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9*** -> [919681, 929296]
1**0* -> [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4 -> [91204, 94864, 97344]
выигрыш
Самая короткая (действительная) (рабочая) подача до 14 февраля, тай-брейк за самую раннюю подачу.
?
прояснения этого вопроса - указать, что должен выбрать ответчик.25
правильный ответ для,***
но не для*2*
?{4, "w", "w", 6}
(или еще лучше{4, w, w, 6}
), а не массивом символов, таким как{"4", "w", "w", "6"}
?Ответы:
05AB1E , 22 байта
Вероятно, здесь есть много возможностей для улучшения.
Любой не цифра в порядке подстановочного знака.
Попробуйте онлайн!
Объяснение, чтобы прийти после дальнейшего игры в гольф.
источник
Mathematica, 44 байта
Входные данные представляют собой список цифр с
_
(без кавычек) в качестве подстановочного знака. например{4, _, _, 6}
объяснение
Создать список
{1, 2, 3, ... , 1000}
Квадрат это. (список всех квадратов от 1 до 1 000 000)
Разбейте каждый квадрат на список цифр.
Найдите те, которые соответствуют шаблону, указанному на входе.
Распечатайте их.
источник
Брахилог , 23 байта
Попробуйте онлайн!
объяснение
Другой формат ввода, 13 байтов
В зависимости от того, что вы считаете допустимым в качестве входных данных, вы можете сделать это:
Попробуйте онлайн!
это в основном вторая часть ответа выше, со списком в качестве входных данных, содержащим цифры и переменные, в которых используются подстановочные знаки.
Я не считаю это действительным, потому что в Brachylog есть только 26 имен переменных (заглавные буквы), поэтому это не сработает, если у вас будет более 26 wilcards.
источник
true.
), но я не использовал языки, которые требуют этого раньше. Я попытаюсь найти какую-то ссылку, чтобы определить, как я должен набрать это, но было бы разумно, чтобы было забито как 23, так что я буду держать это при этом.Perl 6 ,
3026 байтовСпасибо @ b2gills за -4 байта!
Использует точку как символ подстановки, так что ввод может использоваться как регулярное выражение:
Попробуйте онлайн .
Вариант, который принимает звездочку как подстановочный знак (как было предложено в предыдущей редакции описания задачи), составляет 42 байта:
источник
{ ... }("9*9***")
) или назначить его переменной / символу для дальнейшего использования. Обратите внимание, что Perl 6 - это отдельный язык от Perl, поэтому он не будет работать с интерпретатором Perl.sudo apt-get install rakudo
получал предполагаемый интерпретатор Perl6 ... Когда я кладуperl6
команду в свой терминал, он запускает то, что кажется интерпретатором Perl6, но я не знаю, как его использовать. Я знаю, что это лямбда, но я не знаю, как это назвать.perl6 foo.p6
. Вы также можете протестировать его в оболочке, напримерperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
Рубин, 54 байта
Функция, которая принимает строковый аргумент. Попробуйте онлайн.
источник
#
делает оставшуюся часть комментария.Пакетный, 109 байтов
Используется
?
как подстановочный знак. Работает, создав 1000 файлов. Имя файла - это квадратное число, а расширение файла - это квадратное число с$
суффиксом. Это связано с тем, что сопоставление с образцом в Batch считает трейлинг?
s необязательным, поэтому1?
будет совпадать1
и с16
;$
поэтому заставляет матч , чтобы быть точным. Однако мы не хотим выводить$
, поэтому мы просто выводим имя файла только без расширения.источник
JavaScript (ES6),
6866 байтРЕДАКТИРОВАТЬ: Обновил мое решение ниже, после того, как вдохновил ответ JungHwan Мин . Теперь он совместим с ES6.
Принимает ввод в формате
'1..4'
где.
подстановочный знак.Вместо итерации до 1e6 и квадратного укоренения эта итерация до 1e3 и квадратов.
Показать фрагмент кода
JavaScript (ES7),
7169 байтСоздает массив чисел от 0 до 1e6, затем фильтрует его по квадратам и соответствует шаблону.
Это ужасно медленно, потому что оно всегда повторяется до 1e6.
Показать фрагмент кода
источник
**
, что работает, потому что это дает мне"SyntaxError: expected expression, got '*'"
.1e6
...**
оператора не существует, по крайней мере, в моей системе.**
. Да, это ES7. Я обновлю заголовок. Вот список поддерживаемых в настоящее время браузеров developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Perl,
424538 байтРЕДАКТИРОВАТЬ: разъяснение Алекса, мы можем использовать точку в качестве символа подстановки, который сбрасывает операцию y //.
РЕДАКТИРОВАТЬ: решение, которое использует звездочку в качестве символа подстановки и ожидает последовательность символов подстановки на STDIN
Этот, несомненно, оставляет много возможностей для улучшения, это довольно просто. Подстановочный знак ожидается в качестве аргумента командной строки с подстановочным знаком точки (что еще?).
источник
Python 3 -
9897 байтТребуется ввод наподобие «4..6».
источник
import re
иre.findall
; оптимизация с помощьюfrom...import *
фактически не оптимизирует его в этом случае.1....
, он дает1 4 9
и в16 25
качестве правильных ответов, что не является правильным. Пожалуйста, исправьте вашу программу.1......
. Это возвращается[]
, но это должно дать[1000000]
. Это можно исправить стоимостью 0 байт, используяrange(0, 1001)
вместоrange(0, 1000)
.k - 28 символов
Пользы
?
как символ подстановки. Вlike
функции используется в?
качестве шаблона, и эта функция делает список первых 1001 квадратов (быть включены до оГО), отбрасывают их все строки, а затем проверяет , где они соответствуют шаблону.источник
type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":"
. Не могли бы вы предоставить ссылку на рабочий набор тестов или посмотреть, есть ли проблема?утилиты bash + Unix, 33 байта
Это использует "." в качестве символа подстановки.
Программа dc печатает квадратные числа в бесконечном цикле:
Вывод dc передается в grep, который печатает только квадраты, которые соответствуют требуемому шаблону.
Это работает, когда я запускаю его в реальной системе Linux или OS X (но это не работает в TIO, возможно, потому что программа dc пытается рекурсировать вечно, и я подозреваю, что TIO не хватает места в стеке для рекурсии и / или имеет проблема с нескончаемой трубой).
источник
dc
командой.--line-buffered
по обе стороны от^$1$
, но это не работает в любом случае.sed s/./0/g<<<$1
| grep ^ $ 1 $ Это использует длину шаблон для ограничения числа тестируемых номеров (4-символьные шаблоны проверяют только до 9999 и т. д.). Вот ссылка TIOgrep
. Тем не менее, поскольку в настоящее время это не самое короткое решение, я буду держать его на 33 байта для оценки. Похоже, работает для всех входов, так что хорошая работа!