Ist es ein Pangram?


42

Schreibe eine Funktion oder das Programm , die einen String als Eingabe nimmt und drucken einen truthy Wert , wenn die Zeichenkette a pangram (eine Folge von Buchstaben mindestens eines von jedem Buchstaben im englischen Alphabet enthalten) und ein Falsey Wert anders.

Groß- und Kleinschreibung sollte ignoriert werden. Ist dies der abcdefghijklmnopqrstuvwXYZFall, sollte die Funktion dennoch einen Wahrheitswert zurückgeben. Beachten Sie, dass die Zeichenfolge beliebige andere Zeichen enthalten kann, sodass 123abcdefghijklm NOPQRSTUVWXYZ321ein wahrer Wert zurückgegeben wird. Eine leere Eingabe sollte einen falschen Wert zurückgeben.


Testfälle

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

Das ist Code Golf. Es gelten Standardregeln. Kürzester Code in Bytes gewinnt.


3
Pluspunkte, wenn Ihr Code überprüfen kann, ob es sich bei der Eingabe um einen Pungram handelt.
timmyRS

4
Frage nach dem Namen: Ist der schnelle braune Fuchs über den faulen Hund gesprungen?

Antworten:


25

Pyth, 7 Bytes

L!-Grb0

Erläuterung:

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)

Probieren Sie hier die einzeilige Vollprogrammversion aus .


Ich denke , dass der kürzeste Weg , um dies für neue Zeilen in der Eingabe zu beheben , ist eine Funktion zu machen: L!-Grb0. !-Grs.z0würde auch funktionieren ist aber länger.
FryAmTheEggman

Oh, die Frage wurde nicht aktualisiert, um \ n in die Zeichenfolge aufzunehmen. Vielen Dank.
Lirtosiast


@Maltysen Es besteht zwar ein (schwacher) Konsens darüber, dass Zeichenfolgen aus Eingaben durch Anführungszeichen getrennt werden dürfen , ich bin mir jedoch nicht sicher, da die Syntax für Python-Zeichenfolgen noch weiter fortgeschritten ist.
Lirtosiast

Ich hätte nie gedacht, dass ein eingebautes Alphabet nützlich wäre ...
Cyoce

16

Perl 6 , 20 Bytes

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

Verwendungszweck:

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

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

Ich habe die 3-Byte-Version des U+2286 SUBSET OF OR EQUAL TOOperators "french" ( ) anstelle der 4-Byte-Version "texas" ( (<=)) verwendet, die auch einen zusätzlichen Platz davor benötigt hätte.


12

GS2, 11 9 Bytes

☺ 6ΘàB1."

Danke an @MitchSchwartz für das Golfen mit 2 Bytes!

Der Quellcode verwendet die CP437-Codierung. Probieren Sie es online!

Wie es funktioniert

☺              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) speichert 2 Bytes.
Mitch Schwartz

@MitchSchwartz Oh, so dass die , wie Sie diese nutzen. Vielen Dank!
Dennis

11

JavaScript ES6, 51 57

Editiere 6 Bytes und speichere thx @ user81655

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

Testschnipsel

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>


Würde a.replace(/[^A-Z]|[^a-z]/g,'')oder a.replace(/[^A-Z]/gi,'')arbeiten?
ev3commander

2
@ ev3commander nein. Aund amuss das gleiche Zeichen werden, sonst behält das Set sie als verschieden und die Größe wird> 26
edc65

Was ist, wenn Sie den Spread-Operator verwenden [...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25?
Scott

@ ScottKaye offensichtlich nicht. Probieren Sie es mit 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
edc65

1
@ user81655 richtig, es funktioniert, toll. Vielen Dank. Ich sollte keine Kommentare beantworten, während ich schlafe
edc65

9

R 50 , 46 39 Bytes

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

Bearbeiten löscht den Bedarf tolowerdurch Hinzufügen von ignore.case=TRUE( T)


Nicht allzu vertraut mit R, sollte aber ignore.case=TRUE (T)dann auch nicht mitgezählt werden?
Ruslan,

2
@ Ruslan Es ist! Es ist das Tals das Ende, dank Argumente Platzierung Anpassung besteht keine Notwendigkeit , tatsächlich ist , um den Namen des Arguments angeben (und Tist der Standard - Alias für TRUE). Der hier geschriebene Code führt die erforderliche Aktion so aus, wie sie ist, ohne dass etwas hinzugefügt werden muss.
Plannapus

9

O, 11 Bytes

GQ_s{n-}dS=

Probieren Sie es online aus.

Leider hat O keinen Unterschied gesetzt: /

Erläuterung

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 Bytes

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

Dies ist einfach - lowercasebehandelt das Problem mit Groß- / Kleinbuchstaben, 'a':'z'enthält alle Kleinbuchstaben, ist ein Schnittpunkt, entfernt alle Zeichen, die kein Buchstabe sind, und enthält, da dies an 'a':'z'erster Stelle steht, nur einen der Buchstaben, die in angezeigt werden s. endofist der kürzeste Weg, um die Länge des resultierenden Arrays zu ermitteln. Wenn es 26 ist, dann ist es ein Pangram (es kann nicht mehr als 26 sein und >25speichert ein Byte relativ zu ==26).


6

Python 2, 53 51 Bytes

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

Alternative Lösungen:

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

Vielen Dank an xnor für den Hinweis, dass Mengen einen <=Operator haben, für eine alternative 51:

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

1
Wenn ich mich nicht irre, ist der letzte Ausdruck derselbe wie lambda s:set(range(65,91))<=set(map(ord,s.upper())), auch für 51.
xnor

Python 3.5 kann hier speichern Bytes: p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}. Übrigens kann ich anscheinend keine Regeln finden, ob ein lambda(wie in Ihrem ersten Fall) zugewiesen werden muss oder nicht (wie in Ihren späteren). Hilfe?
Tim Pederick

@TimPederick Die Benennung des Lambda ist nicht erforderlich, es sei denn, Sie müssen die Funktion anderswo verwenden, wie in der ersten rekursiven Lösung.
FryAmTheEggman

@ TimPederick Vielen Dank für den Hinweis. Ich habe meine Antwort in Python 2 anstatt nur in Python umbenannt. Sie haben meinen Segen, dies als neue Antwort zu veröffentlichen, wenn Sie dies wünschen. Ich denke, dies wäre nach Gemeinschaftsnormen in Ordnung, obwohl ich nicht sicher bin.
Mitch Schwartz

@FryAmTheEggman: Danke für die Klarstellung. Diese Unterscheidung war mir nicht eingefallen! Ich habe auch einen Meta-Post gefunden , der die Regel erklärt. Es gibt zwei Bytes von ein paar Dingen, die ich geschrieben habe ...
Tim Pederick

5

Netzhaut , 22 Bytes

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

Probieren Sie es online aus.

Die erste Zeile entspricht einem Buchstaben, der später in der Zeichenfolge nicht mehr angezeigt wird. Das stellt sicher, dass wir nicht jeden Buchstaben auf einmal finden, egal wie oft er vorkommt. Der Übereinstimmungsmodus ersetzt standardmäßig die Zeichenfolge durch die Anzahl der gefundenen Übereinstimmungen. In der zweiten Stufe werden wir also mit 26dem Ergebnis der ersten Eingabe abgleichen, was entweder 0oder ergibt 1, je nachdem, ob wir das Maximum von 26 Übereinstimmungen gefunden haben oder nicht.


4

Minkolang 0,14 , 18 Bytes

$o7$ZsrlZ'26'$ZN.

Probieren Sie es hier aus.

Erläuterung

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

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

Gleiches Prinzip wie die Antwort von Mitch Schwartz , jedoch unter Verwendung der PEP 0448- Erweiterungen zum *Entpacken, die erstmals in Python 3.5 eingeführt wurden.

Diese Version unterscheidet sich geringfügig von dem, was ich in meinem Kommentar zu Mitch's Post geschrieben habe, indem ich die Zahlen eher in Buchstaben verwandle als umgekehrt. Das liegt daran, dass ich auf diese Weise meine ursprünglichen Lösungsversuche aufgeschrieben habe, bevor ich herausfand, dass ich Mitch nicht übertreiben konnte, ohne seinen Ansatz zu kopieren. Denken Sie also daran, dass Sie meinen letzten Rest an Originalität optimieren!


4

Ruby, 41 33

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

Verwendungszweck

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

Vielen Dank an Vasu Adari, der mir 8 Bytes gespart hat


2
Sie können 8 Bytes sparen, indem Sie die Regex ignorieren.
Vasu Adari

4

R 53 45 Bytes

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

Alte Version bei 53 Bytes:

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

Verwendungszweck:

> 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 / Oktave , 35 33 Bytes

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

Probieren Sie es online!


Die anonyme Funktion gibt eine logische 1 zurück, wenn die Eingabe xein Pangram ist, oder eine logische 0, wenn dies nicht der Fall ist.

Im Wesentlichen wird der gleiche Ansatz wie bei der Pyth-Lösung von @ ThomasKwa verwendet. Der eingestellte Unterschied zwischen allen Zeichen im Großbuchstabenbereich ( 65:91) und der Eingabezeichenfolge (in Großbuchstaben umgewandelt). Alle Zeichen im Alphabet, jedoch nicht in der Eingabezeichenfolge, werden von zurückgegeben setdiff. Nur wenn das von der eingestellten Differenz zurückgegebene Array leer ist, ist die Zeichenfolge ein Pangram.

Durch die Verwendung von Großbuchstaben anstelle von Kleinbuchstaben werden im Vergleich dazu einige Bytes gespart, 'a':'z'da stattdessen der ASCII-Wert verwendet werden kann, um den Bereich festzulegen.


Gute Antwort! Meins war 10 Bytes länger
Luis Mendo

4

Haskell , 59 56 53 51 Bytes

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

Probieren Sie es online!

Erläuterung:

Geben Sie eine Eingabezeichenfolge ein s. Für jede Zeichenfolge aim Bereich von 65 bis 90 (die ASCII-Codes für Abis Z) wird geprüft, ob ein Zeichen in sentweder a(Großbuchstabe) oder a+32(Kleinbuchstabe) in ein Zeichen von konvertiert ist toEnum. Dies erzeugt eine Liste von Booleschen Werten. andprüft, ob sie alle sind True.

Alte Version:

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

Überprüfen Sie für jeden Buchstaben in Großbuchstaben, ob ein Buchstabe aus sGroßbuchstaben mit dem Buchstaben übereinstimmt. any(==a)sist das Gleiche wie elem a s, ermöglicht jedoch das Ändern der Elemente svor dem Vergleich. In diesem Fall müssen Sie sie in Großbuchstaben umwandeln.


3

Japt , 14 Bytes

#ao#{ e@Uv fXd

Probieren Sie es online!

Wie es funktioniert

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

'[,65>qeu-!

Dies ist ein vollständiges Programm. Probieren Sie es online aus .

Erläuterung:

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

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

6 Bytes dank Thomas Kwa und 10 dank ev3 eingespart.


Würde b = 0 für b = [] funktionieren?
ev3commander

Nicht bei diesem Ansatz. Aber ich bin vielleicht in der Lage, das zum Laufen zu bringen.
SuperJedi224

Ich kenne kein Javascript, aber kannst du es tun for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)?
Lirtosiast

Beeindruckend. Das ist noch kürzer als das, was ich gerade getan habe.
SuperJedi224

3

05AB1E , 4 Bytes (wahrscheinlich nicht konkurrierend)

lêAå

Probieren Sie es 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 Bytes

6 Byte Version:

AIl-g_

Probieren Sie es online!

Erläuterung:

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-Byte-Version, inspiriert von der 05AB1E-Antwort von carusocomputing :

lÙ{Aå

Probieren Sie es online!

Erläuterung:

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


2

TeaScript , 12 Bytes

Sz.e»xL.I(l©

Erster TeaScript-Beitrag seit ich TeaScript getötet habe: p

Probieren Sie es online aus

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
; -; Ich fühle mich jetzt schlecht. TBH Ich mag TeaScript am liebsten.
Conor O'Brien

2

JavaScript ES6, 124 114 113 Bytes

Ich bin mir sicher, dass man mehr Golf spielen kann.

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

Erzeugt eine anonyme Funktion.

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 Ich glaube, ich habe das Problem gefunden. Bitte testen Sie es erneut (mein Browser unterstützt kein ES6 atm)
Conor O'Brien

Ja, sieht jetzt gut aus!
Apsillers

2

C 107 Bytes

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

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

Diese Saite sieht furchtbar verschwenderisch aus, aber ich kenne keinen besseren Weg.


Verwenden Sie möglicherweise eine Reihe von Zeichencodes?
Cyoce

@Cyoce Das hat mich zum Nachdenken gebracht und ich habe versucht, eine Reihe von Basis-36-Ziffern zu verwenden, aber bis jetzt sind noch 70 Bytes erforderlich:s=>[...Array(x=9,26)].every(z=>RegExp((++x).toString(36),"i").test(s))
Neil,

2

Scala, 59 48 46 Bytes

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

Verwenden von 32 | Statt _ | 32 wird (gibt eine Warnung ab, aber) ein weiteres Byte abgeschnitten
Jacob,

2

Bash, 45 42 Bytes

41-Byte-Programm plus 1, da es aufgerufen werden muss mit bash -e:

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

Erstaunlicherweise gelang mir eine Bash-Antwort ohne Anführungszeichen! (ja, ich habe mit Eingaben, die mit -fund dergleichen beginnen, nachgeprüft).

Dies setzt ein Gebietsschema voraus, in dem die englischen Kleinbuchstaben von abis fortlaufend sind z. Die Eingabe erfolgt über das erste Argument an das Programm.

Die Art und Weise dies funktioniert , ist für jeden alphabetischen Buchstaben $i, prüfen wir , ob die Zeichenfolge enthält $ioder dessen Groß- Äquivalent ${i^}von allen anderen Zeichen zu entfernen. Wenn dies zu einer leeren Zeichenfolge führt, enthielt die Eingabe diesen Buchstaben nicht und wir beenden mit 1(false). Wenn wir ein nicht leeres Ergebnis haben, haben wir den Test bestanden und sind zum nächsten Buchstaben übergegangen. Wenn die Eingabezeichenfolge jeden englischen Buchstaben enthält, erreichen wir das Programmende und verlassen das Programm mit 0(true).


2

Perl 5, 33 Bytes

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

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

2

PlatyPar , 14 Bytes

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

Erklärung (Stack Visualizer-Funktion in Kürze verfügbar!):

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

Wenn ich eine lächerliche "alle Buchstaben des Alphabets drücken" -Funktion hätte, wäre dies 10 ...

Probieren Sie es online !


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.