팬 그램입니까?


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
코드가 입력이 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 입력에서 문자열을 인용 부호로 묶는 것에 대한 (약한) 합의가 있지만 파이썬 문자열 구문이 더 필요하기 때문에 확실하지 않습니다.
lirtosiast

알파벳 내장 기능이 유용 할 것이라고 생각한 적이 없었습니다 ...
Cyoce

16

펄 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

4 바이트 "texas"버전 ( ) 대신 연산자 의 3 바이트 "french"버전 ( )을 U+2286 SUBSET OF OR EQUAL TO사용 (<=)했는데 그 앞에 추가 공간이 필요했습니다.


12

GS2, 11 9 바이트

☺ 6ΘàB1."

2 바이트를 골라 낸 @MitchSchwartz에게 감사합니다!

소스 코드는 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 바이트를 저장합니다.
Mitch Schwartz 5

@MitchSchwartz 아, 그래서 그의 당신이 그 사용 방법. 감사!
Dennis

11

자바 스크립트 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
@ ev3 사령관 번호 Aa같은 문자가되어야, 다른> 26 세트는 별개로 유지하고 크기가 될 것입니다
edc65

스프레드 연산자를 함께 사용하면 [...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25어떻게됩니까?
Scott

@ScottKaye는 분명히 아닙니다. 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'로 시도하십시오
edc65

1
@ user81655 맞아요, 잘 작동합니다. 감사. 나는 자고있는 동안 의견에 대답해서는 안됩니다
edc65

9

R 50 , 46 39 바이트

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

편집은 ( ) tolower을 추가 하여 필요성을 떨어 뜨립니다.ignore.case=TRUET


R에 익숙하지 않지만 ignore.case=TRUE (T)카운트에 포함 되어서는 안 됩니까?
Ruslan

2
@Ruslan입니다! 그것은이 T마지막으로, 인수 배치 매칭 덕분에 실제로 인수의 이름을 지정할 필요가 없습니다 (및 T기본 별명이다 TRUE). 여기에 작성된 코드는 추가 할 필요없이 필요한 조치를 그대로 수행합니다.
plannapus

9

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

파이썬 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

파이썬 3.5는 여기에 바이트를 저장할 수 있습니다 p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}. 그건 그렇고, lambda(첫 번째 경우와 같이) 할당 해야하는지 (나중의 경우와 같이) 여부에 대한 규칙을 찾을 수없는 것 같습니다 . 도움?
Tim Pederick

@TimPederick 첫 번째 재귀 솔루션과 같이 다른 곳에서 함수를 사용할 필요가 없으면 람다 이름을 지정할 필요가 없습니다.
FryAmTheEggman

@TimPederick 지적 해 주셔서 감사합니다. 내 대답의 이름을 Python 대신 Python 2로 바꿨습니다. 원하는 경우 새 답변으로 게시 할 수있는 축복이 있습니다. 확실하지는 않지만 커뮤니티 규범에 따라 괜찮을 것이라고 생각합니다.
Mitch Schwartz

@FryAmTheEggman : 설명해 주셔서 감사합니다. 그 구별은 나에게 일어나지 않았다! 또한 규칙을 설명 하는 메타 게시물을 찾았 습니다 . 2 바이트 ... 내가 작성한 몇 가지로 간다
팀 Pederick에게

5

망막 , 22 바이트

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

온라인으로 사용해보십시오.

첫 번째 줄은 문자열에서 나중에 다시 나타나지 않는 문자와 일치합니다. 이렇게하면 얼마나 자주 발생하더라도 각 문자가 최대 한 번만 일치하지 않습니다. 일치 모드는 기본적으로 문자열을 찾은 일치 수로 바꿉니다. 그래서 두 번째 단계에서, 우리는 일치 26하나 줄 것이다 첫 번째 입력의 결과에 대해 0또는 1우리가 26 개 일치 여부의 최대 발견 여부에 따라.



4

파이썬 3.5, 47 바이트

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

Mitch Schwartz의 답변 과 같은 원리 이지만 PEP 0448의 개선 된 기능을 사용하여 *언 패킹을 사용했습니다 . Python 3.5에서 처음 소개되었습니다.

이 버전은 내가 Mitch의 게시물에 대한 내 의견에 쓴 것과 약간 다릅니다. 숫자를 반대로 바꾸지 않고 문자로 바꿉니다. 그것이 그의 접근 방식을 완전히 복사하지 않고 Mitch를 아웃 골프 할 수 없다는 것을 발견하기 전에 솔루션에 대한 원래의 시도를 작성한 방법이기 때문입니다. 따라서 남은 독창성 조각을 조정하십시오!


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 바이트를 절약 해 준 Vasu Adari에게 감사합니다


2
정규식을 무시하여 8 바이트를 절약 할 수 있습니다.
Vasu Adari

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 / 옥타브 , 35 33 바이트

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

온라인으로 사용해보십시오!


익명 함수는 입력 x이 팬 그램 인 경우 논리 1을 반환하고 그렇지 않으면 논리 0을 반환합니다.

본질적으로 @ThomasKwa의 Pyth 솔루션과 동일한 접근 방식을 사용합니다. 대문자 알파벳 범위 ( 65:91) 의 모든 문자 와 입력 문자열 (대문자로 변환) 의 설정된 차이 입니다. 알파벳은 있지만 입력 문자열에는없는 모든 문자가에 의해 반환됩니다 setdiff. 설정된 차이로 반환 된 배열이 비어있는 경우에만 문자열이 팬 그램입니다.

소문자 대신 대문자를 사용 'a':'z'하면 ASCII 값을 사용하여 범위를 만들 수 있기 때문에 몇 바이트를 절약 할 수 있습니다.


좋은 답변입니다! 광산은 10 바이트 이상이었다
루이스 Mendo

4

하스켈 , 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

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

CJam, 11 바이트

'[,65>qeu-!

이것은 완전한 프로그램입니다. 온라인으로 사용해보십시오 .

설명:

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

자바 스크립트 (110) 109 99 95 93 바이트

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

Thomas Kwa 덕분에 6 바이트를 절약했으며, ev3 덕분에 10 바이트를 절약했습니다.


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)

carusocomputing의 05AB1E 답변 에서 영감을 얻은 5 바이트 버전 :

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

자바 스크립트 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 지원하지 않음)
코너 오브라이언

그래, 이제 좋아 보인다!
apillers

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

2

스칼라, 59 48 46 바이트

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

32 사용하기 | _ | 32보다는 (경고를 생성하지만) 더 많은 바이트를 제거합니다
Jacob

2

배쉬, 45 42 바이트

다음과 bash -e같이 호출해야하기 때문에 41 바이트 프로그램 + 1

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

놀랍게도 나는 따옴표없이 Bash 답변을 관리했습니다! (예, 입력 등으로 시작하여 확인했습니다 -f).

소문자 영어 문자가에서 a로 인접한 로케일을 가정합니다 z. 입력은 프로그램의 첫 번째 인수를 통해 이루어집니다.

이것이 작동하는 방식은 각 알파벳 문자 $i에 대해 문자열에 $i대문자 또는 동등한 것이 있는지 테스트합니다.${i^} 다른 모든 문자를 제거 . 이 결과 빈 문자열이 발생하면 입력에 해당 문자가 포함되어 있지 않고 1(false)로 종료됩니다 . 비어 있지 않은 결과가 나오면 테스트를 통과하고 다음 편지로 넘어갑니다. 입력 문자열에 모든 영어 문자가 포함되어 있으면 프로그램 끝에 도달하여 0(true)로 종료됩니다 .


2

펄 5, 33 바이트

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

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

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이 될 것이다.

온라인으로 사용해보십시오 !


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.