Ce mot est-il ordonné lexicalement?

44

Avec une chaîne d'entrée S, renvoie truthysi toutes les lettres de S sont ordonnées lexicalement: leurs valeurs ASCII doivent être dans un ordre croissant ou décroissant. Retour falsydans les autres cas.

Contribution

  • La saisie se fera dans le même cas (majuscules ou minuscules). Votre soumission devrait pouvoir gérer les deux.
  • L'entrée consistera en ASCII dans la plage [A-Za-z]seulement
  • La longueur d’entrée sera d’au moins 1, jusqu’à concurrence de votre langue.
  • L'entrée est une chaîne - pas une liste de caractères, pas un tableau de points de codage ASCII.

Sortie

  • Le résultat devrait être trueou false, ou 0/1, ou tout autre true / falsestyle de sortie que votre langage peut fournir.
  • Tous les vrais cas doivent avoir la même sortie, ainsi que tous les faux cas. Non "False est 0, true est 1, 2 ou 3".

Règles supplémentaires

  • Les échappatoires standard sont interdites
  • La réponse doit être un programme complet ou une fonction, pas un extrait de code ni une entrée REPL.
  • , la réponse la plus courte en octets l'emporte.

Cas de test

Vérité

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

Fausseté

"ABCDC"
"yes"
"deed"

Invalide

"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
Steenbergh
la source
1
Pouvez-vous clarifier le résultat: la valeur de vérité doit-elle être la même quel que soit le type d'entrée donné?
Business Cat
1
@ BusinessCat J'ai ajouté une clarification.
Steenbergh
Que se passe-t-il si l'implémentation d'une chaîne dans votre langage est une liste de caractères? La
plupart
1
Si vous voulez vraiment des valeurs distinctes pour Vrai et Faux, vous ne devriez pas dire truthyou falsy. Cela implique que toutes les valeurs évaluées trueou falseautorisées.
FlipTack

Réponses:

8

05AB1E , 5 octets

Â)¤{å

Essayez-le en ligne!

Explication

Â)     # 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]
Emigna
la source
{¹åpour 4, supprimé ma réponse. Je n'ai pas remarqué l'utilisation de bifurcate, le mien était trop similaire.
Urne magique Octopus le
@carusocomputing: cela ne vérifierait malheureusement que si l'entrée est à l'inverse de l'entrée triée.
Emigna
Ou égal à l'entrée triée. aba => ['aab', 'baa'] => is in? => 0| aab => same => 1
Urne magique Octopus le
@carusocomputing: L'entrée triée est ignorée car elle est située au-dessous de l'inverse sur la pile. Vous ne les associez jamais dans une liste.
Emigna
Coulda juré bifurcate sortie enveloppée; NVM, ignorez-moi.
Urne magique Octopus le
17

Python 2 , 53 44 40 39 octets

lambda a:`sorted(a)`[2::5]in(a,a[::-1])

Essayez-le en ligne!

Barre
la source
Bien, mais cela redevient vrai pour les valeurs non valides
Patrick Bard
5
La casse mixte de @PatrickBard est une entrée non valide, elle ne doit pas être traitée
Rod
13

Haskell , 33 octets

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

Essayez-le en ligne!

Merci à Ørjan Johansen pour 1 octet avec scanl1infixe de repliement .

Haskell est un langage intéressant pour les défis basés sur le tri du golf, car il n’a pas de tri intégré, à l’exception de long import Data.List. Cela encourage à trouver un moyen de faire la tâche à la main sans trier explicitement.

Le code utilise scanl1, qui replie une opération sur la liste de gauche à droite, en gardant une trace des résultats intermédiaires. Ainsi, scanl1 maxa pour effet d’énumérer les maxima cumulés de la liste, c’est-à-dire les maxima de préfixes de plus en plus longs. Par exemple, scanl1 max [3,1,2,5,4] == [3,3,3,5,5].

La même chose avec minvérifie si la liste diminue. Le code vérifie les deux cas et les combine avec ||.

Comparez avec d'autres expressions:

(%)=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]
Xnor
la source
En fait, votre version ||gagne si vous définissez (?)=scanl1.
Ørjan Johansen
11

Perl 6 , 25 octets

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

Comment ça marche:

  • .comb divise l'entrée en une séquence de caractères.
  • leet gesont les opérateurs de comparaison de chaînes "inférieur ou égal" et "supérieur ou égal à" .
  • [ ]autour d'un opérateur infixe, réduit ("plie") la liste d'arguments avec cet opérateur. (Il est assez intelligent pour renvoyer True si l'entrée n'a que zéro ou un caractère.)
  • or renvoie True si les expressions de chaque côté sont vraies.
smls
la source
10

JavaScript (ES6), 43 octets

([...s],q=s+"")=>q==s.sort()|q==s.reverse()
ETHproductions
la source
Je ne savais pas que vous pouviez modifier des variables dans l'argument lui-même. Agréable!
Luc
1
@Luke Ceci est juste une utilisation délicate des paramètres par défaut : si vous appelez la fonction avec un second argument, sa valeur qserait définie à la place.
ETHproductions
Je pensais en fait à l'opérateur de propagation qui (dans ce cas) le convertit immédiatement en tableau.
Luke
Ah d'accord. Ouais, les tâches de déstructuration sont aussi très utiles ;-)
ETHproductions
Intelligent utilisant la mutation .sort()pour trier implicitement le reversechèque
Cyoce 2/02/2017
7

MATL , 7 octets

dZSuz2<

Essayez-le en ligne! Ou vérifiez tous les cas de test .

d     % Implicitly input string. Push array of consecutive differences of code points
ZS    % Sign. Transforms each entry into 1, 0 or -1
u     % Unique
z     % Number of nonzeros
2<    % Is it less than 2? Implicit display
Luis Mendo
la source
Cela se vérifie pour tous les cas invalides
Patrick Bard le
1
@ PatrickBard Comme l'indiquent les instructions, aucune de celles-ci ne doit être traitée.
Suever le
6

Clojure, 47 octets

#(let[c(map int %)a apply](or(a <= c)(a >= c)))
NikoNyrh
la source
Impossible de déterminer comment choisir l'opérateur à appliquer de manière concise. C'est bien.
Carcigenicate
Attendez, vous pouvez mettre des noms de fonction intégrés dans des variables dans Clojure? Hein, c'est cool. Cela rend le <=et l' >=air infixe cependant, ce qui est vraiment bizarre.
clismique
(let[+ *](+ 2 3))= 6: D Cela fonctionne sur n'importe quelle fonction mais apparemment pas sur les macros: "Impossible de prendre la valeur d'une macro"
NikoNyrh
6

C (gcc) , 70 octets

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

J'espérais trouver une solution plus courte basée sur une fonction récursive, mais cela n'a pas fonctionné en raison des exigences de sortie. Alors, voici une approche impérative. Au moins, la priorité de l'opérateur C fonctionne bien pour l'instruction de boucle interne.

Essayez-le en ligne!

Nwellnhof
la source
6

R, 48 50 61 octets

En tant que fonction non nommée

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

Merci à @guiseppe pour quelques octets supplémentaires.

charToRawprend set se divise en un vecteur brut. Ceci est converti en entiers et diffappliqué. signrend les diffs une seule unité. rangeréduit le vecteur à son minimum et maximum. Ensuite, si l'écart type sdest inférieur à 1, il est VRAI

Essayez-le en ligne!

MickyT
la source
Vous pouvez économiser 9 octets en utilisant function(s,d=utf8ToInt(s))all(d==sort(d))orfunction(s,d=utf8ToInt(s))!is.unsorted(d)
mnel
Ou jusqu'à 34 octets avec!is.unsorted(utf8ToInt(scan(,'')))
mnel le
@mnel malheureusement, ils ne gèrent pas le tri inversé, par exemple, cbaet le dernier nécessiterait un cat()programme complet
MickyT
Économisez 5 octets avec function(s)all(!diff(order(utf8ToInt(s)),,2))(fonctionne aussi avec le tri inversé!)
mnel
@mnel désolé encore une fois, cela échoue pourtree
MickyT
5

MATL, 8 octets

tPvGSXma

Essayez-le en ligne!

Explication

        % 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
Suever
la source
Bien, mais cela se vérifie pour '\n'et 'Hello': /
Patrick Bard
1
@PatrickBard L'entrée sera tout le même cas et ne sera que [A-Za-z]comme indiqué dans le post initial. Ils sont dans la section "invalid" car ils n'ont explicitement pas besoin d'être traités.
Suever le
5

Gelée , 4 à 5 octets

Ṣm0ẇ@

Essayez-le en ligne!

À l'origine était Ṣm0wà quatre octets.

Explication

Ṣ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
milles
la source
J'étais sûr qu'il y avait un quatre octets, mais je ne pouvais pas y penser!
Jonathan Allan
1
... malheureusement, le PO a clarifié le résultat, ce n'est pas la vérité / la fausseté, mais deux valeurs distinctes. Quatre octets encore possibles avec cependant, je crois. Edit: Ugh Ṣm0ẇ@.
Jonathan Allan
@ JonathanAllan Unfortunate car il respectait la règle d'origine consistant à utiliser le style vrai / faux du langage. Une autre forme pourrait être Ṣẇm0$. Si l'ordre des arguments n'était pas différent pour wet ...
miles
Sympa, mais ça retourne vrai sur les valeurs invalides
Patrick Bard
@ PatrickBard Hein? '\n'et 'Hello'sont des valeurs parfaitement valables.
Erik the Outgolfer
5

Mathematica, 33 octets

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

Basé sur cette astuce . Malheureusement, je dois utiliser à la ToCharacterCodeplace de Characters, car <=et >=ne compare pas les chaînes.

Martin Ender
la source
4

PowerShell , 61 octets

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

Essayez-le en ligne!

Prend l'entrée $a, puis vérifie s'il s'agit d' -inun tableau à deux éléments. Le tableau est formé en prenant $a, en le chartransformant en un tableau, en le stockant $bpour plus tard, en le dirigeant vers un tri lexical sort-object. L'autre élément est $btrié dans l' -desordre croissant.

AdmBorkBork
la source
4

Perl , 35 octets

Sauvegardé 4 octets grâce à @Xcali directement, et 4 autres indirectement.

31 octets de code + -pFdrapeau.

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

Essayez-le en ligne!

Le code trie l'entrée et vérifie si les entrées correspondent elles-mêmes triées (ou dans l'ordre inverse).

Dada
la source
Méthode légèrement différente, mais réduite à 38 octets: essayez-la en ligne!
Xcali
@Xcali Très bien, merci. Nous pouvons alors nous débarrasser de $"=$,et utiliser le /xmodificateur à la place pour sauvegarder 5 octets supplémentaires.
Dada
3

Gelée , 5 octets

,Ue@Ṣ

Essayez-le en ligne!

Comment?

,Ue@Ṣ - Main link: string
,     - pair string with
 U    - reverse(string)
    Ṣ - sorted(string)
  e@  - exists in with reversed arguments
Jonathan Allan
la source
3

Bash + coreutils, 59 octets

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

La chaîne d'entrée est transmise en tant qu'argument.

La sortie est renvoyée dans le code de sortie (0 pour la vérité, 1 pour la fausseté, comme d'habitude), comme le permettent les méthodes d'E / S PPCG .

Mitchell Spector
la source
3

PHP, 66 octets

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

prend en entrée l'argument de la ligne de commande. Courez avec -r.

Titus
la source
3

Raquette , 93 octets

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

Essayez-le en ligne!

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))))

Utiliser le tri puis comparer à l'approche originale

Rodrigo Ruiz Murguía
la source
3

Brachylog , 5 octets

J'ai essayé de trouver une solution de 4 octets sans succès, donc pour l'instant voici la solution de 5 octets la plus intéressante que j'ai trouvée:

:No₎?

Essayez-le en ligne!

o, la fonction de classement peut prendre un paramètre: 0signifie ordre croissant, 1signifie ordre décroissant. Nous définissons ce paramètre sur une variable non liée N. Brachylog essaiera différentes valeurs pour N(seulement 0ou 1est possible), tentera d'unifier le résultat avec l'entrée et retournera si l'une de ces tentatives a réussi.

Leo
la source
Semble ne plus fonctionner :( o?|o₁?fonctionne pour un octet supplémentaire tho
hakr14
Semble fonctionner si vous remplacez le colon par un point-virgule. Une autre variante d'un octet plus longue serait o{|↔}?.
Unrelated String
2

JavaScript (ES6) 74 62 50 47 43 octets

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

Après avoir joué au golf et corrigé des bugs, cette réponse s’est avérée être à peu près la même que celle d’ETHProduction. Veuillez donc consulter sa réponse et donner une réponse +1.

Luke
la source
Correction du bug ..
Luke
1
Tu m'as attrapé, j'ai posté le commentaire avant l'édition
Luke
J'ai trouvé la cause du bogue, et je l'ai maintenant corrigé correctement en organisant tout intelligemment ...
Luke
Bug est de retour ... repl.it/FZrs/2
steenbergh
1
Eh bien, c’est à peu près la réponse de @ ETHProduction maintenant, j’ai donc ajouté un avis. S'il vous plaît +1sa réponse.
Luc
2

Haskell, 54 à 50 octets

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

Exemple d'utilisation: t "defggh"-> True. Essayez-le en ligne! .

Peut-être que l’utilisation de la sortmême chose peut être plus courte, bien que cela exige import Data.List. Voici une approche différente:

Pour chaque fonction fde [(=<<),(<*>)], calculez and(zipWith(<=)`f`tail$a)et demandez à l’un des résultats d’être True. Les fonctions sont

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

qui sont tous deux effectuer des comparaisons des éléments voisins de la liste d'entrée aavec <=, mais avec les arguments retourné résultant en une >=. andvérifie si toutes les comparaisons sont True.

nimi
la source
2

Pushy , 7 octets

ogoGo|#

Essayez-le en ligne!

Explication:

      \ 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
FlipTack
la source
Cela ne renvoie pas une valeur vraie distincte.
Steenbergh
1
@steenbergh Non, mais cela satisfait notre méta consensus sur ce qui est considéré comme une vérité ou une fausseté - 1et 2sont Truedans Pushy, alors qu’il en 0est False.
FlipTack
Si Pushy a un opérateur OU au niveau du bit, cela devrait plutôt fonctionner.
ETHproductions
@ FlipTack Je pensais que le défi était clair, mais je l'ai maintenant précisé: TRUE doit afficher la même valeur dans tous les cas de test. Même chose pour FALSE.
Steenbergh
@steenbergh Le méta-consensus existe pour une raison qui a du sens, mais si vous insistez ...
FlipTack
2

Pyth, 5 octets

}Q_BS

Un programme qui prend une entrée "quoted string"et imprime Trueou Falseselon le cas.

Suite de tests

Comment ça marche

}Q_BS   Program. Input: Q
}Q_BSQ  Implicit variable fill
 Q      Is Q
}       in
    SQ  Q sorted
   B    or
  _     Q sorted reversed?
        Implicitly print
TheBikingViking
la source
Vous pouvez sauvegarder un octet (et devenir la réponse la plus courte) en le remplaçant }Qpar /, qui utilise un implicite Q.
isaacg
2

GNU sed, 97 + 1 (indicateur r) = 98 octets

Si les lettres sont ordonnées, le script revient 1, sinon 0. Dans sed, il n'y a pas de types de données.

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

Pour vérifier si toutes les lettres sont classées par ordre croissant, je fais une recherche sous forme de tableau de chaque paire de lettres consécutives dans un alphabet décroissant, c’est-à-dire que j’essaie de trouver un exemple de compteur. Notez que //répète en fait la dernière correspondance d'expression régulière! (voir lignes 2 et 3)

Exemple d'exécution: le script peut tester plusieurs mots d'entrée, un par ligne.

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

CJam , 12 à 11 octets

q_$_W%+\#)g

Essayez-le en ligne!

Explication

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)
Chat d'affaires
la source
2

8086 code machine, 68 61 48 46 45 39 octets

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

Assemblé 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
utilisateur5434231
la source
2

Scala, 47 octets

def f(x:String)=x==x.sorted|x==x.sorted.reverse
Aria Axe
la source