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

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]

{¹å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


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]

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.

10

JavaScript (ES6), 43 octets

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

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


6

Clojure, 47 octets

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

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!


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!


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

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

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.


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.


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


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

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 .


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.



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


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.


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.


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.


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

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

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

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)

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

2

Scala, 47 octets

def f(x:String)=x==x.sorted|x==x.sorted.reverse
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.