(inspirado nesse desafio de Puzzling - SPOILERS para esse quebra-cabeça está abaixo, então pare de ler aqui se você quiser resolver esse quebra-cabeça sozinho!)
Se uma letra em uma palavra ocorre alfabeticamente depois da letra anterior, chamamos isso de aumento entre as duas letras. Caso contrário, inclusive se for a mesma letra , será chamada de queda .
Por exemplo, a palavra ACE
tem duas subidas ( A
para C
e C
para E
) e sem quedas, enquanto que THE
tem duas quedas ( T
para H
e H
para E
) e sem subidas.
Chamamos uma palavra de instável se a sequência de subidas e descidas se alterna. Por exemplo, BUMP
vai subir ( B
para U
), cair ( U
para M
), subir ( M
para P
). Observe que a primeira sequência não precisa ser uma subida - BALD
vai subindo subindo e descendo e também é instável.
O desafio
Dada uma palavra, a saída seja Bumpy ou não.
Entrada
- Uma palavra (não necessariamente uma palavra do dicionário) que consiste apenas no alfabeto ASCII (
[A-Z]
ou[a-z]
), em qualquer formato adequado . - Sua escolha se a entrada for toda maiúscula ou minúscula, mas deve ser consistente.
- A palavra terá pelo menos três caracteres.
Saída
Um valor truthy / falsey para saber se a palavra de entrada é Acidentada (truthy) ou não Acidentada (falsey).
As regras
- Um programa completo ou uma função são aceitáveis.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Exemplos
Verdade:
ABA
ABB
BAB
BUMP
BALD
BALDY
UPWARD
EXAMINATION
AZBYCXDWEVFUGTHSIRJQKPLOMN
Falsey:
AAA
BBA
ACE
THE
BUMPY
BALDING
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
fonte
BUMP
está listado em Truthy (por exemplo, Bumpy), por queBUMPY
está na lista de Falsey? O que significa "sobe e desce alternadamente" significa? Duas subidas não podem ser sucessivas?BUMPY
é falso porqueMPY
dá dois aumentos consecutivos. Em outras palavras, nenhuma subcadeia de comprimento 3 deve ser classificada em ordem crescente ou decrescente para que uma palavra fique irregular (exceto no caso especial em que duas letras consecutivas são idênticas).Respostas:
MATL, 4 bytes
Explicação:
Esta é a minha primeira entrada no MATL, então, pergunto-me quanta melhoria pode haver dessa porta ingênua da minha tentativa do MATLAB / Octave (o que seria
@(a)all(diff(diff(a)>0))
). Observe que issoall
não é necessário porque qualquer zero torna uma matriz falsa; portanto, não háA
na porta MATL.fonte
d0>d
deve funcionar (você não precisa oA
de acordo com nossa definição de truthy / Falsey)JavaScript (ES6),
7569634643 bytesEconomizou 3 bytes graças a Neil:
Destruindo o parâmetro string em vez de
s.slice(1)
.Solução anterior:
economizou 17 bytes graças ao ETHproductions:
O que aconteceu com a solução anterior passo a passo:
Soluções anteriores:
63 bytes graças a ETHproductions:
69 bytes:
75 bytes:
Todas as letras de uma palavra devem ter o mesmo caso.
fonte
!s[2]|...
fazer o mesmo ques[2]?...:1
?f=([c,...s])=>s[1]?c<s[0]^s[0]<s[1]&&f(s):1
LabVIEW, 36 bytes equivalentes
Golfe usando equivalências lógicas:
Ungolfed:
Primeiro, convertemos para minúsculas e depois para a matriz de bytes. Apare o primeiro elemento da matriz de bytes, pois ela não tem precedentes. Em seguida, para cada elemento da matriz, verifique se é maior que o anterior (o caractere U8 é mapeado para ASCII conforme o esperado) e armazene o resultado para a próxima iteração, bem como em uma matriz para visualizar o bumpiness geral. Se a verificação booleana atual e anterior for igual, encerramos o loop e não é acidentado. Senão, é acidentado!
fonte
Python, 56 bytes
Todos os casos de teste estão em ideone
Percorre triplos caracteres em s e testa se todos esses triplos têm pares esquerdo e direito com diferentes propriedades de subida / descida.
Funciona para todas as maiúsculas ou minúsculas.
fonte
Ruby,
5748 bytesEspera que a entrada seja todas maiúscula.
Veja em repl.it: https://repl.it/D7SB
Explicação
A expressão regular
/.(?=(.)(.))/
corresponde a cada caractere que é seguido por mais dois caracteres.(?=...)
é uma visão positiva, o que significa que combinamos os dois caracteres subsequentes, mas não os "consumimos" como parte da correspondência. Dentro das chaves,$&
é o texto-o primeiro caractere combinado dos três-e$1
e$2
são os personagens capturados dentro da visão antecipada. Em outras palavras, se a string for"BUMPY"
, ela corresponderá primeiro"B"
(e a colocará$&
) e capturará"U"
e"M"
(e as colocará em$1
e$2
). Em seguida, ele irá corresponder"U"
e captura"M"
e"P"
, e assim por diante.Dentro do bloco, verificamos se o primeiro par de caracteres (
$&
e$1
) é um aumento e o segundo ($1
e$2
) é uma queda ou vice-versa, bem como a maioria das outras respostas. Essa^
expressão retornatrue
orfalse
, que é convertida em uma sequência e inserida no lugar da correspondência. Como resultado, nosso exemplo"BUMPY"
se torna o seguinte:Como sabemos que a entrada está toda em maiúscula, sabemos
"f"
que apenas ocorrerá como parte"false"
e!result[?f]
nos dará nossa resposta.fonte
C #,
646355 bytes-8 bytes de sugestões de Scepheo
Esta é uma porta da solução da Hedi para C #. Eu também vim com uma solução recursiva, mas a recursão não foi tão boa. Minha solução original está abaixo.
Meu C # original,
969491 bytes-2 bytes usando em
1>0
vez detrue
.-3 bytes das sugestões do Scepheo para a solução de porta acima
Chama a si próprio verificando recursivamente que a subida / descida alterna cada vez.
Ungolfed:
fonte
?:
unsafe bool B(char*s)=>1>s[2]|s[0]<s[1]!=s[1]<s[2]&B(s+1);
unsafe bool B(char*s)=>1>s[2]|*s<s[1]!=*++s<s[1]&B(s);
||
vez de OR bit a bit|
. Atualizado a postagem, obrigado.C 59 bytes
fonte
AAA
e minúsculas - o primeiro "Falsey" nos exemplosgcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
e fico falso para aaa e animado. Nesta versão, diferente de zero é falsey e zero é verdade. Na verdade, me pergunto agora se isso é permitido.f("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
compilada no Visual Studio 2012 retorna um valor23
que pode ser tratado,True
mas na pergunta esse valor está na seção "Falsey", portanto, o valor0
esperado.Gelatina , 6 bytes
Com base na resposta de @sanchises .
Experimente online! ou Verifique tudo.
Explicação
fonte
JavaScript (ES6), 65 bytes
.map
é não definitivamente a melhor solução .fonte
Python 2, 88 bytes
Solução simples.
Experimente online
Se as mesmas letras seguidas não aumentassem nem diminuíssem, a solução seria 79 bytes:
fonte
Perl, 34 bytes
Inclui +3 para
-p
(o código contém,'
portanto,-e
não pode ser usado)Dê entrada em maiúsculas no STDIN:
bump.pl
fonte
Python, 51 bytes
Toma entradas
g('B','U','M','P')
e saídas como1
ou0
.Usa o argumento de descompactação para pegar as três primeiras letras e verificar se as duas primeiras se comparam de maneira diferente das duas primeiras. Em seguida, repete-se no restante, usando multiplicação para
and
.fonte
Gelatina ,
65 bytes-1 byte graças a @Dennis (use uma redução cumulativa)
Todos os casos de teste estão em TryItOnline
Quão?
Funciona para todas as maiúsculas ou minúsculas.
fonte
Japonês, 8 bytes
Teste online!
Como funciona
fonte
C #
105104 bytes105 bytes Solução:
Experimente online
O uso de uma matriz de caracteres salvou um byte, pois o espaço pode ser omitido após os colchetes.
f(string x)
vsf(char[]x)
São 101 bytes se eu posso retornar um int 1/0 em vez de bool true / false
fonte
Haskell, 52 bytes
Eu suspeito que eu poderia diminuir um pouco se conseguisse me livrar da construção "where", mas provavelmente estou presa ao zipWith.
Isso funciona fazendo uma lista dos aumentos (True) e das quedas (False) e, em seguida, fazendo uma lista de se as entradas ajacent nesta lista são diferentes
Esta é a minha primeira tentativa de uma delas, então vou passar pelo meu processo de pensamento, caso eu tenha cometido um erro horrível em algum lugar.
Versão Ungolfed (168 bytes)
Encurte nomes, remova informações de tipo (100 bytes)
Mova h para a função principal, pois ela é usada apenas uma vez (86 bytes)
Perceba que areBumps e riseFall são semelhantes o suficiente para abstrair (73 bytes)
Observe que (cauda y) é menor que ya @ (y: ys) (70 bytes)
Arrumar; remover espaços desnecessários (52 bytes)
fonte
g h=tail>>=zipWith h
e torná-lo uma função global para evitar awhere
palavra - chave.Java 7,
157153150 150125117 bytesCasos não testados e de teste:
Experimente aqui.
Saída:
fonte
a > b
, mas cai quandoa <= b
, em vez de>
e<
?char[]
para não precisar transformar sua string de entrada em matriz de caracteres. isso deve economizar alguns bytes. PS: java ftw!String s
->char[]z
?truthy
oufalsey
valor, para fazer o seu método de um int e retornar 1 ou 0 :) .. coloca você para baixo para 117 bytesPowerShell v2 +, 83 bytes
Um pouco de uma abordagem diferente. Isso percorre a entrada
$n
, cada iteração verificando se o caractere anterior$n[$_-1]
é-l
esst
han o caractere atual e$n[$_]
, em seguida, convertendo o resultado desse operador booleano para um int com+
. Esses são-join
editados juntos em uma string, armazenados em$a
. Em seguida, verificar se$a
é-eq
ual para$a
com todos os substrings de00
ou11
removidos.fonte
Python 2.7, 84 bytes
Retorna 1 para acidentado, 0 para caso contrário
Aprendeu algumas coisas legais com bit a bit & e ^.
Começa com booleano b definindo o primeiro par como cima / baixo, depois testa e vira b para cada par seguinte.
o vira para falso se o teste falhar e persistir.
Requer aspas ao redor da entrada (+4 bytes para raw_input () se isso quebra alguma regra)
Teste-o
fonte
05AB1E , 9 bytes
Explicação
Experimente online!
fonte
Python 2.7 (novamente,
8483 bytes)Ou,
7877 bytes sem a impressão.A propósito, o exemplo acima de 56 bytes do Python 2.7 interrompe, por exemplo,Não importa, não leu instruções. Revisando."abbab"
ou qualquer outra entrada com caracteres repetidos.Ok, até 83. O triplo é melhor.
fonte
a(x)if x else[]
. 2. Use uma lambda em vez dissoa=lambda s:[cmp(s[0],s[1:])]+a(s[1:])if s[1:]else[]
3. Use uma lambda no final em vez de imprimir.lambda s:len(set(a(s)))>1
4. selen(set(a(s)))
não for maior que 1, então já é falso, então você pode decolar>1
CJam , 15 bytes
Experimente online! (Como um conjunto de testes separado por avanço de linha.)
Explicação
fonte
PHP, 80 bytes
ou
saída vazia para falso,
1
para verdadeiroou a abordagem recursiva de Hedi e portada e um pouco jogada por 70 bytes:
Na verdade, isso deve recair infinitamente por palavras esburacadas, mas não!
fonte
Haskell,
3037 bytesUso:
fonte
foldl1(/=)
não faz o que você pensa que faz.PHP 7,
137118 bytesSaída vazia para Bumpy,
0
para Not Bumpy.Esta é minha primeira tentativa no código de golfe e preciso melhorar bastante, mas foi um método maravilhoso para aprender coisas novas para mim. Eu também queria me desafiar nessa tarefa usando o novo Operador de espaçonave PHP 7, que parece muito interessante.
De qualquer forma, não estou satisfeito com isso, antes de tudo, pelo fato de precisar adicionar um extra(Nota: eu consertei isso simplesmente mudandoif(isset($s[$i+2]))
para verificar se a variável existe, porque não encontrei outra solução alternativa para o problema, mas é isso por enquanto.strlen($s)-1
parastrlen($s)-2
, eu realmente não conseguia ver isso antes ...).Código de teste:
Teste on-line
fonte
Javascript ES6, 100 bytes
Experimente aqui:
Oh, vamos lá, duas pessoas já me venceram por 40 bytes ...
fonte
"A"<"B"
:, assim você não precisa obter os códigos dos caracteres.1
paraBUMPY
(ou qualquer outra coisa que contenha um aumento e uma queda).Python 3,
148 139127 bytescódigo de teste
fonte
C,
655760 bytesé conserto de
que funciona corretamente com todos os dados apenas em uma única chamada de função (quando a variável global
r
é inicializada como zero).Mas, em qualquer caso, isso é mais curto que a solução anterior (65 bytes) devido ao uso de em
for
vez dewhile
. Mas anterior (a seguir) é um pouco mais fácil de entender:Minha solução é baseada em bit a bit
&
com o código de direção anterior e atual invertido, onde o código de direção pode ser2
(1<<1
) para aumentar o código de caractere (*s > *(s-1)
) ou1
(1<<0
) caso contrário. O resultado desta operação tornou-se 0 se usarmos o mesmo código de direção que o anterior e o atual, ou seja, quando a palavra não for acidentada.ATUALIZAR:
Código para teste:
fonte
r
a0
de graça, mas deve fazê-lo de dentro da função.PHP, 100 bytes
Substitui todos os caracteres da cadeia de caracteres (exceto o último, obviamente) por um
r
para aumento ou umf
para queda e, em seguida, verifica se ocorrerr
ouff
ocorre na cadeia. Para evitar que o último caractere restante interfira com isso, a entrada deve estar em letras maiúsculas.Estou muito insatisfeito com o loop, por exemplo, tenho a sensação de que deve haver uma maneira de combinar o
$i++
em um dos vários$i
s usados no loop, mas não consegui encontrar esse caminho. Talvez alguém mais veja.(Foi também por isso que publiquei meu código, apesar de ter 20 (!) Bytes a mais que a boa solução de Titus.)
fonte
Java 8,
11490 bytesPrograma de teste ungolfed
fonte