Czy to wyboiste słowo?

31

(zainspirowany tym wyzwaniem na łamigłówkach - SPOILERY dla tej układanki są poniżej, więc przestań czytać tutaj, jeśli chcesz rozwiązać tę zagadkę samodzielnie!)

Jeśli litera w słowie występuje alfabetycznie później niż poprzednia litera w słowie, nazywamy to wzrostem między dwiema literami. W przeciwnym razie, w tym jeśli jest to ta sama litera , nazywa się to upadkiem .

Na przykład słowo ACEma dwa wzloty ( Ado Ci Cdo E) i nie ma spadków, podczas gdy THEma dwa spadki ( Tdo Hi Hdo E) i nie ma wzlotów.

Nazywamy słowo Wyboisty, jeśli sekwencja wzlotów i upadków zmienia się. Na przykład, BUMPidzie w górę ( Bdo U), w dół ( Udo M), w górę ( Mdo P). Zauważ, że pierwsza sekwencja nie musi być wzrostem - BALDprzechodzi od spadku do spadku i jest również wyboista.

Wyzwanie

Biorąc pod uwagę słowo, wypisz, czy jest wyboisty, czy nie.

Wkład

  • Słowo (niekoniecznie słowo słownikowe) składające się wyłącznie z alfabetu ASCII ( [A-Z]lub [a-z]), w dowolnym odpowiednim formacie .
  • Twój wybór, jeśli dane wejściowe są pisane wielkimi lub małymi literami, ale muszą być spójne.
  • Słowo będzie miało co najmniej 3 znaki.

Wydajność

Truthy / falsey wart, czy słowo wejściowego jest Bumpy (truthy) lub nie Bumpy (falsey).

Zasady

  • Dopuszczalny jest pełny program lub funkcja.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Przykłady

Prawda:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey:

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

AdmBorkBork
źródło
Cholera. Byłoby łatwiej, gdyby ten sam list nie był ani wzrostem, ani spadkiem.
mbomb007
Nie rozumiem podanych przykładów: jeśli BUMPjest wymieniony w Truthy (tj. Bumpy), dlaczego BUMPYznajduje się na liście Falsey? Co oznacza „wzloty i upadki na przemian”? Dwa wzrosty nie mogą być sukcesywnie?
VolAnd
4
@VolA Tak, oznacza to, że po wzroście zawsze następuje spadek i odwrotnie. BUMPYjest fałszem, ponieważ MPYdaje dwa kolejne wzrosty. Innymi słowy, żadne podciągi o długości 3 nie mogą być sortowane rosnąco lub malejąco, aby słowo było wyboiste (poza szczególnym przypadkiem, gdy dwie kolejne litery są identyczne).
Martin Ender
Czy potrafisz zepsuć odpowiedź na pytanie Puzzling.SE, aby inni, którzy chcą go rozwiązać samodzielnie, mogli to zrobić?
OldBunny2800
1
@ OldBunny2800 Nie umieszczę pełnego spoilera (nie chcę, aby moje wyzwanie było tutaj trudne do odczytania, ukrywając kluczowe informacje za spoilerem), ale dodam dodatkowy tekst na górze jako ostrzeżenie. Dzięki!
AdmBorkBork

Odpowiedzi:

31

MATL, 4 bajty

d0>d

Wyjaśnienie:

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

To jest mój pierwszy wpis w MATL, więc zastanawiam się, jak wiele ulepszeń można uzyskać dzięki temu naiwnemu portowi po mojej próbie MATLAB / Octave (która byłaby @(a)all(diff(diff(a)>0))). Zauważ, że allnie jest to konieczne, ponieważ dowolne zero powoduje, że tablica jest fałszywa, więc nie ma go Aw porcie MATL.

Sanchises
źródło
Zobacz poprawione wyzwanie. W przypadku testowym była literówka. Twoje podejście było prawidłowe. W rzeczywistości d0>dpowinien działać (nie potrzebujesz Azgodnie z naszą definicją truey / falsey)
Luis Mendo
1
Dobra robota, obrzucanie Luisa swoim własnym językiem! Próbowałem już wcześniej i to nie jest łatwe zadanie. ;)
DJMcMayhem
@DJMcMayhem Haha. To właśnie dostaję za zbyt szybkie czytanie wyzwania. W mojej obronie jest sprzeczne z intuicją, że dwie równe litery to upadek. I (teraz poprawione) wprowadzające w błąd przypadki testowe również nie pomogły :-)
Luis Mendo
1
@DJMcMayhem Dzięki - chociaż może po prostu miałem szczęście, ponieważ tak naprawdę nie myślałem o kolejnych równych literach, ale okazało się, że dokładnie o to pytano ...
Sanchises
1
@immibis In MATL (AB) i Octave, tak. Zobacz odpowiedź Meta.
Sanchises
24

JavaScript (ES6), 75 69 63 46 43 bajty

Zaoszczędzono 3 bajty dzięki Neilowi:

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

Niszczenie parametru ciągu zamiast s.slice(1).


Poprzednie rozwiązanie:
Oszczędność 17 bajtów dzięki produktom ETH:

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

Co się stało z poprzedniego rozwiązania krok po kroku:

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`


Poprzednie rozwiązania:
63 bajty dzięki produktom ETH:

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 bajtów:

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 bajtów:

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

Wszystkie litery w słowie muszą mieć tę samą wielkość liter.

Hedi
źródło
2
Możesz zagrać w
ETHproductions 12.09.16
@ETHproductions Czy powinienem opublikować treść twojego linku?
Hedi
Możesz, jeśli chcesz :-)
ETHproductions
Czy możesz !s[2]|...zrobić to samo co s[2]?...:1?
Tytus
1
Przepraszam za spóźnienie na imprezę, ale za 43 bajty daję ci:f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil
14

LabVIEW, 36 równoważnych bajtów

Gra w golfa przy użyciu logicznych równoważników:

grał w golfa

Nie golfowany:

bez golfa

Najpierw konwertujemy na małe litery, a następnie na tablicę bajtów. Przytnij pierwszy element tablicy bajtów, ponieważ nie ma on precedensu. Następnie, dla każdego elementu w tablicy, sprawdź, czy jest większy niż poprzedni (znak U8 odwzorowuje na ASCII, jak się spodziewasz) i zapisz wynik dla następnej iteracji, a także w tablicy do przeglądania ogólnej nierówności. Jeśli bieżąca i wcześniejsza kontrola logiczna są równe, przerywamy pętlę i nie jest to wyboista. W przeciwnym razie jest wyboisty!

ijustlovemath
źródło
1
Co za fajny język! Witamy w PPCG!
DJMcMayhem
1
Dzięki! Nigdy nie będę konkurował z 4 bajtowymi odpowiedziami, ale jest to dobry sposób na poprawę moich umiejętności :)
ijustlovemath,
Zobacz tutaj . Twoja ocena jest zdecydowanie błędna i nadmiernie nadmierna . Nie sądzę, że twoja odpowiedź to tak naprawdę 246450 - 246549 bajtów.
Erik the Outgolfer,
Opuściłem zakładkę Pamięć, ponieważ nie wiedziałem, że istnieje koncepcja równoważnych bajtów dla LabVIEW. Policzy je i zredaguje odpowiedź później dzisiaj.
ijustlovemath
1
@Erik Jestem na Firefoxie w systemie Windows, ale otwarcie go na telefonie komórkowym również psuje. Po prostu działa meta.ppcg.lol . W każdym razie jest to poza zakresem komentarzy.
Pozew Fund Moniki,
8

Python, 56 bajtów

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

Wszystkie przypadki testowe są w ideone

Przeskakuje przez trójki znaków ws i sprawdza, czy wszystkie takie trójki mają lewą i prawą parę o różnych właściwościach wznoszenia / opadania.
Działa dla wszystkich wielkich lub małych liter.

Jonathan Allan
źródło
6

Rubin, 57 48 bajtów

Oczekuje, że dane wejściowe będą składać się z wielkich liter.

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

Zobacz na repl.it: https://repl.it/D7SB

Wyjaśnienie

Wyrażenie regularne /.(?=(.)(.))/pasuje do każdego znaku, po którym następują dwa kolejne znaki. (?=...)jest pozytywnym spojrzeniem w przyszłość, co oznacza, że ​​dopasowujemy dwa kolejne znaki, ale nie „konsumujemy” ich w ramach meczu. Wewnątrz nawiasów klamrowych $&znajduje się dopasowany tekst - pierwszy znak z trzech - $1i $2są one schwytanymi postaciami z góry. Innymi słowy, jeśli łańcuch jest "BUMPY", najpierw dopasuje "B"(i wstawi $&) i przechwyci "U"oraz "M"(i umieści je w $1i $2). Następny będzie pasować "U"i wychwytywania "M"i "P", i tak dalej.

Wewnątrz bloku sprawdzamy, czy pierwsza para znaków ( $&i $1) jest wzniesieniem, a druga ( $1i $2) jest spadkiem lub odwrotnie, podobnie jak większość innych odpowiedzi. To ^wyrażenie zwraca truelub false, które jest konwertowane na ciąg znaków i wstawiane w miejsce dopasowania. W rezultacie nasz przykład "BUMPY"wygląda następująco:

"truetruefalsePY"

Ponieważ wiemy, że dane wejściowe są pisane wielkimi literami, wiemy, że "f"wystąpią tylko jako część "false"i !result[?f]daje nam odpowiedź.

Jordania
źródło
Jak to działa?
GreenAsJade
1
@GreenAsJade Dodałem wyjaśnienie do mojej odpowiedzi.
Jordan
6

C #, 64 63 55 bajtów

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

-8 bajtów z sugestii Scepheo

To jest port rozwiązania Hedi do C #. Wymyśliłem również rozwiązanie rekurencyjne, ale rekursja nie była tak dobra. Moje oryginalne rozwiązanie znajduje się poniżej.

My Original C #, 96 94 91 bajtów

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 bajty przy użyciu 1>0zamiast true.

-3 bajty z sugestii Scepheo dla powyższego rozwiązania portu

Nazywa się rekurencyjnie sprawdzając, czy wzrost / opadanie zmienia się za każdym razem.

Nie golfowany:

// 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)
;
mleko
źródło
Wygląda na to, że ostatni może obejść się bez ?:operatora lub nawiasów:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
Scepheo,
W rzeczywistości, chociaż nie mogę tego przetestować, manipulowanie samym wskaźnikiem wydaje się jeszcze bardziej zwięzłe:unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
Scepheo,
@Scepheo Mam StackOverflowExceptions z tymi sugestiami, ale działają one przy użyciu logicznego OR ||zamiast bitowego OR |. Zaktualizowano wpis, dzięki.
mleko
6

C 59 bajtów

r;f(s)char*s;{for(r=0;r=*s?~r&1<<(*s>=*++s):0;);return!*s;}
cleblanc
źródło
Rozwiązanie w 70 bajtach zwraca 1 (prawda) dla przypadku AAA- pierwszy „Falsey” w przykładach
VolAnd
Testuję za pomocą gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)i otrzymuję fałsz za AAA i jestem podekscytowany. W tej wersji wartość niezerowa to falsey, a zero to prawda. Zastanawiam się teraz, czy jest to dozwolone.
cleblanc
Wywołanie f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")skompilowane w Visual Studio 2012 zwraca wartość, 23którą można traktować jako, Trueale w pytaniu ta wartość znajduje się w sekcji „Falsey”, więc 0oczekiwana wartość .
VolAnd
Źle zrozumiałem, co było dozwolone dla True i Falsey. Teraz przeczytałem ten post i wydaje się jasne, jakie muszą być wartości dla „C”.
cleblanc
Oto nasze standardowe definicje prawdy i falseya oparte na konsensusie Meta.
AdmBorkBork,
5

Galaretka , 6 bajtów

OI>0IẠ

Na podstawie odpowiedzi @sanchises .

Wypróbuj online! lub Zweryfikuj wszystko.

Wyjaśnienie

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
mile
źródło
5

Python 2, 88 bajtów

Proste rozwiązanie.

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:]))

Wypróbuj online

Gdyby te same litery z rzędu nie były ani wzrostem, ani spadkiem, rozwiązaniem byłoby 79 bajtów:

s=input()
m=map(cmp,s[:-1],s[1:])
print all(x-y for x,y in zip(m[:-1],m[1:]))
mbomb007
źródło
5

Perl, 34 bajty

Obejmuje +3 dla -p(kod zawiera, 'więc -enie można go użyć)

Podaj duże litery w STDIN:

bump.pl <<< AAA

bump.pl

#!/usr/bin/perl -p
s%.%$&.z lt$'|0%eg;$_=!/(.)\1./
Ton Hospel
źródło
5

Python, 51 bajtów

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

Pobiera dane wejściowe g('B','U','M','P')i wyjściowe 1lub 0.

Używa rozpakowywania argumentów, aby pobrać pierwsze trzy litery i sprawdzić, czy pierwsze dwa różnią się od dwóch pozostałych. Następnie powtarza się w pozostałej części, używając mnożenia dla and.

xnor
źródło
Niezły golf. ;-)
AdmBorkBork
5

Galaretka , 6 5 bajtów

-1 bajt dzięki @Dennis (użyj skumulowanej redukcji)

<2\IẠ

Wszystkie przypadki testowe znajdują się w TryItOnline

W jaki sposób?

<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

Działa dla wszystkich wielkich lub małych liter.

Jonathan Allan
źródło
4

Japt, 8 bajtów

Uä> ä- e

Przetestuj online!

Jak to działa

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
ETHprodukcje
źródło
To samo co moje rozwiązanie. Z wyjątkiem 11x krótszych. : P
mbomb007
4

C # 105 104 Bajtów

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 bajtów Rozwiązanie:

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;}

Wypróbuj online

Za pomocą tablicy znaków zapisano jeden bajt, ponieważ spację można pominąć po nawiasach. f(string x)vsf(char[]x)

To 101 bajtów, jeśli mogę zwrócić int 1/0 zamiast bool true / false

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
źródło
4

Haskell, 52 bajty

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

Podejrzewam, że mógłbym zmniejszyć ten kawałek, jeśli udało mi się pozbyć konstruktu „gdzie”, ale prawdopodobnie utknąłem z zipWith.

Działa to poprzez utworzenie listy wzlotów (Prawda) i upadków (Fałsz), a następnie sporządzenie listy, jeśli sąsiednie wpisy na tej liście są różne


To jest moja pierwsza próba jednego z nich, więc przejdę przez proces myślowy, na wypadek, gdybym gdzieś strasznie się pomylił.

Wersja bez golfa (168 bajtów)

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

Skróć nazwy, usuń informacje o typie (100 bajtów)

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

Przenieś h do głównej funkcji, ponieważ jest używana tylko raz (86 bajtów)

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

Zrozum, że areBumps i riseFall są wystarczająco podobne do abstrakcyjnych (73 bajtów)

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

Zauważ, że (ogon y) jest krótszy niż ya @ (y: ys) (70 bajtów)

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

Sprzątać; usuń niepotrzebne spacje (52 bajty)

f x=and$g(/=)$g(>)x
  where g h y=zipWith h(tail y)y
Teron
źródło
... i właśnie zauważyłem krótszą odpowiedź Haskella, która została opublikowana przed moją, która zasadniczo robi to samo. Jestem okropny w wykrywaniu rzeczy.
Teron
Masz na myśli ten, który nie działa? ;-) Możesz użyć g h=tail>>=zipWith hi ustawić ją jako funkcję globalną, aby uniknąć wheresłowa kluczowego.
Christian Sievers,
@ChristianSievers Naprawiłem to i właśnie zauważyłem tę odpowiedź, która teraz robi dokładnie to samo co moja, dzięki czemu moja odpowiedź lepiej nadaje się jako komentarz do tego.
BlackCap
4

Java 7, 157 153 150 125 117 bajtów

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;}

Przypadki bez golfa i testy:

Wypróbuj tutaj.

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()) + ", ");
  }
}

Wydajność:

1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
Kevin Cruijssen
źródło
@TimmyD Hmm, więc rośnie kiedy a > b, ale spada kiedy a <= bzamiast >i <?
Kevin Cruijssen
@ TimmyD Ok, jest naprawiony, a nawet zapisuje 3 bajty. :)
Kevin Cruijssen
1
możesz ponownie zdefiniować metodę, aby zaakceptować, char[]więc nie musisz przekształcać łańcucha wejściowego na tablicę char. to powinno zaoszczędzić kilka bajtów. PS: java ftw!
peech
1
Czy może chciałeś zmienić String s-> char[]z?
1
Możesz zwrócić a truthylub falseywartość, więc ustaw metodę na int i zwróć 1 lub 0 :) .. Sprowadza cię do 117 bajtów
Shaun Wild
3

PowerShell v2 +, 83 bajty

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

Trochę innego podejścia. Te pętle przez wejście $n, każda iteracja widząc czy poprzedni znak $n[$_-1]jest -less than obecny charakter $n[$_], a następnie rzucając wynik tego operatora logicznego do int z +. Są one -joinedytowane razem w ciąg, przechowywany w $a. Następnie sprawdzamy, czy $ajest to -eqprzydatne $aprzy jakichkolwiek podciągach 00lub 11usuniętych.

AdmBorkBork
źródło
3

Python 2.7, 84 bajty

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

Zwraca 1 dla wyboistej, 0 dla innej

Nauczyłem się fajnych rzeczy z bitowym & i ^.
Zaczyna się od wartości logicznej b definiującej pierwszą parę jako góra / dół, a następnie testuje i odwraca b dla każdej następnej pary.
o zmienia się na fałsz, jeśli test się nie powiedzie i zaciął.
Wymaga cudzysłowu wokół danych wejściowych (+4 bajty dla raw_input (), jeśli łamie to jakąś regułę)

Sprawdź to

greyShift
źródło
3

05AB1E , 9 bajtów

SÇ¥0›¥_O_

Wyjaśnienie

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

Wypróbuj online!

Emigna
źródło
2

Python 2.7 (ponownie, 84 83 bajty)

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

Lub 78 77 bajtów bez nadruku.

Nawiasem mówiąc, powyższy 56-bajtowy przykład Python 2.7 łamie się, na przykład, "abbab"lub inne dane wejściowe z powtarzającymi się znakami. Nieważne, nie przeczytałem instrukcji. Korekta

Okej, do 83. Trojka jest jednak ładniejsza.

Timothy Teräväinen
źródło
Oto kilka wskazówek dla ciebie. 1. Usuń trochę białych znaków a(x)if x else[]. 2. Zamiast tego użyj lambda. a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]3. Użyj lambda na końcu zamiast drukowania. lambda s:len(set(a(s)))>14. jeśli len(set(a(s)))nie jest większy niż 1, to już jest fałsz, więc możesz się wystartować>1
DJMcMayhem
2

CJam , 15 bajtów

l2ew::<2ew::^:*

Wypróbuj online! (Jako pakiet testowy oddzielony od linii).

Wyjaśnienie

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
źródło
2

PHP, 80 bajtów

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

lub

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

puste wyjście dla false, 1dla true

lub rekursywne podejście Hedi przeniesione i trochę golfa za 70 bajtów:

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

W rzeczywistości powinno to powtarzać się w nieskończoność dla wyboistych słów, ale tak nie jest!

Tytus
źródło
2

Haskell, 30 37 bajtów

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

Stosowanie:

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]
Gajówka
źródło
To nie akceptuje „łysych”, foldl1(/=)nie robi tego, co myślisz.
Christian Sievers,
@ChristianSievers Auch, masz rację. Dzięki za heads-up
BlackCap
2

PHP 7, 137 118 bajtów

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;}

Puste wyjście dla Wyboista, 0dla Nie wyboista.

To moja pierwsza próba gry w golfa i muszę wiele poprawić, ale była to dla mnie wspaniała metoda uczenia się nowych rzeczy. Chciałem też rzucić wyzwanie temu zadaniu, używając nowego operatora kosmicznego PHP 7, który wydaje się bardzo interesujący.

W każdym razie nie jestem z tego zadowolony, przede wszystkim dlatego, że musiałem dodać dodatkowy, if(isset($s[$i+2]))aby sprawdzić, czy zmienna istnieje, ponieważ nie znalazłem innego obejścia problemu, ale na razie to tyle. (Uwaga: Naprawiłem to, zmieniając strlen($s)-1na strlen($s)-2, tak naprawdę nie widziałem tego wcześniej ...).

Kod testowy:

$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;}
}

Przetestuj online

Mario
źródło
Witaj i witaj w PPCG! Świetny pierwszy post!
NoOneIsHere
Witamy w PPCG! Niezły pierwszy post. Sprawdź Porady dla PHP, aby uzyskać dodatkowe sugestie dotyczące gry w golfa.
AdmBorkBork
1

JavaScript ES6, 100 bajtów

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}

Wypróbuj tutaj:

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()));

Och, dwie osoby już mnie pobiły o 40 bajtów ... cokolwiek

Łysa Bantha
źródło
Wskazówka: "A"<"B"więc nie musisz uzyskiwać kodów znaków.
ETHprodukcje
Poza tym, ten powraca 1do BUMPY(lub czegokolwiek innego, który zawiera zarówno wzrost i spadek).
ETHprodukcje
To wydaje się nie działać poprawnie.
AdmBorkBork
1

Python 3, 148 139 127 bajtów

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]

kod testowy

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
źródło
Naprawdę ssę na tym #facepalm
Jeffrey04,
Witamy w PPCG! Sprawdź Wskazówki dotyczące gry w golfa w Pythonie i czerp inspirację z innych odpowiedzi.
AdmBorkBork
1

DO, 65 57 60 bajtów

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

jest naprawiony

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

który działa poprawnie z dowolnymi danymi tylko przy wywołaniu jednej funkcji (gdy zmienna globalna rjest inicjowana na zero).

Ale w każdym razie jest to krótsze niż poprzednie rozwiązanie (65 bajtów) z powodu użycia forzamiast while. Ale poprzednie (poniższe) jest nieco łatwiejsze do zrozumienia:

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

Moje rozwiązanie opiera się na bitowym &odwróceniu poprzedniego i bieżącego kodu kierunkowego, gdzie kod kierunkowy może być 2( 1<<1) dla zwiększenia kodu znakowego ( *s > *(s-1)) lub 1( 1<<0) w przeciwnym razie. Wynik tej operacji stał się 0, jeśli użyjemy tego samego kodu kierunkowego co poprzedni i bieżący, tj. Gdy słowo nie jest nierówne.

AKTUALIZACJA:

Kod do testowania:

#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
źródło
Zgodnie z meta konsensusem funkcje muszą być wielokrotnego użytku . Oznacza to, że nie można przywrócić rdo 0nas za darmo, ale musi to zrobić od wewnątrz funkcji.
Dennis
@Dennis Masz rację, wymagana jest inicjalizacja, ale tylko w przypadku powtarzających się połączeń. Załóżmy, że dla pojedynczego wywołania, które działa z dowolnymi danymi, ponieważ kompilator zapewnia inicjalizację zmiennych globalnych
VolAnd
Myślę, że powinieneś ustawić 60-bajtowe rozwiązanie jako swoje główne, ponieważ 57-bajtowa wersja nie jest poprawna w tym cytowanym przez mnie meta postu.
Dennis
@Dennis Gotowe! +3 bajty
VolAnd
1

PHP, 100 bajtów

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;

Zastępuje każdy char łańcucha (z wyjątkiem ostatniego, oczywiście) z rza wzrost lub fna jesieni i następnie sprawdza, czy rrlub ffwystąpić w ciągu. Aby uniknąć sytuacji, w której ostatni pozostały znak przeszkadza w tym, dane wejściowe muszą być pisane wielkimi literami.

Jestem bardzo niezadowolony z pętli, na przykład mam wrażenie, że musi istnieć sposób na połączenie $i++jednej z kilku $iużywanych w pętli, ale nie udało mi się jej znaleźć. Może ktoś to widzi.

(Dlatego też opublikowałem swój kod, mimo że jest on o 20 (!) Bajtów dłuższy niż dobre rozwiązanie Tytusa).

Christallkeks
źródło
0

Java 8, 114 90 bajtów

(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;};

Nie testowany program testowy

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
źródło