มันเป็น pangram หรือไม่?


42

เขียนฟังก์ชั่นหรือโปรแกรมที่ใช้เป็นสายป้อนและพิมพ์ค่าความจริงถ้าสตริงเป็นpangram (ลำดับของตัวอักษรที่มีอย่างน้อยหนึ่งตัวอักษรแต่ละตัวในตัวอักษรภาษาอังกฤษ) และค่าเท็จ

กรณีตัวอักษรควรละเว้น; หากสตริงเป็นabcdefghijklmnopqrstuvwXYZเช่นนั้นฟังก์ชั่นควรยังคงส่งกลับค่าความจริง โปรดทราบว่าสตริงสามารถมีตัวละครอื่น ๆ ในนั้นดังนั้น123abcdefghijklm NOPQRSTUVWXYZ321จะส่งกลับค่าความจริง อินพุตว่างควรส่งคืนค่าเท็จ


กรณีทดสอบ

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

นี่คือรหัสกอล์ฟ ใช้กฎมาตรฐาน รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


3
บวกคะแนนถ้ารหัสของคุณสามารถตรวจสอบว่าการป้อนข้อมูลเป็น Pungram
timmyRS

4
คำขอคำถามชื่อ: สุนัขจิ้งจอกสีน้ำตาลรีบกระโดดข้ามสุนัขขี้เกียจหรือไม่?

คำตอบ:


25

Pyth, 7 ไบต์

L!-Grb0

คำอธิบาย:

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)

ลองแบบเต็มรูปแบบโปรแกรมรุ่นบรรทัดเดียวที่นี่


L!-Grb0ผมคิดว่าทางที่สั้นที่สุดเพื่อแก้ไขปัญหานี้สำหรับการขึ้นบรรทัดใหม่ในการป้อนข้อมูลที่จะทำให้การทำงาน: !-Grs.z0จะทำงานได้ แต่นานกว่า
FryAmTheEggman

โอ้ฉันไม่เห็นคำถามที่อัปเดตเพื่อรวม \ n ในสตริง ขอบคุณ
lirtosiast


@Maltysen แม้ว่าจะมีฉันทามติ (อ่อน) เกี่ยวกับการอนุญาตให้สตริงจากอินพุตถูกคั่นด้วยเครื่องหมายคำพูดฉันไม่แน่ใจเกี่ยวกับสิ่งนี้
lirtosiast

ฉันไม่เคยคิดเลยว่าตัวอักษรในตัวจะมีประโยชน์ ...
Cyoce

16

Perl 6 , 20 ไบต์

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

การใช้งาน:

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

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

ฉันใช้ตัวดำเนินการรุ่น 3 "" French "( ) ของU+2286 SUBSET OF OR EQUAL TOตัวดำเนินการแทนรุ่น 4 byte" texas "( (<=)) ซึ่งจะต้องมีพื้นที่เพิ่มเติมด้านหน้าด้วย


12

GS2, 11 9 ไบต์

☺ 6ΘàB1."

ขอบคุณ @MitchSchwartz สำหรับการตี 2 ไบต์!

ซอร์สโค้ดใช้การเข้ารหัส CP437 ลองออนไลน์!

มันทำงานอย่างไร

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

บล็อกด่วนm2( \xe9) บันทึก 2 ไบต์
Mitch Schwartz

@MitchSchwartz โอ้นั่นเป็นวิธีที่คุณใช้ ขอบคุณ!
Dennis

11

JavaScript ES6, 51 57

แก้ไข 6 ไบต์บันทึก thx @ user81655

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

ตัวอย่างการทดสอบ

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>


จะa.replace(/[^A-Z]|[^a-z]/g,'')หรือa.replace(/[^A-Z]/gi,'')ทำงาน
ev3commander

2
@ ev3commander ไม่มี Aและaจะต้องกลายเป็นตัวละครเดียวกันมิฉะนั้นชุดจะทำให้พวกเขาแตกต่างกันและขนาดจะ> 26
edc65

ถ้าคุณใช้ตัวดำเนินการสเปรดด้วย[...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25ล่ะ
สกอตต์

@ScottKaye เห็นได้ชัดว่าไม่มี ลองใช้ด้วย 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
edc65

1
@ user81655 ถูกต้องมันใช้งานได้ดี ขอบคุณ ฉันไม่ควรตอบความคิดเห็นในขณะนอนหลับ
edc65

9

R 50 , 46 39 ไบต์

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

แก้ไขการลดความต้องการtolowerโดยการเพิ่มignore.case=TRUE( T)


ไม่คุ้นเคยกับ R มากนัก แต่ไม่ควรignore.case=TRUE (T)รวมอยู่ในการนับด้วย?
Ruslan

2
@ Ruslan มันเป็น! มันคือTจุดสิ้นสุดเนื่องจากการจับคู่การจัดวางอาร์กิวเมนต์ไม่จำเป็นต้องระบุชื่อของอาร์กิวเมนต์ (และTเป็นชื่อแทนเริ่มต้นTRUE) โค้ดที่เขียนที่นี่จะดำเนินการตามที่จำเป็นโดยไม่จำเป็นต้องเพิ่มอะไรเลย
plannapus

9

O, 11 ไบต์

GQ_s{n-}dS=

ลองออนไลน์

น่าเศร้าที่ O ไม่ได้ตั้งค่าต่าง: /

คำอธิบาย

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 ไบต์

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

นี้เป็นเรื่องง่าย - lowercaseข้อเสนอเกี่ยวกับปัญหาตัวพิมพ์ใหญ่ / พิมพ์เล็กที่'a':'z'ถือหุ้นทั้งหมดของอักษรตัวพิมพ์เล็กที่เป็นจุดตัดเอาตัวอักษรใด ๆ ที่ไม่ได้เป็นตัวอักษรและเพราะมาก่อนจะมีเพียงหนึ่งของแต่ละตัวอักษรที่ปรากฏใน'a':'z' เป็นวิธีที่สั้นที่สุดในการรับความยาวของอาเรย์ที่เกิดขึ้นและถ้าเป็น 26 ก็จะเป็นแบบ pangram (ไม่สามารถมากกว่า 26 และบันทึกไบต์ที่สัมพันธ์กับ)sendof>25==26


6

Python 2, 53 51 ไบต์

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

ทางเลือกอื่น:

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

ขอบคุณxnorสำหรับการชี้ให้เห็นว่าชุดนั้นมีตัว<=ดำเนินการสำหรับตัวสำรอง 51:

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

1
ถ้าฉันไม่เข้าใจผิดนิพจน์สุดท้ายก็เหมือนกับlambda s:set(range(65,91))<=set(map(ord,s.upper()))51 เช่นกัน
xnor

งูหลาม 3.5 p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}สามารถบันทึกไบต์ที่นี่: โดยวิธีการที่ฉันดูเหมือนจะไม่พบกฎใด ๆ เกี่ยวกับว่าlambdaจะต้องได้รับมอบหมาย (เช่นในกรณีแรกของคุณ) หรือไม่ (เช่นเดียวกับในภายหลังของคุณ) ช่วยด้วย?
ทิม Pederick

@TimPederick การตั้งชื่อแลมบ์ดานั้นไม่จำเป็นเว้นแต่คุณจะต้องใช้ฟังก์ชั่นที่อื่นเช่นในโซลูชันแบบเรียกซ้ำครั้งแรก
FryAmTheEggman

@TimPederick ขอบคุณที่ชี้ให้เห็น ฉันเปลี่ยนชื่อคำตอบเป็น Python 2 แทนที่จะเป็น Python คุณมีพรของฉันที่จะโพสต์ว่าเป็นคำตอบใหม่ถ้าคุณต้องการซึ่งฉันคิดว่าจะ ok โดยบรรทัดฐานของชุมชนแม้ว่าฉันจะไม่แน่ใจ
Mitch Schwartz

@FryAmTheEggman: ขอบคุณสำหรับการชี้แจง ความแตกต่างนั้นไม่ได้เกิดขึ้นกับฉัน! ฉันยังพบโพสต์เมตาอธิบายกฎ มีสองไบต์ไปจากบางสิ่งที่ฉันได้เขียน ...
ทิม Pederick

5

เรติน่า 22 ไบต์

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

ลองออนไลน์

บรรทัดแรกตรงกับตัวอักษรใด ๆ ที่ไม่ปรากฏขึ้นอีกในภายหลังในสตริง เพื่อให้แน่ใจว่าเราจะไม่จับคู่จดหมายแต่ละฉบับมากที่สุดไม่ว่าจะเกิดบ่อยแค่ไหนก็ตาม โดยค่าเริ่มต้นโหมดการจับคู่จะแทนที่สตริงด้วยจำนวนการจับคู่ที่พบ ดังนั้นในขั้นตอนที่สองเราจับคู่26กับผลลัพธ์ของอินพุตแรกซึ่งจะให้อย่างใดอย่างหนึ่ง0หรือ1ขึ้นอยู่กับว่าเราพบสูงสุด 26 การแข่งขันหรือไม่



4

Python 3.5, 47 ไบต์

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

หลักการเดียวกับคำตอบของ Mitch Schwartzแต่ใช้PEP 0448ปรับปรุงการ*เปิดออกนำเสนอครั้งแรกใน Python 3.5

รุ่นนี้แตกต่างเล็กน้อยจากสิ่งที่ฉันเขียนในความคิดเห็นของฉันไปยังโพสต์ของ Mitch ในที่ฉันเปลี่ยนตัวเลขเป็นตัวอักษรมากกว่าในทางกลับกัน นั่นเป็นเพราะฉันเขียนความพยายามดั้งเดิมของฉันก่อนที่จะค้นพบว่าฉันไม่สามารถออกไปเล่นมิทช์ได้โดยไม่ต้องลอกเลียนแบบวิธีการของเขา ดังนั้นให้คิดว่าปรับแต่งชิ้นส่วนของฉันที่เหลือจากการสร้างสรรค์!


4

ทับทิม, 41 33

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

การใช้

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

ขอบคุณ Vasu Adari ที่ช่วยฉัน 8 ไบต์


2
คุณสามารถบันทึก 8 ไบต์ด้วยการทำให้ regex ของคุณไม่สนใจ
Vasu Adari

4

R, 53 45 ไบต์

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

รุ่นเก่าที่ 53 ไบต์:

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

การใช้งาน:

> 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 ไบต์

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

ลองออนไลน์!


ฟังก์ชันที่ไม่ระบุชื่อส่งคืนโลจิคัล 1 หากอินพุตxเป็น pangram หรือโลจิคัล 0 หากไม่ใช่

โดยพื้นฐานแล้วมันใช้วิธีการเดียวกับโซลูชัน Pyth ของ @ ThomasKwa ความแตกต่างที่ตั้งไว้ระหว่างตัวอักษรทั้งหมดในช่วงตัวอักษรตัวพิมพ์ใหญ่ ( 65:91) และสตริงอินพุต (แปลงเป็นตัวพิมพ์ใหญ่) ตัวละครที่อยู่ในตัวอักษร setdiffแต่ไม่ได้อยู่ในสายป้อนจะถูกส่งกลับโดย เฉพาะในกรณีที่อาร์เรย์ส่งคืนโดยความแตกต่างของชุดที่ว่างเปล่าคือสตริง pangram

การใช้ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กแทนที่จะเป็นตัวพิมพ์เล็กบันทึกสองสามไบต์เปรียบเทียบกับ'a':'z'เพราะค่า ASCII สามารถใช้แทนเพื่อสร้างช่วง


คำตอบที่ดี! ของฉันนานกว่า 10 ไบต์
Luis Mendo

4

Haskell , 59 56 53 51 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

ให้สตริงการป้อนข้อมูลsสำหรับแต่ละaอยู่ในช่วง 65-90 (รหัส ASCII สำหรับAการZ) มันมีการตรวจสอบว่าตัวอักษรใด ๆ ในsเท่ากับทั้งa(กรณีที่ตัวอักษรบน) หรือa+32(กรณีตัวละครล่าง) toEnumแปลงเป็นตัวอักษรโดย สิ่งนี้สร้างรายการบูลีน ตรวจสอบว่าพวกเขากำลังทั้งหมดandTrue

เวอร์ชั่นเก่า:

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

สำหรับตัวอักษรตัวพิมพ์ใหญ่ทุกตัวให้ตรวจสอบว่าตัวอักษรบางตัวจากตัวsพิมพ์ใหญ่มีค่าเท่ากันหรือไม่ any(==a)sเหมือนกับelem a sแต่อนุญาตให้แก้ไของค์ประกอบของsก่อนการเปรียบเทียบ - ในกรณีนี้ให้แปลงเป็นตัวพิมพ์ใหญ่


3

Japt , 14 ไบต์

#ao#{ e@Uv fXd

ลองออนไลน์!

มันทำงานอย่างไร

        // 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 ไบต์

'[,65>qeu-!

นี่เป็นโปรแกรมที่สมบูรณ์ ลองมันออนไลน์

คำอธิบาย:

'[,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 ไบต์

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

บันทึกไปแล้ว 6 ไบต์ขอบคุณ Thomas Kwa และอีก 10 ขอบคุณส่วน EV3


b = 0 ใช้งานได้สำหรับ b = [] หรือไม่
ev3commander

ไม่ใช่ด้วยวิธีการนี้ แต่ฉันอาจจะสามารถทำงานได้
SuperJedi224

ฉันไม่รู้จัก Javascript แต่คุณทำได้for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)ไหม
lirtosiast

ว้าว. นั่นสั้นกว่าที่ฉันเพิ่งทำไป
SuperJedi224


3

2sable , 6 5 ไบต์

รุ่น 6 ไบต์:

AIl-g_

ลองออนไลน์!

คำอธิบาย:

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)

5 ไบต์รุ่นแรงบันดาลใจจาก carusocomputing ของ คำตอบ 05AB1E carusocomputing :

lÙ{Aå

ลองออนไลน์!

คำอธิบาย:

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


2

TeaScriptขนาด 12 ไบต์

Sz.e»xL.I(l©

โพสต์ TeaScript แรกตั้งแต่ฉันฆ่า TeaScript: p

ลองออนไลน์

Ungolfed

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
; -; ตอนนี้ฉันรู้สึกไม่ดี TBH ฉันชอบ TeaScript มากที่สุด
Conor O'Brien

2

JavaScript ES6, 124 114 113 ไบต์

ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟได้มากกว่านี้

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

สร้างฟังก์ชั่นที่ไม่ระบุชื่อ

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 ฉันคิดว่าฉันพบปัญหา กรุณาทดสอบอีกครั้ง (เบราว์เซอร์ของฉันไม่รองรับ ES6 atm)
Conor O'Brien

อ๋อตอนนี้ดูดีแล้ว!
apsillers


2

ES6, 68 ไบต์

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

สตริงนั้นดูสิ้นเปลืองอย่างมาก แต่ฉันไม่รู้วิธีที่ดีกว่านี้


อาจจะใช้ charcodes หลากหลายแบบ?
Cyoce

@Cyoce ที่ทำให้ฉันคิดและฉันพยายามช่วงฐาน 36 หลัก แต่จนถึงขณะนี้ก็ยังคงใช้เวลา 70 ไบต์:s=>[...Array(x=9,26)].every(z=>RegExp((++x).toString(36),"i").test(s))
Neil

2

สกาลา, 59 48 46 ไบต์

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

ใช้ 32 | มากกว่า _ | 32 จะ (ให้คำเตือน แต่) โกนทิ้งอีกหนึ่งไบต์
จาค็อบ

2

Bash, 45 42 ไบต์

41 byte program, plus 1 เพราะมันจะต้องถูกเรียกใช้ด้วยbash -e:

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

น่าอัศจรรย์ที่ฉันจัดการคำตอบ Bash โดยไม่มีตัวอักษรคำพูด! (ใช่ฉันตรวจสอบด้วยอินพุตที่ขึ้นต้นด้วย-fและไม่ชอบ)

สิ่งนี้จะถือว่าเป็นโลแคลที่มีตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก aไปzไปการป้อนข้อมูลผ่านอาร์กิวเมนต์แรกของโปรแกรม

วิธีการทำงานของตัวอักษรแต่ละตัว$iนั้นเราจะทดสอบว่าสตริงนั้นมีตัวอักษรตัวพิมพ์ใหญ่$iหรือตัวพิมพ์ใหญ่เทียบเท่ากันหรือไม่${i^}โดยการลบอักขระอื่นทั้งหมด หากสิ่งนี้ส่งผลให้เกิดสายอักขระว่างการป้อนข้อมูลจะไม่มีตัวอักษรนั้นและเราจะออกด้วย1(เท็จ) หากเรามีผลที่ไม่ว่างเปล่าเราก็ผ่านการทดสอบแล้วไปยังจดหมายถัดไป หากสตริงอินพุตมีตัวอักษรภาษาอังกฤษทุกตัวเราจะไปถึงจุดสิ้นสุดของโปรแกรมดังนั้นจึงออกด้วย0(จริง)



2

PlatyParขนาด 14 ไบต์

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

คำอธิบาย (ฟีเจอร์วิชวล visualizer เร็ว ๆ นี้!):

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

หากฉันมีฟังก์ชั่น "ผลักดันตัวอักษรทั้งหมดของตัวอักษร" ที่ไร้สาระนี่จะเป็น 10 ...

ลองออนไลน์ !


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.