Nombres ondulants


16

Un nombre ondulant est un nombre où ses chiffres alternent entre le haut et le bas comme le numéro suivant: 461902 ou 708143, ou même 1010101, mais pas 123, car 2 <3.

Écrivez un programme ou une fonction qui renvoie une valeur vraie si un nombre est ondulant , et une valeur fausse sinon. Le code le plus court gagne.

Remarque : Les nombres à un chiffre sont une entrée valide mais ne sont pas considérés comme udulant , donc isUndulantrenvoie faux pour n <10.


Entrée de nombre sous forme de chaîne, entier, flottant ...?
cessé de tourner dans le sens inverse des aiguilles d'une montre le

1
Quel est l'objectif ici? Code-golf (fonction la plus courte)?
Alexandru

1
@JBernardo: Je pense que le comportement est vrai ou indéfini, car ce serait un meilleur cas de base pour la récursivité.
Joey Adams

4
Votre définition du nombre ondulant n'est pas en accord avec la définition standard: mathworld.wolfram.com/UndulatingNumber.html . Est-ce intentionnel?
mellamokb

9
Ma solution pourrait être 16% plus petite si le cas de base était vrai (comme cela aurait du sens à mon humble avis).
eternalmatt

Réponses:


6

J, 45

*./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=.

Exemple d'utilisation:

   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 461902
1
   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 708143
1
   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 1010101
1
   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 123
0
   *./(n>9),(}:(=-)}.)(}:*@-}.)n#:~10$~>.10^.n=. 5
0

Je suis sûr qu'il existe une meilleure façon de tordre l'insert /pour faire plus de travail en une fois, mais je suis sans J depuis des mois, je dois y revenir.


Il sera difficile de battre J dans ce problème. belle solution!
leonardo

@leonardo merci!
JB

6

Ruby, 72 70 caractères

Q=10;k=->n,v{(n%Q-n/Q%Q)*v<0?k[n/Q,-v]:n<Q};u=->n{n>9&&k[n,-1]|k[n,1]}

Utilisation et testcases:

p u[10101]   # <= true
p u[708143]  # <= true
p u[2421]    # <= false
p u[1231]    # <= false
p u[873]     # <= false

Les chiffres simples donnent faux :

p u[5]       # <= false

Des chiffres identiques consécutifs renvoient également faux :

p u[66]      # <= false
p u[1221]    # <= false

6

J, 30 octets

*/0<(#,]*{.*1 _1$~#)2-/\a.i.":

Une approche différente de celle des autres réponses 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 <(#,] * {. * 1 _1 $ ~ #) (} .-} :) ai ": 5
0

Serait 3 caractères plus courts si 5 étaient considérés comme ondulants.


Eh bien, au moins je peux me consoler en pensant que j'avais le plomb pendant une heure. :-)
Gareth

5

(pdf) eTeX, 129 caractères

\def\a#1#2{\if#2?\ifx\r\s\def\s{1}\else
True\end\fi\fi\edef\t{\pdfstrcmp{#2}{#1}}\ifx\s\t
False\end\fi\let\s\t\a#2}\expandafter\a

La compilation avec pdfetex filename.tex 1324?donne une sortie pdf. TeX est principalement un langage de composition, et la sortie vers stdout prendrait environ 20 caractères supplémentaires. De plus, l'exigence étrange de nombres à un chiffre (faux plutôt que vrai) me prend 26 caractères.


5

Haskell, 88 77 73 65 caractères

z=tail>>=zipWith compare
q[]=0>1
q s=all(/=EQ)$s++z s
u=q.z.show

Cela nécessite la pragma langue utilisée (ou -Xdrapeau): NoMonomorphismRestriction. Si vous ne l'admettez pas, nous devons ajouter 4 caractères et définir zainsi:

z s=zipWith compare s$tail s

Je suis tellement furieux que vous avez battu ma solution de 104 caractères. 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.cycleC'est un peu élégant. zipWithune fois avec comparecomme vous l'avez fait, puis zipWithavec (==)et cycle[GT,LT]ou cycle[LT,GT]comme deuxième argument.
eternalmatt

vous pouvez aligner w as tail>>=zipWith comparece qui raccourcirait quelques octets.
fier haskeller

aussi, j'ai qq[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1
joué au golf sur

en fait, voici une version encore plus courte: q s=and$all(/=EQ)s:zipWith(/=)s(tail s)
fier haskeller

@proudhaskeller - aucune des deux versions ne réussit tous les tests. Ils échouent tous les deux le 3 (devrait être faux), et le premier échoue à beaucoup d'autres, comme 32 et 101010101.
MtnViewMark

4

Sauge, 83 76 octets

f=lambda x:uniq(cmp(*`x`[i-2:i][::(-1)^i])for i in[2..len(`x`)])in[[1],[-1]]

J'ai eu l'idée d'utiliser cmp (* [..]) de JBernardo. Dans Sage, uniq(...)est un alias pourlist(set(...)) .

Edit: vient de remarquer que pour x <10 uniq(cmp(...)) == [], qui n'est pas activé [[1],[-1]]. Si x était entré sous forme de chaîne, au lieu d'un entier, je pourrais obtenir 4 autres caractères!


J'ai eu une idée à utiliser sum(uniq(...))^2 , depuis sum([1,-1]) = 0, et les sommes des singletons [1] et [-1] carrés à 1. Malheureusement, il échoue sur un chiffre trois fois répété; 1011101.
stand le

Agréable. Je devrais apprendre la sauge. BTW, je viens de réaliser que les backticks ajouteront unL si le nombre est supérieur à 2 ** 32 en Python et affecte le résultat. Est-ce que cela se produit sur Sage?
JBernardo

Ouais, Sage rend quelques choses agréables pour le golf ... par exemple, son temps de démarrage ridicule est passé à importer un énorme arbre de modules. La classe Sage Integer ne se soucie pas de laL se soucie car Sage est du python pré-préparé; 1234 -> Entier ('1234'). Vous pouvez vous lancer directement dans l'utilisation de Sage ici: sagenb.org
boothby

4

Python: 101100 caractères

Avant la minification:

undulate = (lambda n: n > 9
            and all(cmp(*digits) == (i % 2) * 2 - 1
                    for i, digits
                    in enumerate(zip(min(`n`,`n`[1:]), 
                                     max(`n`,`n`[1:])))))

Après minification:

a=lambda b:b>9and all(cmp(*c)==d%2*2-1 for d,c in enumerate(zip(min(`b`,`b`[1:]),max(`b`,`b`[1:]))))

3

Python, 134 129 caractères

def f(x):d=[cmp(*i)for i in zip(`x`,`x`[1:])]if x>9 else[0];n=d[0]>0;return all(i<0 for i in d[n::2])&all(i>0 for i in d[n<1::2])

Non golfé:

def f(x):
    if x>9:
        d = [cmp(*i)for i in zip(`x`,`x`[1:])] #difference of x[i] and x[i+1]
    else:
        d = [0]       #trick to return False if x<10 using less chars
    n = d[0]>0        #First digit is -1 or 1?
    neg = d[n::2]     #negative numbers if x is Undulant
    pos = d[not n::2] #positive numbers if x is Undulant

    #check if all negs are -1 and all pos are 1 and return value
    return all(i<0 for i in neg) and all(i>0 for i in pos)

3

JavaScript, 88 caractères

function _(i){i+='';c=i[0];f=i[a=x=1];for(g=f<c;d=i[x++];c=d)g^=a&=g?d<c:d>c;return!f^a}

Essentiellement, transformez le nombre en une chaîne et comparez les caractères adjacents, inversant l'attente pour chacun.


2
En JavaScript, une fonction n'a pas besoin d'un nom et la question demande explicitement une fonction, vous pouvez donc enregistrer deux caractères.
Ry-

3

K, 41 octets

{(x>9)&~max(=). 1_'-':'1_'(<':;>':)@\:$x}

Par exemple

{(x>9)&~max(=). 1_'-':'1_'(<':;>':)@\:$x}1212130659
1b

3

CoffeeScript, 98 67 53 octets

(n)->0!in((n[i]>=c^(n[0]<n[1])+i)%2for c,i in n[1..])

Tests:

[
    '01010101' # true
    '12345'    # false
    '1010101'  # true
    '887685'   # false
    '9120734'  # true
    '090909'   # true
]

Non compressé:

undulant = (n) ->
    direction = n[0] < n[1]
    return n.split('').every (cur, i) ->
        prev = arr[i-1] or 10 * direction
        +(prev >= cur) is (direction+i)%2

3

J, 44 39 36 31 octets

*/2(0<#@],0>*/\)*2-/\".;' ',.":

Utilisation comme avant.

Je n'avais pas remarqué que ma dernière modification rendait l'inégalité avec la vérification 0 complètement inutile. :-)

Réponse précédente (+ explication):

(0=+/2=/\u)*(1<#u)**/2~:/\2<:/\u=.".;' ',.":

Usage:

    (0=+/2=/\u)*(1<#u)**/2~:/\2<:/\u=.".;' ',.":461902
1

La réponse comprend quatre parties:

  1. u=.".;' ',.": Cela lit le nombre sous forme de chaîne ":, le divise en une liste de caractères précédée d'espaces ' ',., le recoud ensemble ;, le reconvertit en nombres "., puis stocke le résultat u=.Cela transforme essentiellement 461902 en 4 6 1 9 0 2 que je trouve plus facile à traiter dans J.

  2. */2~:/\2<:/\ Cela fonctionne sur la valeur stockée dans u. Il prend chaque paire de caractères et vérifie si celui de gauche est inférieur ou égal à celui de droite, 2<:/\donc 4 6 1 9 0 2 devient 1 0 1 0 1. Il prend ensuite le résultat de cela et vérifie chaque paire de nombres pour l'inégalité 2~:/\donc 1 0 1 0 1 devient 1 1 1 1. Enfin, il les multiplie tous ensemble pour obtenir soit un 0 soit un 1 */À ce stade, nous pourrions retourner la réponse si ce n'était pour 2 choses: un seul chiffre renvoie 1 lorsque le la question nécessite un 0; et les nombres égaux sont traités de la même manière que «moins que», donc 461900 renvoie 1 au lieu de 0. Bummer. On y va ...

  3. (1<#u) Cela vérifie si le nombre d'éléments stockés dans u #uest supérieur à 1 et renvoie faux s'il ne s'agit que d'un nombre à un seul chiffre.

  4. (0=+/2=/\u) Cela prend chaque paire de nombres stockés dans u et vérifie l'égalité 2=/\u. Il additionne ensuite les réponses et vérifie s'il a 0.

Les résultats des parties 2, 3 et 4 sont ensuite multipliés ensemble pour (espérons-le) produire un 1 lorsque le nombre répond aux exigences spécifiées dans la question.


Beau travail pour reprendre la tête, mais je viens de vous emprunter un truc!
éphémère

(Cela étant dit, je pense que vous pourriez me prendre a.i.":pour raser quelques personnages de plus.)
éphémère

Malheureusement, je vais probablement devoir remettre ce contrôle des inégalités - ma réponse échoue maintenant pour 11, 22, 33, 44 etc.
Gareth

3

Haskell, 82 octets

c=cycle[(<),(>)]
l!n=n>9&&and(zipWith3($)l(show n)$tail$show n)
u n=c!n||((>):c)!n

Essayez-le en ligne!


Je ne compte que 83 caractères dans cette solution. (Êtes-vous sur Windows, peut-être? Écrivez le fichier avec les fins de ligne Unix, ce qui est légal Haskell.)
MtnViewMark

Merci, j'utilisais 'wc' pour compter mes personnages sur Cygwin. Je compte 82 caractères. J'ai utilisé le code suivant, car wc semble produire un caractère supplémentaire. (Vim n'affiche pas de nouvelle ligne, mais le bloc-notes le fait ...) readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
Thomas Eding

c=cycle[(<),(>)]peut être raccourci c=(<):(>):c.
Laikoni

1
zipWith3($)l(show n)$tail$show npeut être zipWith3($)l=<<tail$show net ((>):c)peut être tail c. Tous ensemble 70 octets: essayez-le en ligne!
Laikoni

3

Python, 119 108 octets

def u(x):l=[cmp(i,j)for i,j in zip(`x`,`x`[1:])];print x>9and all([i*j<0 for i,j in zip(l,l[1:])])and l!=[0]

2
Belle utilisation de xor. Vous pouvez découper pas mal de caractères avec ... for a,b in zip(t,t[1:])plutôt que d'utiliser des plages. De plus, vous n'avez pas besoin des crochets all([...])- Python crée un générateur quand il le trouve (... for ...), même si les parenthèses sont pour un appel de fonction.
stand le

Merci beaucoup pour votre conseil! Ils ont été très précieux! -20 caractères
Kirill

Très belle solution. Moins de caractères supplémentaires x>9 and all(i^j for i,j in zip(l,l[1:]))et supprimez if l else False.
Ante

1
Cela ne fonctionne pas dans tous les cas. Deux cas sont problématiques: seulement 2 chiffres (par exemple 11), et les 2 derniers chiffres sont identiques et supérieurs à un avant (par exemple 12155). Le premier problème est qu'il n'y a pas de test si x <100. Deuxièmement, c'est parce que la «comparaison à sens unique». Il peut être corrigé avec cmp(i,j)et i^jdéfini à la place i*j<0, et en test and l[0]!=0. Plus de personnages: - /
Ante

1
Hmmm ... printenregistre un caractère return, mais est-ce légitime? La spécification demande une fonction qui "retourne".

2

Python, 155 caractères

g=lambda a,b:all(x>y for x,y in zip(a,b))
u=lambda D:g(D[::2],D[1::2])&g(D[2::2],D[1::2])
def U(n):D=map(int,str(n));return(n>9)&(u(D)|u([-d for d in D]))

2

C ++, 94 caractères

bool u(int N){int K,P,Q,U=1,D=1;while(N>9)P=N%10,Q=(N/=10)%10,K=D,D=U&Q<P,U=K&Q>P;return U^D;}

même méthode que mon erlang awnser avec une boucle for plutôt qu'une récursivité.


2

Python 105 101 100 caractères

c=lambda r,t:len(r)<2 or(cmp(*r[:2])==t and c(r[1:],-t))
u=lambda x:x>9and c(`x`,cmp(*`x`[:2])or 1)

Solution récursive. c(r,t)vérifie si le premier caractère de rest inférieur (t==-1)ou supérieur au (t==1)second caractère et appelle la vérification opposée sur la chaîne raccourcie.


Nice. You can save a character in the first line by removing 0, and you can save three characters on the second line by writing u=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)

Tnx. I didn't like any() from the beginning :-)
Ante

You can save one more by writing x>9and.

2

Perl/re, 139 bytes

Doing everything in regex is kind of a bad idea.

/^(?:(.)(?{local$a=$1}))?(?:(?>((.)(?(?{$a lt$3})(?{local$a=$3})|(?!)))((.)(?(?{$a gt$5})(?{local$a=$5})|(?!))))*(?2)?)(?(?{pos>1})|(?!))$/

I'm using Perl 5.12 but I think this will work on Perl 5.10. Pretty sure 5.8 is out though.

for (qw(461902 708143 1010101 123 5)) {
    print "$_ is " . (/crazy regex goes here/ ? '' : 'not ') . "undulant\n";
}

461902 is undulant
708143 is undulant
1010101 is undulant
123 is not undulant
5 is not undulant

2

GolfScript, 48 bytes

[`..,(<\1>]zip{..$=\-1%.$=-}%(\{.@*0<*}/abs

Hoping to beat J, my first time using GolfScript. Didn't quite succeed.


2

JavaScript, 66 65 62 60 bytes

Takes input as a string, returns true for undulant numbers, an empty string (falsey) for single digit numbers and false otherwise.

([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)

Try it

Run the Snippet below to test 0-9 and 25 random numbers <10,000,000.

f=
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
tests=new Set([...Array(10).keys()])
while(tests.add(Math.random()*1e7|0).size<35);
o.innerText=[...tests].map(x=>(x=x+``).padStart(7)+` = `+JSON.stringify(f(x))).join`\n`
<pre id=o></pre>


Explanation

A few fun little tricks in this one so I think it warrants a rare explanation to a JS solution from me.

()=>

We start, simply, with an anonymous function which takes the integer string as an argument when called.

[s,...a]

That argument is immediately destructured into 2 parameters: s being the first character in the string and a being an array containing the remaining characters (e.g. "461902" becomes s="4" and a=["6","1","9","0","2"]).

a+a&&

First, we concatenate a with itself, which casts both occurrences to strings. If the input is a single digit number then a will be empty and, therefore, become and empty string; an empty string plus an empty string is still an empty string and, because that's falsey in JS, we stop processing at the logical AND and output our empty string. In all other cases a+a will be truthy and so we continue on to the next part of the function.

a.every(x=>)

We'll be checking if every element x in a returns true when passed through a function.

y=s<a

This determines what our first comparison will be (< or >) and then we'll alternate from there. We check if the string s is less than the array a, which gets cast to a string in the process so, if s is less than the first character in a, y will be true or false if it's not.

s+"<>"[++y%2]+x

We build a string with the current value of s at the beginning and x at the end. In between, we index into the string "<>" by incrementing y, casting its initial boolean value to an integer, and modulo by 2, giving us 0 or 1.

eval()

Eval that string.

s=x

Finally, we pass a second argument to eval, which it ignores, and use it to set the value of s to the current value of x for the next iteration.


1

PowerShell, 88

Naïve and trivial. I will golf later.

filter u{-join([char[]]"$_"|%{if($n){[Math]::Sign($n-$_)+1}$n=$_})-notmatch'1|22|00|^$'}

My test cases.


1

JavaScript, 112

function(n,d,l,c,f){while(l=n%10,n=n/10|0)d=n%10,c?c>0?d>=l?(f=0):(c=-c):d<=l?(f=0):(c=-c):(c=d-l,f=1);return f}

You only need to pass it one argument. I could probably golf this further with a for loop.


(d>=l -> d>0) and (d<=l -> d<2) perhaps? I'm not looking closely, as perhaps d might contain fractional parts that might skew it.
Thomas Eding

@trinithis: That's a lowercase L, not a 1. Thanks though!
Ry-

Where's DejaVu Sans Mono or Bitstream Vera Sans Mono when you need it? Perhaps I need to customize stackoverflow with some custom css or a user script...
Thomas Eding

@trinithis: I agree, the font choice isn't that great. Bolding doesn't stand out enough...
Ry-

1

Erlang, 137 123 118 chars

u(N)->Q=N div 10,u(Q,N rem 10,Q>0,Q>0). u(0,_,D,U)->D or U;u(N,P,D,U)->Q=N rem 10,u(N div 10,Q,U and(Q<P),D and(Q>P)).

Won't this return True so long as there has been at least one up and one down transition anywhere? Won't it return True for, say 1234321?
MtnViewMark

@ MtnViewMark, yeah it did thanks, I misunderstood the question fixed now hopefully.
Scott Logan

1

CJam, 30 bytes

CJam is newer than this challenge, so this does not compete for the green checkmark, but it's not a winner anyway (although I'm sure this can actually be golfed quite a bit).

l"_1=\+{_@-\}*;]"_8'*t+~{W>},!

Test it here.

How it works

Firstly, I'm doing some string manipulation (followed by eval) to save 5 bytes on duplicate code:

"..."_8'*t+~
"..."        "Push this string.":
     _       "Duplicate.";
      8'*t   "Replace the 8th character (the -) with *.";
          +~ "Concatenate the strings and evaluate.";

So in effect my code is

l_1=\+{_@-\}*;]_1=\+{_@*\}*;]{W>},!

First, here is how I deal with the weird special case of a single digit. I copy the digit at index 1 and prepend it to the number. We need to distinguish 3 cases:

  • The first two digits are different, like 12..., then we get 212..., so the start is undulant, and won't affect whether the entire number is undulant.
  • The first two digits are the same, like 11..., then we get 111.... Now the start is not undulant, but the number wasn't undulant anyway, so this won't affect the result either.
  • If the number only has one digit, the digit at index 1 will be the first digit (because CJam's array indexing loops around the end), so this results in two identical digits, and the number is not undulant.

Now looking at the code in detail:

l_1=\+{_@-\}*;]_1=\+{_@*\}*;]{W>},!
l                                   "Read input.";
 _1=\+                              "Prepend second digit.";
      {_@-\}*                       "This fold gets the differences of consecutive elments.";
             ;]                     "Drop the final element and collect in an aray.";
               _1=\+                "Prepend second element.";
                    {_@*\}*         "This fold gets the products of consecutive elments.";
                           ;]       "Drop the final element and collect in an aray.";
                             {W>},  "Filter out non-negative numbers.";
                                  ! "Logical not.";

I'm sure there is a shorter way to actually check digits (of length greater 1) for whether they are undulant (in particular, without using two folds), but I couldn't find it yet.


1

Prolog 87 bytes

u(X) :- number_codes(X,C),f(C).
f([_,_]).
f([A,B,C|L]) :- (A<B,B>C;A>B,B<C),f([B,C|L]).

To run it, just save it as golf.pl, open a prolog interpreter (e.g. gprolog) in the same directory then do:

consult(golf).
u(101010).

It will give true if the number is undulant, otherwise just no.


1

Mathematica, 46 bytes

#!=Sort@#&&#!=Reverse@Sort@#&[IntegerDigits@n]

Examples (spaces are not required):

# != Sort@# && # != Reverse@Sort@# &[IntegerDigits@5]
# != Sort@# && # != Reverse@Sort@# &[IntegerDigits@123]
# != Sort@# && # != Reverse@Sort@# &[IntegerDigits@132]
# != Sort@# && # != Reverse@Sort@# &[IntegerDigits@321]

(*  out *)
False  False  True  False

1

Scala, 141 133 129 97 bytes

def u(n:Int):Boolean=n>9&&{
val a=n%10
val b=(n/10)%10
a!=b&&n<99||(a-b*b-(n/100)%10)<0&&u(n/10)}

With a = n % 10, b = (n/10) % 10, c = (n/100) % 10

if a > b and b < c or 
   a < b and b > c

Then a-b * b-c is either x*-y or -x*y with x and y as positive numbers, and the product is in both cases negative, but for -x*-y or x*y (a < b < c or a > b > c) the product is always positive.

The rest of the code is handling special cases: one digit, two digits, two identical digits.


1

Perl, 78 bytes

sub u{@_=split//,$_=shift;s/.(?=.)/($&cmp$_[$+[0]])+1/ge;chop;$#_&&!/00|1|22/}

1

Q, 71 bytes

{$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]}

Sample usage:

q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 5
0b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 10101
1b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 01010
1b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 134679
0b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 123456
0b
q){$[x>9;any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':){"I"$x}each -3!x;0b]} 132436
1b

You can logic away the if {(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x} gives 62
skeevey

Never seen ($) syntax for string before and the logic is a nice touch.
tmartin

1

Julia 0.6, 62 bytes

f(x,a=sign.(diff(digits(x))))=x>9&&-a*a[1]==(-1).^(1:endof(a))

Takes in a number, returns true for Undulant, and false for not. Eg f(163) returns true.

f(x,a=sign.(diff(digits(x))))=x>9&&-a*a[1]==(-1).^(1:endof(a))
f(x,                        )                                   # function definition
    a=sign.(diff(digits(x)))                                    # default 2nd argument is array of differences of signs of digits
                              x>9&&                             # short circuiting and to catch cases under 10
                                   -a*a[1]                      # make the first element of a always -1
                                          ==(-1).^(1:endof(a))  # check that a is an array of alternating -1 and 1 of correct length

Try it online!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.