Apakah kata ini Diurutkan secara Lexual?

44

Diberikan string input S, kembalikan truthyjika semua huruf dalam S adalah Lexically Ordered: nilai ASCII-nya harus dalam urutan naik atau turun. Kembali falsydalam kasus lain.

Memasukkan

  • Input akan berada dalam kasus yang sama (semua huruf kecil atau semua). Kiriman Anda harus dapat menangani keduanya.
  • Input akan terdiri dari ASCII dalam rentang [A-Za-z]saja
  • Panjang input akan minimal 1, hingga maksimal apa pun yang didukung bahasa Anda.
  • Input adalah string - bukan daftar karakter, bukan array dari ASCII-codepoints.

Keluaran

  • Output harus trueatau false, atau 0/1, atau true / falseoutput gaya lain yang berbeda yang dapat disediakan oleh bahasa Anda.
  • Semua case yang benar harus memiliki output yang sama, dan juga semua case yang salah. Tidak "Salah 0, benar 1, 2, atau 3".

Aturan tambahan

  • Celah standar dilarang
  • Jawaban harus berupa program atau fungsi lengkap, bukan cuplikan atau entri REPL.
  • , jawaban terpendek dalam byte menang.

Uji kasus

Sejujurnya

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

Palsu

"ABCDC"
"yes"
"deed"

Tidak valid

"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
sumber
1
Bisakah Anda mengklarifikasi tentang output: apakah nilai kebenaran harus sama tanpa memperhatikan input apa yang diberikan?
Bisnis Cat
1
@BusinessCat Saya telah menambahkan klarifikasi.
steenbergh
Bagaimana jika implementasi string Anda dalam bahasa adalah daftar karakter? Banyak jawaban yang diposting di sini menggunakan bahasa seperti itu ...
theonlygusti
1
Jika Anda benar-benar menginginkan nilai berbeda untuk Benar dan Salah Anda tidak boleh mengatakan truthyatau falsy. Ini menyiratkan bahwa nilai apa pun yang mengevaluasi trueatau falsediizinkan.
FlipTack

Jawaban:

8

05AB1E , 5 byte

Â)¤{å

Cobalah online!

Penjelasan

Â)     # 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
sumber
{¹åuntuk 4, hapus jawaban saya. Tidak memperhatikan penggunaan dwi dua cabang, milik saya terlalu mirip.
Guci Gurita Ajaib
@carusocomputing: yang sayangnya hanya akan memeriksa apakah input tersebut kebalikan dari input yang diurutkan.
Emigna
Atau sama dengan input yang diurutkan. aba => ['aab', 'baa'] => is in? => 0| aab => same => 1
Guci Gurita Ajaib
@carusocomputing: Input yang diurutkan diabaikan karena berada di bawah kebalikan pada stack. Anda tidak pernah memasangkannya dalam daftar.
Emigna
Bisa saja bersumpah keluaran terbungkus bifurkasi; nvm, abaikan aku.
Guci Gurita Ajaib
17

Python 2 , 53 44 40 39 byte

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

Cobalah online!

tongkat
sumber
Bagus, tetapi mengembalikan nilai true untuk nilai yang tidak valid
Patrick Bard
5
@PatrickBard case campuran adalah input yang tidak valid, tidak harus ditangani
Rod
13

Haskell , 33 byte

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

Cobalah online!

Terima kasih kepada Ørjan Johansen untuk 1 byte dengan aliasing scanl1infix.

Haskell adalah bahasa yang menarik untuk tantangan berbasis pemilahan golf karena tidak memiliki jenis bawaan, kecuali yang panjang import Data.List. Ini mendorong menemukan cara untuk melakukan tugas dengan tangan tanpa penyortiran secara eksplisit.

Penggunaan kode scanl1, yang melipat operasi atas daftar dari kiri ke kanan, melacak hasil antara. Jadi, scanl1 maxmemiliki efek daftar maksimal kumulatif dari daftar, yaitu maksimal dari awalan yang semakin lama semakin lama. Sebagai contoh scanl1 max [3,1,2,5,4] == [3,3,3,5,5],.

Sama dengan minmemeriksa apakah daftar menurun. Kode memeriksa dua kasing dan menggabungkannya dengan ||.

Bandingkan dengan ekspresi lain:

(%)=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]
Tidak
sumber
Sebenarnya versi Anda dengan ||kemenangan jika Anda tentukan (?)=scanl1.
Ørjan Johansen
11

Perl 6 , 25 byte

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

Bagaimana itu bekerja:

  • .comb membagi input menjadi urutan karakter.
  • ledan gemerupakan operator perbandingan string "kurang atau sama" dan "lebih besar atau sama" .
  • [ ]sekitar operator infiks, mengurangi ("lipatan") daftar argumen dengan operator itu. (Cukup cerdas untuk mengembalikan True jika inputnya hanya nol atau satu karakter.)
  • or mengembalikan True jika ekspresi di kedua sisi itu benar.
seseorang
sumber
10

JavaScript (ES6), 43 byte

([...s],q=s+"")=>q==s.sort()|q==s.reverse()
Produksi ETH
sumber
Tidak tahu Anda bisa memodifikasi variabel dalam argumen itu sendiri. Bagus!
Luke
1
@ Lukas Ini hanyalah penggunaan rumit dari parameter default : jika Anda memanggil fungsi dengan argumen kedua, qakan ditetapkan ke nilai itu sebagai gantinya.
ETHproduksi
Sebenarnya saya maksudkan operator spread yang (dalam hal ini) mengubahnya menjadi array segera.
Luke
Oh oke. Ya, penugasan
penataan
Pintar menggunakan mutasi .sort()untuk secara implisit mengurutkan reversecek
Cyoce
7

MATL , 7 byte

dZSuz2<

Cobalah online! Atau verifikasi semua kasus uji .

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
sumber
Ini mengembalikan true untuk semua kasus yang tidak valid
Patrick Bard
1
@ PatrickBard Seperti petunjuknya, tidak ada yang perlu ditangani.
Suever
6

Clojure, 47 byte

#(let[c(map int %)a apply](or(a <= c)(a >= c)))
NikoNyrh
sumber
Tidak dapat mengetahui cara memutuskan operator mana yang akan diterapkan secara ringkas. Ini bagus.
Carcigenicate
Tunggu, Anda bisa memasukkan nama fungsi builtin ke dalam variabel di Clojure? Huh, itu keren. Itu membuat <=dan >=terlihat infix, yang benar-benar aneh.
clismique
(let[+ *](+ 2 3))= 6: D Ia berfungsi pada fungsi apa pun tetapi tampaknya tidak pada makro: "Tidak dapat mengambil nilai makro"
NikoNyrh
6

C (gcc) , 70 byte

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

Saya berharap untuk menemukan solusi yang lebih pendek berdasarkan pada fungsi rekursif, tetapi tidak berhasil karena persyaratan output. Jadi, inilah pendekatan yang sangat penting. Setidaknya, prioritas operator C bekerja dengan baik untuk pernyataan loop dalam.

Cobalah online!

nwellnhof
sumber
6

R, 48 50 61 byte

Sebagai fungsi yang tidak disebutkan namanya

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

Terima kasih kepada @ guiseppe untuk beberapa byte tambahan.

charToRawmengambil sdan membelah menjadi vektor mentah. Ini dikonversi menjadi bilangan bulat dan diffditerapkan. signmembuat diffs menjadi satu unit. rangemengurangi vektor ke minimum dan maksimum. Kemudian jika standar deviasi sdkurang dari 1 itu BENAR

Cobalah online!

MickyT
sumber
Anda dapat menyimpan 9 byte menggunakan function(s,d=utf8ToInt(s))all(d==sort(d))ataufunction(s,d=utf8ToInt(s))!is.unsorted(d)
saluran
Atau turun ke 34 byte dengan!is.unsorted(utf8ToInt(scan(,'')))
mnel
@mnel sayangnya ini tidak menangani reverse sort eg cbadan yang terakhir akan membutuhkan cat()untuk membuatnya menjadi program penuh
MickyT
Simpan 5 byte dengan function(s)all(!diff(order(utf8ToInt(s)),,2))(bekerja dengan sortir terbalik juga!)
mnel
@mnel minta maaf lagi, itu gagal untuktree
MickyT
5

MATL, 8 byte

tPvGSXma

Cobalah secara Online!

Penjelasan

        % 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
sumber
Bagus, tetapi hasilnya benar untuk '\n'dan 'Hello': /
Patrick Bard
1
@PatrickBard Masukan akan sama halnya dan hanya akan [A-Za-z]seperti yang dinyatakan dalam posting awal. Mereka berada di bagian "tidak valid" karena mereka secara eksplisit tidak perlu ditangani.
Suever
5

Jelly , 4 5 byte

Ṣm0ẇ@

Cobalah online!

Awalnya adalah Ṣm0wempat byte.

Penjelasan

Ṣ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
mil
sumber
Saya yakin ada empat byter, tetapi tidak bisa memikirkannya!
Jonathan Allan
1
... sayangnya OP telah mengklarifikasi keluaran tidak benar / salah, tetapi dua nilai berbeda. Empat byte masih mungkin dengan , saya percaya. Edit: ugh Ṣm0ẇ@.
Jonathan Allan
@ JonathanAllan Malang karena tidak memenuhi aturan asli menggunakan gaya bahasa yang benar / salah. Bentuk lain mungkin Ṣẇm0$. Jika urutan argumennya tidak berbeda untuk wdan ...
mil
Bagus, tetapi mengembalikan nilai benar pada nilai yang tidak valid
Patrick Bard
@ PatrickBard Hah? '\n'dan 'Hello'merupakan nilai yang benar-benar valid.
Erik the Outgolfer
5

Mathematica, 33 byte

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

Berdasarkan tip ini . Sayangnya, saya harus menggunakan ToCharacterCodebukan Characters, karena <=dan >=tidak membandingkan string.

Martin Ender
sumber
4

PowerShell , 61 byte

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

Cobalah online!

Mengambil input $a, lalu memeriksa apakah -inarray dua elemen. Array dibentuk dengan mengambil $a, charmenuangnya sebagai -array, menyimpannya $buntuk nanti, menyalurkannya ke sort-objectjenis yang secara leksikal. Elemen lainnya $bdiurutkan dalam -desurutan cending.

AdmBorkBork
sumber
4

Perl , 35 byte

Disimpan 4 byte berkat @Xcali secara langsung, dan 4 lainnya secara tidak langsung.

31 byte kode + -pFbendera.

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

Cobalah online!

Kode mengurutkan input, dan memeriksa apakah input cocok dengan dirinya sendiri diurutkan (atau dalam urutan terbalik).

Dada
sumber
Metode yang sedikit berbeda, tetapi memotongnya menjadi 38 byte: Cobalah online!
Xcali
@ Xali Sangat bagus, terima kasih. Kita kemudian dapat menyingkirkan $"=$,dan menggunakan /xpengubah untuk menghemat 5 byte lebih.
Dada
3

Jelly , 5 byte

,Ue@Ṣ

Cobalah online!

Bagaimana?

,Ue@Ṣ - Main link: string
,     - pair string with
 U    - reverse(string)
    Ṣ - sorted(string)
  e@  - exists in with reversed arguments
Jonathan Allan
sumber
3

Bash + coreutils, 59 byte

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

String input dilewatkan sebagai argumen.

Output dikembalikan dalam kode keluar (0 untuk truey, 1 untuk falsy, seperti biasa), sebagaimana diizinkan oleh metode I / O PPCG .

Mitchell Spector
sumber
3

PHP, 66 byte

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

mengambil input dari argumen baris perintah. Jalankan dengan -r.

Titus
sumber
3

Ruby , 44 byte

->s{[s,s.reverse].include?s.chars.sort.join}

Cobalah online!

Ara
sumber
3

Racket , 93 byte

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

Cobalah online!

Tidak Disatukan:

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

Menggunakan semacam itu kemudian dibandingkan dengan pendekatan asli

Rodrigo Ruiz Murguía
sumber
3

Brachylog , 5 byte

Saya sudah mencoba mencari solusi 4 byte tanpa hasil, jadi untuk sekarang inilah solusi 5 byte paling menarik yang saya temukan:

:No₎?

Cobalah online!

o, fungsi pemesanan, dapat mengambil parameter: 0berarti urutan naik, 1berarti urutan menurun. Kami menetapkan parameter itu ke variabel tidak terikat N. Brachylog akan mencoba nilai yang berbeda untuk N(hanya 0atau 1yang mungkin), mencoba menyatukan hasilnya dengan input, dan mengembalikan apakah salah satu dari percobaan tersebut berhasil.

Leo
sumber
Tampaknya tidak lagi berfungsi :( o?|o₁?bekerja untuk byte ekstra tho
hakr14
Tampaknya bekerja jika Anda mengganti titik dua dengan titik koma. Varian satu-byte-lagi adalah o{|↔}?.
String yang tidak terkait
2

MATLAB / Oktaf, 38 byte

@(x)any(all([x;flip(x)]'==sort(x)',1))

Demo online

Suever
sumber
2

JavaScript (ES6) 74 62 50 47 43 byte

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

Setelah beberapa golf dan perbaikan bug, jawaban ini akhirnya hampir sama dengan ETHProduction, jadi silakan periksa jawabannya dan berikan a +1.

Luke
sumber
Memperbaiki bug ..
Luke
1
Anda menangkap saya, saya mengirim komentar sebelum mengedit ...
Luke
Saya menemukan penyebab bug, dan sekarang saya memperbaikinya dengan mengatur semuanya dengan cerdik ...
Luke
Bug kembali ... repl.it/FZrs/2
steenbergh
1
Baiklah, ini jawaban yang cukup banyak @ ETHProduction sekarang, jadi saya menambahkan pemberitahuan. Mohon +1jawabannya.
Luke
2

Haskell, 54 50 byte

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

Contoh penggunaan: t "defggh"-> True. Cobalah online! .

Mungkin menggunakan sortlike semoga jawaban lain lebih pendek walaupun membutuhkan import Data.List. Berikut pendekatan yang berbeda:

Untuk setiap fungsi fdari [(=<<),(<*>)], hitung and(zipWith(<=)`f`tail$a)dan minta hasil apa saja True. Fungsinya adalah

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

yang keduanya melakukan perbandingan elemen tetangga dari daftar input adengan <=, tetapi satu dengan argumen terbalik menghasilkan a >=. andmemeriksa apakah semua perbandingannya adalah True.

nimi
sumber
2

Pushy , 7 byte

ogoGo|#

Cobalah online!

Penjelasan:

      \ 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
sumber
Ini tidak mengembalikan satu nilai benar yang berbeda.
steenbergh
1
@steenbergh Tidak, tetapi memenuhi konsensus meta kami tentang apa yang dianggap sebagai kebenaran atau kepalsuan - 1dan 2berada Truedi Pushy, padahal 0itu False.
FlipTack
Jika Pushy memiliki operator ATAU bitwise, itu seharusnya bekerja.
ETHproduksi
@FlipTack Saya pikir ini jelas dalam tantangan, tapi saya sekarang membuatnya lebih spesifik: TRUE harus menampilkan nilai yang sama pada semua testcases. Sama berlaku untuk SALAH.
steenbergh
@steenbergh Konsensus meta ada karena suatu alasan dan masuk akal, tetapi jika Anda bersikeras ...
FlipTack
2

Pyth, 5 byte

}Q_BS

Suatu program yang mengambil input dari "quoted string"dan mencetak Trueatau yang Falsesesuai.

Suite uji

Bagaimana itu bekerja

}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
sumber
Anda dapat menyimpan byte (dan menjadi jawaban terpendek) dengan mengganti }Qdengan /yang menggunakan implisit Q.
isaacg
2

GNU sed, 97 +1 (r flag) = 98 byte

Jika surat dipesan, skrip kembali 1, jika tidak 0. Selain itu tidak ada tipe data.

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

Untuk memeriksa apakah semua huruf disusun dalam urutan menaik, saya melakukan pencarian tabel dari setiap pasangan huruf berturut-turut dalam alfabet menurun, yaitu saya mencoba menemukan contoh penghitung. Perhatikan bahwa //sebenarnya mengulangi pertandingan ekspresi reguler terakhir! (lihat baris 2 dan 3)

Jalankan contoh: skrip dapat menguji beberapa kata input, satu per baris

me@LCARS:/PPCG$ echo -e "tree\nABCDC" | sed -rf word_ordered.sed
1
0
seshoumara
sumber
2

CJam , 12 11 byte

q_$_W%+\#)g

Cobalah online!

Penjelasan

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)
Kucing Bisnis
sumber
2

8086 kode mesin, 68 61 48 46 45 39 byte

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

Dirakit dari:

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
pengguna5434231
sumber
2

Scala, 47 byte

def f(x:String)=x==x.sorted|x==x.sorted.reverse
Aria Ax
sumber