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, isUndulant
devuelve 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.
Serí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
-X
bandera):NoMonomorphismRestriction
. Si no admite eso, tenemos que agregar 4 caracteres y definirz
así: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.cycle
Es un poco elegante.zipWith
una vez concompare
como lo hiciste, luegozipWith
otra vez con(==)
ycycle[GT,LT]
ocycle[LT,GT]
como segundo argumento.tail>>=zipWith compare
que acortaría unos pocos bytes.q
:q[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1
q 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.L
si el número es mayor que 2 ** 32 en Python y afecta el resultado. ¿Eso sucede en Sage?L
porque 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#u
es 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 n
puede serzipWith3($)l=<<tail$show n
y((>):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^j
configurari*j<0
y probarand l[0]!=0
. Pocos personajes más: - /print
salva 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 der
es 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.
fuente
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
true
para números ondulantes, una cadena vacía (falsey) para números de un solo dígito y defalse
otra manera.Intentalo
Ejecute el fragmento a continuación para probar
0-9
y 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:
s
ser el primer carácter de la cadena ya
ser una matriz que contiene los caracteres restantes (por ejemplo, se"461902"
convierte ens="4"
ya=["6","1","9","0","2"]
).Primero, nos concatenamos
a
consigo mismos, lo que convierte ambas ocurrencias en cadenas. Si la entrada es un número de un solo dígito,a
estará 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+a
será veraz y, por lo tanto, continuaremos con la siguiente parte de la función.Comprobaremos si cada elemento
x
ena
devuelvetrue
cuando 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 cadenas
es menor que la matriza
, que se convierte en una cadena en el proceso, por lo que, sis
es menor que el primer caráctera
,y
serátrue
ofalse
no.Construimos una cadena con el valor actual de
s
al principio yx
al 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ándonos0
o1
.Evalúa esa cuerda.
Finalmente, pasamos un segundo argumento a
eval
, que ignora, y lo usamos para establecer el valor des
al valor actual dex
para 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ásd
podrí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
1
y 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.1
será 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á
true
si 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-c
esx*-y
o-x*y
conx
yy
como números positivos, y el producto es negativo en ambos casos, pero para-x*-y
ox*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 nuncastring
antes vista y la lógica es un buen toque.Julia 0.6 , 62 bytes
Toma un número, regresa
true
por Undulant yfalse
por no. Por ejemplo,f(163)
vuelvetrue
.Pruébalo en línea!
fuente