Apakah itu pangram?


42

Tulis fungsi atau program yang mengambil input string dan mencetak nilai kebenaran jika string tersebut adalah pangram (urutan huruf yang mengandung setidaknya satu dari setiap huruf dalam alfabet bahasa Inggris) dan nilai falsey sebaliknya.

Kasus huruf harus diabaikan; Jika string adalah abcdefghijklmnopqrstuvwXYZ, maka fungsi tersebut masih harus mengembalikan nilai yang benar Perhatikan bahwa string dapat berisi karakter lain di dalamnya, sehingga 123abcdefghijklm NOPQRSTUVWXYZ321akan mengembalikan nilai yang sebenarnya. Input kosong harus mengembalikan nilai falsey.


Uji kasus

AbCdEfGhIjKlMnOpQrStUvWxYz

==> True


ACEGIKMOQSUWY
BDFHJLNPRTVXZ

==> True


public static void main(String[] args)

==> False


The quick brown fox jumped over the lazy dogs. BOING BOING BOING

==> True

Ini kode golf. Aturan standar berlaku. Kode terpendek dalam byte menang.


3
Poin plus jika kode Anda dapat memeriksa apakah input adalah Pungram.
timmyRS

4
Permintaan nama pertanyaan: Apakah rubah cokelat cepat melompati anjing malas?

Jawaban:


25

Pyth, 7 byte

L!-Grb0

Penjelasan:

L             lambda (implicit b:)
    rb0       Convert b to lowercase
   G          Lowercase alphabet, "abcd...z"
  -           Set difference, all elts of first that aren't in second
 !            Logical NOT (The empty string is falsey)

Coba program lengkap, versi satu baris di sini .


Saya pikir cara terpendek untuk memperbaiki ini untuk baris baru di input adalah untuk membuat fungsi: L!-Grb0. !-Grs.z0juga akan bekerja tetapi lebih lama.
FryAmTheEggman

Oh, saya tidak melihat pertanyaan diperbarui untuk menyertakan \ n dalam string. Terima kasih.
lirtosiast


@Maltysen Meskipun ada konsensus (lemah) untuk mengizinkan string dari input dibatasi oleh tanda kutip , saya tidak yakin tentang ini karena lebih jauh membutuhkan sintaks string Python.
lirtosiast

Saya tidak akan pernah berpikir alfabet built-in akan berguna ...
Cyoce

16

Perl 6 , 20 byte

'a'..'z'⊆*.lc.comb

pemakaian:

my &code = 'a'..'z'⊆*.lc.comb;
#  the parameter is ^ there

say code '123abcdefghijklm NOPQRSTUVWXYZ321' # True
say code '123abcdefghijklm NOPQRSTUVWXY'     # False

Saya menggunakan versi 3 byte "french" ( ) dari U+2286 SUBSET OF OR EQUAL TOoperator alih-alih versi 4 byte "texas" ( (<=)) yang juga akan membutuhkan ruang tambahan di depannya.


12

GS2, 11 9 byte

☺ 6ΘàB1."

Terima kasih kepada @MitchSchwartz karena bermain golf dengan 2 byte!

Kode sumber menggunakan pengkodean CP437. Cobalah online!

Bagaimana itu bekerja

☺              Push 32 (code point of space).
  6            Bitwise OR.
   Θ           Make a block of these two instructions and map it over the input.
               This turns uppercase letters into their lowercase counterparts.
      à        Push the lowercase alphabet.
       B1      Swap and apply set difference.
         ."    Push the logical NOT of the length of the result.

blok cepat m2( \xe9) menghemat 2 byte.
Mitch Schwartz

@MitchSchwartz Oh, jadi begitulah cara Anda menggunakannya. Terima kasih!
Dennis

11

JavaScript ES6, 51 57

Edit 6 byte, simpan thx @ user81655

a=>new Set(a.toUpperCase().match(/[A-Z]/g)).size>25

Cuplikan tes

F=a=>new Set(a.toUpperCase().match(/[A-Z]/g)).size>25

function update() {  O.innerHTML=F(I.value) }
I.value='qwertyuiopasdfghjklzxcvbnm';update()
input { width: 70% }
<input id=I oninput='update()'>
<pre id=O></pre>


Akan a.replace(/[^A-Z]|[^a-z]/g,'')atau a.replace(/[^A-Z]/gi,'')bekerja?
ev3commander

2
@ ev3commander no. Adan aharus menjadi karakter yang sama, jika tidak himpunan akan membuat mereka berbeda dan ukurannya akan> 26
edc65

Bagaimana jika Anda menggunakan operator spread [...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25?
Scott

@ScottKaye jelas tidak. Cobalah dengan 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
edc65

1
@ user81655 benar, ini berfungsi, bagus. Terima kasih. Saya tidak boleh menjawab komentar saat tertidur
edc65

9

R 50 , 46 39 byte

all(sapply(letters,grepl,readline(),T))

Edit menghilangkan kebutuhan tolowerdengan menambahkan ignore.case=TRUE( T)


Tidak terlalu terbiasa dengan R, tetapi tidakkah seharusnya ignore.case=TRUE (T)dimasukkan dalam hitungan juga?
Ruslan

2
@Ruslan Ini! Ini adalah Tsebagai akhirnya, berkat pencocokan penempatan argumen tidak perlu benar-benar menentukan nama argumen (dan Tmerupakan alias default untuk TRUE). Kode yang ditulis di sini melakukan tindakan yang diperlukan apa adanya, tanpa perlu menambahkan apa pun.
plannapus

9

O, 11 byte

GQ_s{n-}dS=

Cobalah online.

Sayangnya, O tidak membuat perbedaan: /

Penjelasan

G            Pushes the alphabet to the stack
 Q           Pushes input to the stack
  _          Converts the string to lowercase
   s         Split string into char array
    {  }d    Iterate through array
     n       Pushes current element to the stack
      -      String subtraction
         S   Pushes a blank string to the stack
          =  Equals

6

Julia, 38 byte

s->endof(∩('a':'z',lowercase(s)))>25

Ini sederhana - lowercaseberkaitan dengan masalah huruf besar / kecil, 'a':'z'memegang semua huruf kecil, adalah persimpangan, menghilangkan karakter apa pun yang bukan huruf dan, karena yang 'a':'z'didahulukan, hanya akan memiliki satu dari setiap huruf yang muncul di s. endofadalah cara terpendek untuk mendapatkan panjang array yang dihasilkan, dan jika itu 26, maka itu adalah pangram (tidak bisa lebih dari 26, dan >25menyimpan byte relatif ke ==26).


6

Python 2, 53 51 byte

f=lambda s,c=65:c>90or(chr(c)in s.upper())*f(s,c+1)

Solusi alternatif:

lambda s:all(chr(c)in s.upper()for c in range(65,91))

lambda s:not set(range(65,91))-set(map(ord,s.upper()))

Terima kasih kepada xnor karena menunjukkan bahwa set memiliki <=operator, untuk alternatif 51:

lambda s:set(range(65,91))<=set(map(ord,s.upper()))

1
Jika saya tidak salah, ungkapan terakhir adalah sama dengan lambda s:set(range(65,91))<=set(map(ord,s.upper())), juga untuk 51.
xnor

Python 3.5 dapat menyimpan byte di sini: p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}. By the way, saya tidak bisa menemukan aturan tentang apakah lambdaperlu ditugaskan (seperti dalam kasus pertama Anda) atau tidak (seperti yang Anda nanti). Membantu?
Tim Pederick

@TimPederick Memberi nama lambda tidak perlu kecuali Anda harus menggunakan fungsi di tempat lain, seperti pada solusi rekursif pertama.
FryAmTheEggman

@TimPederick Terima kasih telah menunjukkannya. Saya mengganti nama jawaban saya sebagai Python 2 dan bukan hanya Python. Anda memiliki berkah saya untuk memposting itu sebagai jawaban baru jika Anda mau, yang saya pikir akan baik-baik saja oleh norma-norma komunitas meskipun saya tidak yakin.
Mitch Schwartz

@FryAmTheEggman: Terima kasih telah menjelaskan. Perbedaan itu tidak terpikir olehku! Saya juga menemukan posting meta yang menjelaskan aturan. Ada dua byte dari beberapa hal yang saya tulis ...
Tim Pederick

5

Retina , 22 byte

Msi`([a-z])(?!.*\1)
26

Cobalah online.

Baris pertama cocok dengan huruf apa pun yang tidak muncul lagi kemudian dalam string. Itu memastikan bahwa kami tidak mencocokkan setiap huruf paling banyak sekali, tidak peduli seberapa sering itu terjadi. Mode kecocokan akan secara default mengganti string dengan jumlah kecocokan yang ditemukan. Jadi pada tahap kedua, kami mencocokkan 26dengan hasil input pertama, yang akan memberikan salah satu 0atau 1, tergantung pada apakah kami menemukan maksimum 26 pertandingan atau tidak.


4

Minkolang 0,14 , 18 byte

$o7$ZsrlZ'26'$ZN.

Coba di sini.

Penjelasan

$o                    Read in whole input as characters
  7$Z                 Uppercase every letter
     s                Sort
      r               Reverse
       lZ             Alphabet - uppercase and lowercase
         '26'         Pushes 26 on the stack
             0$Z      Count how often the top 26 numbers of the stack appear in the stack
                N.    Output as number and stop.

4

Python 3.5, 47 byte

lambda s:{*map(chr,range(65,91))}<={*s.upper()}

Prinsip yang sama dengan jawaban Mitch Schwartz , tetapi menggunakan perangkat tambahan PEP 0448 untuk *membongkar, pertama kali diperkenalkan dengan Python 3.5.

Versi ini sedikit berbeda dari apa yang saya tulis dalam komentar saya ke posting Mitch, dalam hal saya mengubah angka menjadi huruf daripada sebaliknya. Itu karena itulah bagaimana saya menulis upaya orisinal saya pada solusi, sebelum menemukan bahwa saya tidak bisa bermain golf tanpa Mitch langsung meniru pendekatannya. Jadi pertimbangkan untuk mengubah sedikit sisa orisinalitas saya!


4

Ruby, 41 33

->s{(?a..?z).all?{|c|s[/#{c}/i]}}

Pemakaian

p=->s{(?a..?z).all?{|c|s[/#{c}/i]}}
p["AbCdEfGhIjKlMnOpQrStUvWxYz"] 
  #=> true
p["ACEGIKMOQSUWY
BDFHJLNPRTVXZ"]
  #=> true
p["public static void main(String[] args)"]
  #=> false
p["The quick brown fox jumped over the lazy dogs. BOING BOING BOING"]
  #=> true

Terima kasih kepada Vasu Adari karena telah menyelamatkan saya 8 byte


2
Anda dapat menyimpan 8 byte dengan membuat regex Anda untuk diabaikan.
Vasu Adari

4

R, 53 45 byte

all(97:122%in%utf8ToInt(tolower(readline())))

Versi lama pada 53 byte:

all(letters%in%strsplit(tolower(readline()),"")[[1]])

Pemakaian:

> all(97:122%in%utf8ToInt(tolower(readline())))
The quick brown fox jumps over the lazy dog
[1] TRUE
> all(97:122%in%utf8ToInt(tolower(readline())))
Write a function or program that takes as its input a string and prints a truthy value if the string is a pangram and a falsey value otherwise.
[1] FALSE
> all(97:122%in%utf8ToInt(tolower(readline())))
123abcdefghijklm NOPQRSTUVWXYZ321
[1] TRUE
> all(97:122%in%utf8ToInt(tolower(readline())))
Portez ce vieux whisky au juge blond qui fume
[1] TRUE

4

MATLAB / Oktaf , 35 33 byte

@(x)~nnz(setdiff(65:90,upper(x)))

Cobalah online!


Fungsi anonim mengembalikan 1 logis jika input xadalah pangram, atau 0 logis jika tidak.

Pada dasarnya ia menggunakan pendekatan yang sama dengan solusi Pyth @ ThomasKwa. Perbedaan yang ditetapkan antara semua karakter dalam rentang alfabet huruf besar ( 65:91) dan string input (dikonversi ke huruf besar). Setiap karakter yang ada dalam alfabet tetapi tidak dalam string input dikembalikan oleh setdiff. Hanya jika array yang dikembalikan oleh perbedaan set kosong adalah string sebuah pangram.

Menggunakan huruf besar alih-alih huruf kecil menghemat beberapa byte dibandingkan dengan 'a':'z'karena nilai ASCII dapat digunakan sebagai gantinya untuk membuat rentang.


Jawaban bagus! Milik saya 10 byte lebih lama
Luis Mendo

4

Haskell , 59 56 53 51 byte

p s=and[any(`elem`map toEnum[a,a+32])s|a<-[65..90]]

Cobalah online!

Penjelasan:

Berikan string input s, untuk masing-masing adalam kisaran 65 hingga 90 (kode ASCII untuk Auntuk Z) diperiksa apakah setiap karakter dalam ssama dengan a(karakter huruf besar) atau a+32(karakter huruf kecil), dikonversi ke karakter dengan toEnum. Ini menghasilkan daftar boolean. andmemeriksa apakah semuanya True.

Versi lama:

import Data.Char
p s=and[any((==)a.toUpper)s|a<-['A'..'Z']]

Untuk setiap huruf alfabet huruf besar, periksa apakah beberapa huruf dari shuruf besar sama dengan itu. any(==a)ssama seperti elem a stetapi memungkinkan untuk memodifikasi elemen ssebelum perbandingan - dalam hal ini, terselubung untuk huruf besar.


3

Japt , 14 byte

#ao#{ e@Uv fXd

Cobalah online!

Bagaimana itu bekerja

        // Implicit: U = input string
#ao#{   // Generate a range of integers from charCode("a") to charCode("{").
e@      // Check if every item X in this range returns truthily to:
Uv fXd  //  convert U to lowercase, and put all instances of X.toCharCode() in an array.
        // This returns false if U does not contain one of the characters.
        // Implicit: output last expression

3

CJam, 11 byte

'[,65>qeu-!

Ini adalah program yang lengkap. Cobalah online .

Penjelasan:

'[,65>  Build upper case alphabet (see CJam tips thread).
q       Get input.
eu      Convert to all upper case.
-       Set difference between alphabet and upper cased input.
!       Negate.

3

Javascript, 110 109 99 95 93 byte

a=prompt(b=0).toUpperCase();for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)

Disimpan 6 byte berkat Thomas Kwa, dan 10 terima kasih sebagian untuk ev3.


Apakah b = 0 bekerja untuk b = []?
ev3commander

Tidak dengan pendekatan ini. Tapi saya mungkin bisa membuatnya bekerja.
SuperJedi224

Saya tidak tahu Javascript, tetapi bisakah Anda melakukannya for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)?
lirtosiast

Wow. Itu bahkan lebih pendek dari apa yang baru saja saya lakukan.
SuperJedi224

3

05AB1E , 4 byte (Mungkin Non-bersaing)

lêAå

Cobalah online!

l    # Push lowercase input.
 ê   # Push sorted, uniquified lowercase input.
  A  # Push lowercase alphabet.
   å # Is lowercase alphabet in sorted, uniquified, lowercase input?
     # True if panagram, false if not.

3

2sable , 6 5 byte

Versi 6 byte:

AIl-g_

Cobalah online!

Penjelasan:

A        Push alphabet
 Il      Push lowercase input
   -     Remove all chars of input from alphabet
    g    Get length of the remainder
     _   Print negative bool, where length < 1 = 1 (true), length > 0 = 0 (false)

Versi 5 byte, terinspirasi oleh jawaban 05AB1E carusocomputing :

lÙ{Aå

Cobalah online!

Penjelasan:

l        Push lowercase input
 Ù{      Push sorted uniquified input
   A     Push alphabet
    å    Is alphabet in sorted, uniquified input?


2

TeaScript , 12 byte

Sz.e»xL.I(l©

Posting TeaScript pertama sejak saya membunuh TeaScript: p

Cobalah online

Tidak disatukan

Sz.e(#xL.I(l))

Sz   // Lower case alphabet
.e(#   // Loop through alphabet, ensure
       // for every character, below returns true
    xL    // Input lowercased
    .I(l) // Checks if above contains current char
)

1
; -; Saya merasa buruk sekarang. TBH Saya paling suka TeaScript.
Conor O'Brien

2

JavaScript ES6, 124 114 113 byte

Saya yakin ini bisa bermain golf lebih banyak.

v=(Q,s=[...Array(26)].map((x,i)=>String.fromCharCode(i+97)))=>s.length-1?Q.search(RegExp(s.pop(),"i"))+1&&v(Q,s):1

Menghasilkan fungsi anonim.

v=(Q,s=[...Array(26)].map((x,i)=>String.fromCharCode(i+97)))=>s.length-1?Q.search(RegExp(s.pop(),"i"))+1&&v(Q,s):1

alert(v(prompt("Enter pangram:")));


@apsillers Saya pikir saya menemukan masalah. Silakan uji lagi (browser saya tidak mendukung ES6 atm)
Conor O'Brien

Yap, terlihat bagus sekarang!
apsillers

2

C, 107 byte

#include<string.h>
int p(char*i){int a=64;while(++a<91)if(!strchr(i,a)&!strchr(i,a+32))return 0;return 1;}

2

ES6, 68 byte

s=>[..."abcdefghijklmnopqrstuvwxyz"].every(x=>RegExp(x,"i").test(s))

Tali itu terlihat sangat boros, tapi aku tidak tahu cara yang lebih baik.


Mungkin menggunakan berbagai kode karakter?
Cyoce

@Cyoce Itu membuat saya berpikir dan saya mencoba berbagai basis 36 digit tetapi sejauh ini masih butuh 70 byte:s=>[...Array(x=9,26)].every(z=>RegExp((++x).toString(36),"i").test(s))
Neil

2

Scala, 59 48 46 byte

print(('a'to'z'diff(readLine.map(_|32)))==Nil)

Menggunakan 32 | bukannya _ | 32 akan (menghasilkan peringatan tetapi) mengurangi satu byte lagi
Jacob

2

Bash, 45 42 byte

Program 41 byte, plus 1 karena harus dijalankan dengan bash -e:

for i in {a..z}
{ [ ${1//[^$i${i^}]} ]
}

Hebatnya, saya mengelola jawaban Bash tanpa karakter kutipan! (ya, saya memeriksa dengan input yang dimulai dengan -fdan sejenisnya).

Ini mengasumsikan lokal di mana huruf-huruf bahasa Inggris kecil berdekatan dari ake z. Input melalui argumen pertama ke program.

Cara kerjanya adalah, untuk setiap huruf alfabet $i, kami menguji apakah string berisi $iatau setara huruf besar-nya ${i^}dengan menghapus semua karakter lain. Jika ini menghasilkan string kosong, maka input tidak mengandung huruf itu, dan kami keluar dengan 1(false). Jika kami memiliki hasil yang tidak kosong, maka kami lulus tes dan melanjutkan ke surat berikutnya. Jika string input berisi setiap huruf bahasa Inggris, kami akan mencapai akhir program, sehingga keluar dengan 0(true).


2

Perl 5, 33 byte

$i=<>;map$=*=$i=~/$_/i,a..z;say$=

Untuk perl <5.10 -pl61e '$i=$_;map$\*=$i=~/$_/i,a..z}{'.
Denis Ibaev

2

PlatyPar , 14 byte

'a'z_,X,F(x;l!

Penjelasan (fitur stack visualizer segera hadir!):

               ## Implicit: push the input (as a string) to the stack
'a'z_          ## Push the range of a-z (the alphabet) to the stack
     ,X        ## Invert stack, expand input string into individual characters
       ,       ## Invert again
        F  ;   ## Fold (While stack.length > 1)
         (      ## Rotate left, moving the first letter of the input string to the top
          x     ## remove any occurences of that letter from the alphabet array
            l! ## Negate the length of the array, so if there's nothing left
               ## output true, else output false

Jika saya memiliki fungsi "tekan semua huruf alfabet" konyol ini akan menjadi 10 ...

Cobalah online !


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.