Pangram mı?


42

Girdi olarak bir dize alan ve dize bir pangram (İngilizce alfabedeki her harften en az birini içeren bir harf dizisi) ve aksi takdirde bir falsey değeri varsa, bir truthy değeri yazdıran bir işlev veya program yazın .

Harflerin durumu göz ardı edilmeli; Dize ise abcdefghijklmnopqrstuvwXYZ, işlev hala bir hakikat değeri döndürmelidir. Dize, içinde herhangi bir karakter içerebileceğini unutmayın, bu yüzden 123abcdefghijklm NOPQRSTUVWXYZ321bir hakikat değeri döndürür. Boş bir giriş bir falsey değeri döndürmelidir.


Test durumları

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

Bu kod golfü. Standart kurallar geçerlidir. Bayt cinsinden en kısa kod kazanır.


3
Ayrıca, kodunuz, girişin bir Pungram olup olmadığını kontrol edebilirse işaret eder.
timmyRS

4
Soru adı isteği: Hızlı kahverengi tilki tembel köpeğin üstünden atladı mı?

Yanıtlar:


25

Pyth, 7 bayt

L!-Grb0

Açıklama:

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)

Tam program, tek satır sürümünü burada deneyin .


Ben girişteki satırsonlarının için bu sorunu gidermek için en kısa yol bir işlev yapmak olduğunu düşünüyorum: L!-Grb0. !-Grs.z0Ayrıca çalışırdı ama daha uzun.
FryAmTheEggman,

Oh, soruyu dizgeye \ n içerecek şekilde güncellendiğini görmedim. Teşekkürler.
lirtosiast


@Maltysen Girilen dizelerin tırnak işaretleri ile sınırlandırılmasına izin verme konusunda (zayıf) bir fikir birliği olsa da, Python string sözdizimini gerektirirken daha da ileri gittiğinden emin değilim.
lirtosiast


16

Perl 6 , 20 bayt

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

kullanımı:

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

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

4 bayt "texas" sürümü ( ) yerine operatörün 3 baytlık "fransız" versiyonunu ( ) U+2286 SUBSET OF OR EQUAL TOkullandım (<=).


12

GS2, 11 9 bayt

☺ 6ΘàB1."

2 byte kapalı golf oynamak için @MitchSchwartz için teşekkürler!

Kaynak kod CP437 kodlamasını kullanır. Çevrimiçi deneyin!

Nasıl çalışır

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

quick block m2( \xe9) 2 bayt kaydeder.
Mitch Schwartz

@MitchSchwartz Demek o yılların o nasıl kullandıklarını. Teşekkürler!
Dennis,

11

JavaScript ES6, 51 57

6 bayt düzenle thx @ user81655 kaydet

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

Test pasajı

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>


Misiniz a.replace(/[^A-Z]|[^a-z]/g,'')yoksa a.replace(/[^A-Z]/gi,'')çalışıyor mu?
ev3 komutanı

2
@ ev3commander no. Ave aaynı karakter olması gerekir, aksi takdirde küme onları farklı tutar ve boyut> 26
edc65

Spread operatörünü birlikte kullanırsanız ne olur [...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25?
Scott,

@ScottKaye açıkçası hayır. 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' ile deneyin
edc65

1
@ user81655 sağ, işe yarıyor, harika. Teşekkürler.
Uykudayken

9

R 50 , 46 39 bayt

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

Düzenleme, ( ) tolowerekleyerek ihtiyacını azaltırignore.case=TRUET


R'ye aşina değil, ancak ignore.case=TRUE (T)o zamanlar sayıma da dahil edilmemeli mi?
Ruslan

2
@Ruslan Öyle! Öyle Tuç olarak, argüman yerleşim eşlemeyi sayesinde aslında tartışmanın adını belirtmek için gerek yoktur (ve Tvarsayılan takma içindir TRUE). Burada yazılan kod, herhangi bir şey eklemenize gerek kalmadan gerekli işlemi olduğu gibi gerçekleştirir.
plannapus

9

O, 11 bayt

GQ_s{n-}dS=

Çevrimiçi deneyin.

Ne yazık ki, O ayarlanan farkı yoktur: /

açıklama

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 bayt

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

Bu basittir - lowercasebüyük / küçük harf sorunuyla ilgilenir 'a':'z', küçük harflerin tümünü tutar , kesişir, harf olmayan herhangi bir karakteri kaldırır ve 'a':'z'ilk önce gelir s; endofSonuçta elde edilen dizinin uzunluğunu almanın en kısa yoludur ve 26 ise, o zaman bir pangramdır (26'dan fazla olamaz ve >25göreceli olarak bir bayt kaydeder ==26).


6

Python 2, 53 51 bayt

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

Alternatif çözümler:

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

Setlerin bir operatöre sahip olduğunu belirten xnor sayesinde <=, bir alternatif 51 için:

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

1
Yanılmıyorsam, son ifadesi ile aynıdır lambda s:set(range(65,91))<=set(map(ord,s.upper()))51. ayrıca,
XNOR

Python 3.5 buradan byte kaydedebilirsiniz: p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}. Bu arada, bir lambdaihtiyacın atanması gerekip gerekmediğine dair herhangi bir kural bulamıyorum (ilk vakanızda olduğu gibi) ya da değil (sonrakilerinizde olduğu gibi). Yardım?
Tim Pederick

@TimPederick İlk özyinelemeli çözümde olduğu gibi, işlevi başka bir yerde kullanmanız gerekmediği sürece lamdayı adlandırmak gereksizdir.
FryAmTheEggman

@TimPederick Buna dikkat çektiğiniz için teşekkür ederiz. Cevabımı Python yerine Python 2 olarak değiştirdim. İsterseniz yeni bir cevap olarak göndereceğime dair nimetim var.
Mitch Schwartz

@ FryAmTheEggman: Aydınlattığın için teşekkürler. Bu ayrım bana gerçekleşmedi! Ayrıca kuralı açıklayan bir meta gönderi buldum .
Yazdığım

5

Retina , 22 bayt

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

Çevrimiçi deneyin.

İlk satır, daha sonra dizgede tekrar görünmeyen tüm harflerle eşleşir. Bu, ne sıklıkta olursa olsun, her harfle en fazla bir kez eşleşmememizi sağlar. Eşleştirme modu, varsayılan olarak dizeyi bulunan eşleşme sayısıyla değiştirir. Yani ikinci aşamada, biz maç 26ya verecektir ilk girdinin sonucu, karşı 0ya da 1biz 26 kibrit veya olmasın maksimum bulundu bağlı olarak.


4

Minkolang 0.14 , 18 bayt

$o7$ZsrlZ'26'$ZN.

Burada dene.

açıklama

$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 bayt

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

Mitch Schwartz'ın cevabıyla aynı prensip , ancak *ilk olarak Python 3.5'te sunulan PEP 0448 geliştirmelerini kullanmak .

Bu sürüm, yorumumda yazdığımdan Mitch'in yazısına göre biraz farklı, sayıları tam tersi yerine harflere çeviriyorum. Çünkü, yaklaşımını tamamen kopyalamadan Mitch'in dışına çıkamayacağımı keşfetmeden önce, ilk denemelerimi bir çözüm yolunda yazdım. Öyleyse bir tane orijinallik parçasını mahvettiğini düşün!


4

Ruby, 41 33

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

kullanım

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

Beni 8 bayt kurtardığı için Vasu Adari'ye teşekkürler.


2
Düzenli ifadenizi yoksaymak için yaparak 8 bayt tasarruf edebilirsiniz.
Vasu Adari

4

R, 5345 bayt

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

53 bayt'ta eski sürüm:

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

Kullanımı:

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

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

Çevrimiçi deneyin!


Anonim işlev, giriş xbir pangram ise bir mantıksal 1 veya değilse bir mantıksal 0 döndürür .

Temel olarak @ ThomasKwa'nın Pyth çözümü ile aynı yaklaşımı kullanır. Büyük harf alfabe aralığındaki ( 65:91) ve giriş dizgisinin (büyük harfe dönüştürülmüş) tüm karakterleri arasındaki fark . Alfabedeki ancak giriş dizgisindeki olmayan karakterler tarafından döndürülür setdiff. Sadece set farkı tarafından döndürülen dizi boşsa, bir pangram dizesidir.

Küçük harf yerine büyük harf kullanmak 'a':'z', ASCII değerinin aralık oluşturmak için kullanılabileceğinden , bir kaç bayttan tasarruf sağlar .


Mükemmel cevap! Mayın 10 byte daha uzundu
Luis Mendo

4

Haskell , 59 56 53 51 bayt

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

Çevrimiçi deneyin!

Açıklama:

Bir giriş dizesi ver sher biri için, aaralık 65 ila 90 (ASCII kodları Aiçin Zherhangi bir karakter olmadığı kontrol edilir) sya da eşittir a(büyük harf) ya da a+32(düşük molekül ağırlıklı harfle) tarafından bir karakter dönüştürülür toEnum. Bu bir boolean listesi oluşturur. andhepsi olup olmadığını kontrol eder True.

Eski versiyon:

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

Her büyük harfli alfabe harfi için, büyük harflerden gelen bazı harflerin sbuna eşit olup olmadığını kontrol edin . any(==a)saynıdır elem a sancak skarşılaştırmadan önceki öğelerin değiştirilmesine izin verir - bu durumda, onları büyük harfe çevirin.


3

Japt , 14 bayt

#ao#{ e@Uv fXd

Çevrimiçi deneyin!

Nasıl çalışır

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

'[,65>qeu-!

Bu tam bir programdır. Çevrimiçi deneyin .

Açıklama:

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

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

Thomas Kwa sayesinde 6 byte kurtarıldı ve ev3'e kısmen 10 teşekkür verdi.


B = 0 b = [] için çalışır mıydı?
ev3 komutanı

Bu yaklaşımla değil. Ama bu işi yapabilirim.
SuperJedi224 11:15

Javascript'i tanımıyorum ama sen yapabilir for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)misin?
lirtosiast

Vay. Bu benim yaptığımdan daha da kısa.
SuperJedi224 11:15


3

2sable , 6 5 bayt

6 bayt sürümü:

AIl-g_

Çevrimiçi deneyin!

Açıklama:

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)

Carusocomputing'in 05AB1E cevabı esinlenerek 5 byte versiyonu :

lÙ{Aå

Çevrimiçi deneyin!

Açıklama:

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


2

TeaScript , 12 bayt

Sz.e»xL.I(l©

TeaScript'i öldürdüğümden beri ilk TeaScript gönderisi: p

Çevrimiçi deneyin

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
, -; Şimdi kötü hissediyorum. TBH En çok TeaScript'i seviyorum.
Conor O'Brien,

2

JavaScript ES6, 124 114 113 bayt

Bunun daha çok golf oynayabileceğine eminim.

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

Anonim bir işlev oluşturur.

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 Sanırım sorunu buldum. Lütfen tekrar test edin (tarayıcım ES6 atm'ı desteklemiyor)
Conor O'Brien,

Evet, şimdi iyi görünüyor!
apsillers

2

C, 107 bayt

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

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

Bu ip çok savurgan görünüyor, ama daha iyi bir yol bilmiyorum.


Belki bir dizi charcodes kullanıyorsunuzdur?
Cyoce

@Cyoce Bu beni düşündürdü ve ben bir dizi temel 36 basamak denedi ama şimdiye kadar hala 70 byte alıyor:s=>[...Array(x=9,26)].every(z=>RegExp((++x).toString(36),"i").test(s))
Neil

2

Scala, 59 48 46 bayt

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

32 kullanımı | _ | 32 yerine (bir uyarı verir ancak) bir bayt daha tıraş olur
Jacob

2

Bash, 45 42 bayt

41 baytlık program artı 1 ile başlatılması gerektiğinden bash -e:

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

Şaşırtıcı, ben hiçbir alıntı karakterleri ile Bash cevap başardı! (evet, başlangıç -fve benzeri girişlerle kontrol ettim ).

Bu küçük harf İngilizce harfler gelen bitişik olan bir yerel ayarı varsayar aiçin z. Girdi, programın ilk argümanı ile gerçekleşir.

Bunun çalışması, her alfabetik harf için $i, diğer tüm karakterleri kaldırarak dizenin içeriğini $iveya büyük harf eşdeğeri olup olmadığını test ederiz ${i^}. Bu boş dizgeyle sonuçlanırsa, giriş o harfi içermiyordu ve biz 1(false) ile çıkıyoruz . Boş olmayan bir sonucumuz olursa, testi geçtik ve bir sonraki harfe geçtik. Giriş dizgisi her İngilizce harfi içeriyorsa, programın sonuna ulaşacağız, böylece 0(true) ile çıkacağız .


2

Perl 5, 33 bayt

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

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

2

PlatyPar , 14 bayt

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

Açıklama (yığın görüntüleyici özelliği çok yakında!):

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

Çok saçma bir "alfabenin tüm harflerini it" işlevine sahip olsaydım bu ...

Çevrimiçi deneyin !


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.