Números ondulados

16

Um número ondulado é um número em que seus dígitos alternam entre cima e para baixo, como o seguinte número: 461902 ou 708143, ou mesmo 1010101, mas não 123, porque 2 <3.

Escreva um programa ou função que retorna um valor truthy se um número é ondulante , e um valor Falsas contrário. O código mais curto vence.

Nota : Os números de um dígito são uma entrada válida, mas não são considerados udulantes ; portanto, isUndulantretornam false para n <10.

Leonardo
fonte
Número de entrada como string, número inteiro, float ...?
deixou de girar no sentido anti-horáriowis
11
Qual é o objetivo aqui? Código-golfe (função mais curta)?
Alexandru
11
@JBernardo: Eu acho que o comportamento é verdadeiro ou indefinido, pois seria um caso base melhor para recursão.
Joey Adams
4
Sua definição de número ondulado não está de acordo com a definição padrão: mathworld.wolfram.com/UndulatingNumber.html . Isso é intencional?
Mellamokb
9
Minha solução poderia ser 16% menor se o caso base fosse verdadeiro (como faria sentido IMHO).
eternalmatt 15/07

Respostas:

6

J, 45

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

Uso da amostra:

   *./(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

Tenho certeza de que há uma maneira mais fina de torcer o Insert / para fazer mais do trabalho de uma só vez, mas estou sem J há meses, preciso voltar a ele.

JB
fonte
Será difícil vencer J neste problema. boa solução!
Leonardo
@leonardo thanks!
JB
6

Ruby, 72 70 caracteres

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]}

Uso e caixas de teste:

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

Dígitos únicos produzem falso :

p u[5]       # <= false

Dígitos idênticos consecutivos também retornam false :

p u[66]      # <= false
p u[1221]    # <= false
Howard
fonte
6

J, 30 bytes

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

Uma abordagem diferente das outras respostas J.

   * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 461902
1 1
   * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 708143
1 1
   * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 1010101
1 1
   * / 0 <(#,] * {. * 1 _1 $ ~ #) 2 - / \ ai ": 123
0 0
   * / 0 <(#,] * {. * 1 _1 $ ~ #) (} .-} :) ai ": 5
0 0

Seriam 3 caracteres mais curtos se 5 fossem considerados indulantes.

efémero
fonte
Bem, pelo menos eu posso me consolar com o pensamento de que eu tinha a liderança por uma hora. :-)
Gareth
5

(pdf) eTeX, 129 caracteres

\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

Compilar com pdfetex filename.tex 1324?fornece uma saída em pdf. O TeX é principalmente uma linguagem tipográfica, e a saída para stdout levaria cerca de 20 caracteres a mais. Além disso, o requisito estranho para números de um dígito (falso e não verdadeiro) leva-me 26 caracteres.

Bruno Le Floch
fonte
5

Haskell, 88 77 73 65 caracteres

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

Isso requer o pragma língua de uso corrente (ou -Xbandeira): NoMonomorphismRestriction. Se você não admitir isso, temos que adicionar 4 caracteres e definir zassim:

z s=zipWith compare s$tail s
MtnViewMark
fonte
Estou tão furioso que você venceu minha solução de 104 caracteres. 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É meio elegante. zipWithuma vez com comparecomo você fez, depois zipWithnovamente com (==)e cycle[GT,LT]ou cycle[LT,GT]como segundo argumento.
21911 eternaltt
você poderia incorporar w, o tail>>=zipWith compareque reduziria alguns bytes.
proud haskeller
Além disso, joguei uma versão mais curta de q:q[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1
proud haskeller
na verdade, aqui está uma versão ainda mais curta: q s=and$all(/=EQ)s:zipWith(/=)s(tail s)
haskeller orgulhoso
@proudhaskeller - nenhuma versão passa em todos os testes. Ambos falham em 3 (deve ser False), ea primeira falha de muitos outros, como 32 e 101010101.
MtnViewMark
4

Sábio, 83 76 bytes

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

Teve a idéia de usar cmp (* [..]) do JBernardo. No Sage, uniq(...)é um apelido para list(set(...)).

Edit: apenas notei que para x <10 uniq(cmp(...)) == [], o que não está ativado [[1],[-1]]. Se x fosse inserido como uma string, em vez de um número inteiro, eu poderia obter outros 4 caracteres!

boothby
fonte
Eu tive uma idéia para usar sum(uniq(...))^2, desde então sum([1,-1]) = 0, e as somas dos singletons [1] e [-1] quadram para 1. Infelizmente, ele falha em um dígito três vezes repetido; 1011101.
Boothby
Agradável. Eu deveria aprender sálvia. BTW, acabei de perceber que os backticks acrescentam um Lse o número for maior que 2 ** 32 no Python e afeta o resultado. Isso acontece no Sage?
JBernardo 12/07
Sim, o Sage faz algumas coisas legais para jogar golfe ... por exemplo, seu tempo de inicialização ridículo é gasto importando uma enorme árvore de módulos. A classe Sage Integer não se incomoda com o Lporque o Sage é python preparado; 1234 -> Inteiro ('1234'). Você pode pular direto para usando Sábio aqui: sagenb.org
Boothby
4

Python: 101 100 caracteres

Antes da minificação:

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:])))))

Após a minificação:

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:]))))

fonte
3

Python, 134 129 caracteres

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])

Ungolfed:

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)
JBernardo
fonte
3

JavaScript, 88 caracteres

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}

Em essência, transforme o número em uma sequência e compare os caracteres adjacentes, alterando a expectativa de cada um.

DocMax
fonte
2
Em JavaScript, uma função não precisa de um nome e a pergunta solicita explicitamente uma função, para que você possa salvar dois caracteres.
Ry-
3

K, 41 bytes

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

Por exemplo

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

CoffeeScript, 98 67 53 bytes

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

Testes:

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

Descomprimido:

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
Ricardo Tomasi
fonte
3

J, 44 39 36 31 bytes

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

Uso como antes.

Eu não tinha notado que minha última edição tornou a desigualdade com o cheque 0 completamente desnecessária. :-)

Resposta anterior (+ explicação):

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

Uso:

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

A resposta tem quatro partes:

  1. u=.".;' ',.": Isso lê o número como uma string ":, divide-o em uma lista de caracteres precedidos por espaços ' ',., junta-os novamente ;, converte-os novamente em números ".e armazena o resultado. u=.Isso basicamente transforma 461902 em 4 6 1 9 0 2, o que acho mais fácil processar em J.

  2. */2~:/\2<:/\ Isso opera com o valor armazenado em u. Ele pega cada par de caracteres e verifica se o esquerdo é menor ou igual ao direito, de 2<:/\modo que 4 6 1 9 0 2 se torna 1 0 1 0 1. Em seguida, pega o resultado disso e verifica se há desigualdade em cada par de números 2~:/\então 1 0 1 0 1 se torna 1 1 1 1. Finalmente, multiplica-os todos juntos para obter um 0 ou um 1. */Nesse ponto, poderíamos retornar a resposta se não fosse por duas coisas: um único dígito retorna 1 quando o pergunta requer um 0; e números iguais são tratados da mesma forma que 'menor que', então 461900 retorna 1 em vez de 0. Que chatice. Vamos lá ...

  3. (1<#u) Isso verifica se o número de itens armazenados em u #ué maior que 1 e retorna falso se for apenas um número de um dígito.

  4. (0=+/2=/\u) Isso pega cada par de números armazenados em u e verifica a igualdade 2=/\u. Em seguida, soma as respostas e verifica se possui 0.

Os resultados das partes 2, 3 e 4 são então multiplicados para (esperançosamente) produzir um 1 quando o número atender aos requisitos especificados na pergunta.

Gareth
fonte
Bom trabalho em retomar a liderança, mas peguei emprestado um truque do seu!
ephemient 25/03
(Dito isto, eu acho que você poderia tomar o meu a.i.":barbear alguns mais caracteres off.)
ephemient
Infelizmente, provavelmente terei que fazer o check-in da desigualdade novamente - minha resposta falha agora para 11, 22, 33, 44 etc.
Gareth
3

Haskell, 82 bytes

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

Experimente online!

Thomas Eding
fonte
Eu conto apenas 83 caracteres nesta solução. (Você está no Windows, talvez Escrever o arquivo com terminações de linha Unix, que é Haskell legal?.)
MtnViewMark
Obrigado, eu estava usando 'wc' para contar meus personagens no Cygwin. Eu conto 82 caracteres. Eu usei o código a seguir, pois o wc parece estar gerando um caractere extra. (Vim não mostra uma nova linha de fuga, mas o bloco de notas faz ...) readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
Thomas Eding
c=cycle[(<),(>)]pode ser reduzido para c=(<):(>):c.
Laikoni
11
zipWith3($)l(show n)$tail$show npode ser zipWith3($)l=<<tail$show ne ((>):c)pode ser tail c. Todos juntos 70 bytes: Experimente online!
Laikoni
3

Python, 119 108 bytes

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]
Kirill
fonte
2
Bom uso de xor. Você pode cortar alguns caracteres com, em ... for a,b in zip(t,t[1:])vez de usar intervalos. Além disso, você não precisa dos colchetes all([...])- o Python cria um gerador quando encontra (... for ...), mesmo que os parênteses sejam para uma chamada de função.
Boothby
Muito obrigado pelo seu conselho! Eles têm sido muito valiosos! -20 caracteres
Kirill 15/07
Solução muito boa. Mais alguns caracteres x>9 and all(i^j for i,j in zip(l,l[1:]))e remova if l else False.
Ante
11
Não está funcionando em todos os casos. Dois casos são problemáticos: apenas 2 dígitos (por exemplo, 11) e os últimos 2 dígitos são iguais e maiores que um antes (por exemplo, 12155). O primeiro problema é que não há testes se x <100. O segundo é porque "uma comparação de sentido único". Pode ser corrigido com cmp(i,j)e, em vez disso , i^jdefinido i*j<0e testado and l[0]!=0. Mais alguns personagens: - /
Ante
11
Hmmm ... printsalva um personagem return, mas é legítimo? A especificação pede uma função que "retorne".
2

Python, 155 caracteres

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]))
Keith Randall
fonte
2

C ++, 94 caracteres

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;}

mesmo método que meu Erlang awnser com um loop for em vez de recursão.

Scott Logan
fonte
2

Python 105 101 100 caracteres

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)

Solução recursiva. c(r,t)verifica se o primeiro caractere de ré menor (t==-1)ou maior que o (t==1)segundo caractere e chame a verificação oposta na string reduzida.

Ante
fonte
Agradável. Você pode salvar um personagem na primeira linha, removendo 0, e você pode salvar três caracteres na segunda linha escrevendou=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)
Tnx. Eu não gostei de nenhum () desde o início :-) #
1717 Ante
Você pode salvar mais um escrevendo x>9and.
2

Perl / re, 139 bytes

Fazer tudo em regex é uma má ideia.

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

Estou usando o Perl 5.12, mas acho que isso funcionará no Perl 5.10. Certamente 5.8 está fora embora.

para (qw (461902 708143 1010101 123 5)) {
    imprima "$ _ is". (/ regex louco vai aqui /? '': 'não'). "ondulado \ n";
}

461902 é ondulado
708143 é ondulado
1010101 é ondulado
123 não é ondulado
5 não é ondulado
efémero
fonte
2

GolfScript, 48 bytes

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

Na esperança de vencer J, minha primeira vez usando o GolfScript. Não foi bem sucedido.

efémero
fonte
2

JavaScript, 66 65 62 60 bytes

Pega a entrada como uma sequência, retorna truepara números não desejados, uma sequência vazia (falsey) para números de um dígito e falseoutros.

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

Tente

Execute o snippet abaixo para testar 0-9e 25 números aleatórios <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>


Explicação

Alguns truques divertidos neste, então eu acho que merece uma explicação rara para uma solução JS de mim.

()=>

Começamos, simplesmente, com uma função anônima que pega a sequência inteira como argumento quando chamada.

[s,...a]

Esse argumento é imediatamente desestruturado em 2 parâmetros: ssendo o primeiro caractere na string e asendo uma matriz que contém os caracteres restantes (por exemplo, "461902"torna s="4"- se e a=["6","1","9","0","2"]).

a+a&&

Primeiro, concatenamos aconsigo mesmo, que lança as duas ocorrências em seqüências de caracteres. Se a entrada for um número de um dígito, aficará vazia e, portanto, se tornará uma sequência vazia; uma string vazia mais uma string vazia ainda é uma string vazia e, como isso é falso no JS, paramos de processar no AND lógico e produzimos nossa string vazia. Em todos os outros casos a+a, será verdade e, portanto, continuamos na próxima parte da função.

a.every(x=>)

Nós vamos estar verificando se cada elemento xem aretornos trueao passado através de uma função.

y=s<a

Isso determina qual será nossa primeira comparação ( <ou >) e, em seguida, alternaremos a partir daí. Verificamos se a string sé menor que a matriz a, que é convertida em uma string no processo, portanto, se sé menor que o primeiro caractere ema , yserá trueou falsenão.

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

Construímos uma string com o valor atual de sno início e xno final. No meio, indexamos a string "<>"incrementandoy , seu valor booleano inicial em um número inteiro e modulo em 2, fornecendo-nos 0ou 1.

eval()

Avalie essa corda.

s=x

Finalmente, passamos um segundo argumento para eval, que ele ignora, e o usamos para definir o valor de spara o valor atual de xpara a próxima iteração.

Shaggy
fonte
1

PowerShell, 88

Ingênuo e trivial. Mais tarde vou jogar golfe.

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

Meus casos de teste .

Joey
fonte
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}

Você só precisa passar um argumento. Provavelmente eu poderia jogar isso ainda mais com um loop for.

Ry-
fonte
( d>=l-> d>0) e ( d<=l-> d<2) talvez? Não estou olhando de perto, pois talvez dcontenha partes fracionárias que possam distorcer.
Thomas Eding
@ Trinithis: Isso é uma letra minúscula L, não uma 1. Obrigado embora!
Ry-
Onde está o DejaVu Sans Mono ou o Bitstream Vera Sans Mono quando você precisa? Talvez eu preciso personalizar stackoverflow com alguns css personalizado ou um script de usuário ...
Thomas Eding
@ trinithis: Eu concordo, a escolha da fonte não é tão boa assim. Não Bolding se destacam o suficiente ...
Ry-
1

Erlang, 137 123 118 caracteres

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)).
Scott Logan
fonte
Isso não retornará verdadeiro, desde que tenha havido pelo menos uma transição para cima e para baixo em algum lugar? Não retornará True para, digamos 1234321?
MtnViewMark
@ MtnViewMark, sim, obrigado, eu entendi mal a pergunta corrigida agora, espero.
21411 Scott Scott Logan
1

CJam, 30 bytes

O CJam é mais novo que esse desafio, portanto não compete pela marca de seleção verde, mas não é um vencedor de qualquer maneira (embora eu tenha certeza de que isso pode realmente ser praticado bastante).

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

Teste aqui.

Como funciona

Em primeiro lugar, estou fazendo alguma manipulação de string (seguida de eval) para salvar 5 bytes em código duplicado:

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

Então, com efeito, meu código é

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

Primeiro, aqui está como eu lido com o caso especial estranho de um único dígito. Copio o dígito no índice 1e o prefixo ao número. Precisamos distinguir 3 casos:

  • Os dois primeiros dígitos são diferentes 12..., então obtemos212... , então o início é ondulado e não afeta se o número inteiro é ondulado.
  • Os dois primeiros dígitos são os mesmos 11..., então, obtemos 111.... Agora, o início não é ondulado, mas o número não era ondulado, portanto, isso também não afetará o resultado.
  • Se o número tiver apenas um dígito, o dígito no índice 1será o primeiro (porque a indexação da matriz do CJam faz um loop no final), portanto, isso resulta em dois dígitos idênticos e o número não é ondulado.

Agora, olhando o código em detalhes:

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.";

Tenho certeza de que existe uma maneira mais curta de verificar os dígitos (de comprimento maior que 1) para saber se eles são ondulados (em particular, sem usar duas dobras), mas ainda não consegui encontrá-lo.

Martin Ender
fonte
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]).

Para executá-lo, salve-o como golf.pl, abra um intérprete de prólogo (por exemplo, gprolog) no mesmo diretório e faça:

consult(golf).
u(101010).

Ele lhe dará truese o número é ondulante, caso contrário, apenas não.

pgy
fonte
1

Mathematica, 46 bytes

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

Exemplos (espaços não são necessários):

# != 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
DavidC
fonte
1

Scala, 1411331297 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)}

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

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

Então a-b * b-cé x*-you -x*ycom xe ycomo números positivos, e o produto é negativo nos dois casos, mas por -x*-youx*y (a <b <c ou a> b> c) o produto é sempre positivo.

O restante do código está lidando com casos especiais: um dígito, dois dígitos, dois dígitos idênticos.

Usuário desconhecido
fonte
1

Perl, 78 bytes

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

Q, 71 bytes

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

Uso da amostra:

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
tmartin
fonte
Você pode lógico fora do if {(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}dá 62
skeevey
($)Sintaxe nunca vista stringantes e a lógica é um toque agradável.
tmartin
1

Julia 0,6 , 62 bytes

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

Pega um número, retorna truepara Undulant e falsepara não. Por exemplo, f(163)retornos 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

Experimente online!

gggg
fonte