Tulis fungsi / program yang menerima string huruf kecil / besar [A-Za-z] sebagai input, yang memeriksa apakah huruf yang muncul adalah unik dan dalam urutan abjad (mengabaikan huruf kecil dan besar) atau tidak. Outputnya harus benar jika mereka unik dan dalam urutan abjad dan palsu jika tidak.
Ini beberapa testcases
a true
abcdefGHIjklmnopqrSTUVWXyz true
aa false
puz true
puzz false
puzZ false
puZ true
PuZ true
pzu false
pzU false
abcdABCD false
dcba false
Jika Anda mau, jalankan program Anda pada semua kata dari daftar kata seperti ini dan posting beberapa yang menarik =).
Skor
Jumlah byte terendah menang.
za
nilai kebenaran?a
dan diakhiri denganz
.Jawaban:
CJam, 8 byte
Berikut ini adalah test harness untuk semua contoh dalam tantangan. Ini mengembalikan
0
atau1
(yang masing-masing palsu dan jujur, dalam CJam).Dan inilah skrip untuk memfilter daftar kata dalam pertanyaan (perlu beberapa detik untuk dijalankan). Anda harus menyalin daftar kata ke dalam kolom input secara manual, karena terlalu panjang untuk permalink.
Penjelasan
sumber
Regex (rasa apa saja), 55 byte
Beberapa orang tidak menganggap regex sebagai bahasa pemrograman, tetapi sudah pernah digunakan sebelumnya, dan itu tidak dekat dengan yang terpendek.
Saya telah menambahkan satu byte untuk
i
flag (case-insensitive). Ini sangat mudah dan mungkin lebih pendek untuk dihasilkan dengan cepat.Jika regex saja tidak diperbolehkan, Anda dapat menggunakan program Retina 56-byte yang disarankan oleh Martin Büttner:
Menjalankan ini pada daftar kata yang ditautkan di atas menghasilkan 10 kata 6 huruf dalam urutan abjad.
sumber
i`^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$
Python 3, 44 byte
Pendekatan sederhana - periksa keunikan, periksa penyortiran.
sumber
*s,=...
?s=list(input().lower())
.x,*y = [1, 2, 3, 4]
, yang menetapkan 1 kex
dan[2, 3, 4]
key
.*s,=
adalahlist(s)
... tautan{*s}
alih - alihset(s)
menghemat 2 byte.> <> ,
524239 byteJenis pertanyaan ini adalah salah satu dari beberapa jenis yang> <> cukup nyaman digunakan, karena kita hanya perlu berurusan dengan satu karakter pada satu waktu.
Penjelasan
Jangan sampai tersesat! Ada banyak pembungkus di sini.
Solusi sebelumnya, 42 byte
Yang menarik adalah bahwa, meskipun tampaknya memiliki fungsi yang sama, alternatifnya
(Perubahan ada di panah dan cermin di paling kanan)
sebenarnya memberikan hasil yang salah , karena interpreter> <> menggunakan Python defaultdict. Apa yang terjadi adalah, dengan menelusuri ruang kosong di akhir baris kedua, 0s secara implisit ditempatkan ke dalam ruang kosong ketika> <> mencoba mengakses sel. Ini kemudian mengacaukan
?
trampolin kondisional pada awal baris yang sama, karena 0s yang baru ditempatkan dilewati daripadav
di akhir.sumber
Haskell, 52 Bytes
Penggunaan:
(and.(zipWith(>)=<<tail).map toLower) "abcd"
output manaTrue
.sumber
C,
67 65 5754 (52) karaktersedikit lebih pendek:
dan bahkan lebih pendek:
Inilah sedikit tes: http://ideone.com/ZHd0xl
Setelah saran terbaru di sini masih ada dua versi yang lebih pendek:
Kode ini juga bergantung pada fakta, bahwa dalam ASCII huruf kecil dan besar hanya berbeda dengan bit ke-5 (32) yang saya filter. Jadi ini mungkin tidak bekerja dengan pengkodean lainnya.
EDIT: Versi terbaru selalu menetapkan bit ke-5
|32
lebih pendek dari&~32
.sumber
for(;(*s&=95)>d;d=*s++);
. Dan Anda dapat menginisialisasid
ke1
tanpa mengubah hasilnya, menyimpan 1. Lihat.d;f(char*s){d=32;for...}
berfungsi, menyatakand
secara implisit sebagai int global (yang, dalam GCC, merupakan peringatan— "definisi data tidak memiliki tipe atau kelas penyimpanan" - tetapi tidak ada kesalahan). Ini menghemat dua byte.d
dalamfor
loop daripada pernyataannya sendiri? Dengan begitu Anda menghemat;
.Ruby, 33
Cek untuk melihat apakah karakter unik yang diurutkan sama dengan semua karakter.
sumber
c==c.sort|c
Javascript (ES5), 101
Ditingkatkan menjadi 87 oleh edc95:
komentarnya :)
Btw, kasus uji saat ini di OP terpenuhi jika program hanya memeriksa keunikan, mengabaikan pesanan.
Saya belum bisa menulis komentar, jadi saya akan menjawab beberapa komentar di sini:
@ edc65: Terima kasih! Saya mencoba menulis ulang menggunakan
some()
, tetapi saya tidak bisa mendapatkan solusi yang lebih pendek, karena meskipun sepertinya itu akan memungkinkan saya untuk menyingkirkan variabel b superflous, Anda perlu mengetik "kembali" dua kali (sama denganreduce()
), dan Anda tidak bisa hanya mengembalikan hasil perbandingan secara langsung, karena karakter terakhir harus disimpan setelah perbandingan dengannya.@ edc65: Itu penggunaan yang bagus dari operator koma untuk 87! Saya mengeditnya di jawaban saya untuk visibilitas lebih.
sumber
return
dan!b
untuk menyimpan char.function i(s){b=0;l='';s.toUpperCase().split('').forEach(function(c){if(c<=l)b=1;l=c});return!b}
function i(s){s.toUpperCase(b=0).split(l='').forEach(function(c){if(c<=l)b=1;l=c});return!b}
function i(s){return!s.toUpperCase().split(l='').some(function(c){return(u=l,l=c)<=u})}
Haskell, 90 byte
Persediaan fungsi
f :: String -> Bool
Penggunaan (dengan asumsi itu disimpan sebagai golf.hs).
...
digunakan untuk menggantighci
pesan pemuatan verbose.Jika seseorang memiliki
lowercase
metode yang lebih pendek daripadaimport Distribution.Simple.Utils
itu, silakan berkomentar.sumber
map toLower
dariData.Char
alih-alihlowercase
l
dif
, yaituf=g.lowercase
(atauf=g.map toLower
jika Anda beralih ketoLower
). Dalamg
satu perbandingan cukup:g l=nub(sort l)==l
.Wolfram Mathematica,
4937 byteSolusi PS Shorter oleh Martin Büttner:
sumber
#⋃#==#&@*Characters@*ToLowerCase
J, 17 byte
Periksa apakah
/:~
string yang diurutkan huruf kecil sama-:
dengan~.
string nub kecil .Seperti pada J, panjang 1-karakter "string" yang direpresentasikan sebagai string biasa (dengan tanda kutip) hanyalah atom karakter, bukan string nyata. Saya memformat input dengan tepat sehingga semua input akan menjadi string nyata. (Dalam contoh di atas saya gunakan
1$'a'
.)sumber
MATLAB,
2927 byteSekarang untuk satu-liner yang bahkan masuk akal di luar kode-golf.
Sebagai fungsi anonim (gunakan sebagai
o('yourstring')
)Saya kira fungsi ini cukup jelas karena berbunyi seperti iklan surat kabar.
Versi sebelumnya (29 byte):
Input harus disajikan di antara'
tanda, mis'Potato'
.sumber
Brachylog , 3 byte
Cobalah online!
Predikat berhasil jika input memenuhi persyaratan yang diuraikan dan gagal jika tidak, pencetakan
true.
ataufalse.
jika dijalankan sebagai suatu program.Versi pertama yang saya buat, tidak secara eksplisit merujuk alfabet:
Brachylog , 4 byte
Cobalah online!
sumber
J, 21 karakter
Ini terlalu lama. Argumen harus memiliki peringkat
1
, yaitu harus berupa string atau vektor.tolower y
-y
dalam huruf kecil./:~ y
-y
dalam urutan leksikal.~. y
- intiy
, yaitu,y
dengan duplikat dihapus.x ; y
-x
dany
dimasukkan ke dalam kotak dan kemudian digabungkan.< y
-y
dimasukkan ke dalam kotak.x = y
-x
Dibandingkan dengan elemen-bijaksanay
.(< y) = (~. y) ; (/:~ y)
- vektor yang menunjukkan apakahy
sama dengan nubnya dan diurutkan sendiri.*/ y
- produk dari itemy
, atau logis dan jika item tersebut adalah boolean.*/ (< y) = (~. y) ; (/:~ y)
- boolean yang menunjukkan properti yang diinginkan untuk huruf kecily
.sumber
Julia, 44 byte
Ini menciptakan fungsi anonim yang mengambil argumen tunggal
s
, mengubahnya menjadi huruf kecil, dan membandingkannya dengan versi unik dari string. Ia mengembalikan boolean, yaitutrue
ataufalse
. Jika Anda ingin mengujinya, tetapkan sepertif=s->...
lalu panggilf("PuZ")
, dll.sumber
Pure Bash 4.x, 37
Input diambil sebagai parameter baris perintah. Sesuai standar semantik shell, kode keluar 0 berarti benar (alfabet) dan kode keluar! = 0 berarti salah (bukan alfabet).
Printf menciptakan regex seperti pada solusi @ hsl . String input diperluas ke huruf kecil dan dibandingkan dengan regex.
Jawaban sebelumnya:
Bash + coreutils, 52
Solusi mudah:
sumber
C # 6, 18 +
8276 = 94 byteMembutuhkan (18 byte):
Kode (76 byte):
C # 6 mendukung lambdas untuk mendefinisikan suatu fungsi, yang berguna untuk bermain golf.
Versi Non-C # 6:
Kode tidak dikunci:
sumber
JavaScript (ES6) 54
Konversikan ke huruf besar, lalu ke array dan urutkan. Jika selama mengurutkan dua elemen berada dalam urutan yang salah atau sama, mengembalikan 0 (salah) yang lain 1 (benar)
Mengedit disingkat thx untuk @Optimizer (tapi masih 2 lebih dari solusi @Tamas diterapkan di ES6:
F=s=>[...s.toUpperCase()].every(c=>(u=l,l=c)>u,l='')
)Uji di Firefox / konsol FireBug
sumber
s=
tampaknya tidak diperlukan ...C (44 byte)
f(char*s){return(*s&=95)?f(s+1)>*s?*s:0:96;}
Uji di sini: http://ideone.com/q1LL3E
Posting ini karena saya belum bisa berkomentar, kalau tidak itu akan menjadi saran untuk meningkatkan jawaban C yang ada karena saya benar-benar mencuri ide case-sensitive dari jawaban C yang ada.
Mengembalikan 0 jika string tidak dipesan, dan nilai bukan nol jika dipesan.
sumber
Golang (65 byte)
Go bukan bahasa yang ramah golf, juga, saya payah di golf ...
Jalankan di sini: http://play.golang.org/p/xXJX8GjDvr
sunting 106-> 102
sunting 102-> 96
sunting 96-> 91
sunting 91-> 87
sunting 87-> 65
Saya mengalahkan versi java, saya bisa berhenti untuk hari ini
sumber
Java 8 -
90898785 karakterIdenya di sini adalah untuk menggunakan fungsi 'mengurangi' yang melacak karakter terakhir dan "menyerah" ketika mendeteksi urutan tidak naik secara ketat.
golf:
ungolfed:
contoh:
keluaran:
sumber
Perl 6, 35 byte
Ini menghasilkan blok yang bisa dipanggil; jika saya hanya bisa berasumsi bahwa
$_
sudah diatur ke kata yang diinginkan, saya bisa menghapus kurung kurawal sekitarnya dan kehilangan dua byte lagi, tetapi mungkin satu-satunya cara yang masuk akal untuk membuat asumsi itu adalah dengan menjalankannya-n
dan memberi makan kata sebagai input standar , yang akan menambahkan dua byte segera kembali.sumber
.uc.comb
tidak mengatur ulang apa pun, jadi jika array huruf besar dan sisir sama dengan array huruf besar dan sisir yang diurutkan , itu berarti ia mulai dalam urutan yang diurutkan.R , 37 byte
Cobalah online!
Posting karena ini sangat berbeda dan lebih pendek dari jawaban R Michal .
Ubah huruf menjadi ASCII dengan codepoint
utf8ToInt
, lalu ambil modulo 32 sehingga huruf bawah dan atas dikonversi ke angka yang sama 1 ... 26. Hitung perbedaan berpasangan, dan periksa apakah semuanya positif.sumber
Perl, 27
@ hsl's regexp membangun secara dinamis.
Kita juga dapat melakukan pencocokan terbalik: mengonversi input menjadi regexp:
PuZ
=>.*p.*u.*z.*
dan kemudian mencocokkan ini dengan serangkaian huruf dalam urutan abjad. Hasil - juga 27 karakter.sumber
k (6 byte)
&
mengembalikan true jika kedua args benar/
memodifikasi&
untuk menerapkan "lebih dari" daftar, seperti lipatan dalam bahasa fungsional>
lebih besar dari':
memodifikasi>
untuk menerapkan "setiap-sebelumnya", jadi mengembalikan vektor boolean yang menyatakan elemen mana yang lebih besar dari pendahulunya_
menjadikannya argumen huruf kecil(
0b
berarti boolean false)q (13 byte)
q hanya gula sintaksis pada k.
all
didefinisikan sebagai&/
, dan lebih rendah adalah_
sumber
Python, 50 byte
Coba online di sini: http://repl.it/c5Y/2
sumber
VBA (161 byte)
Membandingkan nilai ascii dengan huruf sebelumnya dalam huruf kecil, menghasilkan 0 (salah) ketika nilainya lebih kecil / sama dan keluar dari fungsi
sumber
Python 2 , 43 byte
Cobalah online!
Letakkan
<
simbol di antara semua huruf (dikonversi ke huruf kecil), lalueval
s. Operator perbandingan dirantai Python sangat senang mengevaluasi semuanya sebagai satu ekspresi boolean besar.sumber
Erlang, 51
Menggunakan set yang dipesan (analog dengan
java.util.TreeSet
) untuk mengurutkan karakter dan membuang duplikat. Daftar baru kemudian dibandingkan dengan string input.Fungsi tes:
sumber
Jawa, 96
Cukup mudah di sini. Konversikan semua menjadi lebih rendah dan bandingkan masing-masing dengan karakter sebelumnya.
sumber