Ist es ein holpriges Wort?

31

(Inspiriert von dieser Herausforderung bei Puzzling - SPOILERS für dieses Rätsel finden Sie weiter unten. Lesen Sie hier also nicht weiter, wenn Sie das Rätsel selbst lösen möchten!)

Wenn ein Buchstabe in einem Wort alphabetisch später als der vorherige Buchstabe im Wort vorkommt, nennen wir dies einen Anstieg zwischen den beiden Buchstaben. Andernfalls, auch wenn es derselbe Buchstabe ist , spricht man von einem Sturz .

Zum Beispiel hat das Wort ACEzwei Anstiege ( Azu Cund Czu E) und keine Anstiege , während THEes zwei Anstiege ( Tzu Hund Hzu E) und keine Anstiege hat.

Wir nennen ein Wort holprig, wenn sich die Abfolge von Anstieg und Abfall abwechselt. Zum Beispiel BUMPsteigt ( Bnach U), fällt ( Unach M), steigt ( Mnach P). Beachten Sie, dass es sich bei der ersten Sequenz nicht unbedingt um einen Anstieg handelt, sondern um einen BALDFall-Anstieg-Fall-Vorgang, der ebenfalls holprig ist.

Die Herausforderung

Geben Sie bei gegebenem Wort aus, ob es holprig ist oder nicht.

Eingang

  • Ein Wort (nicht unbedingt ein Wörterbuchwort), das nur aus ASCII-Buchstaben ( [A-Z]oder [a-z]Buchstaben) in einem geeigneten Format besteht .
  • Sie können wählen, ob die Eingabe nur in Groß- oder Kleinbuchstaben erfolgen soll, sie muss jedoch konsistent sein.
  • Das Wort wird mindestens 3 Zeichen lang sein.

Ausgabe

Ein Wert für Wahr / Falsch, der angibt , ob das Eingabewort holprig (wahr) oder nicht holprig (falsch) ist.

Die Regeln

  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

Beispiele

Wahrheit:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey:

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Bestenlisten

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

# Perl, 43 + 2 (-p flag) = 45 bytes

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

AdmBorkBork
quelle
Dangit. Dies wäre einfacher, wenn derselbe Brief weder steigen noch fallen würde.
mbomb007
Ich verstehe die angegebenen Beispiele nicht: Wenn BUMPin Truthy (dh Bumpy) aufgeführt, warum BUMPYin der Falsey-Liste? Was bedeutet "steigt und fällt abwechselnd"? Zwei Aufstiege können nicht hintereinander sein?
VolAnd
4
@VolAnd Ja, das bedeutet, dass auf einen Anstieg immer ein Rückgang folgt und umgekehrt. BUMPYist falsch, weil MPYes zwei aufeinander folgende Anstiege gibt. Mit anderen Worten, kein Teilstring der Länge 3 muss auf- oder absteigend sortiert werden, damit ein Wort holprig wird (mit Ausnahme des Sonderfalls, bei dem zwei aufeinanderfolgende Buchstaben identisch sind).
Martin Ender
Können Sie die Antwort auf die Puzzling.SE-Frage verderben, damit andere, die sie selbst lösen möchten, dies tun können?
OldBunny2800
1
@ OldBunny2800 Ich werde keinen vollständigen Spoiler einfügen (ich möchte meine Herausforderung hier nicht durch das Ausblenden wichtiger Informationen hinter einem Spoiler schwer lesbar machen), aber ich werde als Warnung einen zusätzlichen Text oben einfügen. Vielen Dank!
AdmBorkBork

Antworten:

31

MATL, 4 Bytes

d0>d

Erläuterung:

d     % Implicitly take input. Take difference between each element
 0>   % Check whether diff's are positive. Should result in [0 1 0 1 ...] pattern.
   d  % Again take the difference. Any consecutive rises or falls results in a 
      % difference of 0, which is a falsy value in MATL

Dies ist mein erster MATL-Eintrag, daher frage ich mich, wie viel sich von diesem naiven Port ausgehend von meinem MATLAB / Octave-Versuch (der wäre @(a)all(diff(diff(a)>0))) verbessern lässt . Beachten Sie, dass dies allnicht erforderlich ist, da eine Null ein Array falsch macht, sodass Ader MATL-Port leer ist.

Sanchises
quelle
Siehe die korrigierte Herausforderung. Es gab einen Tippfehler in einem Testfall. Ihr Ansatz war richtig. In der Tat d0>dsollte funktionieren (Sie brauchen nicht die Agemäß unserer Definition von Wahrhaftigkeit / Falschheit)
Luis Mendo
1
Gute Arbeit, Luis in seiner eigenen Sprache herausfordernd! Ich habe es schon einmal versucht, und das ist keine leichte Aufgabe. ;)
DJMcMayhem
@ DJMcMayhem Haha. Das ist es, was ich bekomme, wenn ich die Herausforderung zu schnell lese. Zu meiner Verteidigung ist es kontraintuitiv, dass zwei gleiche Buchstaben einen Sturz bedeuten. Und die (jetzt korrigierten) irreführenden Testfälle haben auch nicht geholfen :-)
Luis Mendo
1
@DJMcMayhem Danke - obwohl ich vielleicht nur Glück hatte, weil ich eigentlich nicht über aufeinanderfolgende gleiche Buchstaben
nachgedacht habe
1
@immibis In MATL (AB) und Octave, ja. Siehe diese Meta-Antwort.
Sanchises
24

JavaScript (ES6), 75 69 63 46 43 Byte

3 Bytes gespart dank Neil:

f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1

Destructuring the string parameter statt s.slice(1).


Bisherige Lösung:
17 Bytes gespart dank ETHproductions:

f=s=>s[2]?s[0]<s[1]^s[1]<s[2]&&f(s.slice(1)):1

Was passierte aus der vorherigen Lösung Schritt für Schritt:

f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b // (63) Original
f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(s[i]<s[i+1]))?f(s,i):b   // (61) No point in reassigning `a`, it's not used again
f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^s[i]<s[i+1])?f(s,i):b     // (59) Remove unnecessary parentheses
f=(s,i=0)=>s[i+2]&&(b=s[i++]<s[i]^s[i]<s[i+1])?f(s,i):b         // (55) `a` is now just a waste of bytes
f=(s,i=0)=>s[i+2]?(b=s[i++]<s[i]^s[i]<s[i+1])?f(s,i):b:1        // (56) Rearrange conditional expressions to allow for more golfing
f=(s,i=0)=>s[i+2]?(b=s[i++]<s[i]^s[i]<s[i+1])&&f(s,i):1         // (55) Rearrange conditional expression
f=(s,i=0)=>s[i+2]?(s[i++]<s[i]^s[i]<s[i+1])&&f(s,i):1           // (53) `b` is now also a waste of bytes
f=(s,i=0)=>s[i+2]?s[i++]<s[i]^s[i]<s[i+1]&&f(s,i):1             // (51) Remove unnecessary parentheses
f=s=>s[2]?s[0]<s[1]^s[1]<s[2]&&f(s.slice(1)):1                  // (46) Use `s.slice(1)` instead of `i`


Bisherige Lösungen:
63 Bytes dank ETHproductions:

f=(s,i=0,a=s[i++]<s[i])=>s[i+1]&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b

69 Bytes:

f=(s,i=0,a=s[i++]<s[i])=>i+1<s.length&&(b=a^(a=s[i]<s[i+1]))?f(s,i):b

75 Bytes:

f=(s,a=s[0]<s[1])=>{for(i=1;i+1<s.length&&(b=a^(a=s[i++]<s[i])););return b}

Alle Buchstaben in einem Wort müssen die gleiche Groß- und Kleinschreibung haben.

Hedi
quelle
2
Sie können noch ein Stück weiter Golf spielen: github.com/ETHproductions/golf/blob/gh-pages/misc/93014.js
ETHproductions
@ETHproductions Soll ich den Inhalt Ihres Links veröffentlichen?
Hedi
Sie können, wenn Sie
möchten
Kann !s[2]|...das gleiche tun wie s[2]?...:1?
Titus
1
Tut mir leid, dass ich zu spät zur Party f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil,
14

LabVIEW, 36 äquivalente Bytes

Golfen mit logischen Äquivalenzen:

Golf gespielt

Ungolfed:

ungolfed

Zuerst konvertieren wir in Kleinbuchstaben, dann in Bytearray. Schneiden Sie das erste Element des Byte-Arrays ab, da es keinen Präzedenzfall hat. Überprüfen Sie dann für jedes Element im Array, ob es größer als das vorherige ist (U8-Zeichen wird erwartungsgemäß in ASCII abgebildet), und speichern Sie das Ergebnis für die nächste Iteration sowie in einem Array, um die allgemeine Unebenheit anzuzeigen. Wenn die aktuelle und die vorherige Boolesche Prüfung gleich sind, beenden wir die Schleife und sie ist nicht holprig. Sonst ist es holprig!

ijustlovemath
quelle
1
Was für eine coole Sprache! Willkommen bei PPCG!
DJMcMayhem
1
Vielen Dank! Ich werde nie mit den 4-Byte-Antworten konkurrieren, aber es ist ein
guter
Sehen Sie hier . Deine Wertung ist definitiv falsch und übertrieben . Ich glaube nicht, dass Ihre Antwort wirklich 246450 - 246549 Bytes ist.
Erik der Outgolfer
Ich habe die Registerkarte "Speicher" verlassen, da ich nicht wusste, dass es für LabVIEW ein Konzept mit äquivalenten Bytes gibt. Zählt sie auf und bearbeitet die Antwort später.
ijustlovemath
1
@Erik Ich bin in Firefox unter Windows, aber das Öffnen auf Mobilgeräten bringt auch Probleme mit sich. Nur meta.ppcg.lol funktioniert. Jedenfalls ist dies für Kommentare unzulässig.
Fund Monica's Lawsuit
8

Python, 56 Bytes

lambda s:all((x<y)^(y<z)for x,y,z in zip(s,s[1:],s[2:]))

Alle Testfälle sind auf ideone

Zippt durch Dreiergruppen von Zeichen in s und prüft, ob alle Dreiergruppen linke und rechte Paare mit unterschiedlichen Anstiegs- / Abfall-Eigenschaften haben.
Funktioniert entweder für Groß- oder Kleinbuchstaben.

Jonathan Allan
quelle
6

Ruby, 57 48 Bytes

Erwartet, dass die Eingabe in Großbuchstaben erfolgt.

->s{!s.gsub(/.(?=(.)(.))/){($&<$1)^($1<$2)}[?f]}

Siehe es auf repl.it: https://repl.it/D7SB

Erläuterung

Der reguläre Ausdruck /.(?=(.)(.))/entspricht jedem Zeichen, auf das zwei weitere Zeichen folgen. (?=...)ist ein positiver Lookahead, was bedeutet, dass wir die folgenden beiden Zeichen abgleichen, sie jedoch nicht als Teil des Abgleichs "verbrauchen". In geschweiften Klammern, $&ist die abgestimmte text das erste Zeichen des Drei und $1und $2sind im Inneren des Vorgriffs - die erfassten Zeichen. Mit anderen Worten, wenn es sich um eine Zeichenfolge handelt "BUMPY", wird diese zuerst mit der Zeichenfolge übereinstimmen "B"(und sie einfügen $&) und sie erfassen "U"und "M"(und sie einfügen $1und $2). Als nächstes wird es passen "U"und zu erfassen "M"und "P", und so weiter.

Innerhalb des Blocks prüfen wir, ob das erste Zeichenpaar ( $&und $1) ein Anstieg und das zweite ( $1und $2) ein Abfall ist oder umgekehrt, ähnlich wie bei den meisten anderen Antworten. Dieser ^Ausdruck gibt trueoder zurück false, das in eine Zeichenfolge konvertiert und anstelle der Übereinstimmung eingefügt wird. Infolgedessen lautet unser Beispiel wie "BUMPY"folgt:

"truetruefalsePY"

Da wir wissen, dass die Eingabe nur in Großbuchstaben erfolgt, wissen wir, dass "f"sie nur als Teil von auftritt "false"und !result[?f]geben uns unsere Antwort.

Jordan
quelle
Wie funktioniert es?
GreenAsJade
1
@ GreenAsJade Ich habe meiner Antwort eine Erklärung hinzugefügt.
Jordanien
6

C #, 64 63 55 Bytes

unsafe bool B(char*s)=>1>s[2]||*s<s[1]!=*++s<s[1]&B(s);

-8 Bytes aus Scepheos Vorschlägen

Dies ist eine Portierung von Hedis Lösung für C #. Ich habe auch eine rekursive Lösung gefunden, aber die Rekursion war nicht so gut. Meine ursprüngliche Lösung ist unten.

My Original C #, 96 94 91 Bytes

unsafe bool B(char*s,bool f=1>0,int i=0)=>1>s[1]||(s[0]<s[1]?f:1>i?!(f=!f):!f)&B(s+1,!f,1);

-2 Bytes mit 1>0anstelle von true.

-3 Bytes aus Scepheos Vorschlägen für die Port-Lösung oben

Ruft sich selbst rekursiv auf und prüft, ob das Steigen / Fallen jedes Mal wechselt.

Ungolfed:

// unsafe in order to golf some bytes from string operations.
// f alternates with each recursive call
// i is 0 for the first call, 1 for all subsequent calls
unsafe bool B(char* s, bool f = 1 > 0, int i = 0) =>
    1 > s[1] ? 1 > 0// (instead of 1 == s.Length) check if s[1] = NULL, and return true.
    : (
        s[0] < s[1] ? f // Rising, so use f...
        : // Else falling
            1 > i ? !(f=!f) // But this is the first call, so use true (but flip f)...
            : !f // Not first call, so use !f...
    )
    & B(s+1, !f, 1) // ...AND the previous value with a recursive call
                    // s+1 instead of s.Substring(1)
;
Milch
quelle
Scheint, als ob der letzte auf den ?:Operator oder die Klammern verzichten kann:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
Scepheo
Eigentlich, obwohl ich das nicht testen kann, scheint die Manipulation des Zeigers noch knapper zu sein:unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
Scepheo
@Scepheo Ich habe StackOverflowExceptions mit diesen Vorschlägen erhalten, aber sie funktionieren mit booleschem ODER ||anstelle von bitweisem ODER |. Aktualisiert den Beitrag, danke.
Milch
6

C 59 Bytes

r;f(s)char*s;{for(r=0;r=*s?~r&1<<(*s>=*++s):0;);return!*s;}
Cleblanc
quelle
Die Lösung in 70 Bytes gibt 1 (True) für case zurück AAA- das erste "Falsey" in den Beispielen
VolAnd
Ich teste mit gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)und werde für aaa falsch und aufgeregt. In dieser Version ist Nicht-Null falsch und Null ist wahr. Eigentlich frage ich mich jetzt, ob das erlaubt ist.
Cleblanc
f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")In Visual Studio 2012 kompilierter Aufruf gibt einen Wert zurück 23, der behandelt werden kann, Trueaber in der Frage befindet sich dieser Wert im Abschnitt "Falsey", sodass ein Wert 0erwartet wird.
VolAnd
Ich habe falsch verstanden, was für True und Falsey erlaubt war. Jetzt habe ich den Beitrag gelesen und es scheint klar zu sein, welche Werte für "C" gelten müssen.
Cleblanc
Hier sind unsere Standarddefinitionen für Wahrhaftigkeit und Falschheit , basierend auf dem Metakonsens .
AdmBorkBork
5

Gelee , 6 Bytes

OI>0IẠ

Basierend auf der Antwort von @sanchises .

Probieren Sie es online! oder Alle überprüfen.

Erläuterung

OI>0IẠ  Input: string S
O       Convert each char in S to an ordinal
 I      Get the increments between each pair
  >0    Test if each is positive, 1 if true else 0
    I   Get the increments between each pair
     Ạ  Test if the list doesn't contain a zero, 1 if true else 0
Meilen
quelle
5

Python 2, 88 Bytes

Einfache lösung.

s=input()
m=map(lambda x,y:y>x,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))

Probieren Sie es online aus

Wenn die gleichen Buchstaben in einer Reihe weder ein Anstieg noch ein Abfall wären, wäre die Lösung 79 Bytes:

s=input()
m=map(cmp,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))
mbomb007
quelle
5

Perl, 34 Bytes

Beinhaltet +3 für -p(Code enthält 'so-e kann also nicht verwendet werden)

Geben Sie bei STDIN Großbuchstaben ein:

bump.pl <<< AAA

bump.pl

#!/usr/bin/perl -p
s%.%$&.z lt$'|0%eg;$_=!/(.)\1./
Tonne Hospel
quelle
5

Python, 51 Bytes

g=lambda a,b,c,*s:((a<b)^(b<c))*(s==()or g(b,c,*s))

Nimmt Ein- g('B','U','M','P')und Ausgänge wie 1oder0 .

Verwendet das Auspacken von Argumenten, um die ersten drei Buchstaben zu nehmen und zu prüfen, ob die ersten beiden anders sind als die zweiten beiden. Wiederholt dann den Rest mit der Multiplikation für and.

xnor
quelle
Schöner Input Golf. ;-)
AdmBorkBork
5

Gelee , 6 5 Bytes

-1 Byte dank @Dennis (verwenden Sie eine kumulative Reduktion)

<2\IẠ

Alle Testfälle sind bei TryItOnline

Wie?

<2\IẠ - main link takes an argument, s,    e.g. "BUMP"    or "BUMPY"
<    - less than comparison (a dyad)
 2   - literal 2 (a nilad)
  \  - n-wise overlapping reduction when preceded by a dyad-nilad chain
       (i.e. reduce the list by pairs with less than)
                                           e.g. [1,0,1]   or [1,0,1,1]
   I  - consecutive differences,           e.g. [-1,1]    or [-1,1,0]
    Ạ - All, 0 if any values are 0 else 1, e.g. 1         or 0

Funktioniert entweder für Groß- oder Kleinbuchstaben.

Jonathan Allan
quelle
4

Japt, 8 Bytes

Uä> ä- e

Online testen!

Wie es funktioniert

Uä> ä- e  // Implicit: U = input string
Uä>       // Map each pair of chars X, Y in U to X > Y.
    ä-    // Map each pair of items in the result to X - Y.
          // If there are two consecutive rises or falls, the result contains a zero.
       e  // Check that every item is truthy (non-zero).
          // Implicit: output last expression
ETHproductions
quelle
Gleich wie meine Lösung. Außer 11x kürzer. : P
mbomb007
4

C # 105 104 Bytes

bool f(char[]x){int t=1;for(int i=2,p=x[1],f=x[0]-p>>7;i<x.Length;)f^=t&=p<(p=x[i++])?1-f:f;return t>0;}

105 Bytes Lösung:

bool f(char[]x){bool t=1>0,f=x[0]<x[1];for(int i=2,p=x[1];i<x.Length;)f^=t&=p<(p=x[i++])?!f:f;return t;}

Probieren Sie es online aus

Durch die Verwendung eines Arrays von Zeichen wurde ein Byte gespart, da das Leerzeichen hinter den Klammern weggelassen werden kann. f(string x)vsf(char[]x)

Es sind 101 Bytes, wenn ich ein int 1/0 anstelle von bool true / false zurückgeben kann

int f(char[]x){int t=1;for(int i=2,p=x[1],f=x[0]-p>>7;i<x.Length;)f^=t&=p<(p=x[i++])?1-f:f;return t;}
pinkfloydx33
quelle
4

Haskell, 52 Bytes

f x=and$g(/=)$g(>)x
  where g h y=zipWith h(tail y)y

Ich vermute, ich könnte diesen Teil verkleinern, wenn ich das "where" -Konstrukt entfernen könnte, aber ich stecke wahrscheinlich mit zipWith fest.

Dies funktioniert, indem eine Liste der Aufstiege (True) und Abfälle (False) erstellt und dann eine Liste erstellt wird, ob die angrenzenden Einträge in dieser Liste unterschiedlich sind


Dies ist mein erster Versuch, also werde ich meinen Denkprozess durchgehen, falls ich irgendwo schrecklich schief gelaufen bin.

Ungolfed Version (168 Bytes)

isBumpy :: [Char] -> Bool
isBumpy input = and $ areBumps $ riseFall input
  where
    riseFall ax@(x:xs) = zipWith (>) xs ax
    areBumps ax@(x:xs) = zipWith (/=) xs ax

Namen kürzen, Typinformationen entfernen (100 Bytes)

f x = and $ g $ h x
  where
    h ax@(x:xs) = zipWith (>) xs ax
    g ax@(x:xs) = zipWith (/=) xs ax

Bewegen Sie h in die Hauptfunktion, da diese nur einmal verwendet wird (86 Bytes)

f ax@(x:xs) = and $ g $ zipWith (>) xs ax
  where
    g ax@(x:xs) = zipWith (/=) xs ax

Stellen Sie fest, dass areBumps und riseFall abstrakt genug sind (73 Byte)

f x  = and $ g (/=) $ g (>) x
  where
    g h ya@(y:ys) = zipWith h ys ya

Beachten Sie, dass (tail y) kürzer ist als ya @ (y: ys) (70 Bytes)

f x  = and $ g (/=) $ g (>) x
  where
    g h y = zipWith h (tail y) y

Aufräumen; entferne nicht benötigte Leerzeichen (52 Bytes)

f x=and$g(/=)$g(>)x
  where g h y=zipWith h(tail y)y
Teron
quelle
... und mir ist gerade eine kürzere Haskell-Antwort aufgefallen, die vor meiner veröffentlicht wurde und im Grunde dasselbe tut. Ich bin schrecklich darin, Dinge zu entdecken.
Teron
Du meinst den, der nicht funktioniert? ;-) Sie können g h=tail>>=zipWith heine globale Funktion verwenden und verwenden, um das whereSchlüsselwort zu vermeiden .
Christian Sievers
@ChristianSievers Es wurde ein Fehler behoben, und ich habe gerade diese Antwort bemerkt, die jetzt genau das Gleiche wie meine tut. Dadurch eignet sich meine Antwort besser als Kommentar zu dieser Antwort.
BlackCap
4

Java 7, 157 153 150 125 117 Bytes

int c(char[]z){for(int i=2,a,b,c;i<z.length;i++)if(((a=z[i-1])<(c=z[i])&(b=z[i-2])<a)|(a>=c&b>=a))return 0;return 1;}

Ungolfed & Testfälle:

Probieren Sie es hier aus.

class M{
  static int c(char[] z){
    for(int i = 2, a, b, c; i < z.length; i++){
      if(((a = z[i-1]) < (c = z[i]) & (b = z[i-2]) < a) | (a >= c & b >= a)){
        return 0; //false
      }
    }
    return 1; //true
  }

  public static void main(String[] a){
    System.out.print(c("ABA".toCharArray()) + ", ");
    System.out.print(c("ABB".toCharArray()) + ", ");
    System.out.print(c("BAB".toCharArray()) + ", ");
    System.out.print(c("BUMP".toCharArray()) + ", ");
    System.out.print(c("BALD".toCharArray()) + ", ");
    System.out.print(c("BALDY".toCharArray()) + ", ");
    System.out.print(c("UPWARD".toCharArray()) + ", ");
    System.out.print(c("EXAMINATION".toCharArray()) + ", ");
    System.out.print(c("AZBYCXDWEVFUGTHSIRJQKPLOMN".toCharArray()) + ", ");

    System.out.print(c("AAA".toCharArray()) + ", ");
    System.out.print(c("ACE".toCharArray()) + ", ");
    System.out.print(c("THE".toCharArray()) + ", ");
    System.out.print(c("BUMPY".toCharArray()) + ", ");
    System.out.print(c("BALDING".toCharArray()) + ", ");
    System.out.print(c("ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()) + ", ");
  }
}

Ausgabe:

1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
Kevin Cruijssen
quelle
@TimmyD Hmm, also steigt wann a > b, fällt wann a <= b, statt >und <?
Kevin Cruijssen
@TimmyD Ok, es ist behoben und spart sogar 3 Bytes. :)
Kevin Cruijssen
1
Sie können Ihre zu akzeptierende Methode neu definieren, char[]damit Sie Ihre Eingabezeichenfolge nicht in ein Zeichen-Array umwandeln müssen. das sollte ein paar bytes sparen. PS: Java ftw!
Peech
1
Wolltest du vielleicht ändern String s-> char[]z?
1
Sie können ein truthyoder einen falseyWert zurückgeben, also machen Sie Ihre Methode zu einem int und geben 1 oder 0 zurück :) .. Setzt Sie auf 117 Bytes zurück
Shaun Wild
3

PowerShell v2 +, 83 Byte

param($n)($a=-join(1..($n.Length-1)|%{+($n[$_-1]-lt$n[$_])}))-eq($a-replace'00|11')

Ein etwas anderer Ansatz. Diese Schleifen durch den Eingang $n, da jede Iteration , ob die vorhergehenden Zeichen $n[$_-1]sind -less than das aktuelle Zeichen $n[$_], dann mit dem Ergebnis des booleschen Operators in einen int Gießen +. Diese werden -joinzu einer Zeichenfolge zusammengefasst und in gespeichert $a. Wir prüfen dann , ob $aist -equal zu $amit irgendwelchen Teil von 00oder 11entfernt.

AdmBorkBork
quelle
3

Python 2.7, 84 Bytes

s=input()
b=s[0]<s[1]
o=1
for i in range(len(s)-1):o&=(s[i]<s[i+1])==b;b^=1
print o

Gibt 1 für holprig, 0 für sonst

Ich habe ein paar coole Sachen mit bitweise & und ^ gelernt.
Beginnt mit dem Booleschen Wert b, der das erste Paar als Auf / Ab definiert, und testet und kippt b für jedes folgende Paar.
o wechselt zu false, wenn der Test fehlschlägt und nicht erfolgreich ist.
Erfordert Anführungszeichen um die Eingabe (+4 Bytes für raw_input (), wenn dies gegen eine Regel verstößt)

Probier es aus

greyShift
quelle
3

05AB1E , 9 Bytes

SÇ¥0›¥_O_

Erläuterung

SÇ          # convert to list of ascii values
  ¥         # take delta's
   0›       # check if positive, giving a list of 1's and 0's
            # if they alternate, the word is bumpy
     ¥      # take delta's again, if we have any 0's in the list the word is not bumpy
      _     # logical negation, turning 0 into 1 and everything else to 0
       O    # sum, producing 0 for a bumpy word and 1 for a non-bumpy word
        _   # logical negation, inverting the previous 1 into 0 and vice versa

Probieren Sie es online!

Emigna
quelle
2

Python 2.7 (wieder 84 83 Bytes)

def a(s):x=s[1:];return[cmp(s[0],x)]+a(x) if x else []
print len(set(a(input())))>1

Oder 78 77 Bytes ohne den Druck.

Übrigens, das obige 56-Byte-Python-2.7-Beispiel setzt zum Beispiel bei "abbab"jeder anderen Eingabe mit wiederholten Zeichen ein.Macht nichts, habe keine Anweisungen gelesen. Überarbeitung.

Okay, bis auf 83. Das Dreifache ist allerdings schöner.

Timothy Teräväinen
quelle
Hier sind einige Tipps für Sie. 1. Entfernen Sie etwas Leerzeichen a(x)if x else[]. 2. Verwenden Sie stattdessen ein Lambda. a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]3. Verwenden Sie am Ende ein Lambda, anstatt zu drucken. lambda s:len(set(a(s)))>14. Wenn len(set(a(s)))nicht größer als 1, dann ist es schon falsch, also können Sie abheben>1
DJMcMayhem
2

CJam , 15 Bytes

l2ew::<2ew::^:*

Probieren Sie es online!(Als durch Zeilenvorschub getrennte Testsuite.)

Erläuterung

l    e# Read input.
2ew  e# Get all (overlapping) pairs.
::<  e# Check whether each pair is strictly ascending (1) or not (0).
2ew  e# Get all (overlapping) pairs.
::^  e# Take the bitwise XOR of each pair, giving 1 if a rise and a fall alternate,
     e# and zero if there are two rises or two falls in succession.
:*   e# Product. Gives 1 only if the previous step yielded a list of 1s, meaning
     e# that any two consecutive rises/falls will turn this into a zero.
Martin Ender
quelle
2

PHP, 80 Bytes

$s=$argv[1];for($c=$s[0];$n=$s[++$i];$c=$n,$d=$e)if($d===$e=$n>$c)break;echo!$n;

oder

for($c=$argv[1][0];$n=$argv[1][++$i];$c=$n,$d=$e)if($d===$e=$n>$c)break;echo!$n;

leere Ausgabe für falsch, 1 für wahr

oder Hedis rekursiver Ansatz portiert und ein wenig golfen für 70 Bytes:

function f($s){return!$s[2]|$s[0]<$s[1]^$s[1]<$s[2]&&f(substr($s,1));}

Eigentlich sollte dies für holprige Wörter unendlich lange dauern, aber das tut es nicht!

Titus
quelle
2

Haskell, 30 37 Bytes

q f=tail>>=zipWith f;k=and.q(/=).q(>)

Verwendung:

Prelude> k <$> words "ABA ABB BAB BUMP BALD BALDY UPWARD EXAMINATION AZBYCXDWEVFUGTHSIRJQKPLOMN"
[True,True,True,True,True,True,True,True,True]

Prelude> k <$> words "AAA BBA ACE THE BUMPY BALDING ABCDEFGHIJKLMNOPQRSTUVWXYZ"
[False,False,False,False,False,False,False]
BlackCap
quelle
Das akzeptiert nicht "Glatze", foldl1(/=)tut nicht, was Sie denken, dass es tut.
Christian Sievers
@ChristianSievers Auch, du hast recht. Vielen Dank für das Heads-up
BlackCap
2

PHP 7, 137 118 Bytes

for($i=0;$i<strlen($argv[1])-2;$i++)if(((($s[$i]<=>$s[$i+1])<0)?1:0)==((($s[$i+1]<=>$s[$i+2])<0)?1:0)){echo"0";break;}

Leere Ausgabe für Bumpy, 0 für nicht holprig.

Dies ist mein erster Versuch, Code Golf zu spielen, und ich muss mich sehr verbessern, aber es war eine wunderbare Methode, um neue Dinge für mich zu lernen. Ich wollte mich bei dieser Aufgabe auch mit dem neuen PHP 7 Spaceship Operator herausfordern, was sehr interessant zu sein scheint.

Jedenfalls bin ich damit nicht zufrieden, vor allem, weil ich ein Extra hinzufügen musste, um if(isset($s[$i+2]))zu überprüfen, ob die Variable existiert, weil ich keine andere Lösung für das Problem gefunden habe, aber das ist es jetzt. (Anmerkung: Ich habe das behoben, indem ich einfach zu gewechselt strlen($s)-1habe strlen($s)-2, das konnte ich vorher nicht wirklich sehen ...).

Testcode:

$as = array("ABA", "ABB", "BAB", "BUMP", "BALD", "BALDY", "UPWARD", 
            "EXAMINATION", "AZBYCXDWEVFUGTHSIRJQKPLOMN", "AAA", "BBA", 
            "ACE", "THE", "BUMPY", "BALDING", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");

foreach ($as as $s) {
    for($i=0;$i<strlen($s)-2;$i++)if(((($s[$i]<=>$s[$i+1])<0)?1:0)==((($s[$i+1]<=>$s[$i+2])<0)?1:0)){echo"0";break;}
}

Online testen

Mario
quelle
Hallo und willkommen bei PPCG! Toller erster Beitrag!
NoOneIsHere
Willkommen bei PPCG! Schöner erster Beitrag. In den PHP-Tipps finden Sie einige zusätzliche Golfvorschläge.
AdmBorkBork
1

Javascript ES6, 100 Bytes

d="charCodeAt";a=b=>{f=r=0;for(i=1;i<b.length;i++){if(b[d](i)<=b[d](i-1)){f=1}else{r=1}}return f&&r}

Probieren Sie es hier aus:

d="charCodeAt";a=b=>{f=r=0;for(i=1;i<b.length;i++){if(b[d](i)<=b[d](i-1)){f=1}else{r=1}}return f&&r}
alert(a(prompt()));

Ach komm schon, zwei Leute haben mich schon um 40 Bytes geschlagen ... was auch immer

Bald Bantha
quelle
Hinweis: "A"<"B"Sie müssen also nicht die Zeichencodes der Zeichen abrufen.
ETHproductions
Dies gilt auch 1für BUMPY(oder alles andere, das sowohl einen Anstieg als auch einen Abfall enthält).
ETHproductions
Dies scheint nicht ganz richtig zu funktionieren.
AdmBorkBork
1

Python 3, 148 139 127 Bytes

def _(w):*r,=map(lambda a,b:0>ord(a)-ord(b)and-1or 1,w,w[1:]);s=len(r)%2==0and r+[r[0]]or r;return sum(s)in(-1,1)and s==s[::-1]

Testcode

positives = ('ABA', 'ABB', 'BAB', 'BUMP', 'BALD', 'BALDY', 'UPWARD', 'EXAMINATION', 'AZBYCXDWEVFUGTHSIRJQKPLOMN')
negatives = ('AAA', 'BBA', 'ACE', 'THE', 'BUMPY', 'BALDING', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')

for w in positives:
    print(_(w), w)
    assert _(w)

for w in negatives:
    print(_(w), w)
    assert not _(w)
Jeffrey04
quelle
Ich lutsche wirklich an diesem #facepalm
Jeffrey04
Willkommen bei PPCG! Lesen Sie die Tipps zum Golfen in Python und lassen Sie sich von den anderen Antworten inspirieren.
AdmBorkBork
1

C, 65 57 60 Bytes

 r;f(char*s){for(r=0;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

ist fix von

r;f(char*s){for(;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

Das funktioniert mit allen Daten nur bei einem einzelnen Funktionsaufruf (wenn die globale Variable rauf Null initialisiert ist).

In jedem Fall ist dies jedoch kürzer als die vorherige Lösung (65 Byte), da foranstelle von verwendet wird while. Aber vorheriges (folgendes) ist ein bisschen einfacher zu verstehen:

r;f(char*s){while(*++s)if(!(r=~r&1<<(*s>*(s-1))))break;return r;}

Meine Lösung basiert auf bitweise &mit invertiertem vorherigen und aktuellen Richtungscode, wobei der Richtungscode 2( 1<<1) sein kann, um den Zeichencode zu erhöhen ( *s > *(s-1)) oder 1( 1<<0) auf andere Weise. Das Ergebnis dieser Operation wurde 0, wenn wir den gleichen Richtungscode wie zuvor und aktuell verwenden, dh wenn das Wort nicht holprig ist.

AKTUALISIEREN:

Code zum Testen:

#include <stdio.h>
#include <string.h>

r;f(char*s){for(;*++s&&(r=~r&1<<(*s>*(s-1))););return r;}

int main(void)
{
    char * Truthy[] = { "ABA", 
                        "ABB", 
                        "BAB",
                        "BUMP",
                        "BALD",
                        "BALDY",
                        "UPWARD",
                        "EXAMINATION",
                        "AZBYCXDWEVFUGTHSIRJQKPLOMN" };
    char * Falsey[] = { "AAA",
                        "BBA",
                        "ACE",
                        "THE",
                        "BUMPY",
                        "BALDING",
                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    int posTestNum = sizeof(Truthy) / sizeof(char *);
    int negTestNum = sizeof(Falsey) / sizeof(char *);
    int i;
    int rate = 0;
    int tests = 0;
    int res = 0;
    printf("Truthy (%d tests):\n", posTestNum);
    for (i = 0; i < posTestNum; i++)
    {
        tests++;
        printf("%s - %s\n", Truthy[i], f(Truthy[i]) ? (rate++, "OK") : "Fail");
        r = 0;
    }
    printf("\nFalsey (%d tests):\n", negTestNum);
    for (i = 0; i < negTestNum; i++)
    {
        tests++;
        printf("%s - %s\n", Falsey[i], f(Falsey[i]) ? "Fail" : (rate++, "OK"));
        r = 0;
    }
    printf("\n%d of %d tests passed\n", rate, tests);
    return 0;
}
VolAnd
quelle
Per Metakonsens müssen Funktionen wiederverwendbar sein . Das heißt , Sie können nicht zurückgestellt, rum 0kostenlos, sondern müssen so innerhalb der Funktion tun.
Dennis
@Dennis Du hast Recht, Initialisierung ist erforderlich, aber nur für wiederholte Anrufe. Nehmen wir an, dass für einen einzelnen Aufruf, der mit allen Daten funktioniert, der Compiler die Initialisierung für globale Variablen
bereitstellt
Ich denke, Sie sollten die 60-Byte-Lösung zu Ihrer Hauptlösung machen, da die 57-Byte-Version in diesem von mir zitierten Metapost nicht gültig ist.
Dennis
@Dennis Fertig! +3 Bytes
VolAnd
1

PHP, 100 Bytes

for($s=$argv[1];$i<strlen($s)-1;$i++)$s[$i]=$s[$i+1]>$s[$i]?r:f;echo str_replace([rr,ff],'',$s)==$s;

Ersetzt jedes Zeichen der Zeichenkette ( mit Ausnahme des letzten offensichtlich) mit einem rfür Aufstieg oder einem ffür den Herbst und dann überprüft , ob rroder ffin der Zeichenfolge auftreten. Um zu vermeiden, dass das letzte verbleibende Zeichen dies beeinträchtigt, muss die Eingabe in Großbuchstaben erfolgen.

Ich bin sehr unzufrieden mit der Schleife, zum Beispiel habe ich das Gefühl, dass es eine Möglichkeit geben muss, die $i++in einer der mehreren $iin der Schleife verwendeten S zu kombinieren , aber ich habe diese Möglichkeit nicht gefunden. Vielleicht sieht es jemand anderes.

(Das ist auch der Grund, warum ich meinen Code gepostet habe, obwohl er 20 (!) Bytes länger ist als die nette Lösung von Titus.)

Christallkeks
quelle
0

Java 8, 114 90 Bytes

(c,b)->{b=c[0]<c[1];for(int i=2;i<c.length;i++)if(c[i]>c[i-1]!=(b=!b))return 0;return 1;};

Ungolfed Testprogramm

public static void main(String[] args) {
    BiFunction<char[], Boolean, Integer> func = (c, b) -> {
        b = c[0] < c[1];
        for (int i = 2; i < c.length; i++) {
            if (c[i] > c[i - 1] != (b = !b)) {
                return 0;
            }
        }
        return 1;
    };

    System.out.println(func.apply("ABCDEFG".toCharArray(), false));
    System.out.println(func.apply("AZBYCXDGEF".toCharArray(), false));
    System.out.println(func.apply("ZXZXZX".toCharArray(), false));
    System.out.println(func.apply("ZXCYZ".toCharArray(), false));
    System.out.println(func.apply("AAA".toCharArray(), false));
}
Shaun Wild
quelle