После слухов, что у Codegolf будет турнир Rock-Paper-Scissors, вы заглядываете в тему слов без квадратов . Слово из букв R
, P
, S
является бесквадратным , если она не содержит последовательность , которая повторяется дважды. То есть слово нельзя записать как
a x x b
где a
и b
слово любой длины и x
слово длины по крайней мере один, все из букв R
, P
, S
.
задача
Написать программу , которая генерирует бесквадратные слова из букв R
, P
, S
длины , n
где число 1 <= n <= 10
берется в качестве входных данных.
пример
Например, слова без квадратов длиной 3
RPR
, RSR
, RPS
, RSP
, SPS
, SRS
, SRP
, SPR
, PRP
, PSP
, PSR
,PRS
и те из длины 4
RPRS
, RPSR
, RPSP
, RSRP
, RSPR
, RSPS
, PRPS
, PRSR
, PRSP
, PSRP
, PSRS
, PSPR
, SRPR
, SRPS
, SRSP
, SPRP
, SPRS
,SPSR
и обратите внимание, что, например, SPSP
или PRPR
не квадратные
правила
- Это Codegolf, самая короткая программа выигрывает, стандартные лазейки закрыты.
- Вы можете напечатать слова или создать их в памяти.
- Ваша программа может быть написана как функция.
Ссылки
Википедия на слова без квадратов
Количество трехзначных слов данной длины без квадратов приведено в https://oeis.org/A006156.
n>3
бы неплохо использовать тестовый сценарий, поскольку возникла путаница относительно повторяющихся символов и повторяющихся последовательностей.Ответы:
Рубин, 39 байт
Эта смешно неэффективная функция генерирует все строки длины N, которые расположены в алфавитном порядке между N Ps и N Ss, а затем отфильтровывает подавляющее большинство, которые содержат символы не-RPS. Фактическая проверка бесквадратной просто использует обратную ссылку РегВыра:
(.+)\1
.Более идиоматические 65 байтов, которые заканчиваются за разумное количество времени для N = 10:
Изменить: Сохраненный байт благодаря G B.
источник
Желе ,
1514 байтПопробуйте онлайн!
Как это работает
источник
Сетчатка , 28 байт
Попробуйте онлайн!
Принимает участие в одинарных .
объяснение
Это создает все строки, состоящие
RPS
из длиныn
. То, как мы это делаем, состоит в том, что мы неоднократно заменяем первое1
в каждой строке. Давайте подумаем о строке как<1>
, где<
находится все перед совпадением и>
все после совпадения (они$`
и$'
соответственно в синтаксисе подстановки регулярных выражений, но они выглядят менее интуитивно понятными). Заменим1
сR>¶<P>¶<S
, где¶
находятся символы перевода строки. Таким образом, полный результат этой замены на самом деле<R>¶<P>¶<S>
, что три копии этой линии, с1
заменитьR
,P
,S
соответственно, в каждом из трех экземпляров. Этот процесс останавливается после1
замены всех s.Наконец, мы просто отбрасываем все строки, содержащие повторение.
источник
1(.*)
на$1R¶$1P¶$1S
но количество байтов такое же.Шелуха ,
1514 байт-1 байт благодаря Zgarb!
Попробуйте онлайн!
Создает все возможные последовательности правильной длины и сохраняет только те, чьи все подстроки (кроме пустой) составлены из двух разных половинок.
Черт, я действительно хотел победить Джелли здесь.
источник
Mathematica, 61 байт
Попробуйте онлайн!
источник
Java 8,
285277 байтХотя Java почти всегда многословен, в этом случае это определенно не тот язык, который подходит для такой задачи. Генерация перестановок с подстроками плохо влияет на производительность и неэффективна.
Хотя определенно можно сыграть в гольф еще.
-8 байт благодаря @Jakob .
Объяснение:
Попробуй это здесь. (Производительность слишком плохая для тестовых случаев выше 3, но она работает локально ..)
источник
n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)
. Кроме того , почему бы не реорганизовать ,for(;i<1;p(...));
чтобыwhile(i<l)p(...);
?for(;...;)
вне codegolfing-habbit, чтобы быть честным. В худшем случае это тот же счетчик байтов, чтоwhile(...)
и в лучшем случае, что-то может быть помещено в цикл for для сохранения байтов. Поэтому я стараюсь вообще не использоватьwhile
в кодгольфинге, потому что в любом случае это никогда не помогает подсчету байтов. Он либо увеличивает его, либо остается прежним, так что лично я не беспокоюсь о лучшей читаемости. ;)PRS
последовательностей, тогда как ваш исходный цикл генерировал последовательность с 2 ^ ( n -2) последовательностями.n
раз "PRS" правильно. Мой генерировал больше, потому что он экономил байты (и снижал производительность, но кому это нужно с помощью codegolf). ;)Python 3 ,
9796 байтВозвращает набор строк.
Попробуйте онлайн!
источник
Юлия 0,65 байт
Попробуйте онлайн!
источник
Perl 5 , 37 байт
Попробуйте онлайн!
Функция возвращает массив свободных квадратных строк.
Разъяснение:
glob
Генерирует все комбинации R, S, P & с длиной , равной ко входу. Вgrep
заявлении отфильтровывает те, которые не квадратные бесплатно.источник
R , 97 байт
Попробуйте онлайн!
combn(rep(c('p','r','s'),n),n,paste,collapse='')
вычисляет всеn
-character струнамp
,r
,s
, но , к сожалению , дублирует многие (*), поэтому мы uniquify, и принять те , которые соответствуют регулярному выражению(.+)\1
, с помощью сопоставления Perl-стиль, то мы выводим из полученного списка.(*) технически он генерирует все комбинации
3n
букв поp,r,s
3 раза, взятыеn
за раз, затем применяетсяpaste(..., collapse='')
к каждой комбинации, а не3^n
напрямую вычисляет строки, но это сложнее, чемexpand.grid
(истинное декартово произведение).источник
JavaScript (Firefox 30-57), 69 байт
Поскольку все подстроки слов без квадратов также без квадратов, проверка может быть выполнена рекурсивно.
источник
Haskell ,
10198 байтПопробуйте онлайн!
источник
JavaScript (ES6), 93 байта
Преобразует все целые числа от 0 до 3ⁿ в основание 3 (с перевернутой подстановкой), используя в
RPS
качестве цифр, и фильтрует их для слов без квадратов.источник
Юлия, 88
Ничего фантастического.
источник
C # / LINQ, 169
Там должен быть лучший способ сделать это :)
источник
F #, 143
источник
к, 56 байт
Отсутствие нативного регулярного выражения на этот раз оставляет k далеко позади кривой. Я выбрал рекурсивное решение, поскольку символы для его реализации были сохранены с помощью более простой проверки без использования квадратов.
является тернарным оператором k, здесь мы делаем интересные вещи для ненулевой длины и возвращаем одну пустую строку, если запрашиваются слова нулевой длины.
берёт декартово произведение "RPS" и всех n-1 длинных квадратичных слов. , /: \: соединяет каждый элемент справа налево, давая массив длиной 3 массива n. , / сглаживает это в массив длины 3n.
берет первые n букв каждой строки и сравнивает их со вторыми n, а затем сокращает массив до тех мест, где они не совпадают. Поскольку мы знаем, что предыдущий результат не содержит квадратов, необходимо сопоставлять только подстроки, начинающиеся с первого символа - упрощение проверки здесь стоило символов, потраченных на реализацию рекурсии. В заключение,
применяет лямбду к начальному результирующему набору слева от нее, перебирая длину каждой подстроки от 1 до (длина слова) -1 ! x генерирует список от 0 до x-1, затем 1_ удаляет первый элемент (поскольку подстроки длины 0 всегда будут совпадать)
Пожертвовав несколькими символами, мы можем использовать .zs для самостоятельной ссылки, а не полагаться на имя функции, и вместо проверки подстрок длиной до n-1 проверяем только этаж (n / 2) на производительность. Он находит всю длину 49 слов (из них 5207706) примерно за 120 секунд на 7700k, выше того, что я сталкиваюсь с пределом 4GB свободного 32-битного k.
источник
Python 2 , 99 байт
Попробуйте онлайн!
источник