パングラムですか?


42

入力として文字列を受け取り、文字列がパングラム(英語のアルファベットの各文字の少なくとも1つを含む文字のシーケンス)である場合は真理値を出力し、それ以外の場合は偽値を出力する関数またはプログラムを作成します。

文字の大文字小文字は無視する必要があります。文字列がの場合、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
入力がパングラムであるかどうかをコードで確認できる場合は、プラス記号を付けます。
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

4バイトの「テキサス」バージョン()の代わりに3バイトの「フランス語」バージョン()の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バイトを節約します。
ミッチシュワルツ

@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 no。Aそして、a同じ文字になる必要があり、そうでない> 26セットは、異なるとしてそれらを維持し、サイズは次のようになります
edc65

スプレッド演算子を使用するとどうなります[...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25か?
スコット

@ScottKayeは明らかにいいえ。「AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA」でそれを試してみてください
edc65

1
@ user81655そうです、うまくいきます。ありがとう。私は眠っている間、コメントに答えるべきではありません
edc65

9

R 5046の 39バイト

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

編集は()をtolower追加することで必要性を減らしますignore.case=TRUET


Rにあまり詳しくありませんが、その場合もignore.case=TRUE (T)カウントに含めるべきではありませんか?
ルスラン

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

代替51について、セットに演算子があることを指摘してくれたxnorに感謝します<=

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だけでなくPython 2に変更しました。あなたが望むなら、それを新しい答えとして投稿する私の祝福があります。それは、コミュニティの規範で大丈夫だと思いますが、私にはわかりません。
ミッチシュワルツ

@FryAmTheEggman:明確にしてくれてありがとう。私にはその区別はありませんでした!ルールを説明するメタ投稿も見つけまし。私が書いたいくつかのことから、2つのバイトが...そこに行く
ティムPederick

5

網膜、22バイト

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

オンラインでお試しください。

最初の行は、文字列の後半に再び現れない文字に一致します。これにより、発生する頻度に関係なく、各文字が1回しか一致しないことが保証されます。一致モードでは、デフォルトで文字列が見つかった一致の数に置き換えられます。そのため、第2段階では26、最初の入力の結果と照合します。最大26件の一致が見つかったかどうかに応じて、0またはのいずれか1が返されます。



4

Python 3.5、47バイト

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

Mitch Schwartzの答えと同じ原理ですが、Python 3.5で初めて導入されたPEP 0448の拡張機能を使用して*展開します。

このバージョンは、Mitchの投稿へのコメントで書いたものとは少し異なります。つまり、数字を文字ではなく文字に変換しています。それは、私が彼のアプローチを完全にコピーせずにミッチをアウトゴルフできないことを発見する前に、それが私が解決策の最初の試みを書いた方法だからです。独創性を残した私の1つを微調整することを検討してください!


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バイト節約できます。
ヴァスアダリ

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バイト長かった
ルイスメンドー

4

Haskell59 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 ss、比較前の要素を変更できます-この場合、大文字に変換します。


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)

Thomas Kwaのおかげで6バイト、ev3のおかげで10バイト節約できました。


b = 0はb = []で機能しますか?
ev3commander

このアプローチではありません。しかし、私はその仕事をすることができるかもしれません。
SuperJedi224

Javascriptはわかりませんが、できますかfor(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)
リトシアスト

ワオ。それは私がちょうどやったことよりもさらに短いです。
SuperJedi224


3

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

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をサポートしていません)
コナーオブライエン

うん、今よさそうだ!
アプシラーズ

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

その文字列は非常に無駄に見えますが、それ以上の方法はわかりません。


多分文字コードの範囲を使用していますか?
チョイス

:私は考えて、私はベース36桁の範囲を試みたが、これまでのところ、それはまだ70のバイトをとりました@Cyoces=>[...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ではなく(警告を生成しますが)さらに1バイト削ります
ジェイコブ

2

Bash、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 ...

オンラインでお試しください


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.