Herausforderung
Für diese Herausforderung ist eine gebirgige Zeichenfolge eine Zeichenfolge, die der Grammatikregel entspricht, bei der M: x(Mx)*
bei jeder Produktion alle x das gleiche Zeichen sind. Wenn eine gebirgige Zeichenfolge eingerückt ist, sieht sie möglicherweise folgendermaßen aus:
A
B
C
D
C
E
F
E
C
B
A
Wie Sie sehen, sieht es von der Seite ein bisschen aus wie ein Berg.
Formale Definition
- Jedes einzelne Zeichen
a
ist bergig. - Wenn
S
es sich um eine bergige Zeichenfolge handelt und wenn es sicha
um ein Zeichen handelt, handelt es sich um eine bergige ZeichenfolgeaSa
, bei der das Nebeneinander die Verkettung der Zeichenfolgen darstellt. - Wenn
aSa
undaTa
sind bergige Saiten, dannaSaTa
ist eine bergige Saite. Beachten Sie, dass diese Regel impliziert, dass dieses Muster für eine beliebige Anzahl von Wiederholungen gilt. (dhaSaTaUa
,aSaTaUaVa
,aSaTaUaVaWa
... sind alle gebirgig.)
Beispiele
Alle ungeraden Palindrome sind bergig, zum Beispiel:
t
a
c
o
c
a
t
qwertytrasdfdgdsarewqjklkjq
ist ein weniger triviales Beispiel:
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
Beispielausgaben
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
Regeln
- Dies ist ein Entscheidungsproblem, daher ist jede Darstellung von wahr oder falsch eine gültige Ausgabe, solange sie korrekt, konsistent und eindeutig ist und das Programm in einer endlichen Zeitspanne endet. Stellen Sie sicher, dass Sie Ihre Ausgabekonvention mit Ihrer Lösung angeben.
- Es sollte trivial sein zu bestimmen, ob die Ausgabe true oder false anzeigt, ohne dass die Eingabezeichenfolge bekannt sein muss. Beachten Sie, dass dies nicht bedeutet, dass die wahren oder falschen Ausgaben konstant sein müssen. Die Konvention "Drucken einer Gebirgszeichenfolge, wenn die Zeichenfolge bergig ist, und einer nicht bergigen Zeichenfolge, wenn sie nicht bergig ist" ist jedoch aus offensichtlichen Gründen eine verbotene Lücke.
- Auf der anderen Seite wäre eine Konvention wie "wirft eine Ausnahme für falsch und beendet stillschweigend für wahr" in Ordnung, ebenso wie "druckt ein einzelnes Zeichen für wahr und alles andere für falsch".
- Dies ist Codegolf, also gewinnt das kürzeste Programm.
- Standardlücken sind verboten.
code-golf
string
decision-problem
Beefster
quelle
quelle
aaa
wäre gut, wo der gleiche Charakter auf mehreren Ebenen verwendet werden muss.wasitacaroraratisaw
? Es scheint mir boshaftwasitacaroraratisaw
ist in der Tat bergig AFAICTaaa
diesem funktioniert das nicht.Antworten:
Japt v2 ,
1413 BytesOnline testen!
quelle
Sauber ,
94898780 BytesProbieren Sie es online!
quelle
Perl, 22 Bytes
Enthält
+
fürp
Gibt 1 für wahr, nichts für falsch aus
quelle
Gehirn-Flak , 78 Bytes
Probieren Sie es online!
Gibt 1 für wahr, nichts für falsch aus.
Um ein bergiges Wort zu verifizieren, reicht es aus, anzunehmen, dass das Wort, wann immer möglich, den Berg hinuntergeht.
quelle
Python 2 ,
8983 BytesProbieren Sie es online!
Danke an ovs für 6 Bytes.
quelle
Prolog (SWI) , 29 Bytes
Probieren Sie es online!
Dieses Programm definiert eine DCG-Regel
a//0
, die mit jeder Zeichenfolge (Liste von Zeichen) übereinstimmt, die eine bergige Zeichenfolge ist.Erläuterung
Für dieses Programm verwende ich eine etwas andere, aber äquivalente Definition für Gebirgszüge als in der Herausforderung beschrieben: Ein Gebirgszug ist ein Zeichen,
c
auf das eine Anzahl (möglicherweise Null) von Gebirgszügen folgt, diec
an den Enden angeheftet sind. In einer knapperen, von Regex abgeleiteten Notation muss eine Gebirgszeichenfolge mit dem Muster übereinstimmen,c(Mc)*
in demM
sich eine Gebirgszeichenfolge befindet. Dies*
bedeutet, dass der Ausdruck in Klammern null oder mehrmals wiederholt wird. Beachten Sie, dass jedesc
Zeichen dasselbe Zeichen sein muss,M
aber nicht dieselbe Gebirgszeichenfolge.Äquivalenznachweis
Es ist klar, dass die Regeln 1 und 2 aus der Herausforderung meiner Regel entsprechen, in
Mc
der sie null bzw. einmal vorkommen.In dem Fall, dass die Gebirgszeichenfolge
Mc
vorkommenden
Zeiten hat, in denenn > 1
die Zeichenfolge dann umgeschrieben werden kann, wiecMcSc
inS
den letztenn - 1
Zeiten,Mc
die ausschließlich der letzten auftretenc
(beachten Sie, dassM
es sich um eine beliebige Gebirgszeichenfolge handelt, die nicht unbedingt dieselbe wie die andere istM
). DaM
es sich um eine Bergkette handelt,cMc
muss es sich nach Regel 2 um eine Bergkette handeln. EntwederS
ist ein bergiger String , in dem FallcSc
ein bergiger String oderS
kann wie folgt umgeschrieben werden ,cMcTc
woT
sind die letzteren - 2
Zeiten , dieMc
die letzte treten ohnec
. Diese Argumentation kann so lange angewendet werden, bis eine Saite enthält, die nicht unbedingt bergig istMc
einmal, was bedeuten würde, dass es auch bergig sein müsste. DacMc
also bergig ist und wenncMc
undcM'c
bergig sind, danncMcM'c
muss der ganze Faden bergig sein.Für die Umkehrung ist für eine Zeichenfolge,
cScTc
in dercSc
undcTc
bergig sind,cSc
nach Regel 2 oder nach Regel 3 entweder eine bergige Zeichenfolge. Wenn es sich nach Regel 2S
um eine bergige Zeichenfolge handelt, muss es sich auch um eine bergige Zeichenfolge handeln. Wenn es eine bergige Zeichenfolge von Regel 3 danncSc
von der Form sein muss ,cUcVc
wocUc
undcVc
Berg Strings ist. Da das längere voncUc
undcVc
mindestens zwei Zeichen kürzer sein muss alscSc
und Regel 3 mindestens 5 Zeichen erfordert, muss nach einer endlichen Anzahl von Anwendungen von Regel 3 jede Zeichenfolge zwischen denc
durch Anwendungen von Regel 3 ausgewählten Zeichenfolgen ein Berg sein Zeichenfolge. Die gleiche Argumentation kann angewendet werdencTc
daher ist die Saite meiner Definition nach bergig.Da jede Zeichenfolge, die meiner Definition entspricht, bergig ist und meine Definition allen bergigen Zeichenfolgen entspricht, entspricht sie der in der Frage angegebenen.
Erklärung des Codes
Insgesamt entspricht die
a//0
in der ersten Zeile definierte DCG-Regel einer beliebigen Gebirgszeichenfolge. Die in Zeile 2 definierte+//1
DCG-Regel (wie Prädikate, DCG-Regeln können mit Operatornamen versehen werden ) stimmt mit jeder Zeichenfolge überein, die aus einer Folge von null oder mehr bergigen Zeichenfolgen besteht, wobei das Zeichen als ArgumentX
an deren Enden angefügt wird . Oder zu leihen , um die regex-artige Notation ich oben verwendet,a//0
Streichhölzerc(Mc)*
aber auslagert die Aufgabe tatsächlich passend die(Mc)*
zu+//1
dem nimmtc
als ArgumentX
.Zeile für Zeile verhalten sich die Codes wie folgt:
Diese Zeile definiert die DCG-Regel
a
. Der[X]
Status, dass das erste Zeichen gleich der aktuell undefinierten Variablen sein mussX
. Dies führtX
dazu, dass der erste Buchstabe gleichgesetzt wird. Das+X
then gibt an, dass der Rest der Zeichenfolge mit der DCG-Regel+//1
mit dem Zeichen übereinstimmen muss, dasX
als Argument festgelegt ist.Diese Zeile definiert die
+//1
DCG-Regel. Das;
stellt ein oder in Prolog dar, was bedeutet, dass die Zeichenfolge entweder mit[]
oder übereinstimmen kanna,[X],+X
. Das[]
stellt die leere Zeichenfolge dar und kann daher+//1
immer mit der leeren Zeichenfolge übereinstimmen. Wenn die Zeichenfolge nicht leer ist, muss der Anfang der Zeichenfolge übereinstimmena//0
und eine bergige Zeichenfolge sein. Darauf muss dann das Zeichen folgen, auf das eingestelltX
ist. Schließlich muss der Rest der Zeichenfolge übereinstimmen+X
.quelle
Husk , 15 Bytes
Probieren Sie es online! Die Eingabe dauert ungefähr 40 Sekunden. Seien Sie also geduldig.
Erläuterung
Die Idee ist, wiederholt eine Teil Form zu ersetzen
aba
mita
bis dies nicht mehr möglich. Die Eingabe ist genau dann bergig, wenn dies zu einer Zeichenfolge mit nur einem Zeichen führt (wasε
testet). Die einzige gefährliche Situation ist, wenn wir eine Saite wie diese haben, in deraba
es keinen Peak zu geben scheint:Glücklicherweise können wir es immer in eines umwandeln:
quelle
true
Fälle zurückzugeben und nicht anders wäre "konsistent".Retina 0.8.2 , 15 Bytes
Probieren Sie es online! Triviale Portierung der Japt-Antwort von @ETHproductions.
quelle
JavaScript (Node.js) , 53 Byte
Ich nehme an, dies ist fast die einfachste Methode, dies zu tun.
Probieren Sie es online!
JavaScript (Node.js) , 72 Byte
Weniger trivial, aber viel länger.
Probieren Sie es online!
quelle