Вызов
Для этой задачи гористая строка - это строка, которая соответствует правилу грамматики, M: x(Mx)*
где в каждом произведении все x имеют одинаковый символ. При отступе горная строка может выглядеть примерно так:
A
B
C
D
C
E
F
E
C
B
A
Как вы можете видеть, это выглядит как гора со стороны.
Формальное определение
- Любой персонаж
a
- гористый. - Если
S
это горная строка иa
символ, тоaSa
она гористая, где сопоставление представляет собой конкатенацию строк. - Если
aSa
иaTa
есть горные нити, тоaSaTa
это гористая нить. Обратите внимание, что это правило подразумевает, что этот шаблон выполняется для любого количества повторений. (то естьaSaTaUa
,aSaTaUaVa
,aSaTaUaVaWa
... все горы.)
Примеры
Все палиндромы нечетной длины горные, например:
t
a
c
o
c
a
t
qwertytrasdfdgdsarewqjklkjq
это менее тривиальный пример:
q
w
e
r
t
y
t
r
a
s
d
f
d
g
d
s
a
r
e
w
q
j
k
l
k
j
q
Пример выходов
a ==> true
aaa ==> true
mom ==> true
tacocat ==> true
qwertytrasdfdgdsarewqjklkjq ==> true
wasitacaroraratisaw ==> true
abcbcbcbcba ==> true
aaaaabcbbba ==> true
<empty string> ==> false
aa ==> false
pie ==> false
toohottohoot ==> false
asdfdghgfdsa ==> false
myhovercraftisfullofeels ==> false
правила
- Это проблема решения, поэтому любое представление true или false является допустимым выводом, если оно является правильным, непротиворечивым, однозначным и программа завершается за конечное время. Обязательно укажите соглашение о выходе с вашим решением.
- Должно быть тривиально определять, указывает ли выход истину или ложь, не зная, что является входной строкой. Обратите внимание, что это не означает, что истинные или ложные результаты должны быть постоянными, однако соглашение «печатать гористую строку, если строка гористая, и не горная строка, если не гористая», является запрещенной лазейкой по очевидным причинам.
- С другой стороны, соглашение вроде «выдает исключение для ложного и беззвучно завершает работу для истины» было бы хорошо, а также «печатает один символ для истины и все остальное для ложного»
- Это код гольф, поэтому выигрывает самая короткая программа.
- Стандартные лазейки запрещены.
code-golf
string
decision-problem
Beefster
источник
источник
aaa
бы неплохо создать тестовый пример , где один и тот же символ должен использоваться на нескольких уровнях.wasitacaroraratisaw
? Это кажется мне горнымwasitacaroraratisaw
действительно гористый AFAICTaaa
заставляют это не работать.Ответы:
Japt v2 ,
1413 байтПроверьте это онлайн!
источник
Чистый ,
94898780 байтПопробуйте онлайн!
источник
Perl, 22 байта
Включает
+
в себя дляp
Отпечатки 1 за правду, ничего за ложь
источник
Brain-Flak , 78 байт
Попробуйте онлайн!
Печатает 1 за правду, ничего за ложь.
Чтобы проверить гористое слово, достаточно предположить, что слово спускается с горы, когда это возможно.
источник
Python 2 ,
8983 байтаПопробуйте онлайн!
Спасибо ovs за 6 байтов.
источник
Пролог (SWI) , 29 байт
Попробуйте онлайн!
Эта программа определяет правило DCG,
a//0
которое соответствует любой строке (списку символов), которая является горной строкой.объяснение
Для этой программы я использую немного другое, но эквивалентное определение для горных нитей, чем то, что описано в задании: горная строка - это символ,
c
за которым следует число (может быть ноль) горных нитей сc
прикрепленными на концах. В более кратких обозначениях, полученных из регулярных выражений, горная строка должна соответствовать шаблону,c(Mc)*
гдеM
есть горная строка, и*
означает, что выражение в скобках повторяется ноль или более раз. Обратите внимание, что хотя каждый из нихc
должен быть одного и того же символа, каждыйM
не обязательно должен быть одной и той же горной строкой.Доказательство эквивалентности
Ясно, что правила 1 и 2 из соревнования эквивалентны моему правилу, где
Mc
происходит ноль и один раз соответственно.В случае, когда гористая строка
Mc
встречается,n
когдаn > 1
строка может быть переписана так, какcMcSc
если быS
это было последнееn - 1
время,Mc
за исключением последнегоc
(обратите внимание, чтоM
это любая горная строка и не обязательно такая же, как и другиеM
). ПосколькуM
горная нить, по правилу 2,cMc
должна быть гористая нить. ЛибоS
является горной строкой, в этом случаеcSc
является горной строкой, либоS
ее можно переписать так, какcMcTc
если быT
это было последнееn - 2
время,Mc
за исключением последнегоc
. Эта линия рассуждений может продолжаться до тех пор, пока не будет гарантированно быть горной строкой.Mc
однажды, что означало бы, что это также должно быть гористым. Таким образом, посколькуcMc
он гористый, а еслиcMc
иcM'c
гористый, тоcMcM'c
должен быть гористым, вся цепочка должна быть горной.Для обратного, для строки,
cScTc
гдеcSc
иcTc
являются гористыми, то либоcSc
является горной строкой по правилу 2, либо по правилу 3. Если это горная строка по правилу 2, тоS
также должна быть горная строка. Если по правилу 3 это гористая нить, то онаcSc
должна иметь форму, вcUcVc
которойcUc
иcVc
есть гористая нить. Поскольку длиннееcUc
иcVc
должно быть не менее чем на два символа короче, чем дляcSc
правила 3, требуется применение не менее 5 символов, то после конечного числа применений правила 3 каждая строка междуc
s, выбранными применениями правила 3, должна быть горной строка. Та же самая линия рассуждения может быть применена кcTc
таким образом, строка по моему определению гористая.Поскольку любая строка, которая соответствует моему определению, является горной, а мое определение соответствует всем горным строкам, она эквивалентна той, которая приведена в вопросе.
Объяснение кода
В целом
a//0
правило DCG, определенное в первой строке, соответствует любой горной строке.+//1
Правило DCG (как предикаты, правила DCG могут дать имена операторов ), определенное на вторую линии, соответствует любой строке , которая состоит из последовательности нуля или более гористых строк с характером , переданным в качестве ее аргументовX
пришитых концов их , Или заимствовать-как регулярные выражения обозначения , которые я использовал выше,a//0
спички ,c(Mc)*
но аутсорсинг работы фактически соответствует силе(Mc)*
в+//1
который принимает вc
качестве аргументаX
.Строки за строкой коды ведут себя следующим образом:
Эта строка определяет правило DCG
a
. В[X]
гласит , что первый символ должен быть равен в настоящее время неопределенной переменнойX
. Это приводит к тому,X
что устанавливается равным первому символу. Затем+X
оператор утверждает, что остальная часть строки должна соответствовать правилу DCG+//1
с символом,X
установленным в качестве аргумента.Эта строка определяет
+//1
правило DCG.;
Представляет собой или в Прологе , который означает , что строка может соответствовать либо[]
илиa,[X],+X
.[]
Представляет собой пустую строку , так+//1
всегда способен согласовать пустую строку. Если строка не пуста, то ее начало должно совпадать,a//0
и поэтому она должна быть горной. После этого должен следовать любой установленный символX
. Наконец, остальная часть строки должна совпадать+X
.источник
Шелуха , 15 байт
Попробуйте онлайн! Вывод типа занимает около 40 секунд, так что наберитесь терпения.
объяснение
Идея заключается в том , чтобы повторно заменить подстроку формы
aba
сa
пока это уже не возможно. Ввод является горным, если и только если это приводит к односимвольной строке (что иε
проверяет). Единственная опасная ситуация - когда у нас есть строка, подобная этой, гдеaba
, кажется, нет пика:К счастью, мы всегда можем превратить его в один:
источник
true
случаев и не было бы "последовательным".Сетчатка 0.8.2 , 15 байт
Попробуйте онлайн! Тривиальный порт ответа @ETHproductions 'Japt.
источник
JavaScript (Node.js) , 53 байта
Я полагаю, это почти самый простой способ сделать это?
Попробуйте онлайн!
JavaScript (Node.js) , 72 байта
Менее тривиально, но гораздо дольше.
Попробуйте онлайн!
источник