(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 ACE
tiene dos subidas ( A
to C
y C
to E
) y ninguna caída, mientras que THE
tiene dos caídas ( T
to H
y H
toE
) y ninguna subida.
Llamamos a una palabra desigual si la secuencia de subidas y bajadas alterna. Por ejemplo, BUMP
sube ( B
a U
), cae ( U
a M
), sube ( M
aP
). Tenga en cuenta que la primera secuencia no necesita ser un aumento: BALD
va 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 código de golf, 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 N
está 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
fuente
BUMP
aparece en Verdad (es decir, desigual), ¿por quéBUMPY
está en la lista de Falsey? ¿Qué significa "sube y baja alternativamente"? ¿Dos ascensos no pueden ser sucesivamente?BUMPY
es falso porqueMPY
da 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).Respuestas:
MATL, 4 bytes
Explicación:
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 queall
no es necesario porque cualquier cero hace que una matriz sea falsa, por lo que no hayA
en el puerto MATL.fuente
d0>d
debería funcionar (no necesita elA
según nuestra definición de verdad / falsey)JavaScript (ES6),
7569634643 bytesGuardado 3 bytes gracias a Neil:
Desestructuración del parámetro de cadena en lugar de
s.slice(1)
.Solución anterior:
ahorré 17 bytes gracias a ETHproductions:
Lo que pasó de la solución anterior paso a paso:
Soluciones anteriores:
63 bytes gracias a ETHproductions:
69 bytes:
75 bytes:
Todas las letras en una palabra deben tener el mismo caso.
fuente
!s[2]|...
hacer lo mismo ques[2]?...:1
?f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
LabVIEW, 36 bytes equivalentes
Golfed hacia abajo utilizando equivalencias lógicas:
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!
fuente
Python, 56 bytes
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.
fuente
Rubí,
5748 bytesEspera que la entrada sea todo en mayúscula.
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$1
y$2
son 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á$1
y$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 ($1
y$2
) es una caída o viceversa, al igual que la mayoría de las otras respuestas. Esta^
expresión devuelvetrue
ofalse
, que se convierte en una cadena y se inserta en lugar de la coincidencia. Como resultado, nuestro ejemplo se"BUMPY"
convierte en esto: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.fuente
C #,
646355 bytes-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,
969491 bytes-2 bytes usando en
1>0
lugar detrue
.-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:
fuente
?:
operador o paréntesis:unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
||
lugar de OR bit a bit|
. Actualizado el post, gracias.C 59 Bytes
fuente
AAA
- el primer "Falsey" en los ejemplosgcc (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.f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
compilada en Visual Studio 2012 devuelve un valor23
que puede tratarse comoTrue
pero en la pregunta este valor está en la sección "Falsey", por lo que el valor0
esperado.Jalea , 6 bytes
Basado en la respuesta de @sanchises .
Pruébalo en línea! o Verificar todo.
Explicación
fuente
JavaScript (ES6), 65 bytes
.map
es definitivamente no es la mejor solución .fuente
Python 2, 88 bytes
Solución simple.
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:
fuente
Perl, 34 bytes
Incluye +3 para
-p
(el código contiene,'
por-e
lo que no se puede usar)Ingrese mayúsculas en STDIN:
bump.pl
fuente
Python, 51 bytes
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
.fuente
Jalea ,
65 bytes-1 byte gracias a @Dennis (use una reducción acumulativa)
Todos los casos de prueba están en TryItOnline
¿Cómo?
Funciona para mayúsculas o minúsculas.
fuente
Japt, 8 bytes
¡Pruébelo en línea!
Cómo funciona
fuente
C #
105104 Bytes105 bytes Solución:
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
fuente
Haskell, 52 bytes
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)
Acortar nombres, eliminar información de tipo (100 bytes)
Mueva h a la función principal, ya que solo se usa una vez (86 bytes)
Tenga en cuenta que areBumps y riseFall son lo suficientemente similares a abstract (73 bytes)
Tenga en cuenta que (tail y) es más corto que ya @ (y: ys) (70 bytes)
Ordenar; eliminar espacios innecesarios (52 bytes)
fuente
g h=tail>>=zipWith h
y convertirlo en una función global para evitar lawhere
palabra clave.Java 7,
157153150125117 bytesSin golf y casos de prueba:
Pruébalo aquí.
Salida:
fuente
a > b
, pero cae cuandoa <= b
, en lugar de>
y<
?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!String s
->char[]z
?truthy
ofalsey
valor, por lo que su método de un int y regresar 1 o 0 .. :) te pone hasta 117 bytesPowerShell v2 +, 83 bytes
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-l
esst
han del carácter actual$n[$_]
, y luego colar el resultado de ese operador booleano a un int con+
. Esos se-join
editan juntos en una cadena, almacenados en$a
. Luego verificamos si$a
es-eq
ual$a
con cualquier subcadena de00
o11
eliminado.fuente
Python 2.7, 84 bytes
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
fuente
05AB1E , 9 bytes
Explicación
Pruébalo en línea!
fuente
Python 2.7 (nuevamente,
8483 bytes)O
7877 bytes sin la impresión.Por cierto, el ejemplo de Python 2.7 de 56 bytes anterior se rompe, por ejemplo,No importa, no leí las instrucciones. Revisando"abbab"
o cualquier otra entrada con caracteres repetidos.De acuerdo, hasta 83. Sin embargo, el triple es más agradable.
fuente
a(x)if x else[]
. 2. Use una lambda en su lugara=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)))>1
4. silen(set(a(s)))
no es mayor que 1, entonces ya es falso, para que pueda despegar>1
CJam , 15 bytes
Pruébalo en línea! (Como un conjunto de pruebas separado por salto de línea).
Explicación
fuente
PHP, 80 bytes
o
salida vacía para falso,
1
para verdaderoo el enfoque recursivo de Hedi portado y un poco de golf por 70 bytes:
En realidad, esto debería repetirse infinitamente para palabras con baches, ¡pero no es así!
fuente
Haskell,
3037 bytesUso:
fuente
foldl1(/=)
no hace lo que crees que hace.PHP 7,
137118 bytesSalida 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(Nota: lo arreglé simplemente cambiandoif(isset($s[$i+2]))
para verificar si la variable existe porque no encontré otra solución al problema, pero esto es todo por ahora.strlen($s)-1
astrlen($s)-2
, realmente no podía ver eso antes ...).Código de prueba:
Prueba en línea
fuente
Javascript ES6, 100 bytes
Pruébalo aquí:
Oh vamos dos personas ya me ganaron por 40 bytes ... lo que sea
fuente
"A"<"B"
no necesita obtener los códigos de caracteres de los caracteres.1
paraBUMPY
(o cualquier otra cosa que contenga tanto una subida y una caída).Python 3,
148 139127 bytescódigo de prueba
fuente
DO,
sesenta y cinco5760 byteses una solución de
que funciona correctamente con cualquier dato solo en la llamada de función única (cuando la variable global
r
se inicializa a cero).Pero en cualquier caso, esto es más corto que la solución anterior (65 bytes) debido al uso de en
for
lugar dewhile
. Pero el anterior (el siguiente) es un poco más fácil de entender: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 ser2
(1<<1
) para el aumento del código de caracteres (*s > *(s-1)
) o1
(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:
fuente
r
a0
gratis, pero debe hacerlo desde dentro de la función.PHP, 100 bytes
Reemplaza cada carácter de la cadena (excepto el último obviamente) con un
r
aumento o unaf
caída y luego comprueba si se producerr
o noff
en 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$i
s 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).
fuente
Java 8,
11490 bytesPrograma de prueba sin golf
fuente