Це панграма?


42

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

Справа листів слід ігнорувати; Якщо рядок є 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
Плюс балів, якщо ваш код може перевірити, чи є вхідним пунктом.
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 у рядок. Дякую.
ліртосіаст


@Maltysen Хоча існує слабкий консенсус щодо того, щоб дозволити рядки з введення розмежовуватись лапками , я не впевнений у цьому, оскільки йдеться далі, вимагаючи синтаксису рядка Python.
ліртосіаст

Я ніколи б не подумав, що вбудований алфавіт буде корисним ...
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-байтної "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 байти.
Мітч Шварц

@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, очевидно, немає. Спробуйте це з "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
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
@Ruslan Це! Це Tяк кінець, завдяки збігу розміщення аргументів фактично не потрібно вказувати назву аргументу (і Tпсевдонім за замовчуванням для TRUE). Код, написаний тут, виконує необхідні дії, як є, без необхідності нічого додавати.
планнапус

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. Тільки якщо масив, повернутий встановленою різницею, порожній, є рядком pangram.

Використання верхнього регістру замість малого регістру економить пару байтів порівняно з '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)?
ліртосіаст

Ого. Це навіть коротше, ніж я щойно робив.
SuperJedi224


3

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

Спробуйте в Інтернеті

Безумовно

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 атм)
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 Це мене змусило задуматися, і я спробував діапазон базових 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^}]} ]
}

Дивовижно, мені вдалося відповісти на Баша без жодних цитат! (так, я перевірив із введеннями, що починаються з -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.