¿Es una palabra llena de baches?


31

(Inspirado por este desafío en Puzzling - A continuación encontrarás SPOILERS para ese rompecabezas, ¡así que deja de leer aquí si quieres resolver ese rompecabezas por tu cuenta!)

Si una letra en una palabra aparece alfabéticamente más tarde que la letra anterior en la palabra, llamamos a eso un aumento entre las dos letras. De lo contrario, incluso si es la misma letra , se llama caída .

Por ejemplo, la palabra ACEtiene dos subidas ( Ato Cy Cto E) y ninguna caída, mientras que THEtiene dos caídas ( Tto Hy HtoE ) y ninguna subida.

Llamamos a una palabra desigual si la secuencia de subidas y bajadas alterna. Por ejemplo, BUMPsube ( Ba U), cae ( Ua M), sube ( MaP ). Tenga en cuenta que la primera secuencia no necesita ser un aumento: BALDva caída-subida-caída y también es desigual.

El reto

Dada una palabra, muestra si es Bumpy o no.

Entrada

  • Una palabra (no necesariamente una palabra del diccionario) que consta de letras del alfabeto ( [A-Z]o [a-z]) ASCII solamente, en cualquier formato adecuado .
  • Usted elige si la entrada es todo en mayúsculas o minúsculas, pero debe ser consistente.
  • La palabra tendrá al menos 3 caracteres de longitud.

Salida

Un valor verdadero / falso para saber si la palabra de entrada es Bumpy (verdadero) o no Bumpy (falsey).

Las normas

  • Un programa completo o una función son aceptables.
  • Lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

Ejemplos

Verdad:

ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN

Falsey

AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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


Dangit Esto sería más fácil si la misma letra no fuera ni ascendente ni descendente.
mbomb007

No entiendo los ejemplos proporcionados: si BUMPaparece en Verdad (es decir, desigual), ¿por qué BUMPYestá en la lista de Falsey? ¿Qué significa "sube y baja alternativamente"? ¿Dos ascensos no pueden ser sucesivamente?
VolAnd

44
@VolAnd Sí, significa que una subida siempre va seguida de una caída y viceversa. BUMPYes falso porque MPYda dos subidas consecutivas. En otras palabras, ninguna subcadena de longitud 3 debe clasificarse de forma ascendente o descendente para que una palabra tenga baches (aparte del caso especial donde dos letras consecutivas son idénticas).
Martin Ender

¿Puedes estropear la respuesta a la pregunta de Puzzling.SE para que otros que deseen resolverla por sí mismos puedan hacerlo?
OldBunny2800

1
@ OldBunny2800 No pondré un spoiler completo (no quiero hacer mi desafío aquí difícil de leer ocultando información crucial detrás de un spoiler), pero agregaré texto adicional en la parte superior como advertencia. ¡Gracias!
AdmBorkBork

Respuestas:


31

MATL, 4 bytes

d0>d

Explicación:

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

Esta es mi primera entrada de MATL, así que me pregunto cuánta mejora puede haber de este puerto ingenuo de mi intento de MATLAB / Octave (que sería @(a)all(diff(diff(a)>0))). Tenga en cuenta que allno es necesario porque cualquier cero hace que una matriz sea falsa, por lo que no hay Aen el puerto MATL.


Ver el desafío corregido. Hubo un error tipográfico en un caso de prueba. Tu enfoque fue correcto. De hecho, d0>ddebería funcionar (no necesita el Asegún nuestra definición de verdad / falsey)
Luis Mendo

1
¡Buen trabajo, superando a Luis en su propio idioma! Lo he intentado antes, y esa no es una tarea fácil. ;)
DJMcMayhem

@DJMcMayhem Jaja. Eso es lo que obtengo por leer el desafío demasiado rápido. En mi defensa, es contra-intuitivo que dos letras iguales son una caída. Y los casos de prueba engañosos (ahora corregidos) tampoco ayudaron :-)
Luis Mendo

1
@DJMcMayhem Gracias, aunque quizás tuve suerte, porque en realidad no pensé en letras iguales consecutivas, pero resultó ser exactamente lo que se pidió ...
Sanchises

1
@immibis En MATL (AB) y Octave, sí. Ver esta respuesta Meta.
Sanchises

24

JavaScript (ES6), 75 69 63 46 43 bytes

Guardado 3 bytes gracias a Neil:

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

Desestructuración del parámetro de cadena en lugar de s.slice(1) .


Solución anterior:
ahorré 17 bytes gracias a ETHproductions:

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

Lo que pasó de la solución anterior paso a paso:

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`


Soluciones anteriores:
63 bytes gracias a 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}

Todas las letras en una palabra deben tener el mismo caso.



@ETHproductions ¿Debo publicar el contenido de su enlace?
Hedi

Puede si lo desea :-)
ETHproductions

Puede !s[2]|...hacer lo mismo que s[2]?...:1?
Tito

1
Perdón por llegar tarde a la fiesta, pero por 43 bytes te doy:f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
Neil

14

LabVIEW, 36 bytes equivalentes

Golfed hacia abajo utilizando equivalencias lógicas:

golf

Sin golf:

sin golf

Primero convertimos a minúsculas, luego a byte array. Recorte el primer elemento de la matriz de bytes, ya que no tiene precedentes. Luego, para cada elemento de la matriz, verifique si es mayor que el anterior (los mapas de caracteres U8 se asignan a ASCII como espera) y almacene el resultado para la próxima iteración, así como en una matriz para ver la irregularidad general. Si la verificación booleana actual y anterior son iguales, terminamos el ciclo y no está lleno de baches. ¡De lo contrario, está lleno de baches!


1
¡Qué lenguaje tan genial! Bienvenido a PPCG!
DJMcMayhem

1
¡Gracias! Nunca competiré con las respuestas de 4 bytes, pero es una buena manera de mejorar mis habilidades :)
ijustlovemath

Ver aquí . Su puntaje es definitivamente incorrecto y excesivamente excesivo . No creo que su respuesta sea realmente 246450 - 246549 bytes.
Erik the Outgolfer

Estaba saliendo de la pestaña Memoria, ya que no sabía que había un concepto de bytes equivalentes para LabVIEW. Los contaré y editaré la respuesta más tarde hoy.
ijustlovemath

1
@Erik Estoy en Firefox en Windows, pero abrirlo en el móvil también rompe cosas. Solo meta.ppcg.lol funciona. De todos modos, esto está fuera del alcance de los comentarios.
Fondo de la demanda de Mónica

8

Python, 56 bytes

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

Todos los casos de prueba están en ideone

Comprime los triples de caracteres en sy comprueba que todos estos triples tienen pares izquierdo y derecho con diferentes propiedades de subida / caída.
Funciona para mayúsculas o minúsculas.


6

Rubí, 57 48 bytes

Espera que la entrada sea todo en mayúscula.

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

Véalo en repl.it: https://repl.it/D7SB

Explicación

La expresión regular /.(?=(.)(.))/coincide con cada carácter seguido de dos caracteres más. (?=...)es una anticipación positiva, lo que significa que hacemos coincidir los dos caracteres posteriores pero no los "consumimos" como parte de la coincidencia. Dentro de las llaves, $&es el texto del primer carácter combinado de los tres-y $1y $2son los personajes capturados dentro de la búsqueda hacia delante. En otras palabras, si la cadena es "BUMPY", primero coincidirá "B"(y la colocará $&) y capturará "U"y "M"(y las colocará $1y $2). Luego coincidirá "U"y capturará "M"y"P" , y así sucesivamente.

Dentro del bloque verificamos si el primer par de caracteres ( $&y $1) es un aumento y el segundo ( $1y $2) es una caída o viceversa, al igual que la mayoría de las otras respuestas. Esta ^expresión devuelve trueo false, que se convierte en una cadena y se inserta en lugar de la coincidencia. Como resultado, nuestro ejemplo se "BUMPY"convierte en esto:

"truetruefalsePY"

Como sabemos que la entrada es todo en mayúscula, sabemos "f"que solo ocurrirá como parte de "false"y !result[?f]nos da nuestra respuesta.


¿Como funciona?
GreenAsJade

1
@GreenAsJade He agregado una explicación a mi respuesta.
Jordania

6

C #, 64 63 55 bytes

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

-8 bytes de las sugerencias de Scepheo

Este es un puerto de la solución de Hedi para C #. También se me ocurrió una solución recursiva, pero la recursividad no fue tan buena. Mi solución original está abajo.

Mi C # original, 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 usando en 1>0lugar de true.

-3 bytes de las sugerencias de Scepheo para la solución de puerto anterior

Se llama a sí mismo de forma recursiva comprobando que el ascenso / descenso se alterna cada vez.

Sin golf:

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

Parece que el último puede prescindir del ?:operador o paréntesis:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
Scepheo

En realidad, aunque no puedo probar esto, manipular el puntero en sí parece aún más terso:unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
Scepheo

@Scepheo Obtuve StackOverflowExceptions con esas sugerencias, pero funcionan usando OR booleano en ||lugar de OR bit a bit |. Actualizado el post, gracias.
leche

6

C 59 Bytes

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

La solución en 70 bytes devuelve 1 (Verdadero) para el caso AAA- el primer "Falsey" en los ejemplos
VolAnd 13/16

Estoy probando usando gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)y me vuelvo falso por aaa y emocionado. En esta versión, no cero es falsey y cero es verdadero. En realidad, ahora me pregunto si esto está permitido.
cleblanc

La llamada f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")compilada en Visual Studio 2012 devuelve un valor 23que puede tratarse como Truepero en la pregunta este valor está en la sección "Falsey", por lo que el valor 0esperado.
VolAnd

No entendí lo que estaba permitido para True y Falsey. Ahora he leído esa publicación y parece claro cuáles deben ser los valores para "C".
cleblanc

Aquí están nuestras definiciones estándar de verdad y falsa , basadas en el consenso meta.
AdmBorkBork

5

Jalea , 6 bytes

OI>0IẠ

Basado en la respuesta de @sanchises .

Pruébalo en línea! o Verificar todo.

Explicación

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


5

Python 2, 88 bytes

Solución 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:]))

Pruébalo en línea

Si las mismas letras seguidas no fueran ni una subida ni una caída, la solución sería de 79 bytes:

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

5

Perl, 34 bytes

Incluye +3 para -p(el código contiene, 'por -elo que no se puede usar)

Ingrese mayúsculas en STDIN:

bump.pl <<< AAA

bump.pl

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

5

Python, 51 bytes

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

Toma entradas como g('B','U','M','P')y salidas1 o0 .

Utiliza el desempaquetado de argumentos para tomar las tres primeras letras y verificar si las dos primeras se comparan de manera diferente a las dos últimas. Luego, recurre en el resto, usando la multiplicación para and.


Buena entrada de golf. ;-)
AdmBorkBork

5

Jalea , 6 5 bytes

-1 byte gracias a @Dennis (use una reducción acumulativa)

<2\IẠ

Todos los casos de prueba están en TryItOnline

¿Cómo?

<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

Funciona para mayúsculas o minúsculas.


4

Japt, 8 bytes

Uä> ä- e

¡Pruébelo en línea!

Cómo funciona

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

Igual que mi solución. Excepto 11 veces más corto. : 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 Solución:

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

Pruébalo en línea

El uso de una matriz de caracteres guarda un byte, ya que el espacio puede omitirse después de los corchetes. f(string x)vsf(char[]x)

Son 101 bytes si puedo devolver un int 1/0 en lugar de bool verdadero / falso

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

4

Haskell, 52 bytes

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

Sospecho que podría reducir esto un poco más si lograra deshacerme de la construcción "where", pero probablemente estoy atrapado con zipWith.

Esto funciona haciendo una lista de las subidas (Verdadero) y las caídas (Falso), luego haciendo una lista de si las entradas adyacentes en esta lista son diferentes


Este es mi primer intento de uno de estos, así que pasaré por mi proceso de pensamiento en caso de que me haya equivocado terriblemente en alguna parte.

Versión sin golf (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

Acortar nombres, eliminar información de tipo (100 bytes)

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

Mueva h a la función principal, ya que solo se usa una vez (86 bytes)

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

Tenga en cuenta que areBumps y riseFall son lo suficientemente similares a abstract (73 bytes)

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

Tenga en cuenta que (tail y) es más corto que ya @ (y: ys) (70 bytes)

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

Ordenar; eliminar espacios innecesarios (52 bytes)

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

... y acabo de notar una respuesta más breve de Haskell que se publicó antes que la mía y que hace básicamente lo mismo. Soy terrible para detectar cosas.
Teron

¿Te refieres al que no funciona? ;-) Puede usar g h=tail>>=zipWith hy convertirlo en una función global para evitar la wherepalabra clave.
Christian Sievers

@ChristianSievers Lo solucionó, y acabo de notar esta respuesta que ahora hace exactamente lo mismo que la mía, lo que hace que mi respuesta sea más adecuada como comentario para esta.
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;}

Sin golf y casos de prueba:

Pruébalo aquí.

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

Salida:

1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0

@TimmyD Hmm, entonces sube cuando a > b, pero cae cuando a <= b, en lugar de >y <?
Kevin Cruijssen

@TimmyD Ok, está arreglado e incluso ahorra 3 bytes. :)
Kevin Cruijssen

1
puede redefinir su método para aceptar char[]para que no tenga que transformar su cadena de entrada en una matriz de caracteres. eso debería ahorrar algunos bytes. PD: java ftw!
peech

1
¿Quizás quisiste cambiar String s-> char[]z?

1
Puede devolver una truthyo falseyvalor, por lo que su método de un int y regresar 1 o 0 .. :) te pone hasta 117 bytes
Shaun salvajes

3

PowerShell v2 +, 83 bytes

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

Un enfoque un poco diferente. Este bucle a través de la entrada $n, cada iteración viendo si el carácter anterior $n[$_-1]es -less than del carácter actual $n[$_], y luego colar el resultado de ese operador booleano a un int con +. Esos se -joineditan juntos en una cadena, almacenados en $a. Luego verificamos si $aes -equal $acon cualquier subcadena de 00o 11eliminado.


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

Devuelve 1 para desigual, 0 para lo contrario

Aprendí algunas cosas interesantes con bitwise & y ^.
Comienza con boolean b definiendo el primer par como arriba / abajo, luego prueba y voltea b para cada par siguiente.
o cambia a falso si la prueba falla y se pega.
Requiere comillas alrededor de la entrada (+4 bytes para raw_input () si eso rompe alguna regla)

Pruébalo


3

05AB1E , 9 bytes

SÇ¥0›¥_O_

Explicación

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

Pruébalo en línea!


2

Python 2.7 (nuevamente, 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

O 78 77 bytes sin la impresión.

Por cierto, el ejemplo de Python 2.7 de 56 bytes anterior se rompe, por ejemplo, "abbab"o cualquier otra entrada con caracteres repetidos.No importa, no leí las instrucciones. Revisando

De acuerdo, hasta 83. Sin embargo, el triple es más agradable.


Aquí hay algunos consejos para ti. 1. Elimine algunos espacios en blanco a(x)if x else[]. 2. Use una lambda en su lugar a=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]3. Use una lambda al final en lugar de imprimir. lambda s:len(set(a(s)))>14. si len(set(a(s)))no es mayor que 1, entonces ya es falso, para que pueda despegar>1
DJMcMayhem

2

CJam , 15 bytes

l2ew::<2ew::^:*

Pruébalo en línea! (Como un conjunto de pruebas separado por salto de línea).

Explicación

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.

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;

o

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

salida vacía para falso, 1para verdadero

o el enfoque recursivo de Hedi portado y un poco de golf por 70 bytes:

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

En realidad, esto debería repetirse infinitamente para palabras con baches, ¡pero no es así!


2

Haskell, 30 37 bytes

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

Uso:

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]

Eso no acepta "calvo", foldl1(/=)no hace lo que crees que hace.
Christian Sievers

@ChristianSievers Auch, tienes razón. Gracias por el
aviso

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

Salida vacía para desigual, 0 para Not Bumpy.

Este es mi primer intento de golf de código y tengo que mejorar mucho, pero fue un método maravilloso para aprender cosas nuevas para mí. También quería desafiarme en esa tarea usando el nuevo PHP 7 Operador de Nave Espacial que parece muy interesante.

De todos modos, no estoy satisfecho con eso, en primer lugar por el hecho de que tuve que agregar un extra if(isset($s[$i+2]))para verificar si la variable existe porque no encontré otra solución al problema, pero esto es todo por ahora. (Nota: lo arreglé simplemente cambiando strlen($s)-1a strlen($s)-2, realmente no podía ver eso antes ...).

Código de prueba:

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

Prueba en línea


Hola y bienvenidos a PPCG! Gran primer post!
NoOneIsHere

Bienvenido a PPCG! Bonito primer post. Consulte Consejos para PHP para obtener algunas sugerencias de golf adicionales.
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}

Pruébalo aquí:

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 vamos dos personas ya me ganaron por 40 bytes ... lo que sea


Sugerencia: "A"<"B"no necesita obtener los códigos de caracteres de los caracteres.
ETHproductions

Además, este regresa 1para BUMPY(o cualquier otra cosa que contenga tanto una subida y una caída).
ETHproductions

Esto no parece funcionar bien.
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]

código de prueba

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)

Realmente soy un
asco

Bienvenido a PPCG! Echa un vistazo a Consejos para jugar golf en Python e inspírate en las otras respuestas.
AdmBorkBork

1

DO, sesenta y cinco 57 60 bytes

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

es una solución de

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

que funciona correctamente con cualquier dato solo en la llamada de función única (cuando la variable global rse inicializa a cero).

Pero en cualquier caso, esto es más corto que la solución anterior (65 bytes) debido al uso de en forlugar de while. Pero el anterior (el siguiente) es un poco más fácil de entender:

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

Mi solución se basa en bit a bit &con el código de dirección anterior y actual invertido, donde el código de dirección puede ser 2( 1<<1) para el aumento del código de caracteres ( *s > *(s-1)) o 1(1<<0 ) de lo contrario. El resultado de esta operación se convirtió en 0 si utilizamos el mismo código de dirección que el anterior y el actual, es decir, cuando la palabra no es desigual.

ACTUALIZAR:

Código para pruebas:

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

Por meta consenso, las funciones tienen que ser reutilizables . Eso significa que no se puede restablecer ra 0gratis, pero debe hacerlo desde dentro de la función.
Dennis

@Dennis Tienes razón, se requiere inicialización, pero solo para llamadas repetidas. Supongamos que para una sola llamada que funciona con cualquier dato porque el compilador proporciona la inicialización para variables globales
VolAnd

Creo que debería hacer que la solución de 60 bytes sea la principal, ya que la versión de 57 bytes no es válida para esa meta publicación que cité.
Dennis

@Dennis Done! +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;

Reemplaza cada carácter de la cadena (excepto el último obviamente) con un raumento o una fcaída y luego comprueba si se produce rro no ffen la cadena. Para evitar que el último carácter restante interfiera con eso, la entrada debe estar en mayúscula.

Estoy muy insatisfecho con el bucle, por ejemplo, tengo la sensación de que debe haber una forma de combinarlo $i++en uno de los varios $is utilizados en el bucle, pero no pude encontrarlo de esa manera. Quizás alguien más lo vea.

(Por eso también publiqué mi código, a pesar de que es 20 (!) Bytes más largo que la buena solución de Titus).


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

Programa de prueba sin 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));
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.