Это панграмма?


42

Напишите функцию или программу, которая принимает в качестве входных данных строку и печатает истинное значение, если строка представляет собой панграмму (последовательность букв, содержащую хотя бы одну из каждой буквы в английском алфавите), и значение false в противном случае.

Регистр букв следует игнорировать; Если строка есть abcdefghijklmnopqrstuvwXYZ, то функция все равно должна возвращать истинное значение. Обратите внимание, что строка может содержать любые другие символы, поэтому 123abcdefghijklm NOPQRSTUVWXYZ321вернет истинное значение. Пустой ввод должен возвращать значение Falsey.


Контрольные примеры

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 Несмотря на то, что существует (слабый) консенсус относительно возможности разделения строк из входных данных в кавычках , я не уверен в этом, так как это требует дальнейшего использования синтаксиса строк Python.
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-байтовую "французскую" версию ( ) U+2286 SUBSET OF OR EQUAL TOоператора вместо 4-байтовой "техасской" версии ( (<=)), которая также потребовала бы дополнительного пространства перед ним.


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 байта.
Митч Шварц

@ MitchSchwartz О, вот как вы их используете. Благодарность!
Деннис

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, очевидно, нет. Попробуйте это с 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
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)быть включен в подсчет?
Руслан

2
@ Руслан Это так! Это Tкак конец, благодаря сопоставлению размещения аргументов нет необходимости фактически указывать имя аргумента (и Tявляется псевдонимом по умолчанию для TRUE). Код, написанный здесь, выполняет необходимые действия как есть, без необходимости что-либо добавлять.
plannapus

9

О, 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

Юлия, 38 байт

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

Это просто - lowercaseимеет дело с заглавными / строчными буквами, 'a':'z'содержит все строчные буквы, является пересечением, удаляет любой символ, который не является буквой и, поскольку 'a':'z'идет первым, будет иметь только одну из каждой буквы, которая появляется в s. endofэто кратчайший способ получить длину полученного массива, и если он равен 26, то это панграмма (она не может быть больше 26 и >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

Python 3.5 может сохранить байт здесь: p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}. Кстати, я не могу найти какие-либо правила о том, lambdaнужно ли присваивать (как в вашем первом случае) или нет (как в ваших последующих). Помогите?
Тим Педерик

@TimPederick Именовать лямбду не нужно, если только вам не нужно использовать эту функцию в другом месте, как в первом рекурсивном решении.
FryAmTheEggman

@TimPederick Спасибо за указание на это. Я переименовал свой ответ как Python 2 вместо просто Python. Если у вас есть мое благословение, я могу опубликовать это как новый ответ, который, я думаю, будет нормальным для сообщества, хотя я не уверен.
Митч Шварц

@FryAmTheEggman: Спасибо за разъяснения. Это различие не произошло со мной! Я также нашел мета-пост, объясняющий правило. Там идет два байта из нескольких вещей, которые я написал ...
Тим Педерик

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

Тот же принцип, что и в ответе Митча Шварца , но с использованием улучшений PEP 0448 для *распаковки, впервые представленных в Python 3.5.

Эта версия немного отличается от того, что я написал в своем комментарии к сообщению Митча, в том, что я превращаю цифры в буквы, а не наоборот. Это потому, что именно так я и написал свои первоначальные попытки найти решение, прежде чем обнаружил, что не смогу обойти Митча, не скопировав его подход. Так что учтите, что подправьте мою единственную оставшуюся часть оригинальности!


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

Спасибо Васу Адари за то, что он спас мне 8 байт


2
Вы можете сэкономить 8 байт, сделав свое регулярное выражение игнорирующим.
Васу Адари

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является панграммой, или логический 0, если это не так.

По сути, он использует тот же подход, что и решение Pyth @ ThomasKwa. Разница между всеми символами в верхнем регистре букв алфавита ( 65:91) и входной строкой (преобразуется в верхний регистр). Любые символы в алфавите, но не во входной строке, возвращаются setdiff. Только если массив, возвращенный заданной разностью, пуст, строка является панграммой.

Использование верхнего регистра вместо нижнего регистра экономит пару байтов по сравнению с 'a':'z'тем, что вместо этого можно использовать значение ASCII для создания диапазона.


Отличный ответ! Мой был на 10 байт длиннее
Луис Мендо

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. Это создает список логических значений. andпроверяет, все ли они True.

Старая версия:

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

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 байтов благодаря Томасу Ква и 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-байтовая версия, вдохновленная ответом 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.
Конор О'Брайен

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

Да, выглядит хорошо сейчас!
Апсиллеры

2

C 107 байтов

#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 байт

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

Эта строка выглядит ужасно расточительной, но я не знаю лучшего способа.


Может быть, с использованием ряда кодов?
Cyoce

@Cyoce Это заставило меня задуматься, и я попробовал диапазон из 36 базовых цифр, но до сих пор он занимает 70 байт:s=>[...Array(x=9,26)].every(z=>RegExp((++x).toString(36),"i").test(s))
Нил

2

Scala, 59 48 46 байт

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

Используя 32 | вместо _ | 32 (выдаст предупреждение, но) сбрит еще один байт
Джейкоб

2

Баш, 45 42 байта

41-байтовая программа, плюс 1, потому что она должна вызываться с помощью bash -e:

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

Удивительно, но мне удалось ответить на Bash без кавычек! (да, я проверил с вводами, начинающимися с -fи тому подобное).

Это предполагает локаль, где строчные латинские буквы являются смежными от aдо z. Ввод осуществляется через первый аргумент программы.

Как это работает, для каждой буквенной буквы $iмы проверяем, содержит ли строка $iили ее эквивалент в верхнем регистре ${i^}, удаляя все остальные символы. Если это приводит к пустой строке, то входные данные не содержат этой буквы, и мы завершаем работу с 1(false). Если у нас есть непустой результат, то мы прошли тест и переходим к следующей букве. Если входная строка содержит каждую английскую букву, мы достигнем конца программы, выйдя, таким образом, с 0(true).



2

PlatyPar , 14 байт

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

Пояснение (функция визуализации стека в ближайшее время!):

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

Попробуйте онлайн !


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.