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 isUndulant
renvoie faux pour n <10.
code-golf
decision-problem
number-theory
leonardo
la source
la source
Réponses:
J, 45
Exemple d'utilisation:
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.la source
Ruby,
7270 caractèresUtilisation et testcases:
Les chiffres simples donnent faux :
Des chiffres identiques consécutifs renvoient également faux :
la source
J, 30 octets
Une approche différente de celle des autres réponses J.
Serait 3 caractères plus courts si 5 étaient considérés comme ondulants.
la source
(pdf) eTeX, 129 caractères
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.la source
Haskell,
88777365 caractèresCela nécessite la pragma langue utilisée (ou
-X
drapeau):NoMonomorphismRestriction
. Si vous ne l'admettez pas, nous devons ajouter 4 caractères et définirz
ainsi:la source
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
C'est un peu élégant.zipWith
une fois aveccompare
comme vous l'avez fait, puiszipWith
avec(==)
etcycle[GT,LT]
oucycle[LT,GT]
comme deuxième argument.tail>>=zipWith compare
ce qui raccourcirait quelques octets.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)
Sauge,
8376 octetsJ'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!la source
sum(uniq(...))^2
, depuissum([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.L
si le nombre est supérieur à 2 ** 32 en Python et affecte le résultat. Est-ce que cela se produit sur Sage?L
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.orgPython:
101100caractèresAvant la minification:
Après minification:
la source
Python,
134129 caractèresNon golfé:
la source
JavaScript, 88 caractères
Essentiellement, transformez le nombre en une chaîne et comparez les caractères adjacents, inversant l'attente pour chacun.
la source
K, 41 octets
Par exemple
la source
CoffeeScript,
986753 octetsTests:
Non compressé:
la source
J,
44393631 octetsUtilisation 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):
Usage:
La réponse comprend quatre parties:
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ésultatu=.
Cela transforme essentiellement 461902 en 4 6 1 9 0 2 que je trouve plus facile à traiter dans J.*/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 ...(1<#u)
Cela vérifie si le nombre d'éléments stockés dans u#u
est supérieur à 1 et renvoie faux s'il ne s'agit que d'un nombre à un seul chiffre.(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.
la source
a.i.":
pour raser quelques personnages de plus.)Haskell, 82 octets
Essayez-le en ligne!
la source
readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
c=cycle[(<),(>)]
peut être raccourcic=(<):(>):c
.zipWith3($)l(show n)$tail$show n
peut êtrezipWith3($)l=<<tail$show n
et((>):c)
peut êtretail c
. Tous ensemble 70 octets: essayez-le en ligne!Python,
119108 octetsla source
... for a,b in zip(t,t[1:])
plutôt que d'utiliser des plages. De plus, vous n'avez pas besoin des crochetsall([...])
- Python crée un générateur quand il le trouve(... for ...)
, même si les parenthèses sont pour un appel de fonction.x>9 and all(i^j for i,j in zip(l,l[1:]))
et supprimezif l else False
.cmp(i,j)
eti^j
défini à la placei*j<0
, et en testand l[0]!=0
. Plus de personnages: - /print
enregistre un caractèrereturn
, mais est-ce légitime? La spécification demande une fonction qui "retourne".Python, 155 caractères
la source
C ++, 94 caractères
même méthode que mon erlang awnser avec une boucle for plutôt qu'une récursivité.
la source
Python
105101100 caractèresSolution récursive.
c(r,t)
vérifie si le premier caractère der
est 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.la source
0
, and you can save three characters on the second line by writingu=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)
x>9and
.Perl/re, 139 bytes
Doing everything in regex is kind of a bad idea.
I'm using Perl 5.12 but I think this will work on Perl 5.10. Pretty sure 5.8 is out though.
la source
GolfScript, 48 bytes
Hoping to beat J, my first time using GolfScript. Didn't quite succeed.
la source
JavaScript,
66656260 bytesTakes input as a string, returns
true
for undulant numbers, an empty string (falsey) for single digit numbers andfalse
otherwise.Try it
Run the Snippet below to test
0-9
and 25 random numbers<10,000,000
.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.
That argument is immediately destructured into 2 parameters:
s
being the first character in the string anda
being an array containing the remaining characters (e.g."461902"
becomess="4"
anda=["6","1","9","0","2"]
).First, we concatenate
a
with itself, which casts both occurrences to strings. If the input is a single digit number thena
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 casesa+a
will be truthy and so we continue on to the next part of the function.We'll be checking if every element
x
ina
returnstrue
when passed through a function.This determines what our first comparison will be (
<
or>
) and then we'll alternate from there. We check if the strings
is less than the arraya
, which gets cast to a string in the process so, ifs
is less than the first character ina
,y
will betrue
orfalse
if it's not.We build a string with the current value of
s
at the beginning andx
at the end. In between, we index into the string"<>"
by incrementingy
, casting its initial boolean value to an integer, and modulo by 2, giving us0
or1
.Eval that string.
Finally, we pass a second argument to
eval
, which it ignores, and use it to set the value ofs
to the current value ofx
for the next iteration.la source
PowerShell, 88
Naïve and trivial. I will golf later.
My test cases.
la source
JavaScript, 112
You only need to pass it one argument. I could probably golf this further with a for loop.
la source
d>=l
->d>0
) and (d<=l
->d<2
) perhaps? I'm not looking closely, as perhapsd
might contain fractional parts that might skew it.L
, not a1
. Thanks though!Erlang,
137123118 charsla source
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).
Test it here.
How it works
Firstly, I'm doing some string manipulation (followed by eval) to save 5 bytes on duplicate code:
So in effect my code is
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:12...
, then we get212...
, so the start is undulant, and won't affect whether the entire number is undulant.11...
, then we get111...
. Now the start is not undulant, but the number wasn't undulant anyway, so this won't affect the result either.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:
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.
la source
Prolog 87 bytes
To run it, just save it as golf.pl, open a prolog interpreter (e.g. gprolog) in the same directory then do:
It will give
true
if the number is undulant, otherwise just no.la source
Mathematica, 46 bytes
Examples (spaces are not required):
la source
Scala,
141 133 12997 bytesWith a = n % 10, b = (n/10) % 10, c = (n/100) % 10
Then
a-b * b-c
is eitherx*-y
or-x*y
withx
andy
as positive numbers, and the product is in both cases negative, but for-x*-y
orx*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.
la source
Perl, 78 bytes
la source
Q, 71 bytes
Sample usage:
la source
{(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}
gives 62($)
syntax forstring
before and the logic is a nice touch.Julia 0.6, 62 bytes
Takes in a number, returns
true
for Undulant, andfalse
for not. Egf(163)
returnstrue
.Try it online!
la source