Czy to słowo jest uporządkowane leksykalnie?

44

Biorąc pod uwagę ciąg wejściowy S, zwróć, truthyjeśli wszystkie litery w S są uporządkowane leksykalnie: ich wartości ASCII muszą być w porządku rosnącym lub malejącym. Wróć falsyw innych przypadkach.

Wejście

  • Dane wejściowe będą w tym samym przypadku (wszystkie wielkie lub wszystkie małe litery). Twoje zgłoszenie powinno być w stanie obsłużyć oba.
  • Wejście będzie składać się z ASCII w zakresie [A-Za-z]tylko
  • Długość wejściowa będzie wynosić co najmniej 1, maksymalnie tyle, ile obsługuje Twój język.
  • Dane wejściowe to ciąg znaków - nie lista znaków, nie tablica punktów kodowych ASCII.

Wynik

  • Dane wyjściowe powinny być truelub false, lub 0/1innymi true / falsewyjściami w stylu, które może zapewnić Twój język.
  • Wszystkie prawdziwe przypadki muszą mieć takie same dane wyjściowe, jak wszystkie fałszywe przypadki. Nie „False to 0, true to 1, 2 lub 3”.

Dodatkowe zasady

  • Standardowe luki są zabronione
  • Odpowiedź musi być pełnym programem lub funkcją, a nie fragmentem kodu lub wpisem REPL.
  • , wygrywa najkrótsza odpowiedź w bajtach.

Przypadki testowe

Prawda

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

Falsy

"ABCDC"
"yes"
"deed"

Nieważny

"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
źródło
1
Czy możesz wyjaśnić dane wyjściowe: czy prawdziwa wartość musi być taka sama, niezależnie od tego, jaki wkład zostanie podany?
Business Cat
1
@BusinessCat Dodałem wyjaśnienie.
steenbergh
Co jeśli implementacja łańcucha w twoim języku jest listą znaków? Wiele zamieszczonych tutaj odpowiedzi używa takich języków ...
theonlygusti
1
Jeśli naprawdę chcesz odrębnych wartości dla Prawdy i Fałszu, nie powinieneś mówić truthyani falsy. Oznacza to, że wszelkie wartości, które oceniają truelub falsesą dozwolone.
FlipTack,
3
powiązane: Znajdź faliste słowa!
Tytus

Odpowiedzi:

8

05AB1E , 5 bajtów

Â)¤{å

Wypróbuj online!

Wyjaśnienie

Â)     # 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
źródło
{¹ådla 4 usunąłem moją odpowiedź. Nie zauważyłem użycia bifurkatu, moje było zbyt podobne.
Magic Octopus Urn
@carusocomputing: to niestety sprawdzałoby tylko, czy wejście znajduje się na odwrocie posortowanego wejścia.
Emigna
Lub równa posortowanemu wejściu. aba => ['aab', 'baa'] => is in? => 0| aab => same => 1
Magic Octopus Urn
@carusocomputing: Posortowane dane wejściowe są ignorowane, ponieważ znajdują się poniżej stosu odwrotnego. Nigdy nie parujesz ich na liście.
Emigna
Mógł zaprzysiężony bifurkat zapakowany; nvm, zignoruj ​​mnie.
Magic Octopus Urn
17

Python 2 , 53 44 40 39 bajtów

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

Wypróbuj online!

Pręt
źródło
Fajnie, ale zwraca wartość true dla niepoprawnych wartości
Patrick Bard
5
@PatrickBard mieszany przypadek jest nieprawidłowym wprowadzeniem, nie musi być obsługiwany
Rod
13

Haskell , 33 bajty

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

Wypróbuj online!

Dzięki Ørjan Johansen za 1 bajt z aliasingiem scanl1.

Haskell jest interesującym językiem dla wyzwań związanych z sortowaniem golfa, ponieważ nie ma wbudowanego sortowania, z wyjątkiem długich import Data.List. Zachęca to do znalezienia sposobu na wykonanie zadania ręcznie bez wyraźnego sortowania.

Kod używa scanl1, który składa operację na liście od lewej do prawej, śledząc wyniki pośrednie. Tak więc scanl1 maxpowoduje wyświetlenie listy skumulowanych maksimów listy, tj. Maksimów coraz dłuższych prefiksów. Na przykład scanl1 max [3,1,2,5,4] == [3,3,3,5,5].

To samo dotyczy minsprawdzania, czy lista się zmniejsza. Kod sprawdza dwa przypadki i łączy je z ||.

Porównaj z innymi wyrażeniami:

(%)=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
źródło
W rzeczywistości twoja wersja z ||wygrywa, jeśli zdefiniujesz (?)=scanl1.
Ørjan Johansen
11

Perl 6 , 25 bajtów

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

Jak to działa:

  • .comb dzieli dane wejściowe na sekwencję znaków.
  • lei gesą operatorami porównania ciągów „mniejszy lub równy” i „większy lub równy” .
  • [ ]wokół operatora infix zmniejsza („fałduje”) listę argumentów z tym operatorem. (Jest wystarczająco inteligentny, aby zwrócić wartość True, jeśli dane wejściowe zawierają tylko zero lub jeden znak).
  • or zwraca True, jeśli wyrażenia po obu stronach są prawdziwe.
smls
źródło
10

JavaScript (ES6), 43 bajty

([...s],q=s+"")=>q==s.sort()|q==s.reverse()
ETHprodukcje
źródło
Nie wiedziałem, że możesz modyfikować zmienne w samym argumencie. Miły!
Łukasz
1
@Luke To tylko trudne użycie domyślnych parametrów : jeśli miałbyś wywołać funkcję z drugim argumentem, qzamiast tego ustawiono by tę wartość.
ETHprodukcje
Miałem na myśli operator spread, który (w tym przypadku) od razu przekształca go w tablicę.
Łukasz
OK Tak, zadania
restrukturyzacji
Sprytne użycie mutacji .sort()do niejawnego sortowania w reverseczeku
Cyoce
7

MATL , 7 bajtów

dZSuz2<

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

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
źródło
Zwraca wartość true dla wszystkich nieważnych przypadków
Patrick Bard
1
@PatrickBard Zgodnie ze wskazówkami, nie trzeba się nimi zajmować.
Suever
6

Clojure, 47 bajtów

#(let[c(map int %)a apply](or(a <= c)(a >= c)))
NikoNyrh
źródło
Nie udało mi się dowiedzieć, jak zdecydować, który operator zastosować zwięźle. To jest świetne.
Carcigenicate
Poczekaj, czy możesz wstawić nazwy funkcji wbudowanych do zmiennych w Clojure? Huh, to spoko. To sprawia, że <=i >=wyglądają na nieosiągalne, co jest naprawdę dziwne.
clismique
(let[+ *](+ 2 3))= 6: D Działa na dowolnej funkcji, ale najwyraźniej nie na makrach: „Nie można przyjąć wartości makra”
NikoNyrh
6

C (gcc) , 70 bajtów

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

Miałem nadzieję znaleźć krótsze rozwiązanie oparte na funkcji rekurencyjnej, ale nie zadziałało z powodu wymagań wyjściowych. Oto imperatywne podejście. Przynajmniej pierwszeństwo operatora C działa dobrze dla instrukcji pętli wewnętrznej.

Wypróbuj online!

nwellnhof
źródło
6

R, 48 50 61 bajtów

Jako funkcja bez nazwy

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

Dzięki @guiseppe za kilka dodatkowych bajtów.

charToRawbierze si dzieli się na surowy wektor. To jest konwertowane na liczby całkowite i diffstosowane. signczyni diffs pojedynczą jednostką. rangeredukuje wektor do minimum i maksimum. Następnie, jeśli odchylenie standardowe sdjest mniejsze niż 1, jest to PRAWDA

Wypróbuj online!

MickyT
źródło
Można zapisać 9 bajtów używając function(s,d=utf8ToInt(s))all(d==sort(d))lubfunction(s,d=utf8ToInt(s))!is.unsorted(d)
mnel
Lub do 34 bajtów za pomocą!is.unsorted(utf8ToInt(scan(,'')))
2017
@mnel niestety nie obsługują odwrotnego sortowania, np cba. ostatni wymaga cat()pełnego programu
MickyT
Zaoszczędź 5 bajtów za pomocą function(s)all(!diff(order(utf8ToInt(s)),,2))(działa również z sortowaniem odwrotnym!)
mnel
@mnel przepraszam jeszcze raz, to się nie udajetree
MickyT
5

MATL, 8 bajtów

tPvGSXma

Wypróbuj online!

Wyjaśnienie

        % 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
źródło
Ładna, ale zwraca prawdziwe dla '\n'a 'Hello': /
Patrick Bard
1
@PatrickBard Dane wejściowe będą identyczne i będą takie, [A-Za-z]jak podano w pierwszym poście. Znajdują się w sekcji „niepoprawne”, ponieważ jawnie nie trzeba się nimi zajmować.
Suever
5

Galaretka , 4 5 bajtów

Ṣm0ẇ@

Wypróbuj online!

Pierwotnie miał Ṣm0wcztery bajty.

Wyjaśnienie

Ṣ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
mile
źródło
Byłem pewien, że jest cztery bajter, ale nie mogłem o tym myśleć!
Jonathan Allan
1
... niestety OP wyjaśnił, że wyniki nie są zgodne z prawdą / fałszem, ale dwie odrębne wartości. Wydaje mi się, że wciąż możliwe są cztery bajty . Edycja: ugh Ṣm0ẇ@.
Jonathan Allan
@JonathanAllan Niefortunne, ponieważ spełniło pierwotną zasadę używania prawdziwego / fałszywego stylu języka. Inna forma może być Ṣẇm0$. Jeśli kolejność argumentów nie była inna wi ...
mile
Fajnie, ale zwraca wartość true w przypadku niepoprawnych wartości
Patrick Bard
@PatrickBard Huh? '\n'i 'Hello'są całkowicie poprawnymi wartościami.
Erik the Outgolfer
5

Mathematica, 33 bajty

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

Na podstawie tej wskazówki . Niestety muszę użyć ToCharacterCodezamiast Characters, ponieważ <=i >=nie porównuj ciągów.

Martin Ender
źródło
4

PowerShell , 61 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe $a, a następnie sprawdza, czy jest -into tablica dwuelementowa. Tablica jest tworzona przez wzięcie $a, rzutowanie jej jako char-array, przechowywanie jej $bna później, potokowanie do sort-objectktórej sortuje się leksykalnie. Drugi element jest $bsortowany w -deskolejności rosnącej.

AdmBorkBork
źródło
4

Perl , 35 bajtów

Zaoszczędź 4 bajty dzięki @Xcali bezpośrednio i 4 bardziej pośrednio.

31 bajtów kodu + -pFflaga.

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

Wypróbuj online!

Kod sortuje dane wejściowe i sprawdza, czy dane wejściowe są posortowane (lub w odwrotnej kolejności).

Dada
źródło
Nieco inna metoda, ale redukuje ją do 38 bajtów: Wypróbuj online!
Xcali,
@Xcali Bardzo miło, dzięki. Następnie możemy się pozbyć $"=$,i użyć /xmodyfikatora, aby zaoszczędzić jeszcze 5 bajtów.
Dada,
3

Galaretka , 5 bajtów

,Ue@Ṣ

Wypróbuj online!

W jaki sposób?

,Ue@Ṣ - Main link: string
,     - pair string with
 U    - reverse(string)
    Ṣ - sorted(string)
  e@  - exists in with reversed arguments
Jonathan Allan
źródło
3

Bash + coreutils, 59 bajtów

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

Łańcuch wejściowy jest przekazywany jako argument.

Dane wyjściowe są zwracane w kodzie wyjścia (0 dla truey, 1 dla falsy, jak zwykle), na co pozwalają metody We / Wy PPCG .

Mitchell Spector
źródło
3

PHP, 66 bajtów

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

pobiera dane wejściowe z argumentu wiersza poleceń. Uruchom z -r.

Tytus
źródło
3

Rakieta , 93 bajty

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

Wypróbuj online!

Nie golfowany:

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

Za pomocą sortowania porównaj następnie oryginalne podejście

Rodrigo Ruiz Murguía
źródło
3

Brachylog , 5 bajtów

Próbowałem znaleźć rozwiązanie 4-bajtowe bez powodzenia, więc na razie oto najciekawsze rozwiązanie 5-bajtowe, jakie znalazłem:

:No₎?

Wypróbuj online!

o, funkcja zamawiania, może przyjmować parametr: 0oznacza kolejność rosnącą, 1oznacza kolejność malejącą. Ustawiamy ten parametr na niezwiązaną zmienną N. Brachylog spróbuje użyć różnych wartości N(tylko 0lub 1możliwe), spróbuje ujednolicić wynik z danymi wejściowymi i zwróci, czy którakolwiek z tych prób zakończyła się powodzeniem.

Lew
źródło
Wydaje się, że już nie działa :( o?|o₁?działa na dodatkowy bajt
czw
Wydaje się działać, jeśli zastąpisz dwukropek średnikiem. Innym wariantem dłuższym o jeden bajt o{|↔}?.
Niepowiązany ciąg
2

JavaScript (ES6) 74 62 50 47 43 bajty

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

Po grze w golfa i naprawianiu błędów, ta odpowiedź była prawie taka sama jak ETHProduction, więc proszę sprawdź jego odpowiedź i daj jej odpowiedź +1.

Łukasz
źródło
Naprawiono błąd ..
Luke
1
Złapałeś mnie, opublikowałem komentarz przed edycją ...
Luke
Znalazłem przyczynę błędu i teraz naprawiłem go poprawnie, wszystko układając sprytnie ...
Luke
Błąd powrócił ... repl.it/FZrs/2
steenbergh
1
Cóż, to właściwie odpowiedź @ ETHProduction, więc dodałem zawiadomienie. Proszę o +1odpowiedź.
Łukasz
2

Haskell, 54 50 bajtów

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

Przykład użycia: t "defggh"-> True. Wypróbuj online! .

Może użycie sortinnych odpowiedzi jest krótsze, chociaż wymaga import Data.List. Oto inne podejście:

Dla każdej funkcji fod [(=<<),(<*>)]oblicz and(zipWith(<=)`f`tail$a)i wymagaj dowolnego z wyników True. Funkcje są

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

Oba wykonać porównań elementów sąsiadujących z listy wejściowej az <=, ale jeden z argumentów przerzucony w rezultacie daje >=. andsprawdza, czy wszystkie porównania są True.

nimi
źródło
2

Pushy , 7 bajtów

ogoGo|#

Wypróbuj online!

Wyjaśnienie:

      \ 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
źródło
To nie zwraca jednej wyraźnej wartości rzeczywistej.
steenbergh
1
@steenbergh Nie, ale spełnia nasz meta konsensus co do tego, co liczy się jako prawda lub fałsz - 1i 2Truew Pushy, podczas gdy 0False.
FlipTack,
Jeśli Pushy ma bitowy operator OR, to powinno działać zamiast tego.
ETHprodukcje
@FlipTack Pomyślałem, że to jasne w wyzwaniu, ale teraz sprecyzowałem: PRAWDA musi wypisywać tę samą wartość na wszystkich testach. To samo dotyczy FAŁSZ.
steenbergh
@steenbergh Meta consensus istnieje z jakiegoś powodu i ma sens, ale jeśli nalegasz ...
FlipTack 30.01.2017
2

Pyth, 5 bajtów

}Q_BS

Program, który pobiera dane wejściowe "quoted string"i drukuje Truelub Falseodpowiednio.

Zestaw testowy

Jak to działa

}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
źródło
Możesz zapisać bajt (i stać się najkrótszą odpowiedzią), zastępując }Qgo /, który używa niejawnej Q.
isaacg
2

GNU sed, 97 + 1 (flaga r) = 98 bajtów

Jeśli litery są uporządkowane, skrypt zwraca 1, w przeciwnym razie 0. W sed nie ma żadnych typów danych.

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

Aby sprawdzić, czy wszystkie litery są ułożone w porządku rosnącym, sprawdzam w tabeli każdą parę kolejnych liter w malejącym alfabecie, to znaczy próbuję znaleźć przeciwny przykład. Zauważ, że //faktycznie powtarza ostatnie dopasowanie wyrażenia regularnego! (patrz wiersze 2 i 3)

Uruchom przykład: skrypt może przetestować wiele słów wejściowych, po jednym w wierszu

me@LCARS:/PPCG$ echo -e "tree\nABCDC" | sed -rf word_ordered.sed
1
0
seshoumara
źródło
2

CJam , 12 11 bajtów

q_$_W%+\#)g

Wypróbuj online!

Wyjaśnienie

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)
Business Cat
źródło
2

8086 kod maszynowy, 68 61 48 46 45 39 bajtów

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

Zmontowano z:

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
użytkownik5434231
źródło
2

Scala, 47 bajtów

def f(x:String)=x==x.sorted|x==x.sorted.reverse
Aria Axe
źródło