Có phải là một pangram?


42

Viết một hàm hoặc chương trình lấy chuỗi đầu vào của nó và in một giá trị trung thực nếu chuỗi đó là một pangram (một chuỗi các chữ cái chứa ít nhất một trong mỗi chữ cái trong bảng chữ cái tiếng Anh) và một giá trị falsey khác.

Trường hợp của các chữ cái nên được bỏ qua; Nếu chuỗi là abcdefghijklmnopqrstuvwXYZ, thì hàm vẫn trả về giá trị trung thực. Lưu ý rằng chuỗi có thể chứa bất kỳ ký tự nào khác trong chuỗi, do đó 123abcdefghijklm NOPQRSTUVWXYZ321sẽ trả về giá trị trung thực. Một đầu vào trống sẽ trả về một giá trị falsey.


Các trường hợp thử nghiệm

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

Đây là mã golf. Quy tắc tiêu chuẩn áp dụng. Mã ngắn nhất trong byte thắng.


3
Điểm cộng nếu mã của bạn có thể kiểm tra xem đầu vào có phải là Pungram không.
timmyRS

4
Câu hỏi yêu cầu: Con cáo nâu nhanh chóng nhảy qua con chó lười?

Câu trả lời:


25

Bình thường, 7 byte

L!-Grb0

Giải trình:

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)

Hãy thử phiên bản đầy đủ, một chương trình tại đây .


Tôi nghĩ rằng cách ngắn nhất để sửa lỗi này cho dòng mới trong đầu vào là tạo một hàm : L!-Grb0. !-Grs.z0cũng sẽ làm việc nhưng lâu hơn.
FryAmTheEggman

Ồ, tôi không thấy câu hỏi được cập nhật để bao gồm \ n trong chuỗi. Cảm ơn.
lirtosiast


@Maltysen Mặc dù có sự đồng thuận (yếu) về việc cho phép các chuỗi từ đầu vào được phân định bằng dấu ngoặc kép , tôi không chắc chắn về điều này vì nó đi xa hơn trong việc yêu cầu cú pháp chuỗi Python.
lirtosiast

Tôi chưa bao giờ nghĩ rằng một bảng chữ cái tích hợp sẽ hữu ích ...
Cyoce

16

Perl 6 , 20 byte

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

sử dụng:

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

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

Tôi đã sử dụng phiên bản 3 byte "tiếng Pháp" ( ) của U+2286 SUBSET OF OR EQUAL TOtoán tử thay vì phiên bản "texas" 4 byte ( (<=)) cũng sẽ cần thêm một khoảng trống phía trước nó.


12

GS2, 11 9 byte

☺ 6ΘàB1."

Cảm ơn @MitchSchwartz đã chơi golf 2 byte!

Mã nguồn sử dụng mã hóa CP437. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

khối nhanh m2( \xe9) tiết kiệm 2 byte.
Mitch Schwartz

@MitchSchwartz Ồ, vậy đó là cách bạn sử dụng chúng. Cảm ơn!
Dennis

11

JavaScript ES6, 51 57

Chỉnh sửa 6 byte lưu thx @ user81655

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

Kiểm tra đoạn

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>


Sẽ a.replace(/[^A-Z]|[^a-z]/g,'')hay a.replace(/[^A-Z]/gi,'')làm việc?
ev3commander

2
@ ev3commander không. Aaphải trở thành cùng một nhân vật, nếu không, bộ sẽ giữ chúng là khác biệt và kích thước sẽ> 26
edc65

Điều gì nếu bạn sử dụng toán tử lây lan với [...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25?
Scott

@ScottKaye rõ ràng là không. Hãy thử với 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
edc65

1
@ user81655 đúng, nó hoạt động, thật tuyệt. Cảm ơn. Tôi không nên trả lời bình luận trong khi ngủ
edc65

9

R 50 , 46 39 byte

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

Chỉnh sửa giảm nhu cầu tolowerbằng cách thêm ignore.case=TRUE( T)


Không quá quen thuộc với R, nhưng sau đó không nên ignore.case=TRUE (T)được bao gồm trong số đếm?
Ruslan

2
@Ruslan Đó là! Đây là Tkết thúc, nhờ khớp vị trí đối số, không cần thực sự chỉ định tên của đối số (và Tlà bí danh mặc định cho TRUE). Mã được viết ở đây thực hiện các hành động cần thiết như là, mà không cần thêm bất cứ điều gì.
plannapus

9

O, 11 byte

GQ_s{n-}dS=

Hãy thử trực tuyến.

Đáng buồn thay, O không có sự khác biệt: /

Giải trình

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

Điều này rất đơn giản - lowercaseliên quan đến vấn đề chữ hoa / chữ thường, 'a':'z'chứa tất cả các chữ cái viết thường, là giao điểm, loại bỏ bất kỳ ký tự nào không phải là một chữ cái và, vì 'a':'z'trước tiên, sẽ chỉ có một trong mỗi chữ cái xuất hiện s. endoflà cách ngắn nhất để có được độ dài của mảng kết quả và nếu là 26, thì đó là một pangram (nó không thể nhiều hơn 26 và >25tiết kiệm một byte so với ==26).


6

Python 2, 53 51 byte

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

Giải pháp thay thế:

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

Cảm ơn xnor đã chỉ ra rằng các bộ có <=toán tử, thay thế 51:

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

1
Nếu tôi không nhầm, biểu thức cuối cùng cũng giống như lambda s:set(range(65,91))<=set(map(ord,s.upper())), cũng cho 51.
xnor

Python 3.5 có thể lưu byte ở đây : p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}. Nhân tiện, tôi dường như không thể tìm thấy bất kỳ quy tắc nào về việc có lambdacần phải chỉ định (như trong trường hợp đầu tiên của bạn) hay không (như trong các quy tắc sau của bạn). Cứu giúp?
Tim Pederick

@TimPederick Đặt tên lambda là không cần thiết trừ khi bạn cần sử dụng chức năng ở nơi khác, như trong giải pháp đệ quy đầu tiên.
FryAmTheEggman

@TimPederick Cảm ơn bạn đã chỉ ra điều đó. Tôi đã đổi tên câu trả lời của mình thành Python 2 thay vì chỉ Python. Bạn có phước cho tôi khi đăng câu trả lời mới nếu bạn muốn, điều mà tôi nghĩ sẽ ổn theo các quy tắc cộng đồng mặc dù tôi không chắc chắn.
Mitch Schwartz

@FryAmTheEggman: Cảm ơn bạn đã làm rõ. Sự khác biệt đó đã không xảy ra với tôi! Tôi cũng đã tìm thấy một bài viết meta giải thích quy tắc. Có hai byte từ một vài điều tôi đã viết ...
Tim Pederick

5

Võng mạc , 22 byte

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

Hãy thử trực tuyến.

Dòng đầu tiên khớp với bất kỳ chữ cái nào không xuất hiện lại sau đó trong chuỗi. Điều đó đảm bảo rằng chúng tôi không khớp từng chữ cái một lần, bất kể tần suất xảy ra như thế nào. Chế độ đối sánh theo mặc định sẽ thay thế chuỗi bằng số lượng kết quả tìm thấy. Vì vậy, trong giai đoạn thứ hai, chúng tôi khớp 26với kết quả của đầu vào đầu tiên, sẽ cho một 0hoặc 1, tùy thuộc vào việc chúng tôi có tìm thấy tối đa 26 trận đấu hay không.


4

Chồn 0,14 , 18 byte

$o7$ZsrlZ'26'$ZN.

Hãy thử nó ở đây.

Giải trình

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

Nguyên tắc tương tự như câu trả lời của Mitch Schwartz , nhưng sử dụng các cải tiến PEP 0448 để *giải nén, lần đầu tiên được giới thiệu trong Python 3.5.

Phiên bản này khác một chút so với những gì tôi đã viết trong bình luận của mình cho bài viết của Mitch, ở chỗ tôi biến các con số thành chữ cái chứ không phải ngược lại. Đó là bởi vì đó là cách tôi viết những nỗ lực ban đầu của mình vào một giải pháp, trước khi phát hiện ra rằng tôi không thể ra ngoài Mitch mà không sao chép hoàn toàn cách tiếp cận của anh ấy. Vì vậy, hãy xem xét điều chỉnh một trong những nguyên bản còn lại của tôi!


4

Ruby, 41 33

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

Sử dụng

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

Cảm ơn Vasu Adari đã tiết kiệm cho tôi 8 byte


2
Bạn có thể lưu 8 byte bằng cách tạo regex của bạn thành ignorecase.
Vasu Adari

4

R, 53 45 byte

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

Phiên bản cũ ở mức 53 byte:

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

Sử dụng:

> 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 / Octave , 35 33 byte

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

Hãy thử trực tuyến!


Hàm ẩn danh trả về logic 1 nếu đầu vào xlà pangram hoặc logic 0 nếu không.

Về cơ bản, nó sử dụng cách tiếp cận tương tự như giải pháp Pyth của @ ThomasKwa. Sự khác biệt được đặt giữa tất cả các ký tự trong phạm vi bảng chữ cái in hoa ( 65:91) và chuỗi đầu vào (được chuyển đổi thành chữ hoa). Bất kỳ ký tự nào trong bảng chữ cái nhưng không có trong chuỗi đầu vào đều được trả về setdiff. Chỉ khi mảng được trả về bởi sự khác biệt thiết lập là trống thì chuỗi là một pangram.

Sử dụng chữ hoa thay vì chữ thường giúp tiết kiệm một vài byte so với 'a':'z'vì giá trị ASCII có thể được sử dụng thay thế để tạo phạm vi.


Câu trả lời chính xác! Của tôi dài hơn 10 byte
Luis Mendo

4

Haskell , 59 56 53 51 byte

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

Hãy thử trực tuyến!

Giải trình:

Đưa ra một chuỗi đầu vào s, đối với mỗi atrong phạm vi 65-90 (các mã ASCII cho Atới Z) nó sẽ được kiểm tra xem có bất kỳ nhân vật trong sbằng một trong hai a(kiểu chữ phía trên) hoặc a+32(nhân vật chữ thường), chuyển đổi sang một nhân vật bằng toEnum. Điều này tạo ra một danh sách các booleans. andkiểm tra nếu họ tất cả True.

Phiên bản cũ:

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

Đối với mỗi chữ cái viết hoa chữ thường, kiểm tra xem một số chữ cái strong chữ hoa có bằng nó không. any(==a)sgiống như elem a snhưng cho phép sửa đổi các yếu tố strước khi so sánh - trong trường hợp này, chuyển chúng thành chữ hoa.


3

Japt , 14 byte

#ao#{ e@Uv fXd

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

        // 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-!

Đây là một chương trình hoàn chỉnh. Hãy thử trực tuyến .

Giải trình:

'[,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)

Đã lưu 6 byte nhờ Thomas Kwa và 10 phần nhờ vào ev3.


B = 0 sẽ làm việc cho b = []?
ev3commander

Không phải với cách tiếp cận này. Nhưng tôi có thể làm cho công việc đó.
SuperJedi224

Tôi không biết Javascript, nhưng bạn có thể làm được for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)không?
lirtosiast

Ồ Điều đó thậm chí còn ngắn hơn những gì tôi vừa làm.
SuperJedi224


3

2sable , 6 5 byte

Phiên bản 6 byte:

AIl-g_

Hãy thử trực tuyến!

Giải trình:

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)

Phiên bản 5 byte, lấy cảm hứng từ câu trả lời 05AB1E của carusocomputing :

lÙ{Aå

Hãy thử trực tuyến!

Giải trình:

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©

Bài viết TeaScript đầu tiên kể từ khi tôi giết TeaScript: p

Dùng thử trực tuyến

Bị đánh cắp

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
; -; Hiện giờ tôi cảm thấy khó chịu. TBH Tôi thích TeaScript nhất.
Conor O'Brien

2

JavaScript ES6, 124 114 113 byte

Tôi chắc chắn rằng điều này có thể được chơi golf nhiều hơn.

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

Tạo một chức năng ẩn danh.

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 Tôi nghĩ rằng tôi đã tìm thấy vấn đề. Vui lòng kiểm tra lại (trình duyệt của tôi không hỗ trợ ES6 atm)
Conor O'Brien

Đúng, có vẻ tốt bây giờ!
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))

Chuỗi đó trông cực kỳ lãng phí, nhưng tôi không biết cách nào tốt hơn.


Có thể sử dụng một loạt các mã hóa?
Cyoce

@Cyoce Điều đó khiến tôi suy nghĩ và tôi đã thử một phạm vi gồm 36 chữ số cơ bản nhưng cho đến nay nó vẫn mất 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)

Sử dụng 32 | thay vì _ | 32 sẽ (đưa ra cảnh báo nhưng) sẽ tắt thêm một byte
Jacob

2

Bash, 45 42 byte

Chương trình 41 byte, cộng với 1 vì nó phải được gọi bằng bash -e:

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

Thật ngạc nhiên, tôi quản lý một câu trả lời Bash không có ký tự trích dẫn! (vâng, tôi đã kiểm tra với đầu vào bắt đầu bằng -fvà tương tự).

Điều này giả định một miền địa phương nơi các chữ cái tiếng Anh viết thường tiếp giáp từ ađến z. Đầu vào là thông qua đối số đầu tiên cho chương trình.

Cách thức hoạt động này là, đối với mỗi chữ cái chữ cái $i, chúng tôi kiểm tra xem chuỗi có chứa $ihoặc chữ hoa của nó tương đương ${i^}bằng cách loại bỏ tất cả các ký tự khác. Nếu điều này dẫn đến chuỗi trống, thì đầu vào không chứa chữ cái đó và chúng ta thoát bằng 1(false). Nếu chúng tôi có một kết quả không trống, thì chúng tôi đã vượt qua bài kiểm tra và chuyển sang chữ cái tiếp theo. Nếu chuỗi đầu vào chứa mỗi chữ cái tiếng Anh, chúng ta sẽ đến cuối chương trình, do đó thoát bằng 0(true).


2

Perl 5, 33 byte

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

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

2

PlatyPar , 14 byte

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

Giải thích (tính năng stack visualizer sắp ra mắt!):

               ## 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

Nếu tôi có một chức năng "đẩy tất cả các chữ cái trong bảng chữ cái" thì đây sẽ là 10 ...

Hãy thử trực tuyến !


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.