Un número ondulante es un número donde sus dígitos alternan entre arriba y abajo como el siguiente número: 461902 o 708143, o incluso 1010101, pero no 123, porque 2 <3.
Escriba un programa o función que devuelva un valor verdadero si un número es ondulante , y un valor falso de lo contrario. El código más corto gana.
Nota : los números de un solo dígito son una entrada válida pero no se consideran udulantes , por lo tanto, isUndulantdevuelve falso para n <10.
                    
                        code-golf
                                decision-problem
                                number-theory
                                
                    
                    
                        leonardo
fuente
                
                fuente

Respuestas:
J, 45
Uso de la muestra:
Estoy bastante seguro de que hay una mejor manera de torcer Insert
/para hacer más trabajo de una vez, pero he estado sin J durante meses, necesito volver a hacerlo.fuente
Ruby,
7270 caracteresUso y casos de prueba:
Los dígitos individuales producen falso :
Los dígitos idénticos consecutivos también devuelven falso :
fuente
J, 30 bytes
Un enfoque diferente que las otras respuestas de J.
* / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 461902 1 * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 708143 1 * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 1010101 1 * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 123 0 0 * / 0 <(#,] * {. * 1 _1 $ ~ #) (} .-} :) ai ": 5 0 0Sería 3 caracteres más corto si 5 se consideraran ondulantes.
fuente
(pdf) eTeX, 129 caracteres
Compilar con
pdfetex filename.tex 1324?da una salida en pdf. TeX es principalmente un lenguaje de composición tipográfica, y la salida en lugar de stdout tomaría alrededor de 20 caracteres más. Además, el extraño requisito de números de un dígito (falso en lugar de verdadero) me lleva 26 caracteres.fuente
Haskell,
88777365 caracteresEsto requiere que el pragma idioma de uso común (o
-Xbandera):NoMonomorphismRestriction. Si no admite eso, tenemos que agregar 4 caracteres y definirzasí:fuente
u n=length s>1&&(a[GT,LT]||a[LT,GT])where s=show n;z=q compare s$tail s;w=q(==)z;q=zipWith;a=and.w.cycleEs un poco elegante.zipWithuna vez concomparecomo lo hiciste, luegozipWithotra vez con(==)ycycle[GT,LT]ocycle[LT,GT]como segundo argumento.tail>>=zipWith compareque acortaría unos pocos bytes.q:q[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1q s=and$all(/=EQ)s:zipWith(/=)s(tail s)Salvia,
8376 bytesSe me ocurrió la idea de usar cmp (* [..]) de JBernardo. En sabio,
uniq(...)es un alias paralist(set(...)).Editar: acabo de notar que para x <10
uniq(cmp(...)) == [], que no está activado[[1],[-1]]. Si x se ingresara como una cadena, en lugar de un entero, ¡podría obtener otros 4 caracteres!fuente
sum(uniq(...))^2, desde entoncessum([1,-1]) = 0, y las sumas de los singletons [1] y [-1] se ajustan a 1. Desafortunadamente, falla en un dígito tres veces repetido; 1011101.Lsi el número es mayor que 2 ** 32 en Python y afecta el resultado. ¿Eso sucede en Sage?Lporque Sage es Python preparsed; 1234 -> Entero ('1234'). Puedes saltar directamente a usar Sage aquí: sagenb.orgPython:
101100 caracteresAntes de la minificación:
Después de la minificación:
fuente
Python,
134129 caracteresSin golf:
fuente
JavaScript, 88 caracteres
En esencia, convierta el número en una cadena y compare los caracteres adyacentes, volteando las expectativas para cada uno.
fuente
K, 41 bytes
P.ej
fuente
CoffeeScript,
986753 bytesPruebas:
Sin comprimir:
fuente
J,
44393631 bytesUso como antes.
No me había dado cuenta de que mi última edición hizo que la desigualdad con el control 0 fuera completamente innecesaria. :-)
Respuesta anterior (+ explicación):
Uso:
La respuesta tiene cuatro partes:
u=.".;' ',.":Esto lee el número como una cadena":, lo divide en una lista de caracteres precedidos por espacios' ',., lo vuelve a unir;, lo convierte de nuevo en números".y luego almacena el resultadou=.Esto básicamente convierte 461902 en 4 6 1 9 0 2, lo cual me parece más fácil procesar en J.*/2~:/\2<:/\Esto opera en el valor almacenado en u. Toma cada par de caracteres y comprueba si el izquierdo es menor o igual que el derecho,2<:/\por lo que 4 6 1 9 0 2 se convierte en 1 0 1 0 1. Luego toma el resultado de esto y verifica la desigualdad en cada par de números2~:/\así que 1 0 1 0 1 se convierte en 1 1 1 1. Finalmente, los multiplica para obtener un 0 o un 1.*/En este punto, podríamos devolver la respuesta si no fuera por 2 cosas: un solo dígito devuelve 1 cuando el la pregunta requiere un 0; y números iguales se tratan igual que 'menor que', por lo que 461900 devuelve 1 en lugar de 0. Bummer. En vamos ...(1<#u)Esto comprueba si el número de elementos almacenados en u#ues mayor que 1 y devuelve falso si es solo un número de un solo dígito.(0=+/2=/\u)Esto toma cada par de números almacenados en u y verifica la igualdad2=/\u. Luego suma las respuestas y comprueba si tiene 0.Los resultados de las partes 2, 3 y 4 se multiplican juntos para (con suerte) producir un 1 cuando el número cumple con los requisitos especificados en la pregunta.
fuente
a.i.":a afeitar algunos personajes más).Haskell, 82 bytes
Pruébalo en línea!
fuente
readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')c=cycle[(<),(>)]se puede acortar ac=(<):(>):c.zipWith3($)l(show n)$tail$show npuede serzipWith3($)l=<<tail$show ny((>):c)puede sertail c. Todos juntos 70 bytes: ¡ Pruébelo en línea!Python,
119108bytesfuente
... for a,b in zip(t,t[1:])lugar de usar rangos. Además, no necesita los corchetesall([...]): Python crea un generador cuando lo encuentra(... for ...), incluso si los paréntesis son para una llamada a la función.x>9 and all(i^j for i,j in zip(l,l[1:]))y eliminarif l else False.cmp(i,j)y, en su lugar ,i^jconfigurari*j<0y probarand l[0]!=0. Pocos personajes más: - /printsalva un personajereturn, pero ¿es legítimo? La especificación pide una función que "devuelva".Python, 155 caracteres
fuente
C ++, 94 caracteres
mismo método que mi Erlang awnser con un bucle for en lugar de recursividad.
fuente
Python
105101100 caracteresSolución recursiva.
c(r,t)comprueba si el primer carácter deres menor(t==-1)o mayor que el(t==1)segundo carácter, y llama al control opuesto en la cadena acortada.fuente
0, y puede guardar tres caracteres en la segunda línea escribiendou=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)x>9and.Perl / re, 139 bytes
Hacer todo en expresiones regulares es una mala idea.
Estoy usando Perl 5.12 pero creo que esto funcionará en Perl 5.10. Sin embargo, estoy bastante seguro de que 5.8 está fuera.
para (qw (461902 708143 1010101 123 5)) { imprime "$ _ is". (/ Regex loco va aquí /? '': 'no'). "ondulante \ n"; } 461902 es ondulante 708143 es ondulante 1010101 es ondulante 123 no es ondulante 5 no es ondulantefuente
GolfScript, 48 bytes
Con la esperanza de vencer a J, mi primera vez usando GolfScript. No tuvo mucho éxito.
fuente
JavaScript,
66656260 bytesToma la entrada como una cadena, regresa
truepara números ondulantes, una cadena vacía (falsey) para números de un solo dígito y defalseotra manera.Intentalo
Ejecute el fragmento a continuación para probar
0-9y 25 números aleatorios<10,000,000.Explicación
Algunos trucos divertidos en este caso, así que creo que justifica una explicación rara para mí de una solución JS.
Comenzamos, simplemente, con una función anónima que toma la cadena entera como argumento cuando se llama.
Ese argumento se desestructura de inmediato en 2 parámetros:
sser el primer carácter de la cadena yaser una matriz que contiene los caracteres restantes (por ejemplo, se"461902"convierte ens="4"ya=["6","1","9","0","2"]).Primero, nos concatenamos
aconsigo mismos, lo que convierte ambas ocurrencias en cadenas. Si la entrada es un número de un solo dígito,aestará vacío y, por lo tanto, se convertirá en una cadena vacía; una cadena vacía más una cadena vacía sigue siendo una cadena vacía y, como eso es falsey en JS, detenemos el procesamiento en el AND lógico y sacamos nuestra cadena vacía. En todos los demás casosa+aserá veraz y, por lo tanto, continuaremos con la siguiente parte de la función.Comprobaremos si cada elemento
xenadevuelvetruecuando se pasa a través de una función.Esto determina cuál será nuestra primera comparación (
<o>) y luego alternaremos desde allí. Verificamos si la cadenases menor que la matriza, que se convierte en una cadena en el proceso, por lo que, sises menor que el primer caráctera,yserátrueofalseno.Construimos una cadena con el valor actual de
sal principio yxal final. En el medio, indexamos en la cadena"<>"incrementandoy, convirtiendo su valor booleano inicial en un número entero, y el módulo en 2, dándonos0o1.Evalúa esa cuerda.
Finalmente, pasamos un segundo argumento a
eval, que ignora, y lo usamos para establecer el valor desal valor actual dexpara la próxima iteración.fuente
PowerShell, 88
Ingenuo y trivial. Jugaré golf más tarde.
Mis casos de prueba .
fuente
JavaScript, 112
Solo necesita pasarle un argumento. Probablemente podría jugar más golf con un bucle for.
fuente
d>=l->d>0) y (d<=l->d<2) tal vez? No estoy mirando de cerca, ya que quizásdpodría contener partes fraccionarias que podrían sesgarlo.L, no a1. Gracias sin embargo!Erlang,
137123118 caracteresfuente
CJam, 30 bytes
CJam es más nuevo que este desafío, por lo que no compite por la marca de verificación verde, pero de todos modos no es un ganador (aunque estoy seguro de que en realidad se puede jugar bastante).
Pruébalo aquí.
Cómo funciona
En primer lugar, estoy haciendo una manipulación de cadenas (seguida de eval) para guardar 5 bytes en código duplicado:
En efecto, mi código es
Primero, así es como trato con el extraño caso especial de un solo dígito. Copio el dígito en el índice
1y lo antepongo al número. Necesitamos distinguir 3 casos:12..., luego obtenemos212..., por lo que el inicio es ondulante y no afectará si el número completo es ondulante.11..., entonces, obtenemos111.... Ahora el inicio no es ondulante, pero el número no fue ondulante de todos modos, por lo que esto tampoco afectará el resultado.1será el primer dígito (porque la indexación de la matriz de CJam gira alrededor del final), por lo que esto da como resultado dos dígitos idénticos, y el número no es ondulante.Ahora mirando el código en detalle:
Estoy seguro de que hay una forma más corta de verificar los dígitos (de longitud mayor 1) para ver si son ondulantes (en particular, sin usar dos pliegues), pero aún no pude encontrarlo.
fuente
Prolog 87 bytes
Para ejecutarlo, simplemente guárdelo como golf.pl, abra un intérprete de prólogo (por ejemplo, gprolog) en el mismo directorio y luego haga lo siguiente:
Dará
truesi el número es ondulante, de lo contrario simplemente no.fuente
Mathematica, 46 bytes
Ejemplos (no se requieren espacios):
fuente
Scala,
14113312997 bytesCon a = n% 10, b = (n / 10)% 10, c = (n / 100)% 10
Entonces
a-b * b-cesx*-yo-x*yconxyycomo números positivos, y el producto es negativo en ambos casos, pero para-x*-yox*y(a <b <c o a> b> c) el producto siempre es positivo.El resto del código maneja casos especiales: un dígito, dos dígitos, dos dígitos idénticos.
fuente
Perl, 78 bytes
fuente
Q, 71 bytes
Uso de la muestra:
fuente
{(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}da 62($)sintaxis nuncastringantes vista y la lógica es un buen toque.Julia 0.6 , 62 bytes
Toma un número, regresa
truepor Undulant yfalsepor no. Por ejemplo,f(163)vuelvetrue.Pruébalo en línea!
fuente