Est-ce un mot cahoteux?

31

(inspiré par ce défi sur Puzzling - les SPOILERS pour ce puzzle sont ci-dessous, alors arrêtez de lire ici si vous voulez résoudre ce puzzle par vous-même!)

Si une lettre d'un mot apparaît alphabétiquement plus tard que la lettre précédente du mot, nous appelons cela une élévation entre les deux lettres. Sinon, même si c'est la même lettre , ça s'appelle une chute .

Par exemple, le mot ACEa deux montées ( Avers Cet Cvers E) et aucune chute, tandis qu'il THEa deux chutes ( Tvers Het Hvers E) et aucune montée.

Nous appelons un mot cahoteux si la séquence de montées et de chutes alterne. Par exemple, BUMPva monter ( Bà U), tomber ( Uà M), monter ( Mà P). Notez que la première séquence n'a pas besoin d'être une montée - BALDva chute-montée-chute et est également cahoteuse.

Le défi

Étant donné un mot, affichez s'il s'agit ou non de Bumpy.

Contribution

  • Un mot (pas nécessairement un mot du dictionnaire) composé uniquement de lettres ( [A-Z]ou [a-z]) alphabétiques ASCII , dans n'importe quel format approprié .
  • Votre choix si l'entrée est entièrement en majuscules ou en minuscules, mais elle doit être cohérente.
  • Le mot comptera au moins 3 caractères.

Sortie

Une valeur truey / falsey pour savoir si le mot d'entrée est Bumpy (véridique) ou non Bumpy (falsey).

Les règles

  • Un programme complet ou une fonction sont acceptables.
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.

Exemples

Vérité:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey:

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Classements

Voici un extrait de pile permettant de générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:

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

Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier séparément les pénalités d'indicateur d'interprétation), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

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

AdmBorkBork
la source
Dangit. Ce serait plus facile si la même lettre n'était ni montée ni chute.
mbomb007
Je ne comprends pas les exemples fournis: si BUMPest répertorié dans Truthy (c'est-à-dire Bumpy), pourquoi BUMPYest-il dans la liste Falsey? Que signifie «monte et descend alterné»? Deux ascensions ne peuvent pas se succéder?
VolAnd
4
@VolAnd Oui, cela signifie qu'une montée est toujours suivie d'une chute et vice versa. BUMPYest faux car MPYdonne deux hausses consécutives. En d'autres termes, aucune sous-chaîne de longueur 3 ne doit être triée par ordre croissant ou décroissant pour qu'un mot soit cahoteux (sauf dans le cas particulier où deux lettres consécutives sont identiques).
Martin Ender
Pouvez-vous gâcher la réponse à la question Puzzling.SE pour que ceux qui souhaitent le résoudre eux-mêmes puissent le faire?
OldBunny2800
1
@ OldBunny2800 Je ne mettrai pas de spoiler complet (je ne veux pas rendre mon défi difficile à lire en cachant des informations cruciales derrière un spoiler), mais j'ajouterai du texte supplémentaire en haut comme avertissement. Merci!
AdmBorkBork

Réponses:

31

MATL, 4 octets

d0>d

Explication:

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

Ceci est ma première entrée MATL, donc je me demande quelle amélioration il peut y avoir de ce port naïf de ma tentative MATLAB / Octave (qui serait @(a)all(diff(diff(a)>0))). Notez que le alln'est pas nécessaire car tout zéro rend un tableau faux, donc il n'y Aen a pas dans le port MATL.

Sanchises
la source
Voir le défi corrigé. Il y avait une faute de frappe dans un cas de test. Votre approche était correcte. En fait, cela d0>ddevrait fonctionner (vous n'avez pas besoin du Aselon notre définition de truey / falsey)
Luis Mendo
1
Beau travail, surpassant Luis dans sa propre langue! J'ai déjà essayé, et ce n'est pas une tâche facile. ;)
DJMcMayhem
@DJMcMayhem Haha. C'est ce que j'obtiens en lisant le défi trop rapidement. Pour ma défense, il est contre-intuitif que deux lettres égales soient une chute. Et les cas de test trompeurs (maintenant corrigés) n'ont pas aidé non plus :-)
Luis Mendo
1
@DJMcMayhem Merci - même si j'ai peut-être juste eu de la chance, parce que je ne pensais pas à des lettres égales consécutives, mais cela s'est avéré être exactement ce qui était demandé ...
Sanchises
1
@immibis En MATL (AB) et Octave, oui. Voir cette réponse Meta.
Sanchises
24

JavaScript (ES6), 75 69 63 46 43 octets

Enregistré 3 octets grâce à Neil:

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

Déstructuration du paramètre de chaîne au lieu de s.slice(1).


Solution précédente:
17 octets économisés grâce aux productions ETH:

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

Ce qui s'est passé étape par étape de la solution précédente:

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`


Solutions précédentes:
63 octets grâce aux productions 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 octets:

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 octets:

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

Toutes les lettres d'un mot doivent avoir la même casse.

Hedi
la source
2
Vous pouvez le jouer
ETHproductions
@ETHproductions Dois-je publier le contenu de votre lien?
Hedi
Vous pouvez si vous le souhaitez :-)
ETHproductions
Peut !s[2]|...faire la même chose que s[2]?...:1?
Titus
1
Désolé d'être en retard à la fête, mais pour 43 octets, je vous donne:f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil
14

LabVIEW, 36 octets équivalents

Golfé en utilisant des équivalences logiques:

golfé

Ungolfed:

non golfé

Nous convertissons d'abord en minuscules, puis en tableau d'octets. Coupez le premier élément du tableau d'octets car il n'a pas de précédent. Ensuite, pour chaque élément du tableau, vérifiez s'il est supérieur au précédent (le caractère U8 est mappé en ASCII comme prévu) et stockez le résultat pour la prochaine itération, ainsi que dans un tableau pour afficher les bosses globales. Si les vérifications booléennes actuelles et antérieures sont égales, nous terminons la boucle et ce n'est pas cahoteux. Sinon, c'est cahoteux!

ijustlovemath
la source
1
Quelle langue cool! Bienvenue chez PPCG!
DJMcMayhem
1
Merci! Je ne rivaliserai jamais avec les réponses à 4 octets, mais c'est une belle façon d'améliorer mes compétences :)
ijustlovemath
Voir ici . Votre score est définitivement faux et excessivement excessif . Je ne pense pas que votre réponse soit vraiment 246450 - 246549 octets.
Erik the Outgolfer
Je sortais de l'onglet Mémoire, car je ne savais pas qu'il y avait un concept d'octets équivalents pour LabVIEW. Les comptera et modifiera la réponse plus tard dans la journée.
ijustlovemath
1
@Erik Je suis sur Firefox sur Windows, mais l'ouvrir sur mobile casse aussi les choses. Juste meta.ppcg.lol fonctionne. Quoi qu'il en soit, cela est hors de portée pour les commentaires.
Fund Monica's Lawsuit
8

Python, 56 octets

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

Tous les cas de test sont à idéone

Zips à travers des triplets de caractères dans s et teste que tous ces triplets ont des paires gauche et droite avec différentes propriétés de montée / descente.
Fonctionne soit en majuscules soit en minuscules.

Jonathan Allan
la source
6

Rubis, 57 48 octets

S'attend à ce que l'entrée soit entièrement en majuscules.

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

Voir sur repl.it: https://repl.it/D7SB

Explication

L'expression régulière /.(?=(.)(.))/correspond à chaque caractère suivi de deux autres caractères. (?=...)est une anticipation positive, ce qui signifie que nous faisons correspondre les deux caractères suivants, mais ne les "consommons" pas dans le cadre de la correspondance. À l'intérieur des accolades, se $&trouve le texte correspondant - le premier caractère des trois - et $1et $2sont les caractères capturés à l'intérieur de l'antichambre. En d'autres termes, si la chaîne est "BUMPY", elle correspondra d'abord "B"(et la mettra $&) et capturera "U"et "M"(et les mettra $1et $2). Ensuite , il correspondra "U"et la capture "M"et "P", et ainsi de suite.

À l'intérieur du bloc, nous vérifions si la première paire de caractères ( $&et $1) est une montée et la seconde ( $1et $2) est une chute ou vice versa, un peu comme la plupart des autres réponses. Cette ^expression renvoie trueou false, qui est convertie en chaîne et insérée à la place de la correspondance. En conséquence, notre exemple "BUMPY"devient ceci:

"truetruefalsePY"

Puisque nous savons que l'entrée est entièrement en majuscules, nous savons "f"qu'elle ne se produira que dans le cadre de "false"et !result[?f]nous donnera notre réponse.

Jordan
la source
Comment ça marche?
GreenAsJade
1
@GreenAsJade J'ai ajouté une explication à ma réponse.
Jordan
6

C #, 64 63 55 octets

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

-8 octets des suggestions de Scepheo

Il s'agit d'un portage de la solution Hedi vers C #. J'ai également trouvé une solution récursive, mais la récursivité n'était pas aussi bonne. Ma solution originale est ci-dessous.

Mon C # d'origine, 96 94 91 octets

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 octets en utilisant 1>0au lieu de true.

-3 octets des suggestions de Scepheo pour la solution de port ci-dessus

S'appelle récursivement vérifier que l'alternance montante / descendante alterne à chaque fois.

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)
;
Lait
la source
On dirait que le dernier peut se passer de l' ?:opérateur ou des parenthèses:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
Scepheo
En fait, bien que je ne puisse pas tester cela, manipuler le pointeur lui-même semble encore plus unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
tordu
@Scepheo J'ai reçu des StackOverflowExceptions avec ces suggestions, mais elles fonctionnent en utilisant un booléen OR ||au lieu d'un OR au niveau du bit |. Mis à jour le message, merci.
lait
6

C 59 octets

r;f(s)char*s;{for(r=0;r=*s?~r&1<<(*s>=*++s):0;);return!*s;}
cleblanc
la source
La solution en 70 octets renvoie 1 (Vrai) pour le cas AAA- le premier "Falsey" dans les exemples
VolAnd
Je teste en utilisant gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)et je suis faux pour aaa et excité. Dans cette version, non nul est falsey, et zéro est véridique. En fait, je me demande maintenant si cela est autorisé.
cleblanc
L'appel f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")compilé dans Visual Studio 2012 renvoie une valeur 23qui peut être traitée comme, Truemais dans la question, cette valeur se trouve dans la section "Falsey", donc valeur 0attendue.
VolAnd
J'ai mal compris ce qui était autorisé pour True et Falsey. Maintenant, j'ai lu ce post et il semble clair quelles doivent être les valeurs pour "C".
cleblanc
Voici nos définitions standard pour vérité et falsey , basées sur le consensus Meta.
AdmBorkBork
5

Gelée , 6 octets

OI>0IẠ

Basé sur la réponse de @sanchises .

Essayez-le en ligne! ou Vérifiez tout.

Explication

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
milles
la source
5

Python 2, 88 octets

Solution simple.

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

Essayez-le en ligne

Si les mêmes lettres consécutives n'étaient ni une montée ni une chute, la solution serait de 79 octets:

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

Perl, 34 octets

Comprend +3 pour -p(le code contient 'donc -ene peut pas être utilisé)

Donnez une entrée en majuscule sur STDIN:

bump.pl <<< AAA

bump.pl

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

Python, 51 octets

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

Prend entrée comme g('B','U','M','P')et sorties 1ou 0.

Utilise le déballage des arguments pour prendre les trois premières lettres et vérifier si les deux premiers se comparent différemment des deux autres. Ensuite, revient sur le reste, en utilisant la multiplication pour and.

Xnor
la source
Beau golf d'entrée. ;-)
AdmBorkBork
5

Gelée , 6 à 5 octets

-1 octet grâce à @Dennis (utilisez une réduction cumulative)

<2\IẠ

Tous les cas de test sont sur TryItOnline

Comment?

<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

Fonctionne soit en majuscules soit en minuscules.

Jonathan Allan
la source
4

Japt, 8 octets

Uä> ä- e

Testez-le en ligne!

Comment ça marche

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
la source
Identique à ma solution. Sauf 11x plus court. : P
mbomb007
4

C # 105 104 Octets

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 octets Solution:

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

Essayez-le en ligne

L'utilisation d'un tableau de caractères a sauvé un octet car l'espace peut être omis après les crochets. f(string x)contref(char[]x)

C'est 101 octets si je peux retourner un int 1/0 au lieu de 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
la source
4

Haskell, 52 octets

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

Je soupçonne que je pourrais obtenir un morceau plus petit si je réussissais à me débarrasser de la construction "où", mais je suis probablement coincé avec zipWith.

Cela fonctionne en faisant une liste des hausses (Vrai) et des chutes (Faux), puis en faisant une liste de si les entrées adjacentes dans cette liste sont différentes


Il s'agit de ma première tentative sur l'un d'entre eux, je vais donc passer par mon processus de réflexion au cas où je me serais horriblement trompé quelque part.

Version non golfée (168 octets)

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

Raccourcir les noms, supprimer les informations de type (100 octets)

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

Déplacer h dans la fonction principale car elle n'est utilisée qu'une seule fois (86 octets)

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

Sachez que areBumps et riseFall sont assez similaires à l'abstrait (73 octets)

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

Notez que (tail y) est plus court que ya @ (y: ys) (70 octets)

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

Ranger; supprimer les espaces inutiles (52 octets)

f x=and$g(/=)$g(>)x
  where g h y=zipWith h(tail y)y
Teron
la source
... et je viens de remarquer une réponse Haskell plus courte qui a été publiée avant la mienne et qui fait essentiellement la même chose. Je suis horrible à repérer des choses.
Teron
Tu veux dire celui qui ne fonctionne pas? ;-) Vous pouvez utiliser g h=tail>>=zipWith het en faire une fonction globale pour éviter le wheremot - clé.
Christian Sievers
@ChristianSievers Corrigé, et je viens de remarquer cette réponse qui fait maintenant exactement la même chose que la mienne, ce qui rend ma réponse mieux adaptée en tant que commentaire à celle-ci.
BlackCap
4

Java 7, 157 153 150 125 125 117 octets

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

Cas non testés et testés:

Essayez ici.

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

Sortie:

1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
Kevin Cruijssen
la source
@TimmyD Hmm, donc il monte quand a > b, mais tombe quand a <= b, au lieu de >et <?
Kevin Cruijssen
@TimmyD Ok, il est fixe et enregistre même 3 octets. :)
Kevin Cruijssen
1
vous pouvez redéfinir votre méthode pour accepter char[]afin de ne pas avoir à transformer votre chaîne d'entrée en tableau char. cela devrait économiser quelques octets. PS: java ftw!
peech
1
Pensiez-vous peut-être à changer String s-> char[]z?
1
Vous pouvez renvoyer une valeur truthyou falsey, alors faites de votre méthode un entier et retournez 1 ou 0 :) .. vous met à 117 octets
Shaun Wild
3

PowerShell v2 +, 83 octets

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

Un peu d'une approche différente. Cela boucle à travers l'entrée $n, chaque itération voyant si le caractère précédent $n[$_-1]est -less than le caractère actuel $n[$_], puis transtypant le résultat de cet opérateur booléen en un int avec +. Ceux-ci sont -joinédités ensemble dans une chaîne, stockés dans $a. Nous vérifions ensuite si $aest -eqcompatible $aavec les sous-chaînes de 00ou 11supprimées.

AdmBorkBork
la source
3

Python 2.7, 84 octets

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

Renvoie 1 pour cahoteux, 0 pour sinon

J'ai appris des trucs sympas avec bit & et ^.
Commence par booléen b définissant la première paire comme haut / bas, puis teste et retourne b pour chaque paire suivante.
o bascule sur faux si le test échoue et colle.
Nécessite des guillemets autour de l'entrée (+4 octets pour raw_input () si cela enfreint une règle)

Essaye-le

greyShift
la source
3

05AB1E , 9 octets

SÇ¥0›¥_O_

Explication

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

Essayez-le en ligne!

Emigna
la source
2

Python 2.7 (encore une fois, 84 83 octets)

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

Ou, 78 77 octets sans l'impression.

À propos, l'exemple Python 2.7 de 56 octets ci-dessus se casse, par exemple, "abbab"ou toute autre entrée avec des caractères répétés. Tant pis, je n'ai pas lu les instructions. Révision.

D'accord, jusqu'à 83. Le triplet est plus joli cependant.

Timothy Teräväinen
la source
Voici quelques conseils pour vous. 1. Supprimez des espaces a(x)if x else[]. 2. Utilisez un lambda à la place a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]3. Utilisez un lambda à la fin au lieu d'imprimer. lambda s:len(set(a(s)))>14. s'il len(set(a(s)))n'est pas supérieur à 1, il est déjà faux, vous pouvez donc décoller>1
DJMcMayhem
2

CJam , 15 octets

l2ew::<2ew::^:*

Essayez-le en ligne! (En tant que suite de tests séparés par des sauts de ligne.)

Explication

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
la source
2

PHP, 80 octets

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

ou

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

sortie vide pour faux, 1pour vrai

ou approche récursive de Hedi portée et un peu golfée pour 70 octets:

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

En fait, cela devrait récurrence infiniment pour les mots cahoteux, mais ce n'est pas le cas!

Titus
la source
2

Haskell, 30 37 octets

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

Usage:

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
la source
Cela n'accepte pas "chauve", foldl1(/=)ne fait pas ce que vous pensez qu'il fait.
Christian Sievers
@ChristianSievers Auch, vous avez raison. Merci pour l'
avertissement
2

PHP 7, 137 118 octets

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

Sortie vide pour Bumpy, 0 pour Not Bumpy.

C'est ma première tentative de golf à code et je dois m'améliorer beaucoup, mais c'était une merveilleuse méthode pour apprendre de nouvelles choses pour moi. Je voulais également me mettre au défi dans cette tâche en utilisant le nouvel opérateur PHP 7 Spaceship qui semble très intéressant.

Quoi qu'il en soit, je ne suis pas satisfait, tout d'abord pour le fait que j'ai dû ajouter un supplément if(isset($s[$i+2]))pour vérifier si la variable existe parce que je n'ai pas trouvé d'autre solution au problème, mais c'est tout pour le moment. (Remarque: j'ai corrigé cela simplement en changeant strlen($s)-1en strlen($s)-2, je ne pouvais pas vraiment voir ça avant ...).

Code de test:

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

Testez en ligne

Mario
la source
Bonjour et bienvenue chez PPCG! Excellent premier post!
NoOneIsHere
Bienvenue chez PPCG! Bon premier post. Consultez les conseils pour PHP pour quelques suggestions de golf supplémentaires.
AdmBorkBork
1

Javascript ES6, 100 octets

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}

Essayez-le ici:

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

Oh allez, deux personnes me l'ont déjà battu de 40 octets ... peu importe

Chauve Bantha
la source
Astuce "A"<"B":, vous n'avez donc pas besoin d'obtenir les codes de caractères des caractères.
ETHproductions
En outre, cela revient 1pour BUMPY(ou toute autre chose qui contient à la fois une hausse et une baisse).
ETHproductions
Cela ne semble pas fonctionner correctement.
AdmBorkBork
1

Python 3, 148 139 127 octets

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]

code de test

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
la source
je suis vraiment nul à ce #facepalm
Jeffrey04
Bienvenue chez PPCG! Consultez les conseils pour jouer au golf en Python et inspirez-vous des autres réponses.
AdmBorkBork
1

C 65 57 60 octets

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

est correct de

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

qui fonctionne correctement avec toutes les données uniquement lors d'un appel de fonction unique (lorsque la variable globale rest initialisée à zéro).

Mais dans tous les cas, c'est plus court que la solution précédente (65 octets) en raison de l'utilisation de forau lieu de while. Mais le précédent (ce qui suit) est un peu plus facile à comprendre:

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

Ma solution est basée sur le bit &avec le code de direction précédent et actuel inversé, où le code de direction peut être 2( 1<<1) pour augmenter le code de caractère ( *s > *(s-1)) ou 1( 1<<0) sinon. Le résultat de cette opération est devenu 0 si nous utilisons le même code de direction que précédent et actuel, c'est-à-dire lorsque le mot n'est pas cahoteux.

MISE À JOUR:

Code de test:

#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
la source
Par méta consensus, les fonctions doivent être réutilisables . Cela signifie que vous ne pouvez pas réinitialiser rà 0gratuitement, mais vous devez le faire à partir de la fonction.
Dennis
@Dennis Vous avez raison, l'initialisation est requise, mais uniquement pour les appels répétés. Supposons que pour un seul appel qui fonctionne avec toutes les données, car le compilateur fournit l'initialisation des variables globales
VolAnd
Je pense que vous devriez faire de la solution à 60 octets votre principale, car la version à 57 octets n'est pas valide par ce message méta que j'ai cité.
Dennis
@Dennis Done! +3 octets
VolAnd
1

PHP, 100 octets

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;

Remplace chaque caractère de la chaîne (sauf le dernier évidemment) par un rpour augmenter ou un fpour tomber, puis vérifie si rrou ffse produisent dans la chaîne. Pour éviter que le dernier caractère restant interfère avec cela, l'entrée doit être entièrement en majuscules.

Je suis très insatisfait de la boucle, par exemple, j'ai le sentiment qu'il doit y avoir un moyen de combiner le $i++dans l'un des nombreux $is utilisés dans la boucle, mais je n'ai pas réussi à trouver cette façon. Peut-être que quelqu'un d'autre le voit.

(C'est aussi pourquoi j'ai posté mon code, bien qu'il soit 20 (!) Octets de plus que la belle solution de Titus.)

Christallkeks
la source
0

Java 8, 114 90 octets

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

Programme de test non golfé

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
la source