¿Es esta palabra ordenada léxicamente?


44

Dada una cadena de entrada S, regrese truthysi todas las letras en S están ordenadas léxicamente: sus valores ASCII deben estar en orden ascendente o descendente. Regreso falsyen otros casos.

Entrada

  • La entrada será en el mismo caso (todo en mayúsculas o minúsculas). Su presentación debe ser capaz de manejar ambos.
  • La entrada consistirá en ASCII en el rango [A-Za-z]solamente
  • La longitud de entrada será al menos 1, hasta el máximo que admita su idioma.
  • La entrada es una cadena, no una lista de caracteres, no una matriz de puntos de código ASCII.

Salida

  • La salida debe ser trueo false, o 0/1, o cualquier otra true / falsesalida de estilo distinto que pueda proporcionar su idioma.
  • Todos los casos verdaderos deben tener la misma salida, así como todos los casos falsos. No "Falso es 0, verdadero es 1, 2 o 3".

Reglas adicionales

  • Las lagunas estándar están prohibidas
  • La respuesta debe ser un programa completo o una función, no un fragmento o una entrada REPL.
  • , la respuesta más corta en bytes gana.

Casos de prueba

Verdad

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

Falsa

"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
¿Puede aclarar acerca de la salida: el valor de verdad necesita ser el mismo independientemente de qué entrada se da?
Business Cat

1
@BusinessCat He agregado una aclaración.
steenbergh

¿Qué sucede si la implementación de una cadena en su idioma es una lista de caracteres? Muchas de las respuestas incluidas en este documento están utilizando dichos idiomas ...
theonlygusti

1
Si realmente desea valores distintos para Verdadero y Falso, no debe decir truthyo falsy. Esto implica que cualquier valor que evalúe trueo falseesté permitido.
FlipTack

Respuestas:


8

05AB1E , 5 bytes

Â)¤{å

Pruébalo en línea!

Explicación

Â)     # 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, borró mi respuesta. No noté el uso de bifurcado, el mío era demasiado similar.
Urna de pulpo mágico

@carusocomputing: desafortunadamente, eso solo verificaría si la entrada está en el reverso de la entrada ordenada.
Emigna

O igual a la entrada ordenada. aba => ['aab', 'baa'] => is in? => 0El | aab => same => 1
Magic Octopus Urn

@carusocomputing: la entrada ordenada se ignora ya que está debajo del reverso en la pila. Nunca los emparejas en una lista.
Emigna

Coulda jurada salida bifurcada envuelta; nvm, ignórame.
Magic Octopus Urn


13

Haskell , 33 bytes

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

Pruébalo en línea!

Gracias a Ørjan Johansen por 1 byte con scanl1infijo de alias .

Haskell es un lenguaje interesante para los desafíos basados ​​en la clasificación del golf porque no tiene un tipo incorporado, salvo mucho tiempo import Data.List. Esto alienta a encontrar una manera de hacer la tarea a mano sin ordenarla explícitamente.

El código utiliza scanl1, que pliega una operación sobre la lista de izquierda a derecha, haciendo un seguimiento de los resultados intermedios. Entonces, scanl1 maxtiene el efecto de enumerar los máximos acumulativos de la lista, es decir, los máximos de prefijos progresivamente más largos. Por ejemplo, scanl1 max [3,1,2,5,4] == [3,3,3,5,5].

Lo mismo con los mincontroles si la lista está disminuyendo. El código verifica los dos casos y los combina con ||.

Compare con otras expresiones:

(%)=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]

En realidad, su versión con ||victorias si define (?)=scanl1.
Ørjan Johansen

11

Perl 6 , 25 bytes

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

Cómo funciona:

  • .comb divide la entrada en una secuencia de caracteres.
  • ley geson los operadores de comparación de cadenas "menor o igual" y "mayor o igual" .
  • [ ]alrededor de un operador infijo, reduce ("pliega") la lista de argumentos con ese operador. (Es lo suficientemente inteligente como para devolver True si la entrada tiene solo cero o un carácter).
  • or devuelve True si las expresiones a cada lado son verdaderas.

10

JavaScript (ES6), 43 bytes

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

No sabía que podía modificar variables en el argumento mismo. ¡Agradable!
Lucas

1
@Luke Este es solo un uso complicado de los parámetros predeterminados : si llamara a la función con un segundo argumento, qse establecería en ese valor.
ETHproductions

De hecho, me refería al operador de propagación que (en este caso) lo convierte en una matriz de inmediato.
Lucas

Oh ok Sí, las tareas de desestructuración también son muy útiles ;-)
ETHproductions

Uso inteligente de la mutación .sort()para ordenar implícitamente el reversecheque
Cyoce


6

Clojure, 47 bytes

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

No se pudo encontrar la forma de decidir qué operador aplicar de manera concisa. Esto es genial.
Carcigenicate

Espera, ¿puedes poner nombres de funciones incorporados en variables en Clojure? Huh, eso es genial. Sin embargo, hace que el <=y se >=vea infijo, lo cual es realmente extraño.
clismique 01 de

(let[+ *](+ 2 3))= 6: D Funciona en cualquier función pero aparentemente no en macros: "No se puede tomar el valor de una 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;}

Esperaba encontrar una solución más corta basada en una función recursiva, pero no funcionó debido al requisito de salida. Así que aquí hay un enfoque imperativo. Al menos, la precedencia del operador de C funciona bien para la declaración del bucle interno.

Pruébalo en línea!


6

R, 48 50 61 bytes

Como una función sin nombre

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

Gracias a @guiseppe por algunos bytes adicionales.

charToRawtoma sy divide en un vector sin procesar. Esto se convierte en enteros y se diffaplica. signhace que el diffs sea una sola unidad. rangereduce el vector a su mínimo y máximo. Entonces, si la desviación estándar sdes menor que 1, es VERDADERO

Pruébalo en línea!


Puede guardar 9 bytes usando function(s,d=utf8ToInt(s))all(d==sort(d))ofunction(s,d=utf8ToInt(s))!is.unsorted(d)
mnel

O hasta 34 bytes con!is.unsorted(utf8ToInt(scan(,'')))
mnel

@mnel desafortunadamente éstos no manejan el tipo inverso por ejemplo, cbay el último requeriría una cat()para que sea un programa completo
MickyT

Ahorre 5 bytes con function(s)all(!diff(order(utf8ToInt(s)),,2))(¡también funciona con el orden inverso!)
mnel

@mnel lo siento de nuevo, eso fallatree
MickyT

5

MATL, 8 bytes

tPvGSXma

Pruébalo en línea!

Explicación

        % 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

Agradable, pero devuelve cierto para '\n'y 'Hello': /
Patrick Bard

1
@PatrickBard La entrada será todo el mismo caso y solo será [A-Za-z]como se indica en la publicación inicial. Están en la sección "no válida" porque explícitamente no necesitan ser manejados.
Suever

5

Jalea , 4 5 bytes

Ṣm0ẇ@

Pruébalo en línea!

Originalmente estaba Ṣm0wen cuatro bytes.

Explicación

Ṣ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

Estaba seguro de que había un byter de cuatro, ¡pero no podía pensar en eso!
Jonathan Allan

1
... desafortunadamente, el OP ha aclarado que el resultado no es verdadero / falso, sino dos valores distintos. Sin embargo, cuatro bytes aún son posibles , creo. Editar: ugh Ṣm0ẇ@.
Jonathan Allan

@JonathanAllan Desafortunado ya que cumplió con la regla original de usar el estilo verdadero / falso del lenguaje. Otra forma podría ser Ṣẇm0$. Si el orden de los argumentos no fuera diferente para wy ...
millas

Agradable, pero devuelve verdadero en valores no válidos
Patrick Bard

@PatrickBard ¿Eh? '\n'y 'Hello'son valores perfectamente válidos.
Erik the Outgolfer

5

Mathematica, 33 bytes

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

Basado en este consejo . Desafortunadamente, tengo que usar en ToCharacterCodelugar de Characters, porque <=y >=no comparar cadenas.


4

PowerShell , 61 bytes

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

Pruébalo en línea!

Toma entrada $a, luego verifica si se trata de -inuna matriz de dos elementos. El conjunto se forma tomando $a, charconvirtiéndolo en una matriz, almacenando eso $bpara más tarde, canalizándolo a lo sort-objectque se ordena léxicamente. El otro elemento se $bordena en -desorden descendente.


4

Perl , 35 bytes

Guardado 4 bytes gracias a @Xcali directamente, y 4 más indirectamente.

31 bytes de código + -pFbandera.

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

Pruébalo en línea!

El código ordena la entrada y comprueba si las entradas coinciden ordenadas (o en orden inverso).


Método ligeramente diferente, pero lo reduce a 38 bytes: ¡ Pruébelo en línea!
Xcali

@ Xcali Muy bien, gracias. Entonces podemos deshacernos $"=$,y usar el /xmodificador en su lugar para guardar 5 bytes más.
Dada


3

Bash + coreutils, 59 bytes

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

La cadena de entrada se pasa como argumento.

La salida se devuelve en el código de salida (0 para verdadero, 1 para falso, como de costumbre), según lo permitido por los métodos de E / S PPCG .


3

PHP, 66 bytes

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

toma datos del argumento de la línea de comando. Corre con -r.



3

Raqueta , 93 bytes

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

Pruébalo en línea!

Sin golf:

(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 el ordenamiento luego compara con el enfoque original


3

Brachylog , 5 bytes

Intenté encontrar una solución de 4 bytes sin éxito, así que por ahora esta es la solución de 5 bytes más interesante que he encontrado:

:No₎?

Pruébalo en línea!

o, la función de ordenamiento, puede tomar un parámetro: 0significa orden ascendente, 1significa orden descendente. Establecemos ese parámetro en una variable independiente N. Brachylog intentará diferentes valores para N(solo 0o 1son posibles), intentará unificar el resultado con la entrada y devolverá si alguno de esos intentos tuvo éxito.


Parece que ya no funciona :( o?|o₁?funciona para un byte adicional aunque
hakr14

Parece funcionar si reemplaza los dos puntos con un punto y coma. Otra variante de un byte más largo sería o{|↔}?.
Cadena no relacionada


2

JavaScript (ES6) 74 62 50 47 43 bytes

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

Después de jugar al golf y corregir errores, esta respuesta terminó siendo más o menos la misma que la de ETHProduction, así que por favor revise su respuesta y dele un +1 .


Se corrigió el error ..
Lucas

1
Me atrapaste, publiqué el comentario antes de editar ...
Luke

He encontrado la causa del error, y ahora lo arreglaron adecuadamente mediante la organización de todo inteligentemente ...
Lucas

Bug ha vuelto ... repl.it/FZrs/2
steenbergh

1
Bueno, esta es la respuesta de @ ETHProduction ahora, así que agregué un aviso. Por favor +1su respuesta.
Lucas

2

Haskell, 54 50 bytes

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

Ejemplo de uso: t "defggh"-> True. Pruébalo en línea! .

Tal vez usar sortcomo muchas otras respuestas es más corto, aunque requiere import Data.List. Aquí hay un enfoque diferente:

Para cada función fde [(=<<),(<*>)], calcular and(zipWith(<=)`f`tail$a)y requerir cualquiera de los resultados para ser True. Las funciones son

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

ambos realizan comparaciones de elementos vecinos de la lista de entrada acon <=, pero uno con los argumentos volteados dando como resultado a >=. andcomprueba si todas las comparaciones son True.


2

Pushy , 7 bytes

ogoGo|#

Pruébalo en línea!

Explicación:

      \ 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

Esto no devuelve un valor verdadero distinto.
steenbergh

1
@steenbergh No, pero satisface nuestro meta consenso sobre lo que cuenta como verdadero o falso, 1y 2están Trueen Pushy, mientras que lo 0es False.
FlipTack

Si Pushy tiene un operador OR bit a bit, eso debería funcionar en su lugar.
ETHproductions

@FlipTack Pensé que estaba claro en el desafío, pero ahora lo he hecho más específico: VERDADERO debe generar el mismo valor en todos los casos de prueba. Lo mismo vale para FALSO.
steenbergh

@steenbergh El meta consenso está ahí por una razón y tiene sentido, pero si insiste ...
FlipTack

2

Pyth, 5 bytes

}Q_BS

Un programa que toma la entrada de "quoted string"ay imprime TrueoFalse según corresponda.

Banco de pruebas

Cómo 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

Puede guardar un byte (y convertirse en la respuesta más corta) reemplazándolo }Qcon /, que usa un implícito Q.
isaacg


2

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

Si las letras están ordenadas, el guión regresa 1, de lo contrario 0. En sed no hay tipos de datos.

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

Para verificar si todas las letras están ordenadas en orden ascendente, hago una búsqueda en la tabla de cada par de letras consecutivas en un alfabeto descendente, es decir, trato de encontrar un contraejemplo. Tenga en cuenta que en //realidad repite la última coincidencia de expresión regular.(ver líneas 2 y 3)

Ejemplo de ejecución: el script puede probar múltiples palabras de entrada, una por línea

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

2

CJam , 12 11 bytes

q_$_W%+\#)g

Pruébalo en línea!

Explicación

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

Ensamblado 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.