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


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

1
Можете ли вы уточнить о выводе: должно ли истинное значение быть одинаковым независимо от того, что вводится?
Деловой кот

1
@BusinessCat Я добавил пояснения.
Стинберг

Что если реализация строки на вашем языке представляет собой список символов? Многие из опубликованных здесь ответов используют такие языки ...
theonlygusti

1
Если вы действительно хотите различать значения True и False, вам не следует говорить truthyили falsy. Это подразумевает, что любые значения, которые оцениваются trueили falseразрешены.
FlipTack

Ответы:


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]

{¹åза 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]

На самом деле ваша версия с ||победами, если вы определите (?)=scanl1.
Орджан Йохансен

11

Perl 6 , 25 байт

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

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

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

10

JavaScript (ES6), 43 байта

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

Не знал, что вы можете изменить переменные в самом аргументе. Ницца!
Люк

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

Не могу понять, как решить, какой оператор применять кратко. Это здорово.
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 хорошо работает для оператора внутреннего цикла.

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


6

R, 48 50 61 байт

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

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

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

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

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


Вы можете сохранить 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

Хороший, но он возвращает истину '\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порядке убывания.


4

Perl , 35 байт

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

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

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

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

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


Немного другой метод, но сокращает его до 38 байт: попробуйте онлайн!
Xcali

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



3

PHP, 66 байт

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

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




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

Это не возвращает одно отличное истинное значение.
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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.