Esta palavra é lexicamente ordenada?


44

Dada uma sequência de entrada S, retorne truthyse todas as letras em S forem Lexically Ordered: seus valores ASCII precisam estar em ordem crescente ou decrescente. Retorno falsyem outros casos.

Entrada

  • A entrada será no mesmo caso (todas maiúsculas ou minúsculas). Seu envio deve ser capaz de lidar com ambos.
  • A entrada consistirá em ASCII [A-Za-z]apenas no intervalo
  • O comprimento da entrada será de pelo menos 1, até o máximo que seu idioma suportar.
  • A entrada é uma sequência - não uma lista de caracteres, nem uma matriz de pontos de código ASCII.

Resultado

  • A saída deve ser trueou false, ou 0/1, ou qualquer outro true / falseestilo distinto que o seu idioma possa fornecer.
  • Todos os casos verdadeiros precisam ter a mesma saída, bem como todos os casos falsos. Não "Falso é 0, verdadeiro é 1, 2 ou 3".

Regras adicionais

  • As brechas padrão são proibidas
  • A resposta deve ser um programa ou uma função completa, não um trecho de texto ou uma entrada REPL.
  • , a resposta mais curta em bytes vence.

Casos de teste

Truthy

"ABCDEF"
"ZYX"
"no"
"tree"   --> the multiple 'e's don't break the order
"q"

Falsy

"ABCDC"
"yes"
"deed"

Inválido

"Hello" --> invalid input - mixed case-, does not have to be handled
""      --> invalid input - length 0-, does not have to be handled
"\n
  "     --> invalid input - newline is not in range [A-Za-z]-, does not have to be handled

1
Você pode esclarecer sobre a saída: o valor de verdade precisa ser o mesmo, independentemente de qual entrada é fornecida?
Cat Business

1
@BusinessCat Adicionei um esclarecimento.
precisa saber é o seguinte

E se a implementação de uma string no seu idioma for uma lista de caracteres? Muitas das respostas postadas aqui estão usando essas línguas ...
theonlygusti

1
Se você realmente deseja valores distintos para Verdadeiro e Falso, não deve dizer truthyou falsy. Isso implica que qualquer valor que avalie trueou falseseja permitido.
FlipTack

Respostas:


8

05AB1E , 5 bytes

Â)¤{å

Experimente online!

Explicação

Â)     # pair the input with it's reverse in a list
  ¤{   # get a copy of the reverse and sort it
    å  # check if the sorted copy is in the list of [input,reverse_input]

{¹åpara 4, excluí minha resposta. Não percebeu o uso de bifurcado, o meu era muito parecido.
Magic Octopus Urn

@carusocomputing: que infelizmente só verificaria se a entrada está no reverso da entrada classificada.
Emigna

Ou igual à entrada classificada. aba => ['aab', 'baa'] => is in? => 0| aab => same => 1
Magic Octopus Urn

@carusocomputing: a entrada classificada é ignorada, pois está abaixo do reverso na pilha. Você nunca os emparelha em uma lista.
Emigna

Poderia jurar bifurcação de saída; NVV, me ignore.
Magic Octopus Urn


13

Haskell , 33 bytes

(%)=scanl1
f s=s==max%s||s==min%s

Experimente online!

Agradecimentos a Ørjan Johansen por 1 byte com scanl1infixo de aliasing .

Haskell é uma linguagem interessante para os desafios baseados na classificação de golfe, porque ela não tem uma classificação interna, exceto uma longa import Data.List. Isso incentiva a encontrar uma maneira de executar a tarefa manualmente, sem classificar explicitamente.

O código usa scanl1, que dobra uma operação sobre a lista da esquerda para a direita, acompanhando os resultados intermediários. Portanto, scanl1 maxtem o efeito de listar os máximos cumulativos da lista, ou seja, os máximos de prefixos progressivamente mais longos. Por exemplo scanl1 max [3,1,2,5,4] == [3,3,3,5,5],.

O mesmo minocorre com verificações se a lista está diminuindo. O código verifica os dois casos e os combina com ||.

Compare com outras expressões:

(%)=scanl1;f s=s==max%s||s==min%s

f s=or[s==scanl1 q s|q<-[min,max]]
f s=s==scanl1 max s||s==scanl1 min s
f s=any(\q->scanl1 q s==s)[min,max]
f s=any((==s).(`scanl1`s))[min,max]
f s=elem s$(`scanl1`s)<$>[min,max]

Na verdade, sua versão com ||vitórias se você definir (?)=scanl1.
Ørjan Johansen

11

Perl 6 , 25 bytes

{[le] .comb or[ge] .comb}

Como funciona:

  • .comb divide a entrada em uma sequência de caracteres.
  • lee gesão os operadores de comparação de cadeia "menor ou igual" e "maior ou igual" .
  • [ ]ao redor de um operador infix, reduz ("dobra") a lista de argumentos com esse operador. (É inteligente o suficiente retornar True se a entrada tiver apenas zero ou um caractere.)
  • or retorna True se as expressões de ambos os lados forem verdadeiras.

10

JavaScript (ES6), 43 bytes

([...s],q=s+"")=>q==s.sort()|q==s.reverse()

Não sabia que era possível modificar variáveis ​​no próprio argumento. Agradável!
Luke

1
@ Lucas Este é apenas um uso complicado de parâmetros padrão : se você chamasse a função com um segundo argumento, qseria definido com esse valor.
ETHproductions

Na verdade, eu quis dizer o operador spread que (neste caso) o converte em uma matriz imediatamente.
Luke

Ah ok. Sim, atribuições desestruturação são realmente útil também ;-)
ETHproductions

Inteligente usando a mutação .sort()para implicitamente tipo na reverseverificação
Cyoce


6

Clojure, 47 bytes

#(let[c(map int %)a apply](or(a <= c)(a >= c)))

Não foi possível descobrir como decidir qual operador aplicar de forma concisa. Isso é ótimo.
Carcigenicate

Espere, você pode colocar nomes de funções incorporados em variáveis ​​no Clojure? Huh, isso é legal. Ele faz o <=e >=olhar infix porém, que é muito estranho.
Clismique

(let[+ *](+ 2 3))= 6: D Ele funciona em qualquer função, mas, aparentemente, não em macros: "Não pode tomar valor de uma macro"
NikoNyrh

6

C (gcc) , 70 bytes

o(s,a)char*s;{for(a=0;s[1];s++)a|=s[1]-*s&64|*s-s[1]&32;return a!=96;}

Eu esperava encontrar uma solução mais curta com base em uma função recursiva, mas não funcionou devido ao requisito de saída. Então, aqui está uma abordagem imperativa. Pelo menos, a precedência do operador de C funciona bem para a instrução de loop interno.

Experimente online!


6

R, 48 50 61 bytes

Como uma função sem nome

function(s)sd(range(sign(diff(utf8ToInt(s)))))<1

Obrigado a @guiseppe por alguns bytes extras.

charToRawleva se se divide em um vetor bruto. Isso é convertido em números inteiros e diffaplicado. signtorna os diffs uma única unidade. rangereduz o vetor ao mínimo e ao máximo. Então, se o desvio padrão sdfor menor que 1, será TRUE

Experimente online!


Você pode salvar 9 bytes usando function(s,d=utf8ToInt(s))all(d==sort(d))orfunction(s,d=utf8ToInt(s))!is.unsorted(d)
mnel

Ou até 34 bytes com!is.unsorted(utf8ToInt(scan(,'')))
mnel

@mnel infelizmente estes não lidar com o inverso tipo por exemplo, cbaeo último exigiria um cat()para torná-lo um programa completo
MickyT

Guardar 5 bytes com function(s)all(!diff(order(utf8ToInt(s)),,2))(trabalhos com o reverso tipo também!)
mnel

@mnel desculpe novamente, que não paratree
MickyT

5

MATL, 8 bytes

tPvGSXma

Experimente Online!

Explicação

        % Implicitly grab the input as a string
tP      % Create a copy that is reversed
v       % Vertically concatenate these
GS      % Grab the input again and sort it
Xm      % Check if each row of the normal and reversed matrix is equal to the sorted one
a       % Check if either row matched
        % Implicitly display the result

Bom, mas ele retorna verdadeiro para '\n'e 'Hello': /
Patrick Bard

1
@PatrickBard A entrada será a mesma coisa e será apenas [A-Za-z]conforme declarado no post inicial. Eles estão na seção "inválida" porque eles explicitamente não precisam ser manipulados.
Suever 01/02

5

Gelatina , 4 5 bytes

Ṣm0ẇ@

Experimente online!

Originalmente tinha Ṣm0wquatro bytes.

Explicação

Ṣm0ẇ@  Input: string S
Ṣ      Sort S
 m0    Concatenate sort(S) with reverse(sort(S))
   ẇ@  Sublist exists? Check if S is contained in the previous result

Eu tinha certeza de que havia um byter de quatro, mas não conseguia pensar nisso!
Jonathan Allan

1
... infelizmente, o OP esclareceu que a saída não é verdadeira / falsa, mas dois valores distintos. Ainda é possível quatro bytes com , acredito. Edit: ugh Ṣm0ẇ@.
Jonathan Allan

@ JonathanAllan Lamentável, pois atendeu à regra original de usar o estilo verdadeiro / falso do idioma. Outra forma pode ser Ṣẇm0$. Se a ordem dos argumentos não fosse diferente para we ...
miles

Bom, mas ele retorna true em valores inválidos
Patrick Bard

@PatrickBard Huh? '\n'e 'Hello'são valores perfeitamente válidos.
Erik the Outgolfer

5

Mathematica, 33 bytes

0<=##||##>=0&@@ToCharacterCode@#&

Com base nesta dica . Infelizmente, eu tenho que usar em ToCharacterCodevez de Characters, porque <=e >=não comparar as strings.


4

PowerShell , 61 bytes

param($a)$a-in-join(($b=[char[]]$a)|sort),-join($b|sort -des)

Experimente online!

Recebe entrada $ae verifica se é -inuma matriz de dois elementos. A matriz é formada pegando $a, moldando-a como uma charmatriz, armazenando-a $bpara mais tarde, canalizando-a para sort-objectque classifique lexicamente. O outro elemento é $bclassificado em -desordem pendente.


4

Perl , 35 bytes

Economizou 4 bytes graças a @Xcali diretamente e 4 indiretamente.

31 bytes de código + -pFsinalizador.

@b=reverse@a=sort@F;$_=/@a|@b/x

Experimente online!

O código classifica a entrada e verifica se as entradas correspondem a si mesmas classificadas (ou na ordem inversa).


Método ligeiramente diferente, mas reduz para 38 bytes: Experimente online!
Xcali

@Xcali Muito bom, obrigado. Podemos então nos livrar $"=$,e usar o /xmodificador para economizar mais 5 bytes.
Dada


3

Bash + coreutils, 59 bytes

f()(sed 's/\(.\)/\1\
/g'<<<$s|grep .|sort -c$1)
s=$1
f||f r

A sequência de entrada é passada como argumento.

A saída é retornada no código de saída (0 para verdade, 1 para falsidade, como de costume), conforme permitido pelos métodos de E / S do PPCG .


3

PHP, 66 bytes

$a=$s=$r=str_split($argv[1]);sort($s);rsort($r);echo$s==$a|$r==$a;

recebe entrada do argumento da linha de comando. Corra com -r.



3

Raquete , 93 bytes

(define(f s)(let([t(string->list s)])(or(equal?(sort t char<=?)t)(equal?(sort t char>=?)t))))

Experimente online!

Ungolfed:

(define (lex-sorted? string)
  (let ([char-list (string->list string)])
    (or
     (equal? (sort char-list char<=?) char-list)
     (equal? (sort char-list char>=?) char-list))))

Usando a classificação e compare com a abordagem original


3

Brachylog , 5 bytes

Eu tentei encontrar uma solução de 4 bytes sem sucesso, então, por enquanto, aqui está a solução mais interessante de 5 bytes que encontrei:

:No₎?

Experimente online!

o, a função de pedido, pode usar um parâmetro: 0significa ordem crescente, 1significa ordem decrescente. Definimos esse parâmetro como uma variável não acoplada N. O Brachylog tentará valores diferentes para N(somente 0ou 1são possíveis), tentará unificar o resultado com a entrada e retornará se alguma dessas tentativas foi bem-sucedida.


Parece não funcionam mais :( o?|o₁?trabalha para um byte extra tho
hakr14

Parece funcionar se você substituir o cólon por um ponto e vírgula. Outra variante de um byte a mais seria o{|↔}?.
String não relacionada


2

JavaScript (ES6) 74 62 50 47 43 bytes

([...a],b=a+'')=>b==a.sort()|b==a.reverse()

Depois de jogar golfe e corrigir bugs, essa resposta acabou sendo praticamente a mesma da ETHProduction, portanto, verifique sua resposta e dê uma +1.


Corrigido o erro ..
Luke

1
Você me pegou, eu postei o comentário antes de editar ...
Luke

Eu encontrei a causa do bug e agora o corrigi corretamente, organizando tudo de maneira inteligente ...
Luke

Bug está de volta ... repl.it/FZrs/2
steenbergh

1
Bem, esta é praticamente a resposta da @ ETHProduction agora, então adicionei um aviso. Por favor, +1a resposta dele.
Luke

2

Haskell, 54 50 bytes

t a=or[and(zipWith(<=)`f`tail$a)|f<-[(=<<),(<*>)]]

Exemplo de uso: t "defggh"-> True. Experimente online! .

Talvez o uso de sortoutras respostas seja mais curto, embora exija import Data.List. Aqui está uma abordagem diferente:

Para todas as funções fde [(=<<),(<*>)], calcule and(zipWith(<=)`f`tail$a)e exija que qualquer um dos resultados seja True. As funções são

((=<<) (zipWith(<=)) tail) a
((<*>) (zipWith(<=)) tail) a

que tanto realizar comparações de elementos vizinhos da lista de entrada acom <=, mas um com os argumentos virado resultando em um >=. andverifica se todas as comparações são True.


2

Pushy , 7 bytes

ogoGo|#

Experimente online!

Explicação:

      \ Implicit: Input on stack as charcodes
og    \ Check if the stack is sorted ascendingly (Push 0/1)
oG    \ Check if the stack is sorted descendingly (Push 0/1)
      \   - Note that this will work regardless of the first check, as input
      \     is guaranteed to be /[A-Za-z]+/
o|    \ Bitwise OR
#     \ Print the result

Isso não retorna um valor verdadeiro distinto.
precisa saber é o seguinte

1
@steenbergh Não, mas satisfaz a nossa meta consenso sobre o que conta como truthy ou Falsas - 1e 2estão Trueem Pushy, enquanto 0é False.
FlipTack

Se o Pushy tiver um operador OR bit a bit, isso funcionará.
ETHproductions

@FlipTack Eu pensei que estava claro no desafio, mas agora o tornei mais específico: TRUE deve gerar o mesmo valor em todos os casos de teste. O mesmo vale para FALSE.
precisa saber é o seguinte

@steenbergh O consenso meta está lá por uma razão e faz sentido, mas se você insistir ...
FlipTack

2

Pitão, 5 bytes

}Q_BS

Um programa que recebe entrada de "quoted string"e imprime Trueou Falseconforme apropriado.

Suíte de teste

Como funciona

}Q_BS   Program. Input: Q
}Q_BSQ  Implicit variable fill
 Q      Is Q
}       in
    SQ  Q sorted
   B    or
  _     Q sorted reversed?
        Implicitly print

Você pode salvar um byte (e se tornar a resposta mais curta) substituindo }Qpor /, que usa um implícito Q.
Isaacg


2

GNU sed, 97 + 1 (sinalizador r) = 98 bytes

Se as letras forem ordenadas, o script retornará 1, caso contrário 0. No sed, não há tipos de dados.

s:$: zyxwvutsrqponmlkjihgfedcba:
s:(.*(.)(.).* ).*\2.*\3.*:\1abcdefghijklmnopqrstuvwxyz:i
//c0
c1

Para verificar se todas as letras estão organizadas em ordem crescente, faço uma pesquisa de tabela de cada par de letras consecutivas em um alfabeto descendente, ou seja, tento encontrar um exemplo de contador. Observe que, //na verdade, repete a última correspondência de expressão regular! (ver linhas 2 e 3)

Exemplo de execução: o script pode testar várias palavras de entrada, uma por linha

me@LCARS:/PPCG$ echo -e "tree\nABCDC" | sed -rf word_ordered.sed
1
0

2

CJam , 12 11 bytes

q_$_W%+\#)g

Experimente online!

Explicação

q            Push the input
 _$          Duplicate and sort
   _W%       Duplicate and reverse
      +      Concatenate the sorted and the reversed strings
       \     Bring input to the top
        #    Find the index of the input in the other string; returns -1 if not found
         )   Increment
          g  Signum (coerces to 0 or 1)

2

Código de máquina 8086, 68 61 48 46 45 39 bytes

00000000  b2 31 be 82 00 ac 9f 88  c3 ac 3c 0d 74 14 38 c3  |.1........<.t.8.|
00000010  74 f5 e3 03 b1 00 9f 77  05 9e 76 ea eb 03 9e 77  |t......w..v....w|
00000020  e5 4a b4 02 cd 21 c3                              |.J...!.|
00000027

Montado a partir de:

org 0x100
use16
    mov dl, 0x31
    mov si, 0x82
    lodsb
a:  lahf
b:  mov bl, al
    lodsb
    cmp al, 0x0d
    je y
    cmp bl, al
    je b
    jcxz @f
    mov cl, 0
    lahf
@@: ja @f
    sahf
    jbe a
    jmp n
@@: sahf
    ja a
n:  dec dx
y:  mov ah, 0x02
    int '!'
    ret

2

Scala, 47 bytes

def f(x:String)=x==x.sorted|x==x.sorted.reverse
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.