Це слово лексично впорядковане?


44

З огляду на рядок введення S, поверніться, truthyякщо всі букви в S лексично впорядковані: їх значення ASCII повинні бути у порядку зростання чи зменшення. Повернення falsyв інших випадках.

Вхідні дані

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

Вихідні дані

  • Вихідні дані повинні бути trueабо false, або 0/1, або будь-який інший окремий true / falseстиль стилю, який може надати ваша мова.
  • Усі справжні випадки повинні мати однаковий результат, як і всі помилкові випадки. Ні "Неправдиво 0, істинно - 1, 2 або 3".

Додаткові правила

  • Стандартні лазівки заборонені
  • Відповідь має бути повною програмою або функцією, а не фрагментом чи запитом REPL.
  • , найкоротша відповідь у байтах.

Тестові справи

Truthy

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

Фальсі

"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
Чи можете ви уточнити щодо результату: чи потрібне значення "truthy" має бути однаковим незалежно від того, який вхід подано?
Ділова кішка

1
@BusinessCat Я додав уточнення.
steenbergh

Що робити, якщо ваша мовна реалізація рядка - це список символів? Багато відповідей, розміщених тут, використовують такі мови ...
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: відсортований вхід ігнорується, оскільки він знаходиться під реверсом на стеці. Ви ніколи не з'єднуєте їх у списку.
Емінья

Не міг присягнути роздвоєний завершений вихід; nvm, ігноруй мене.
Чарівний восьминога Урна


13

Haskell , 33 байти

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

Спробуйте в Інтернеті!

Дякуємо Ørjan Johansen за 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.
Ørjan Johansen

11

Perl 6 , 25 байт

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

Як це працює:

  • .comb розбиває введення на послідовність символів.
  • leі geє операторами порівняння рядків "менше чи рівних" та "більших або рівних" .
  • [ ]навколо оператора infix, зменшує ("складе") список аргументів із цим оператором. (Це досить розумно, щоб повернути значення True, якщо вхід містить лише нуль або один символ.)
  • or повертає True, якщо вирази з обох боків від нього істинні.

10

JavaScript (ES6), 43 байти

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

Не знав, що ви можете змінити змінні в самому аргументі. Приємно!
Лука

1
@Luke Це лише хитро використання параметрів за замовчуванням : якби ви викликали функцію другим аргументом, qзамість цього було б встановлено це значення.
ETHproductions

Насправді я мав на увазі оператор розповсюдження, який (в даному випадку) перетворює його в масив відразу.
Лука

О, добре. Так, завдання з руйнування також дуже зручні ;-)
ETHproductions

Розумний за допомогою мутації .sort()неявно reverse
сортував

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 Як сказано в інструкції, жоден із них не повинен працювати.
Suever

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і для останнього потрібно буде cat()повноцінна програма
MickyT

Збережіть 5 байт за допомогою function(s)all(!diff(order(utf8ToInt(s)),,2))(працює і з зворотним сортуванням!)
mnel

@mnel знову вибачте, що не tree
вдалося

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]як зазначено в початковій публікації. Вони знаходяться в розділі "недійсні", оскільки їх явно не потрібно обробляти.
Suever

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 Нещасний, оскільки він відповідав оригінальному правилу використання справжнього / хибного стилю мови. Можливо, ще одна форма Ṣẇm0$. Якщо порядок аргументів не відрізнявся wі ...
миль

Приємно, але він повертає справжнє значення
Патрік Бард

@PatrickBard Так? '\n'і 'Hello'є абсолютно допустимими значеннями.
Ерік Аутгольфер

5

Математика, 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масив, зберігаючи його $bдля подальшого, переносячи його на sort-objectякий сортує лексично. Інший елемент $bсортується у -desпорядку, що змінюється.


4

Perl , 35 байт

Збережено 4 байти завдяки @Xcali безпосередньо та ще 4 побічно.

31 байт коду + -pFпрапор.

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

Спробуйте в Інтернеті!

Код сортує введення та перевіряє, чи впорядковані самі входи (або у зворотному порядку).


Трохи інший метод, але скорочує його до 38 байт: Спробуйте в Інтернеті!
Xcali

@Xcali Дуже приємно, дякую. Потім ми можемо позбутися $"=$,та використовувати /xмодифікатор замість цього, щоб зберегти ще 5 байт.
Дада



3

PHP, 66 байт

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

приймає дані з аргументу командного рядка. Бігайте з -r.



3

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

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

Спробуйте в Інтернеті!

Безголівки:

(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. Брахілог спробує різні значення для N(лише 0чи 1можливі), спробує уніфікувати результат із вхідними даними та повернути, чи вдала будь-яка з цих спроб.


Здається, більше не працює :( o?|o₁?працює на додатковий байт Тхо
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.
isaacg


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

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.