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

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]

{¹å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


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]

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.

10

JavaScript (ES6), 43 byte

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

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


6

Clojure, 47 byte

#(let[c(map int %)a apply](or(a <= c)(a >= c)))

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!


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!


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

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

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.


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.


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


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

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 .


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.



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


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.


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

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.


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.


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

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

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

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)

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

2

Scala, 47 byte

def f(x:String)=x==x.sorted|x==x.sorted.reverse
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.