Pemeriksa isogram

13

Tantangan:

Diberi kata, periksa apakah isogram atau tidak.


Apa :

Isogram adalah kata yang hanya terdiri dari huruf-huruf tanpa duplikat (case-sensitive). String kosong adalah isogram.


Contoh:

"Dermatoglyphics"     ---> true
"ab"                  ---> true
"aba"                 ---> false
"moOse"               ---> false
"abc1"                ---> false
""                    ---> true

Memasukkan :

Anda dapat menerima input dalam format apa pun yang masuk akal

Input hanya akan berisi huruf dan / atau angka, tanpa spasi ( [a-zA-Z0-9])


Keluaran:

  • true atau nilai kebenaran apa pun jika inputnya isogram
  • false atau nilai falsy sebaliknya

Ini adalah sehingga kode terpendek dalam byte menang di setiap bahasa.

Muhammad Salman
sumber
3
sad2
Case
1
Definisi isogram Anda mencakup dua pernyataan kontradiktif yang berbeda. Yang mana itu?
Posting Rock Garf Hunter
9
Saya akan merekomendasikan agar Anda mulai menggunakan kotak pasir sehingga masalah ini dapat ditangkap sebelum memposting tantangan.
fəˈnɛtɪk
3
@MuhammadSalman Ini sangat ceroboh, harap hapus ". Any" dari akhir kutipan Anda dan berikan beberapa contoh lagi ( sad2dasakan gagal bahkan tanpa 2jadi tidak menunjukkan apa-apa).
Asone Tuhid
4
"Apa" dan "Catatan" tampaknya saling bertentangan: "Terapkan fungsi yang menentukan apakah string yang hanya berisi huruf adalah isogram" (penekanan ditambahkan) dan "Mungkin ada angka dan yang akan dan harus mengembalikan false" mengatakan hal-hal yang berlawanan. Saya telah memilih untuk menutup sebagai tidak jelas untuk saat ini, tetapi dengan senang hati akan menariknya kembali setelah itu jelas!
Giuseppe

Jawaban:

9

Python 2/ 3 36 52 48 bytes

lambda s:len(s)==len({*s.lower()}-{*str(56**7)})

Cobalah online!

Saya memanfaatkan fakta yang sethanya mengandung elemen unik. Dengan memohon __len__metode masing-masing, saya dapat menentukan apakah sjuga hanya berisi elemen unik (mengabaikan kasus).

EDIT: Diperbarui untuk memenuhi persyaratan yang sebelumnya diabaikan untuk mengembalikan False untuk input numerik. Himpunan semua digit dikodekan sebagai set(str(56**7)).

EDIT 2: Mengikuti saran pengguna ini , saya sekarang mengambil keuntungan dari membongkar argumen untuk mengatur pemahaman. Ini secara resmi merusak kompatibilitas dengan Python 2.

Scott Norton
sumber
3
selamat datang di PPCG! Ini juga seharusnya kembali falseketika sberisi karakter digit.
Giuseppe
menggunakan `56**7`(seperti pada jawaban python lainnya) alih-alih str()lebih pendek? Saya tidak terbiasa dengan python tetapi tampaknya itulah perbedaan utama antara dua jawaban Anda.
Giuseppe
@Giuseppe python3 tidak punya ``, versi hanya python2 akan menghemat 4 byte (3 pada +1 ini pada divisi bukannya sama)
Rod
@Rod benar sekali. Lucunya, 56**7itu terinspirasi oleh pengkodean Anda sendiri angka 0-9 di bawah ini, tetapi simpan pada Anda dengan 1 byte.
Scott Norton
Mungkin Anda bisa menambahkan versi Python 2? 46 Bytes:lambda s:len(s)==len(set(s.lower())-{`56**7`})
Sunny Patel
5

05AB1E , 5 byte

lDáÙQ

Cobalah online!

Penjelasan

l        # convert input to lower-case
 D       # duplicate
  á      # keep only letters
   Ù      # remove duplicates
    Q     # compare for equality
Emigna
sumber
4

R , 41 byte

!grepl("(.).*\\1|\\d",tolower(scan(,"")))

Cobalah online!

Pendekatan regex. !grepl(regex,scan(,""),F)tidak berfungsi jadi saya kira menangkap tidak cocok dengan huruf besar-kecil di R? Saya buruk di regex secara umum, jadi saya tidak akan terkejut jika saya salah melakukannya ...

R , 58 byte

!anyDuplicated(c(el(strsplit(tolower(scan(,"")),"")),0:9))

Cobalah online!

Tambahkan digit 0:9ke daftar karakter dan tes (lebih kecil) jika ada duplikat.

Giuseppe
sumber
3

Ruby , 25 23 21 byte

-2 byte pada keduanya berkat Giuseppe

->s{/(.).*\1|\d/i!~s}

Cobalah online!


-2 byte terima kasih kepada Kirill L.

Ruby -n , 21 19 18 16 byte

p !/(.).*\1|\d/i

Cobalah online!

Asone Tuhid
sumber
@ Giuseppe Saya tidak berpikir itu akan berhasil, terima kasih
Asone Tuhid
1
Saya pikir, dalam versi kedua, Anda bahkan tidak perlu $_- hanya melempar regex tanpa hal lain secara implisit cocok dengan $_: 16 byte
Kirill L.
@ KirillL. terima kasih, saya tidak pernah melihat !/.../sebelumnya, bahkan tidak dapat menemukannya di ruby-doc.org
Asone Tuhid
Tidak mengherankan, saya juga belajar tentang hal itu di sini setelah mendapat saran dari beberapa orang Perl :)
Kirill L.
@ KirillL. tidak mengherankan juga, keanehan ruby ​​umumnya diwarisi dari perl
Asone Tuhid
3

Brachylog , 4 byte

ḷo⊆Ạ

Cobalah online!

Predikat akan berhasil jika input isogram dan gagal jika tidak, menghasilkan alfabet Latin huruf kecil jika berhasil. Karena predikat bawaan Brachylog tidak persis cocok dengan hubungan biasa antara subset dan superset, saya harus menghabiskan satu byte untuk menyortir input yang lebih rendah, tetapi menyimpan satu byte karena tidak harus secara eksplisit memeriksa duplikat di dalamnya. (Jika tidak perlu gagal dengan angka, kita bisa menggunakan ḷ≠.)

String yang tidak terkait
sumber
2

Sekam , 6 byte

§=f√ü_

Cobalah online!

Penjelasan

§=f√ü_  -- takes a string as argument, eg: "sAad2"
§       -- fork the argument..
  f√    -- | filter out non-letters: "sad"
    ü_  -- | deduplicate by lower-case: "sAd2"
 =      -- ..and compare: 0
ბიმო
sumber
2

Japt , 12 byte

;v
oC ‰ eUq

Penjelasan:

;v
;         // Set alternative default vars, where C is the lowercase alphabet
 v        // Make the implicit input lowercase and reassign it
oC ‰ eUq
oC        // Remove all items from the input that are not in the alphabet
   ‰     // Split into chars and select unique array items
      eUq // Check if the result is equal to the input split into chars

Coba di sini.

Nit
sumber
2

MATL , 9 byte

kt2Y2X&X=

Cobalah online!

k   % Lowercase implicit input
t   % Duplicate that
2Y2 % Push lowercase alphabet
X&  % Intersection of alphabet and duplicate lowercase input
X=  % Check for exact equality.
Sanchises
sumber
2

Japt 2.0, 12 11 byte

-1 byte terima kasih kepada Nit

v
f\l â eUq

Uji secara online!

Oliver
sumber
Eh, mengapa Anda mengubah versi ke yang lebih lama? Juga, saya pikir versi terakhir dari Japt adalah 1.4.4 ...
Erik the Outgolfer
@EriktheOutgolfer Yang asli tidak memperhitungkan angka yang secara otomatis kembali salah.
Oliver
Ah, jadi Anda menggunakan versi alfa karena sebenarnya lebih pendek.
Erik the Outgolfer
@EriktheOutgolfer Benar. Regex akan berharga +2 di vanilla Japt. ethproductions.github.io/japt/…
Oliver
1
@Terima kasih! Baik digunakane
Oliver
2

JavaScript (Node.js) , 29 25 byte

s=>!/(.).*\1|\d/i.test(s)

Cobalah online!

Terima kasih atas pembaruan jawaban @BMO , @ l4m2 , @KevinCruijssen

-4 byte terima kasih kepada @KevinCruijssen


sumber
s=>!/(.).*\1|[^a-z]/i.test(s)?
14m2
@KevinCruijssen: Saya tidak melihat versi yang diperbarui
Saya cukup yakin [^a-z]bisa diganti dengan\d
Kevin Cruijssen
@KevinCruijssen: Terima kasih. diperbarui
2

Retina , 16 byte

Ci`(.).*\1|\d
^0

Kembali 1sebagai nilai Kebenaran dan 0sebagai Falsey.
Terima kasih @Neil untuk menemukan dan memperbaiki bug di kode awal saya.

Cobalah online.

Penjelasan:

C             Check if the input matches part of the following regex:
 i`            Case insensitivity enabled
               Check if part of the input matches either:
  (.)           A character `C`
     .*         followed by zero or more characters
       \1       followed by the same character `C` again
         |     Or
          \d    A digit
^0             Invert Truthy/Falsey, basically replacing every 0 with a 1,
               and every other value with a 1
Kevin Cruijssen
sumber
Mengapa Anda berbeda?
Muhammad Salman
@MuhammadSalman Dua alasan: membalik pertandingan akan membutuhkan lebih banyak byte. Dan saya tidak terlalu ahli dengan Retina jadi saya tidak yakin bagaimana untuk membalikkan pertandingan untuk memulai dengan .. xD
Kevin Cruijssen
alasan 1). Ah baiklah. alasan 2). LOL
Muhammad Salman
1

PowerShell , 91 byte

param($b)($a=[char[]]$b.ToUpper()|group|sort c*)[0].Count-eq$a[-1].count-and$b-notmatch'\d'

Cobalah online!

Solusi naif, tapi saya tidak bisa menghasilkan algoritma yang lebih baik. Mengambil input $b, mengonversinya ToUppercase, melemparkannya sebagai char-array. Pipes array Group-Objectyang membangun objek yang memiliki pasangan nama / hitungan untuk setiap huruf input. Kami kemudian sortberdasarkan count dan mengambil yang 0satu daripadanya. Kami memeriksa apakah .Countini asli -eqke.Count[-1] pasangan terakhir . Jika demikian, maka jumlah semuanya sama, jika tidak kita memiliki jumlah huruf yang berbeda.

Kami kemudian -anddengan memeriksa apakah input -notmatchmenentang \duntuk mengesampingkan digit dalam input. Hasil Boolean ditinggalkan di jalur pipa dan hasilnya tersirat.

AdmBorkBork
sumber
1

Python 2 , 57 56 byte

x=input().lower()
print len(set(x)-set(`763**4`))/len(x)

Cobalah online!

Pertama-tama giliran lalu input ke dalam satu set, menghapus duplikat, kemudian menghapus digit (dikodekan dalam `763**4`), lalu periksa apakah panjangnya sama dengan input asli

tongkat
sumber
1

Java 8, 61 39 byte

s->!s.matches("(?i).*((.).*\\2|\\d).*")

Penjelasan:

Cobalah online.

s->  // Method with String parameter and boolean return-type
  !s.matches("(?i).*((.).*\\2|\\d).*")
     //  Return whether the input does not match the regex

Penjelasan regex:

String#matchessecara implisit menambahkan ^...$.

^(?i).*((.).*\2|\d).*$
 (?i)                      Enable case insensitivity
^    .*                    Zero or more leading characters
       (       |  )        Followed by either:
        (.)                 Any character `C`
           .*               with zero or more characters in between
             \2             followed by that same character `C` again
               |           Or:
                \d          Any digit
                   .*$     Followed by zero or more trailing characters
Kevin Cruijssen
sumber
1

APL (Dyalog Unicode) , 12 byte

Fungsi diam-diam anonim.

(∪≡~∘⎕D)819

Cobalah online!

819⌶ huruf kecil

(...)  terapkan fungsi tersembunyi berikut pada itu:

~∘⎕D hapus D igits dari argumen

∪≡ Apakah elemen unik dari argumen itu identik dengan itu?

Adm
sumber
1

Perl 6 , 22 byte

{!(.uc~~/(.).*$0|\d/)}

Cobalah online!

Tidak ada kecocokan untuk beberapa karakter, kemudian karakter yang sama. Fungsi tersirat sebagai blok kode, cocok secara implisit dengan $ _, invert book with !. Ditambahkan|\d (ta Adam) tetapi juga dibutuhkan.uc~~ , yang membutuhkan kurung ...

Alternatif dengan Tas, 23 byte

{.uc.ords.Bag65..97}

Cobalah online!

Kasus yang normal ini kemudian membuat tas (diatur dengan jumlah kejadian). Subset atau sama hanya benar jika semua anggota adalah anggota Tas pembanding, dan semua jumlah insiden kurang dari atau sama dengan yang ada dalam Tas pembanding. Jadi setiap pengulangan atau angka akan membuat perbandingan salah.

Phil H
sumber
Gagal aktif abc1.
Adám
Ah, tulis jawaban ini sebelum spek angka ditambahkan.
Phil H
Bisakah Anda menambahkan |\d?
Adám
@ Adám: Semacam. Menyadari itu juga tidak mendeteksi surat berulang jika kasus surat-surat itu berbeda, sehingga perlu menormalkan kasus dan menambahkan parens juga.
Phil H
1
19 byte
Jo King
1

Swift , 81 byte

let s=readLine()!.lowercased().characters;print(s.count<1||Set(s).count==s.count)

Cobalah online!

Tamás Sengel
sumber
Bagus! 25 byte lebih pendek dari milikku.
onnoweb
1

Visual Basic for Applications (32 bit), 102 byte

s=LCase(InputBox(u)):j=1:For i=1To Len(s):k=Mid(s,i,1):j=j*0^Instr(i+1,s,k)*(k Like"[a-z]"):Next:?j<>0

Menggunakan fakta bahwa di VBA 0^x menghasilkan 1 jika x adalah nol dan 0 sebaliknya. Jalankan di jendela (debug) langsung.

Sunting: seperti yang ditunjukkan oleh Taylor dalam komentar ini hanya berfungsi dalam 32 bit instal MS Office.

dnep
sumber
Jika Anda membatasi bahasa Anda ke Excel VBA, maka Anda dapat menukar ini ke s=LCase([A1]):j=1:For i=1To Len(s):k=Mid(s,i,1):j=j*0^InStr(i+1,s,k)*(k Like"[a-z]"):Next:?j<>0untuk 95 byte dengan mengambil input dari [A1]. Juga, perlu dicatat bahwa karena Eksponen dalam VBA aneh bahwa solusi ini dibatasi untuk instalasi kantor 32 bit.
Taylor Scott
Selain itu, Anda dapat membuat jawaban Anda terlihat lebih baik dan lebih mudah dibaca dengan menggunakan kapitalisasi yang tepat (lihat di atas) dan menambahkan <!-- language-all: lang-vb -->tanda pada jawaban Anda untuk menambahkan penyorotan sintaksis
Taylor Scott
1
@TaylorScott terima kasih! Menambahkan highlight sintaksis dan pembatasan 32 bit. Tentang input Excel, saya lebih suka menyimpan solusi-invarian jika memungkinkan.
dnep
1

05AB1E , 4 byte

lDÔQ

Cobalah online!

Penjelasan

l      # convert input to lowercase
 D     # duplicate and push to stack
  Ô    # uniquify the list of characters
   Q   # check for equality
LordColus
sumber
Ini gagal jika input berisi karakter non-huruf.
Shaggy
Ini berfungsi
LordColus
The input will only contain letters and/or numbers, no spaces ([a-zA-Z0-9])
LordColus
" Isogram adalah kata yang hanya terdiri dari huruf tanpa duplikat " - yaitu, "kata" yang berisi angka harus mengembalikan nilai falsey. Lihat contoh uji ke-5 sebagai contoh.
Shaggy
Salahku. Lihat jawaban @ Enigma untuk kode 05AB1E yang benar.
LordColus
1

C (gcc) , 87 85 83 byte

f(s,p,b,P)char*s,*p;{for(b=s;*s;++s)for(p=b*=*s>64;b&&p<s;b=(*s^*p++)&95?b:0);s=b;}

Cobalah online!

Jonathan Frech
sumber
@ceilingcat Saran yang bagus, terima kasih.
Jonathan Frech
@ceilingcat Terima kasih.
Jonathan Frech
0

CJam , 11 byte

qelA,s+_L|=

Cobalah online!

Penjelasan

Ide dasarnya adalah menambahkan setiap digit kemudian memeriksa duplikat. Karena append memastikan bahwa setiap digit sudah ada satu kali, setiap kehadiran lebih lanjut dari digit akan menjadi duplikat, yang menyebabkannya kembali salah.

q      e# read the input:            | "MOoSE1"
el     e# convert to lowercase:      | "moose1"
A      e# push 10:                   | "moose1" 10
,      e# range [0,N):               | "moose1" [0 1 2 3 4 5 6 7 8 9]
s      e# string representation:     | "moose1" "0123456789"
+      e# concatenate:               | "moose10123456789"
_      e# duplicate:                 | "moose10123456789" "moose10123456789"
L|     e# union with the empty list: | "moose10123456789" "mose1023456789"
       e# (this gets rid of duplicates)
=      e# Equal to original:         | 0
Buah Esolanging
sumber
0

Merah , 76 byte

func[s][a: charset[#"a"-#"z"#"A"-#"Z"]parse s[any[copy c a ahead not to c]]]

Cobalah online!

Galen Ivanov
sumber
0

Smalltalk, 57 byte

Metode yang akan didefinisikan dalam kelas String:

s^(self select:#isLetter)asUppercase asSet size=self size

Ini kemungkinan besar cukup jelas.

Hans-Martin Mosner
sumber
0

Pyth , 17 byte

.Am&!t/rz0d}dGrz0

Suite uji

Penjelasan:
.Am&!t/rz0d}dGrz0 # Code
  m           rz0 # Map the following over the lowercase input:
      /rz0d       #  Count occurrences of d in lowercase input
     t            #   minus 1
    !             #    inverted (0 -> True)
   &              #     and
           }dG    #      d is in the lowercase alphabet
.A                # Print whether all values are truthy
Terjemahan Python 3:
z=input()
print(all(map(lambda d:not z.lower().count(d)-1and d in "abcdefghijklmnopqrstuvwxyz",z.lower())))
hakr14
sumber
0

C #, 82 byte

bool f(string s)=>!!(s.GroupBy(c=>c).Any(c=>c.Count()>1|(!Char.IsLetter(c.Key))));

sunting: tes tambahan untuk char

sunting: menggunakan GroupBy untuk mempersingkatnya dengan 5 byte

Raymond Osterbrink
sumber
1
Selamat datang di PPCG! Saya pikir Anda kehilangan persyaratan bahwa Anda juga perlu memeriksa bahwa input tidak mengandung digit.
Martin Ender
0

APL (Dyalog Unicode) , 25 20 22 byte

'''(.).*\1|\d'S'&'1

Cobalah online!

Mengembalikan 1 untuk true, kalau tidak 0.

Disimpan 5 byte berkat @ H.PWiz

Memperbaiki, dan menyimpan byte lain berkat @ Adám

Bagaimana?

'''(.).*\1|\d'S'&'1  Tacit fn
                    1  Ignore case
               S'&'    Search and return the match(es)
   '(.).*\1|\d'         For this regex
''                     And compare to the empty string
J. Sallé
sumber
Gagal aktif abc1.
Adám
Tidak \w.valid?
Adám
Jika maksud Anda (.).*\1, tidak. Itu juga gagal untuk abc1: /
J. Sallé
Saya tidak mengerti. Apa yang Anda maksud dengan "itu juga gagal"?
Adám
Jika Anda Coba Online! Anda dapat melihatnya mengembalikan 1 untuk abc1, ketika harus mengembalikan 0.
J. Sallé
0

Tcl , 114 byte

proc I w {lmap c [set L [split $w ""]] {if {[regexp -all -nocase $c $w]>1|![string is alp $c]} {return 0}}
expr 1}

Cobalah online!

Tcl , 121 byte

proc I w {lmap c [set L [split $w ""]] {if {[llength [lsearch -al -noc $L $c]]>1|![string is alp $c]} {return 0}}
expr 1}

Cobalah online!

Masih terlalu lama untuk seleraku!

sergiol
sumber