Это слово в лексическом порядке?

44

Если задана входная строка S, вернуть, truthyесли все буквы в S лексически упорядочены: их значения ASCII должны быть в порядке возрастания или убывания. Вернуть falsyв других случаях.

вход

  • Ввод будет в том же регистре (все прописные или строчные). Ваше представление должно быть в состоянии справиться с обоими.
  • Ввод будет состоять из ASCII в диапазоне [A-Za-z]только
  • Длина ввода будет по крайней мере 1, до того максимума, который поддерживает ваш язык.
  • Ввод - это строка, а не список символов, а не массив кодов ASCII.

Выход

  • Выводом должен быть trueили false, или 0/1, или любой другой true / falseстиль вывода, который может обеспечить ваш язык.
  • Все истинные случаи должны иметь одинаковый вывод, как и все ложные случаи. Нет «False равно 0, true равно 1, 2 или 3».

Дополнительные правила

  • Стандартные лазейки запрещены
  • Ответом должна быть полная программа или функция, а не фрагмент или запись REPL.
  • , кратчайший ответ в байтах выигрывает.

Контрольные примеры

Truthy

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

Falsy

"ABCDC"
"yes"
"deed"

Недействителен

"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
источник
1
Можете ли вы уточнить о выводе: должно ли истинное значение быть одинаковым независимо от того, что вводится?
Деловой кот
1
@BusinessCat Я добавил пояснения.
Стинберг
Что если реализация строки на вашем языке представляет собой список символов? Многие из опубликованных здесь ответов используют такие языки ...
theonlygusti
1
Если вы действительно хотите различать значения True и False, вам не следует говорить truthyили falsy. Это подразумевает, что любые значения, которые оцениваются trueили falseразрешены.
FlipTack
3
связанные: найти волнистые слова!
Титус

Ответы:

8

05AB1E , 5 байтов

Â)¤{å

Попробуйте онлайн!

объяснение

Â)     # 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
источник
{¹åза 4 удалил мой ответ. Не заметил использования бифурката, мой был слишком похож.
Волшебная урна осьминога
@carusocomputing: это, к сожалению, будет только проверять, находится ли вход в обратном направлении от отсортированного ввода.
Эминья
Или равно отсортированному вводу. aba => ['aab', 'baa'] => is in? => 0| aab => same => 1
Волшебная Урна Осьминога
@carusocomputing: отсортированный ввод игнорируется, так как он находится ниже стека в обратном направлении. Вы никогда не объединяете их в список.
Эминья
Мог ли присягнуть раздвоенным выходом; НВМ, игнорируй меня.
Волшебная урна осьминога
13

Haskell , 33 байта

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

Попробуйте онлайн!

Спасибо Эрджану Йохансену за 1 байт с scanl1инфиксом псевдонимов .

Haskell - интересный язык для задач, связанных с сортировкой в ​​гольфе, потому что у него нет встроенной сортировки, за исключением длинных import Data.List. Это поощряет поиск способа выполнить задачу вручную без явной сортировки.

Используется код scanl1, который сворачивает операцию по списку слева направо, отслеживая промежуточные результаты. Таким образом, scanl1 maxимеет эффект перечисления совокупных максимумов списка, то есть максимумов постепенно более длинных префиксов. Например, scanl1 max [3,1,2,5,4] == [3,3,3,5,5].

То же самое с minпроверками, уменьшается ли список. Код проверяет два случая и объединяет их с ||.

Сравните с другими выражениями:

(%)=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
источник
На самом деле ваша версия с ||победами, если вы определите (?)=scanl1.
Орджан Йохансен
11

Perl 6 , 25 байт

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

Как это работает:

  • .comb разбивает ввод на последовательность символов.
  • leи geявляются операторами сравнения строк «меньше или равно» и «больше или равно» .
  • [ ]вокруг инфиксного оператора, уменьшает («складывает») список аргументов с этим оператором. (Он достаточно умен, чтобы вернуть True, если на входе есть только ноль или один символ.)
  • or возвращает True, если выражения по обе стороны от него истинны.
SMLS
источник
10

JavaScript (ES6), 43 байта

([...s],q=s+"")=>q==s.sort()|q==s.reverse()
ETHproductions
источник
Не знал, что вы можете изменить переменные в самом аргументе. Ницца!
Люк
1
@Luke Это просто хитрое использование параметров по умолчанию : если бы вы вызывали функцию со вторым аргументом, qвместо этого было бы установлено это значение.
ETHproductions
Я на самом деле имел в виду оператор распространения, который (в данном случае) сразу преобразует его в массив.
Люк
О хорошо Да, задания по деструктуризации тоже очень удобны ;-)
ETHproductions
Умный, используя мутацию, .sort()чтобы неявно сортировать в reverseчеке
Cyoce
7

MATL , 7 байт

dZSuz2<

Попробуйте онлайн! Или проверьте все тестовые случаи .

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
Луис Мендо
источник
Он возвращает истину для всех недействительных случаев
Патрик Бард
1
@PatrickBard Как говорится в инструкциях, ни одна из них не должна быть обработана.
17
6

Clojure, 47 байтов

#(let[c(map int %)a apply](or(a <= c)(a >= c)))
NikoNyrh
источник
Не могу понять, как решить, какой оператор применять кратко. Это здорово.
Carcigenicate
Подождите, вы можете поместить имена встроенных функций в переменные в Clojure? Да, это круто. Это делает <=и >=выглядит инфикс, хотя, что действительно странно.
clismique
(let[+ *](+ 2 3))= 6: D Работает с любой функцией, но, видимо, не с макросами: «Не могу получить значение макроса»
NikoNyrh
6

C (gcc) , 70 байт

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

Я надеялся найти более короткое решение, основанное на рекурсивной функции, но оно не сработало из-за требования к выводу. Итак, вот императивный подход. По крайней мере, приоритет оператора C хорошо работает для оператора внутреннего цикла.

Попробуйте онлайн!

nwellnhof
источник
6

R, 48 50 61 байт

Как неназванная функция

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

Спасибо @guiseppe за несколько дополнительных байтов.

charToRawберет sи распадается на сырой вектор. Это преобразуется в целые числа и diffприменяется. signделает различия в единую единицу. rangeуменьшает вектор до минимума и максимума. Тогда, если стандартное отклонение sdменьше 1, оно ИСТИНА

Попробуйте онлайн!

MickyT
источник
Вы можете сохранить 9 байтов, используя function(s,d=utf8ToInt(s))all(d==sort(d))илиfunction(s,d=utf8ToInt(s))!is.unsorted(d)
mnel
Или до 34 байтов с!is.unsorted(utf8ToInt(scan(,'')))
mnel
@mnel, к сожалению, они не обрабатывают обратную сортировку, например, cbaи последней потребуется a, cat()чтобы сделать ее полной программой
MickyT
Сохраните 5 байтов с помощью function(s)all(!diff(order(utf8ToInt(s)),,2))(работает и с обратной сортировкой!)
mnel
@mnel еще раз извините, это терпит неудачуtree
MickyT
5

MATL, 8 байт

tPvGSXma

Попробуйте онлайн!

объяснение

        % 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
источник
Хороший, но он возвращает истину '\n'и 'Hello': /
Patrick Bard
1
@PatrickBard Ввод будет все тот же случай и будет только так, [A-Za-z]как указано в первоначальном посте. Они находятся в разделе «неверно», потому что их явно не нужно обрабатывать.
17
5

Желе , 4 5 байт

Ṣm0ẇ@

Попробуйте онлайн!

Первоначально был Ṣm0wв четыре байта.

объяснение

Ṣ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
миль
источник
Я был уверен, что было четыре байта, но не мог думать об этом!
Джонатан Аллан
1
... к сожалению, ОП пояснил, что вывод - это не правда / ложь, а два разных значения. Четыре байта все еще возможны, хотя, я полагаю. Редактировать: тьфу Ṣm0ẇ@.
Джонатан Аллан
@JonathanAllan К сожалению, так как он действительно соответствовал первоначальному правилу использования стиля true / false языка. Другая форма может быть Ṣẇm0$. Если порядок аргументов не w
миль
Хорошо, но он возвращает true для недопустимых значений
Патрик Бард
@PatrickBard А? '\n'и 'Hello'являются совершенно действительными значениями.
Эрик Outgolfer
5

Mathematica, 33 байта

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

На основании этого совета . К сожалению, я должен использовать ToCharacterCodeвместо Characters, потому что <=и >=не сравнивать строки.

Мартин Эндер
источник
4

PowerShell , 61 байт

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

Попробуйте онлайн!

Принимает ввод $a, затем проверяет, является ли он -inдвухэлементным массивом. Массив формируется путем взятия $a, приведения его к типу char-array, сохранения его $bна потом, передачи его в sort-objectлексическую сортировку. Другой элемент $bотсортирован в -desпорядке убывания.

AdmBorkBork
источник
4

Perl , 35 байт

Благодаря @Xcali сохранено 4 байта , а косвенно - 4.

31 байт кода + -pFфлаг.

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

Попробуйте онлайн!

Код сортирует входные данные и проверяет, соответствуют ли входные данные отсортированным (или в обратном порядке).

папа
источник
Немного другой метод, но сокращает его до 38 байт: попробуйте онлайн!
Xcali
@Xcali Очень мило, спасибо. Затем мы можем избавиться от него $"=$,и использовать /xвместо него модификатор, чтобы сохранить еще 5 байтов.
Dada
3

Bash + coreutils, 59 байт

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

Входная строка передается в качестве аргумента.

Вывод возвращается в коде выхода (0 для истины, 1 для ложного, как обычно), как это разрешено методами ввода-вывода PPCG .

Митчелл Спектор
источник
3

PHP, 66 байт

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

принимает входные данные из аргумента командной строки. Беги с -r.

Titus
источник
3

Ракетка , 93 байта

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

Попробуйте онлайн!

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

Используя сортировку, сравните с оригинальным подходом

Родриго Руис Мургия
источник
3

Брахилог , 5 байт

Я попытался найти 4-байтовое решение, но безуспешно, так что пока вот самое интересное 5-байтовое решение, которое я нашел:

:No₎?

Попробуйте онлайн!

oфункция упорядочения может принимать параметр: 0означает возрастание, 1убывание. Мы устанавливаем этот параметр в несвязанную переменную N. Brachylog попытается использовать разные значения N(только 0или 1возможно), попытается объединить результат с вводом и возвратит, была ли успешной любая из этих попыток.

Лео
источник
Кажется, больше не работает :( o?|o₁?работает для дополнительного байта tho
hakr14
Кажется, работает, если вы замените двоеточие точкой с запятой. Другой вариант длиной в один байт будет o{|↔}?.
Несвязанная строка
2

JavaScript (ES6) 74 62 50 47 43 байта

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

После некоторой игры в гольф и исправления ошибок этот ответ оказался почти таким же, как у ETHProduction, поэтому, пожалуйста, проверьте его ответ и дайте ему ответ +1.

Люк
источник
Исправлена ​​ошибка ..
Люк
1
Вы поймали меня, я разместил комментарий перед редактированием ...
Лука
Я нашел причину ошибки, и теперь я исправил ее, организовав все грамотно ...
Лука,
Ошибка вернулась ... repl.it/FZrs/2
steenbergh
1
Ну, это в значительной степени ответ @ ETHProduction сейчас, поэтому я добавил уведомление. Пожалуйста, +1ответьте.
Лука
2

Haskell, 54 50 байт

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

Пример использования: t "defggh"-> True. Попробуйте онлайн! ,

Может быть, так же, sortкак и другие ответы, короче, хотя это и требуется import Data.List. Вот другой подход:

Для каждой функции fиз [(=<<),(<*>)]рассчитайте and(zipWith(<=)`f`tail$a)и требует каких - либо результатов , чтобы быть True. Функции

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

которые оба выполняют сравнение соседних элементов входного списка aс <=, но один с перевернутыми аргументами приводит к >=. andпроверяет, все ли сравнения True.

Ними
источник
2

Напористый , 7 байтов

ogoGo|#

Попробуйте онлайн!

Объяснение:

      \ 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
источник
Это не возвращает одно отличное истинное значение.
steenbergh
1
@steenbergh Нет, но он удовлетворяет нашему мета-консенсусу в отношении того, что считается правдивым или ложным - 1и 2находятся Trueв Pushy, тогда как 0есть False.
FlipTack
Если у Pushy есть побитовый оператор ИЛИ, он должен работать вместо этого.
ETHproductions
@FlipTack Я думал, что это было ясно в задаче, но теперь я уточнил это: TRUE должен выводить одинаковое значение во всех тестовых случаях. То же самое касается ЛОЖЬ.
Steenbergh
@steenbergh Мета-консенсус существует по причине и имеет смысл, но если вы настаиваете ...
FlipTack
2

Pyth, 5 байт

}Q_BS

Программа, которая принимает ввод "quoted string"и печатает Trueили Falseпри необходимости.

Тестирование

Как это работает

}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
источник
Вы можете сохранить байт (и стать кратчайшим ответ) путем замены }Qс /, которая использует неявное Q.
Исаак
2

GNU sed, 97 + 1 (флаг r) = 98 байт

Если буквы упорядочены, скрипт возвращается 1, в противном случае 0. В sed нет типов данных.

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

Чтобы проверить, расположены ли все буквы в порядке возрастания, я выполняю поиск в таблице каждой пары последовательных букв в нисходящем алфавите, то есть пытаюсь найти контрпример. Обратите внимание, что //фактически повторяется последнее совпадение регулярного выражения! (см. строки 2 и 3)

Пример запуска: скрипт может проверить несколько входных слов, по одному в строке

me@LCARS:/PPCG$ echo -e "tree\nABCDC" | sed -rf word_ordered.sed
1
0
seshoumara
источник
2

CJam , 12 11 байтов

q_$_W%+\#)g

Попробуйте онлайн!

объяснение

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 машинный код, 68 61 48 46 45 39 байт

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

Собран из:

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
user5434231
источник
2

Скала, 47 байт

def f(x:String)=x==x.sorted|x==x.sorted.reverse
Топор арии
источник