Est-ce un pangram?


42

Ecrivez une fonction ou un programme qui prend en entrée une chaîne et affiche une valeur de vérité si la chaîne est un pangram (une séquence de lettres contenant au moins une lettre de chaque lettre de l'alphabet anglais), sinon une valeur de Falsey.

Le cas des lettres devrait être ignoré; Si la chaîne est abcdefghijklmnopqrstuvwXYZ, alors la fonction devrait toujours renvoyer une valeur de vérité. Notez que la chaîne peut contenir d'autres caractères, elle 123abcdefghijklm NOPQRSTUVWXYZ321renverrait donc une valeur de vérité. Une entrée vide devrait renvoyer une valeur de falsey.


Cas de test

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

C'est du code golf. Les règles standard s'appliquent. Le code le plus court en octets gagne.


3
Des points plus si votre code peut vérifier si la saisie est un Pungram.
timmyRS

4
Demande de nom de question: Le renard brun rapide a-t-il sauté par-dessus le chien paresseux?

Réponses:


25

Pyth, 7 octets

L!-Grb0

Explication:

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)

Essayez la version complète du programme sur une seule ligne ici .


Je pense que le plus court chemin pour résoudre ce problème pour les sauts de ligne dans l'entrée est de faire fonction: L!-Grb0. !-Grs.z0serait également travailler mais est plus long.
FryAmTheEggman

Oh, je n'ai pas vu la question mise à jour pour inclure \ n dans la chaîne. Merci.
lirtosiast


@Maltysen Bien qu'il existe un consensus (faible) sur la possibilité de délimiter les chaînes de l'entrée par des guillemets , je ne suis pas sûr à ce sujet car cela va encore plus loin en exigeant la syntaxe de chaîne Python.
lirtosiast

Je n'aurais jamais pensé qu'un alphabet intégré serait utile ...
Cyoce 12/12

16

Perl 6 , 20 octets

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

usage:

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

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

J'ai utilisé la version française de l' U+2286 SUBSET OF OR EQUAL TOopérateur (3 octets ) au lieu de la version texas de 4 octets, (<=)qui aurait également nécessité un espace supplémentaire.


12

GS2, 11 à 9 octets

☺ 6ΘàB1."

Merci à @MitchSchwartz pour le golf de 2 octets!

Le code source utilise le codage CP437. Essayez-le en ligne!

Comment ça marche

☺              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) enregistre 2 octets.
Mitch Schwartz

@MitchSchwartz Oh, c'est comme ça que vous les utilisez. Merci!
Dennis

11

JavaScript ES6, 51 57

Éditer 6 octets sauf thx @ user81655

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

Extrait de test

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>


Est-ce que a.replace(/[^A-Z]|[^a-z]/g,'')ou a.replace(/[^A-Z]/gi,'')travaillerait?
ev3commander

2
@ ev3commander no. Aet adoit devenir le même personnage, sinon l'ensemble les conservera comme distinct et la taille sera> 26
edc65

Et si vous utilisiez l'opérateur spread avec [...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25?
Scott

@ ScottKaye évidemment non. Essayez-le avec 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
edc65 11/12

1
@ user81655 droit, ça marche, génial. Merci. Je ne devrais pas répondre aux commentaires pendant
mon

9

R 50 , 46 39 octets

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

Editer supprime le besoin toloweren ajoutant ignore.case=TRUE( T)


Pas trop familier avec R, mais ne devrait-il pas également ignore.case=TRUE (T)être inclus dans le décompte?
Ruslan

2
@Ruslan C'est! C'est Tla fin, grâce à la correspondance de placement d'argument, il n'est pas nécessaire de spécifier le nom de l'argument (et Tc'est l'alias par défaut TRUE). Le code écrit ici effectue l'action nécessaire tel quel, sans rien ajouter.
Plannapus

9

O, 11 octets

GQ_s{n-}dS=

Essayez-le en ligne.

Malheureusement, O n'a pas mis la différence: /

Explication

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 octets

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

C’est simple: lowercasetraite du problème des majuscules / minuscules, 'a':'z'contient toutes les lettres minuscules, est une intersection, supprime tout caractère qui n’est pas une lettre et, car 'a':'z'vient en premier, n’aura qu’une lettre de chaque lettre qui apparaît s. endofest le moyen le plus court d’obtenir la longueur du tableau résultant, et s’il est 26, c’est un pangram (il ne peut pas être plus de 26 et >25enregistre un octet par rapport à ==26).


6

Python 2, 53 51 octets

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

Solutions alternatives:

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

Merci à xnor d’ avoir fait remarquer que les ensembles ont un <=opérateur, pour un autre 51:

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

1
Si je ne me trompe pas, la dernière expression est la même que lambda s:set(range(65,91))<=set(map(ord,s.upper())), également pour 51.
xnor

Python 3.5 peut économiser des octets ici: p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}. En passant, je n'arrive pas à trouver de règles pour déterminer si un lambdabesoin doit être attribué (comme dans votre premier cas) ou non (comme dans les derniers). Aidez-moi?
Tim Pederick

@TimPederick Nommer le lambda n'est pas nécessaire sauf si vous devez utiliser la fonction ailleurs, comme dans la première solution récursive.
FryAmTheEggman

@ TimPederick Merci de l'avoir signalé. J'ai renommé ma réponse en Python 2 au lieu de simplement Python. Vous avez la bénédiction d’afficher cela comme une nouvelle réponse si vous le souhaitez, ce qui, à mon avis, conviendrait aux normes de la communauté bien que je ne sois pas sûr.
Mitch Schwartz

@FryAmTheEggman: Merci pour cette clarification. Cette distinction ne m'était pas venue à l'esprit! J'ai également trouvé un méta-post expliquant la règle. Il y a deux octets de quelques-unes des choses que j'ai écrites ...
Tim Pederick

5

Rétine , 22 octets

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

Essayez-le en ligne.

La première ligne correspond à toute lettre qui n'apparaît pas plus tard dans la chaîne. Cela garantit que nous ne correspondons pas à chaque lettre au plus une fois, peu importe la fréquence. Le mode de correspondance remplacera par défaut la chaîne par le nombre de correspondances trouvées. Donc, dans la deuxième étape, nous comparons 26le résultat de la première entrée, ce qui donnera l’un 0ou l’ autre 1, selon que nous ayons trouvé le maximum de 26 matches ou non.


4

Minkolang 0,14 , 18 octets

$o7$ZsrlZ'26'$ZN.

Essayez ici.

Explication

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

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

Même principe que la réponse de Mitch Schwartz , mais utilisant les améliorations de décompression PEP 0448* , introduites pour la première fois dans Python 3.5.

Cette version diffère légèrement de ce que j'ai écrit dans mon commentaire au message de Mitch, en ce sens que je transforme les nombres en lettres plutôt que l'inverse. C'est parce que c'est comme ça que j'ai écrit mes tentatives initiales pour trouver une solution, avant de découvrir que je ne pouvais pas battre le golfe de Mitch sans copier son approche. Alors considérez que modifiez mon dernier lambeau d’originalité!


4

Ruby, 41 33

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

Usage

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

Merci à Vasu Adari pour m'avoir sauvé 8 octets


2
Vous pouvez économiser 8 octets en faisant votre regex à ignorecase.
Vasu Adari

4

R, 53 45 octets

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

Ancienne version à 53 octets:

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

Usage:

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

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

Essayez-le en ligne!


La fonction anonyme renvoie un 1 logique si l'entrée xest un pangram, ou un 0 logique si ce n'est pas le cas.

Il utilise essentiellement la même approche que la solution Pyth @ ThomasKwa. Différence définie entre tous les caractères de la plage d'alphabet en majuscule ( 65:91) et la chaîne de saisie (convertie en majuscule). Tous les caractères figurant dans l'alphabet mais pas dans la chaîne d'entrée sont renvoyés par setdiff. Ce n'est que si le tableau renvoyé par la différence définie est vide que la chaîne est un pangram.

L'utilisation de majuscules au lieu de minuscules permet d'économiser quelques octets par rapport à l'utilisation de 'a':'z'la valeur ASCII pour créer la plage.


Très bonne réponse! Le mien était plus long de 10 octets
Luis Mendo

4

Haskell , 59 56 53 51 octets

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

Essayez-le en ligne!

Explication:

Indiquez une chaîne d'entrée s. Pour chaque aplage comprise entre 65 et 90 (les codes ASCII Ade Z), il est vérifié si un caractère sest égal à a(le caractère majuscule) ou a+32(le caractère minuscule), converti en caractère par toEnum. Cela génère une liste de booléens. andvérifie s'ils sont tous True.

Ancienne version:

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

Pour chaque lettre de l'alphabet en majuscule, vérifiez si une lettre sen majuscule lui correspond. any(==a)sest identique à elem a smais permet de modifier les éléments d' savant la comparaison - dans ce cas, convertissez-les en majuscules.


3

Japt , 14 octets

#ao#{ e@Uv fXd

Essayez-le en ligne!

Comment ça marche

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

'[,65>qeu-!

Ceci est un programme complet. Essayez-le en ligne .

Explication:

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

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

Sauvé 6 octets grâce à Thomas Kwa et 10 grâce en partie à ev3.


Est-ce que b = 0 fonctionnerait pour b = []?
ev3commander

Pas avec cette approche. Mais je peux être capable de faire ce travail.
SuperJedi224

Je ne connais pas le Javascript, mais pouvez-vous le faire for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)?
lirtosiast

Sensationnel. C'est encore plus court que ce que je viens de faire.
SuperJedi224

3

05AB1E , 4 octets (probablement non concurrents)

lêAå

Essayez-le en ligne!

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 octets

Version 6 octets:

AIl-g_

Essayez-le en ligne!

Explication:

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)

Version 5 octets, inspirée de la réponse 05AB1E de carusocomputing :

lÙ{Aå

Essayez-le en ligne!

Explication:

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


2

TeaScript , 12 octets

Sz.e»xL.I(l©

Premier post TeaScript depuis que j'ai tué TeaScript: p

Essayez-le en ligne

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
; -; Je me sens mal maintenant. TBH J'aime TeaScript le plus.
Conor O'Brien

2

JavaScript ES6, 124 114 113 octets

Je suis sûr que cela peut être joué plus au golf.

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

Génère une fonction anonyme.

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 Je pense avoir trouvé le problème. S'il vous plaît testez à nouveau (mon navigateur ne supporte pas l'ES6 atm)
Conor O'Brien

Oui, ça va bien maintenant!
apsillers

2

C, 107 octets

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

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

Cette chaîne a l'air terriblement inutile, mais je ne connais pas de meilleur moyen.


Peut-être en utilisant une gamme de charcodes?
Cyoce

@Cyoce Cela m'a fait réfléchir et j'ai essayé une gamme de base de 36 chiffres, mais jusqu'à présent, il faut encore 70 octets:s=>[...Array(x=9,26)].every(z=>RegExp((++x).toString(36),"i").test(s))
Neil

2

Scala, 59 48 46 octets

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

Utiliser 32 | plutôt que _ | 32 va (donner un avertissement mais) raser un octet de plus
Jacob

2

Bash, 45 42 octets

Programme de 41 octets, plus 1 car il doit être appelé avec bash -e:

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

Étonnamment, j'ai réussi une réponse Bash sans caractères de citation! (oui, j'ai vérifié avec les entrées commençant par -fet similaire).

Cela suppose des paramètres régionaux où les lettres anglaises minuscules sont contiguës de aà z. La saisie s'effectue via le premier argument du programme.

En procédant ainsi $i, nous vérifions , pour chaque lettre alphabétique , si la chaîne contient $iou son équivalent en majuscule ${i^}en supprimant tous les autres caractères. S'il en résulte une chaîne vide, l'entrée ne contenait pas cette lettre et nous sortons avec 1(false). Si nous obtenons un résultat non vide, nous passons le test et passons à la lettre suivante. Si la chaîne d'entrée contient toutes les lettres anglaises, nous atteindrons la fin du programme et nous quitterons donc avec 0(true).


2

Perl 5, 33 octets

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

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

2

PlatyPar , 14 octets

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

Explication (fonctionnalité de visualisation de pile à venir bientô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

Si j'avais une fonction ridicule "pousser toutes les lettres de l'alphabet" ce serait 10 ...

Essayez-le en ligne !


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.