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, isUndulant
retornam false para n <10.
code-golf
decision-problem
number-theory
Leonardo
fonte
fonte
Respostas:
J, 45
Uso da amostra:
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.fonte
Ruby,
7270 caracteresUso e caixas de teste:
Dígitos únicos produzem falso :
Dígitos idênticos consecutivos também retornam false :
fonte
J, 30 bytes
Uma abordagem diferente das outras respostas J.
Seriam 3 caracteres mais curtos se 5 fossem considerados indulantes.
fonte
(pdf) eTeX, 129 caracteres
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.fonte
Haskell,
88777365 caracteresIsso requer o pragma língua de uso corrente (ou
-X
bandeira):NoMonomorphismRestriction
. Se você não admitir isso, temos que adicionar 4 caracteres e definirz
assim:fonte
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.zipWith
uma vez comcompare
como você fez, depoiszipWith
novamente com(==)
ecycle[GT,LT]
oucycle[LT,GT]
como segundo argumento.tail>>=zipWith compare
que reduziria alguns 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)
Sábio,
8376 bytesTeve a idéia de usar cmp (* [..]) do JBernardo. No Sage,
uniq(...)
é um apelido paralist(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!fonte
sum(uniq(...))^2
, desde entãosum([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.L
se o número for maior que 2 ** 32 no Python e afeta o resultado. Isso acontece no Sage?L
porque o Sage é python preparado; 1234 -> Inteiro ('1234'). Você pode pular direto para usando Sábio aqui: sagenb.orgPython:
101100 caracteresAntes da minificação:
Após a minificação:
fonte
Python,
134129 caracteresUngolfed:
fonte
JavaScript, 88 caracteres
Em essência, transforme o número em uma sequência e compare os caracteres adjacentes, alterando a expectativa de cada um.
fonte
K, 41 bytes
Por exemplo
fonte
CoffeeScript,
986753 bytesTestes:
Descomprimido:
fonte
J,
44393631 bytesUso 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):
Uso:
A resposta tem quatro partes:
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<:/\
Isso opera com o valor armazenado em u. Ele pega cada par de caracteres e verifica se o esquerdo é menor ou igual ao direito, de2<:/\
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úmeros2~:/\
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á ...(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.(0=+/2=/\u)
Isso pega cada par de números armazenados em u e verifica a igualdade2=/\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.
fonte
a.i.":
barbear alguns mais caracteres off.)Haskell, 82 bytes
Experimente online!
fonte
readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
c=cycle[(<),(>)]
pode ser reduzido parac=(<):(>):c
.zipWith3($)l(show n)$tail$show n
pode serzipWith3($)l=<<tail$show n
e((>):c)
pode sertail c
. Todos juntos 70 bytes: Experimente online!Python,
119108 bytesfonte
... for a,b in zip(t,t[1:])
vez de usar intervalos. Além disso, você não precisa dos colchetesall([...])
- o Python cria um gerador quando encontra(... for ...)
, mesmo que os parênteses sejam para uma chamada de função.x>9 and all(i^j for i,j in zip(l,l[1:]))
e removaif l else False
.cmp(i,j)
e, em vez disso ,i^j
definidoi*j<0
e testadoand l[0]!=0
. Mais alguns personagens: - /print
salva um personagemreturn
, mas é legítimo? A especificação pede uma função que "retorne".Python, 155 caracteres
fonte
C ++, 94 caracteres
mesmo método que meu Erlang awnser com um loop for em vez de recursão.
fonte
Python
105101100 caracteresSolução recursiva.
c(r,t)
verifica se o primeiro caractere der
é menor(t==-1)
ou maior que o(t==1)
segundo caractere e chame a verificação oposta na string reduzida.fonte
0
, e você pode salvar três caracteres na segunda linha escrevendou=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)
x>9and
.Perl / re, 139 bytes
Fazer tudo em regex é uma má ideia.
Estou usando o Perl 5.12, mas acho que isso funcionará no Perl 5.10. Certamente 5.8 está fora embora.
fonte
GolfScript, 48 bytes
Na esperança de vencer J, minha primeira vez usando o GolfScript. Não foi bem sucedido.
fonte
JavaScript,
66656260 bytesPega a entrada como uma sequência, retorna
true
para números não desejados, uma sequência vazia (falsey) para números de um dígito efalse
outros.Tente
Execute o snippet abaixo para testar
0-9
e 25 números aleatórios<10,000,000
.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.
Esse argumento é imediatamente desestruturado em 2 parâmetros:
s
sendo o primeiro caractere na string ea
sendo uma matriz que contém os caracteres restantes (por exemplo,"461902"
tornas="4"
- se ea=["6","1","9","0","2"]
).Primeiro, concatenamos
a
consigo mesmo, que lança as duas ocorrências em seqüências de caracteres. Se a entrada for um número de um dígito,a
ficará 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 casosa+a
, será verdade e, portanto, continuamos na próxima parte da função.Nós vamos estar verificando se cada elemento
x
ema
retornostrue
ao passado através de uma função.Isso determina qual será nossa primeira comparação (
<
ou>
) e, em seguida, alternaremos a partir daí. Verificamos se a strings
é menor que a matriza
, que é convertida em uma string no processo, portanto, ses
é menor que o primeiro caractere ema
,y
serátrue
oufalse
não.Construímos uma string com o valor atual de
s
no início ex
no final. No meio, indexamos a string"<>"
incrementandoy
, seu valor booleano inicial em um número inteiro e modulo em 2, fornecendo-nos0
ou1
.Avalie essa corda.
Finalmente, passamos um segundo argumento para
eval
, que ele ignora, e o usamos para definir o valor des
para o valor atual dex
para a próxima iteração.fonte
PowerShell, 88
Ingênuo e trivial. Mais tarde vou jogar golfe.
Meus casos de teste .
fonte
JavaScript, 112
Você só precisa passar um argumento. Provavelmente eu poderia jogar isso ainda mais com um loop for.
fonte
d>=l
->d>0
) e (d<=l
->d<2
) talvez? Não estou olhando de perto, pois talvezd
contenha partes fracionárias que possam distorcer.L
, não uma1
. Obrigado embora!Erlang,
137123118 caracteresfonte
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).
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:
Então, com efeito, meu código é
Primeiro, aqui está como eu lido com o caso especial estranho de um único dígito. Copio o dígito no índice
1
e o prefixo ao número. Precisamos distinguir 3 casos:12...
, então obtemos212...
, então o início é ondulado e não afeta se o número inteiro é ondulado.11...
, então, obtemos111...
. Agora, o início não é ondulado, mas o número não era ondulado, portanto, isso também não afetará o resultado.1
será 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:
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.
fonte
Prolog 87 bytes
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:
Ele lhe dará
true
se o número é ondulante, caso contrário, apenas não.fonte
Mathematica, 46 bytes
Exemplos (espaços não são necessários):
fonte
Scala,
141133129797 bytesCom a = n% 10, b = (n / 10)% 10, c = (n / 100)% 10
Então
a-b * b-c
éx*-y
ou-x*y
comx
ey
como números positivos, e o produto é negativo nos dois casos, mas por-x*-y
oux*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.
fonte
Perl, 78 bytes
fonte
Q, 71 bytes
Uso da amostra:
fonte
{(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}
dá 62($)
Sintaxe nunca vistastring
antes e a lógica é um toque agradável.Julia 0,6 , 62 bytes
Pega um número, retorna
true
para Undulant efalse
para não. Por exemplo,f(163)
retornostrue
.Experimente online!
fonte