Escreva uma função / programa que aceite uma sequência de letras maiúsculas / minúsculas [A-Za-z] como entrada, que verifique se as letras existentes são únicas e em ordem alfabética (ignorando maiúsculas e minúsculas) ou não. A saída deve ser verdadeira se for única e em ordem alfabética e, se não for, falsificada.
Aqui alguns casos de teste
a true
abcdefGHIjklmnopqrSTUVWXyz true
aa false
puz true
puzz false
puzZ false
puZ true
PuZ true
pzu false
pzU false
abcdABCD false
dcba false
Se você quiser, execute seu programa com todas as palavras de uma lista de palavras como esta e poste algumas interessantes =).
Ponto
O menor número de bytes vence.
code-golf
string
decision-problem
flawr
fonte
fonte
za
ser um valor verdadeiro?a
e termina comz
.Respostas:
CJam, 8 bytes
Aqui está um equipamento de teste para todos os exemplos no desafio. Isso retorna
0
or1
(que são falsy e truth, respectivamente, em CJam).E aqui está um script para filtrar a lista de palavras na pergunta (leva alguns segundos para executar). Você precisará copiar a lista de palavras no campo de entrada manualmente, porque é muito longo para um link permanente.
Explicação
fonte
Regex (qualquer sabor), 55 bytes
Algumas pessoas não consideram o regex uma linguagem de programação, mas já foi usada antes e não está perto de ser a mais curta.
Adicionei um byte para o
i
sinalizador (sem distinção entre maiúsculas e minúsculas). Isso é muito simples e pode ser mais curto para gerar em tempo real.Se regex sozinho não for permitido, você poderá usar este programa Retina de 56 bytes sugerido por Martin Büttner:
Ao executá-lo na lista de palavras vinculada acima, obtivemos 10 palavras de 6 letras em ordem alfabética.
fonte
i`^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$
Python 3, 44 bytes
Uma abordagem simples - verifique a exclusividade, verifique a classificação.
fonte
*s,=...
faz?s=list(input().lower())
.x,*y = [1, 2, 3, 4]
, que atribui 1 ax
e[2, 3, 4]
ay
.*s,=
islist(s)
... link{*s}
vez deset(s)
salvar 2 bytes.> <> ,
524239 bytesEsse tipo de pergunta é um dos poucos tipos com os quais> <> é bastante confortável, pois precisamos lidar apenas com um caracter por vez.
Explicação
Não se perca! Há muita embalagem aqui.
Solução anterior, 42 bytes
O interessante é que, apesar de parecer ter a mesma funcionalidade, a alternativa
(A mudança está nas setas e espelhos na extrema direita)
na verdade, fornece resultados incorretos , devido ao intérprete de> <> usando um comando padrão do Python. O que acontece é que, percorrendo o espaço vazio no final da segunda linha, os 0s são implicitamente colocados nos espaços em branco quando> <> tenta acessar a célula. Isso mexe com o
?
trampolim condicional no início da mesma linha, pois os 0s recém-colocados são ignorados e nãov
no final.fonte
Haskell, 52 bytes
Uso:
(and.(zipWith(>)=<<tail).map toLower) "abcd"
quais saídasTrue
.fonte
C,
67 65 5754 (52) caracteresum pouco mais curto:
e ainda mais curto:
Aqui está um pequeno teste: http://ideone.com/ZHd0xl
Após as sugestões mais recentes, ainda há duas versões mais curtas:
Além disso, esse código depende do fato de que, em ASCII, letras minúsculas e maiúsculas diferem apenas pelo quinto bit (32) que eu filtro. Portanto, isso pode não funcionar com outras codificações, obviamente.
EDIT: A versão mais recente sempre define o quinto bit como
|32
é menor que&~32
.fonte
for(;(*s&=95)>d;d=*s++);
. E você pode inicializard
a1
sem alterar o resultado, economizando mais 1. Vejo.d;f(char*s){d=32;for...}
funciona, declarandod
implicitamente como um int global (que, no GCC, é um aviso - "a definição de dados não tem tipo ou classe de armazenamento" - mas não é um erro). Isso economiza dois bytes.d
nofor
loop, em vez de sua própria declaração? Dessa forma, você salva;
.Ruby, 33
Verifica se os caracteres exclusivos classificados são iguais a todos os caracteres.
fonte
c==c.sort|c
Javascript (ES5), 101
Aprimorado para 87 por edc95:
voto o seu comentário :)
Aliás, os casos de teste atualmente no OP são preenchidos se um programa está apenas verificando a exclusividade, desconsiderando a ordem.
Ainda não posso escrever comentários, então vou responder algumas observações aqui:
@ edc65: Obrigado! Tentei reescrevê-lo usando
some()
, mas não consegui uma solução mais curta, porque, embora pareça que me permita me livrar da variável supérflua b, você precisa digitar "return" duas vezes (o mesmo comreduce()
) e você não pode simplesmente retornar o resultado da comparação diretamente, porque o último caractere precisa ser salvo após a comparação com ele.@ edc65: Esse é um bom uso do operador de vírgula para 87! Editei-o na minha resposta para obter mais visibilidade.
fonte
return
e!b
salvar um caractere.function i(s){b=0;l='';s.toUpperCase().split('').forEach(function(c){if(c<=l)b=1;l=c});return!b}
function i(s){s.toUpperCase(b=0).split(l='').forEach(function(c){if(c<=l)b=1;l=c});return!b}
function i(s){return!s.toUpperCase().split(l='').some(function(c){return(u=l,l=c)<=u})}
Haskell, 90 bytes
Fornece a função
f :: String -> Bool
Uso (supondo que ele seja salvo como golf.hs).
...
é usado para substituirghci
as mensagens de carregamento detalhadas de.Se alguém tiver um
lowercase
método mais curto do queimport Distribution.Simple.Utils
então, por favor, comente.fonte
map toLower
from emData.Char
vez delowercase
l
emf
, ief=g.lowercase
(ouf=g.map toLower
se você alternar paratoLower
). Dentro deg
uma comparação é suficiente:g l=nub(sort l)==l
.Wolfram Mathematica,
4937 bytesSolução PS Shorter de Martin Büttner:
fonte
#⋃#==#&@*Characters@*ToLowerCase
J, 17 bytes
Verifica se as minúsculas classificadas
/:~
string é igual-:
à~.
string nub em minúsculas .Como em J, uma "string" longa de 1 caractere, representada como uma string regular (com aspas), é apenas um átomo de caracteres, não uma string real. (No exemplo acima eu usei
1$'a'
.)fonte
MATLAB,
2927 bytesAgora, uma linha única que até faz sentido fora do código-golfe.
Como uma função anônima (use as
o('yourstring')
)Eu acho que essa função é bastante auto-explicativa, pois se parece com um anúncio de jornal.
Versão anterior (29 bytes):
A entrada deve ser apresentada entre'
marcas, por exemplo'Potato'
.fonte
Braquilog , 3 bytes
Experimente online!
O predicado será bem-sucedido se a entrada atender aos requisitos descritos e falhar se não atender, imprimir
true.
oufalse.
se executar como um programa.A primeira versão que criei, sem referenciar explicitamente o alfabeto:
Braquilog , 4 bytes
Experimente online!
fonte
J, 21 caracteres
Este é muito longo. O argumento deve ter classificação
1
, ou seja, deve ser uma string ou vetor.tolower y
-y
em minúsculas./:~ y
-y
em ordem lexical.~. y
- o nó dey
, isto é,y
com duplicatas removidas.x ; y
-x
ey
coloque em caixas e depois concatenadas.< y
-y
coloque em uma caixa.x = y
-x
comparado com elementosy
.(< y) = (~. y) ; (/:~ y)
- um vetor indicando sey
é igual ao seu nó e ele próprio classificado.*/ y
- o produto dos itens dey
, ou sua lógica e se os itens são booleanos.*/ (< y) = (~. y) ; (/:~ y)
- um booleano indicando a propriedade desejada para minúsculasy
.fonte
Julia, 44 bytes
Isso cria uma função anônima que aceita um único argumento
s
, converte-o para minúsculas e o compara à versão classificada exclusiva da string. Retorna um booleano,true
ou seja, oufalse
. Se você quiser testá-lo, atribua-o comof=s->...
e depois liguef("PuZ")
etc.fonte
Pure Bash 4.x, 37
Entrada tomada como um parâmetro da linha de comandos. De acordo com a semântica padrão do shell, o código de saída 0 significa verdadeiro (alfabético) e o código de saída! = 0 significa falso (não alfabético).
O printf cria o regex como na solução do @ hsl . A sequência de entrada é expandida para minúscula e comparada com a regex.
Resposta anterior:
Bash + coreutils, 52
Solução simples:
fonte
C # 6, 18 +
8276 = 94 bytesRequer (18 bytes):
Código (76 bytes):
O C # 6 suporta lambdas para definir uma função, útil para jogar golfe.
Versão não C # 6:
Código não destruído:
fonte
JavaScript (ES6) 54
Converta em maiúsculas e depois em matriz e classificação. Se durante a classificação dois elementos estiverem na ordem errada ou igual, retorne 0 (falsy) else 1 (truth)
Editar encurtado thx para @Optimizer (mas ainda 2 mais do que a solução @Tamas implementado em ES6:
F=s=>[...s.toUpperCase()].every(c=>(u=l,l=c)>u,l='')
)Teste no console Firefox / FireBug
fonte
s=
parece não ser necessário ...C (44 bytes)
f(char*s){return(*s&=95)?f(s+1)>*s?*s:0:96;}
Teste aqui: http://ideone.com/q1LL3E
Postando isso porque ainda não posso comentar, caso contrário, seria uma sugestão para melhorar a resposta C existente porque roubei completamente a ideia que não diferencia maiúsculas de minúsculas da resposta C existente.
Retorna 0 se a sequência não for solicitada e um valor diferente de zero se solicitado.
fonte
Golang (65 bytes)
Go não é uma linguagem amigável para golfe, também, eu sou péssima em golfe ...
Execute-o aqui: http://play.golang.org/p/xXJX8GjDvr
editar 106-> 102
editar 102-> 96
editar 96-> 91
editar 91-> 87
editar 87-> 65
Eu venci a versão java, posso parar por hoje
fonte
Java
8-90898785 caracteresA idéia aqui é usar uma função 'reduzir' que rastreie o último caractere e "desista" quando detectar que a sequência não está subindo estritamente.
golfed:
ungolfed:
exemplo:
saída:
fonte
Perl 6, 35 bytes
Isso produz um bloco que pode ser chamado; se eu pudesse assumir que
$_
já está definido com a palavra desejada, eu poderia excluir as chaves ao redor e perder mais dois bytes, mas provavelmente a única maneira razoável de fazer essa suposição seria executá-la-n
e alimentá-la como entrada padrão , que adicionaria os dois bytes de volta.fonte
.uc.comb
não reorganiza nada; portanto, se a matriz maiúscula e penteada for igual à matriz maiúscula e penteada classificada , isso significa que ela começou na ordem classificada.R , 37 bytes
Experimente online!
Postagem, pois isso é substancialmente diferente e mais curto que a resposta R de Michal .
Converte as letras em pontos de código ASCII com o
utf8ToInt
módulo 32, para que as letras maiúsculas e minúsculas sejam convertidas nos mesmos números 1 ... 26. Calcula as diferenças aos pares e verifica se todas são positivas.fonte
Perl, 27
O regexp do @ hsl cria dinamicamente.
Também podemos fazer uma correspondência inversa: converter a entrada em um regexp:
PuZ
=>.*p.*u.*z.*
e depois corresponder isso a uma sequência de letras em ordem alfabética. Resultado - também 27 caracteres.fonte
k (6 bytes)
&
retorna true se os dois argumentos forem verdadeiros/
modifica&
para aplicar "sobre" uma lista, como uma dobra em idiomas funcionais>
Melhor que':
modifica>
para aplicar "each-prior", então retorna um vetor de booleanos informando quais elementos são maiores que seu antecessor_
torna argumento minúsculo(
0b
significa booleano false)q (13 bytes)
q é apenas açúcar sintático em k.
all
é definido como&/
e menor é_
fonte
Python, 50 bytes
Experimente online aqui: http://repl.it/c5Y/2
fonte
VBA (161 bytes)
Compara o valor ascii com a letra anterior em minúscula, retorna 0 (false) quando seu valor é menor / igual e sai da função
fonte
Python 2 , 43 bytes
Experimente online!
Coloca
<
símbolos entre todas as letras (convertidas em minúsculas) e depoiseval
s. Os operadores de comparação encadeados do Python ficam perfeitamente felizes em avaliar a coisa toda como uma grande expressão booleana.fonte
Erlang, 51
Usa um conjunto ordenado (análogo ao
java.util.TreeSet
) para classificar os caracteres e descartar as duplicatas. A nova lista é então comparada com a sequência de entrada.Função de teste:
fonte
Java, 96
Bem simples aqui. Apenas converta tudo para menor e compare cada um com o caractere anterior.
fonte