正規表現を使用せずにUUIDが有効かどうかを確認します


44

文字列の入力が与えられた場合、正規表現を使用せずに、入力が有効なUUIDである場合は、STDOUTまたは同等のを出力するプログラムを作成します。

有効なUUIDは

32桁の16進数。ハイフンで区切られた5つのグループに表示され、8-4-4-4-12の形式で合計36文字(32文字の英数字と4つのハイフン)で表示されます。

ソース

テストケース

0FCE98AC-1326-4C79-8EBC-94908DA8B034
    => true
00000000-0000-0000-0000-000000000000
    => true
0fce98ac-1326-4c79-8ebc-94908da8b034
    => true
0FCE98ac-1326-4c79-8EBC-94908da8B034
    => true

{0FCE98AC-1326-4C79-8EBC-94908DA8B034}
    => false (the input is wrapped in brackets)
0GCE98AC-1326-4C79-8EBC-94908DA8B034
    => false (there is a G in the input)
0FCE98AC 1326-4C79-8EBC-94908DA8B034
    => false (there is a space in the input)
0FCE98AC-13264C79-8EBC-94908DA8B034
    => false (the input is missing a hyphen)
0FCE98AC-13264-C79-8EBC-94908DA8B034
    => false (the input has a hyphen in the wrong place)
0FCE98ACD-1326-4C79-8EBC-94908DA8B034
    => false (one of the groups is too long)
0FCE98AC-1326-4C79-8EBC-94908DA8B034-
    => false (has a trailing hyphen)
0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
    => false (too many groups)
0FCE98AC13264C798EBC94908DA8B034
    => false (there is no grouping)

ルール

  • 正規表現は許可されていません
  • 正規表現のようなリテラルパターンマッチングは許可されていません。たとえば、[0-9a-fA-F]他の16進数の識別子(これを呼び出しますn)を使用してから一致nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnnまたはn[8]-n[4]-n[4]-n[4]-n[12]許可されません
  • 入力はSTDIN、関数から取得するか、関数の引数として取得できます
  • 入力では大文字と小文字が区別されません
  • 入力に改行や改行含まれないと想定するのが安全です。
  • 入力には、印刷可能なASCII文字(スペースを含む)を含めることができます
  • truthy値 に印刷しなければならないSTDOUT入力が有効なUUIDである場合、または同等
  • falsey値 に印刷しなければならないSTDOUT入力がある場合またはそれと同等ではない有効なUUID
  • 関数を使用する場合、を使用する代わりにSTDOUT、出力を関数の戻り値にすることができます
  • 真偽値はに印刷できませんSTDERR
  • 標準的な抜け穴が適用されます
  • これはであるため、バイト単位の最短プログラムが優先されます。幸運を!

リーダーボード

これは、リーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください

## Language Name, N bytes

Nは、送信のサイズ(バイト単位)です。

ヘッダーに複数の数字を含める場合(たとえば、古いスコアを打つ、またはバイトカウントにフラグを含める)、実際のスコアがヘッダーの最後の数字であることを確認してください

## Language Name, <s>K</s> X + 2 = N bytes


32
貧しい網膜。D:
BrainSteel


8
参考までに、28バイトのRetinaソリューションを考え出すことができます(したがって、現在はリードしているとはいえ、ゴルフの言語に対するクレイジーな利点ではありません。)
マーティンエンダー

5
Luaのパターンは許可されますか?確かに正規表現ではありません。
マナトワーク

1
@JacobKrallあなたの質問のすべてに対して「偽」だと確信しています。私は挑戦をすることをかなり明確だと思うだけで、フォームの文字列\h{8}-\h{4}-\h{4}-\h{4}-\h{12}\h進数字です)が有効です。
マーティンエンダー

回答:


15

CJam、31 30 29バイト

8 4__C]Nf*'-*qA,s'G,_el^+Ner=

ここですべてのテストケースを実行します。

説明

入力を直接パターンマッチングする代わりに、最初に単一のパターン文字列と簡単に比較できる単純な形式に変換します。

8 4__C] e# Push the array of segment lengths, [8 4 4 4 12].
Nf*     e# Turn that into strings of linefeeds of the given length.
'-*     e# Join them by hyphens, giving "NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN".
q       e# Read the input.
A,s     e# Push the string "0123456789".
'G,_el^ e# Push the string "ABCDEFabcdef".
+       e# Concatenate the two strings.
N       e# Push a linefeed.
er      e# Replace all hexadecimal digits with linefeeds.
=       e# Check for equality with the pattern string.

23

JavaScriptのES6、73の 55 56文字

s=>s.split`-`.map(x=>x.length+`0x${x}0`*0)=="8,4,4,4,12"

以前の55文字バージョンには、グループの末尾のスペースに問題があります。

s=>s.split`-`.map(x=>x.length+("0x"+x)*0)=="8,4,4,4,12"
// "00000000-0000-0000-000 -000000000000" true

テスト:

f=s=>s.split`-`.map(x=>x.length+`0x${x}0`*0)=="8,4,4,4,12"
;`0FCE98AC-1326-4C79-8EBC-94908DA8B034
0fce98ac-1326-4c79-8ebc-94908da8b034
0FCE98ac-1326-4c79-8EBC-94908da8B034
0GCE98AC-1326-4C79-8EBC-94908DA8B034
0FCE98AC-13264C79-8EBC-94908DA8B034
0FCE98AC-13264-C79-8EBC-94908DA8B034
0FCE98ACD-1326-4C79-8EBC-94908DA8B034
0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
00000000-0000-0000-0000-000000000000
D293DBB2-0801-4E60-9141-78EAB0E298FF
0FCE98AC-1326-4C79-8EBC-94908DA8B034-
00000000-0000-0000-000 -000000000000`.split(/\n/g).every(s=>f(s)==/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(s))

素晴らしい(そして私のために萎縮)+1
edc65

@ edc65、「枯れ」とはどういう意味ですか?
Qwertiy

暗黙的なキャストの恐ろしい悪用+1
Downgoat

4
軽蔑、軽蔑、痛烈な、刺す、壊滅的な、屈辱、悔しい- (私にあなたの答えを比較)
edc65

11

PowerShell、29 21 84 49 37バイト

param($g)@{36=$g-as[guid]}[$g.length]

変更のルールについていくために、このゴルフを支援コメントで人々に感謝- TessellatingHeckleriFreilichtヤコブ・クラール、とジョーイ。リビジョンと古いバージョンの編集履歴をご覧ください。

このリビジョンはとして入力を受け取り、1つの要素$gを持つ新しいハッシュテーブル@{}を作成36$g-as[guid]ます。インデックスはに等しく設定されます。これは、組み込み-as演算子を使用して、2つの.NETデータ型(from [string]から[guid]。変換が成功した場合、[guid]オブジェクトが返され、そうでない場合$nullは返されます。この部分により、入力文字列が有効な.NET GUIDになります。

次のステップは、を使用してハッシュテーブルにインデックスを付けること[$g.length]です。の$g長さが正確に36文字ではない場合、ハッシュテーブルは$nullfalsey値として出力されるを返します。$g長さが36文字の場合、.NET呼び出しの結果が出力されます。$gが有効な.NET GUID(任意の形式)でない場合$null、falsey値として出力されます。それ以外の場合は、.NET GUIDオブジェクトを真実の値として出力します。出力できる唯一の方法は、要求されたチャレンジの形式に一致する場合のみです。

ここでは、スクリプト呼び出しを括弧でカプセル化し、明確にするためにブール値として明示的にキャストしています。

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC-1326-4C79-8EBC-94908DA8B034')
True

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC-1326-4C79-8EBC-94908DA8B034D')
False

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC13264C798EBC94908DA8B034')
False

4
!!($args[0]-as[guid])21バイトでスローします。
TessellatingHeckler

2
を省略して4バイトだけを節約できませんでした!!()か?値$NULL[guid]は相互に排他的であるため、それらは真理値と偽値を表す資格がありますか?とにかく、ブール値に変換するための素晴らしい方法は、ソリューションが大好きです!
iFreilicht

@iFreilichtがポイントです。リンクされた「真実/偽の解釈」投稿を見て-私はそれが有効に見えることに同意します。
TessellatingHeckler

1
このソリューションTrue0FCE98AC13264C798EBC94908DA8B034、を誤って返します。これにはハイフンがありません
ジェイコブクラル

1
@TessellatingHecklerいや、本当であるにはあまりにも良い。0FCE98AC-1326-4C79-8EBC-94908DA8B034D(末尾の余分なD )などの数字を追加するとfalseyが返されます。これ$TRUEは問題の数字を切り捨てるだけで、最初の36文字が有効だからです。
AdmBorkBork

9

Emacs Lisp、236バイト

(lambda(s)(and(eq(string-bytes s)36)(let((l(string-to-list s))(i 0)(h '(8 13 18 23))(v t))(dolist(c l v)(set'v(and v(if(member i h)(and v(eq c 45))(or(and(> c 47)(< c 58))(and(> c 64)(< c 91))(and(> c 96)(< c 123))))))(set'i(+ i 1))))))

ゴルフをしていない:

(lambda (s)
  (and (eq (string-bytes s) 36) ; check length
       (let ((l (string-to-list s))
             (i 0)
             ; location of hyphens
             (h '(8 13 18 23))
             (v t))
         (dolist (c l v)
           (set 'v (and v (if (member i h)      ; check if at hyphen position
                              (and v (eq c 45)) ; check if hyphen
                            (or (and (> c 47) (< c 58))      ; check if number
                                (and (> c 64) (< c 91))      ; check if upper case letter
                                (and (> c 96) (< c 123)))))) ; check if lower case letter
           (set 'i (+ i 1)))))) ; increment

8

ルールの変更により、この答えはもはや競争力のないものになりました:(

C、98

main(a,n){printf("%d",scanf("%8x-%4hx-%4hx-%4hx-%4hx%8x%n%c",&a,&a,&a,&a,&a,&a,&n,&a)==6&&n==36);}

ほぼ自明です。%n形式指定子は、バイト数は36であるべきで、これまで読み取る与える scanf()最終6.なければならない戻り一致項目の数、%c何も一致していなければなりません。含まれている場合は、末尾にテキストがあり、scanf()7が返されます。

コンパイルし-wて厄介な警告を抑制します(いくつかあります)。


6

JavaScript ES6、70 83

バグを見つける(およびいくつかの改善と修正を提案する)@Qwertiyへの

Thx @CᴏɴᴏʀO'Bʀɪᴇɴ2バイト保存

他の9バイトは、長さのチェックを簡素化して節約しました(最初のドラフトでは複雑な方法短くなりましたが、現在はそうではありません)

u=>u.split`-`.every((h,l,u)=>u[4]&&-`0x${h}1`&&h.length-'40008'[l]==4)

説明した

u=>u.split`-` // make an array splitting at '-'
.every( // for every element the following must be true
 (h,l,u)=> // h is the element, l is the index, u is the whole array
 u[4] // element 4 must be present (at least 5 element in array)
 && -`0x${h}1` // element must be a valid hex string with no extraneous blanks (else NaN that is falsy)
 // get requested length from index (8,4,4,4,12 sub 4 to put in 1 char)
 // a 6th elements will be rejected as undefined != 4
 && h.length-'40008'[l]==4// then check element length
)

テストスニペット

f=u=>u.split`-`.every((h,l,u)=>u[4]&&-`0x${h}1`&&h.length-'40008'[l]==4)

console.log=x=>O.innerHTML+=x+'\n'

;[
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034',true],
  ['0fce98ac-1326-4c79-8ebc-94908da8b034',true],
  ['0FCE98ac-1326-4c79-8EBC-94908da8B034',true],
  ['00000000-0000-0000-0000-000000000000', true],
  ['ffffffff-ffff-ffff-ffff-ffffffffffff', true],
  ['0GCE98AC-1326-4C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-13264C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-13264-C79-8EBC-94908DA8B034',false],
  ['0FCE98ACD-1326-4C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-1326-4C79-8EBC',false],
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034-',false],
  ['00000000-0000-0000-000 -000000000000', false],
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034-123',false],
].forEach(x=>{
  var t=x[0], r=f(t), k=x[1]
  console.log('Test '+t+' result '+r+(r==k?' ok':' fail'))
})
<pre id=O></pre>


-1-('0x'+h)=>1/('0x'+h)
Qwertiy

真のために:私の以前のバージョンと同じ問題00000000-0000-0000-000 -000000000000
Qwertiy

いいえ。しかし、間違ったテストを追加しました。先頭のスペースは問題ではありませんが、数字に変換するときに文字列がトリミングされるため、末尾のスペースは問題になります。上記の私のコメントをテストでご覧ください。
Qwertiy

'00000000-0000-0000-000 -000000000000'が表示されるようになりました@Qwertiy 4ではなく3つのゼロを見逃しました
edc65

1
@Stefnotch私は同意しません。外のevery呼び出しはu、文字列ではなく配列である
edc65

5

ルールの変更により、この答えはもはや競争力のないものになりました:(

Pure Bash(外部ユーティリティなし)、78

printf -vv %8s-%4s-%4s-%4s-%12s
p=${v// /[[:xdigit:]]}
[ "$1" -a ! "${1/$p}" ]

コマンドラインから入力を取得します。

  • printf次の文字列を構築します- - - -
  • p=行は、次のパターンにこれを変換します:[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]。これは、正規表現に酷似していることに注意してください。ただし、このコンテキストではありません。これは、シェルパターンマッチングのパターンです。これは正規表現に概念が似いますが、異なる構成(および構文)です。
  • 最後の行は、
    • 入力は空ではありません
    • 入力文字列からパターンを引き出して空の文字列を生成する場合

シェルと同じように、戻りコード0は成功/ TRUEを示し、1は失敗/ FALSEを示します。リターンコードはecho $?、スクリプトの実行後に検査できます。


1
シェルパターンマッチングは正規表現の構文に従わない場合がありますが、文字クラスは間違いなくPOSIX正規表現の定義と構文を使用します。とにかく、それが受け入れられるかどうかを決めるのはOP次第です。
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳正規表現にはPosix文字クラスが含まれる場合がありますが、Posix文字クラスを使用するものが正規表現であることを意味するとは思いません。別の例でtrもPosix文字クラスを使用していますが、正規表現パーサーではありません。
デジタル外傷

例えばprintf形式のような、無駄な二重引用符を避けることで、いくつかの文字を削ることができます。
イェンス

私は明確に挑戦を更新しました-正規表現が禁止された理由は、六角パターンがUUIDを一致させるために使用することができなかったので、それを作ることだった
Jojodmo

4

Jolf、32バイト

ここで試してみてください!

 eGi'-DN&bH*28=lH.[8,4,4,4,12]S}
 e                               Property "e"very of next object
  Gi'-                           Split i at hyphen
      DN                       } every comparison function
        &                        logical conjugation of next two arguments
         bH*28                   base 16 of H (first arg); is NaN (falsey) if invalid
              =                  equality of next two items
               lH                the length of H (first arg)
                 .            S  the Sth (index) member of the object inbetween
                  [8,4,4,4,12]   array of lengths

私のコードのエラーのため、これは予想よりも長くなっています。:( [8,4,4,4,12] べきと同じである{8444*26}が、}また、機能の閉鎖である:P


2
作成した言語に曖昧なコマンドがあるため、必要以上に長くなっていますか?:P
Rɪᴋᴇʀ

@RikerW軽微なセマンティックエラー。現在修正されています。
コナーオブライエン

4

MATL、55バイト

jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$

Yb関数(strsplit)はやや似てregexp(..., 'split')いるため、使用を控えました。これは、インデックス付けと文字比較のみを使用します。

>> matl
 > jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$
 > 
> This is a test
0

>> matl
 > jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$
 > 
> D293DBB2-0801-4E60-9141-78EAB0E298FF
1

説明

jt                     % input string, duplicate
tn36=?                 % if length is 36
  [9,5,5,5]XsXK        % build and copy indices of required '-' positions
  )45=?                % if those entries are indeed '-'
    36:Km~)            % logical index of remaining positions
    4Y2'A':'F'h        % allowed chars in those positions
    m?                 % if all those entries are legal: do nothing
    }                  % else
      F                % false value
    ]                  % end
  ]                    % end
]                      % end
N~                     % true if stack is empty
1$                     % display last result only

3

CJam、52 42バイト

qeu__{A7*)<},\'-/83 3b{)4*}%.{\,=}[1]5*=*=

オンラインでお試しください。trueの場合は元の文字列を出力し、falseの場合は空の文字列を出力します(これは許可されます)。

説明:

qeu__                                      e# Take input, make 2 copies
     {A7*)<},\                             e# Remove invalid characters from first copy
              '-/                          e# Split top of stack on '-
                 83 3b{)4*}%               e# Array of group lengths: [8 4 4 4 12]
                            .{\,=}[1]5*=   e# Compare two arrays, return true if group lengths are correct
                                        *= e# Multiply this value by original string (0 = empty string, 1 = same string)

A7*)<スペースのように、多くの無効な文字を削除しないであろう、+?...
マーティン・エンダー

@MartinBüttneroh shoot ...気づかなかったので、数分で修正できます。
GamrCorps

3

ジュリア、86バイト

s->(t=split(s,"-");map(length,t)==[8,4,4,4,12]&&all(i->!isnull(tryparse(Int,i,16)),t))

これは、文字列を受け入れてブール値を返す匿名関数です。呼び出すには、名前を付けf=s->...ます。

ゴルフをしていない:

function f(s::AbstractString)
    # Split the input into an array on dashes
    t = split(s, "-")

    # Ensure the lengths are appropriate
    ok1 = map(length, t) == [8, 4, 4, 4, 12]

    # Ensure each element is a valid hexadecimal number
    ok2 = all(i -> !isnull(tryparse(Int, i, 16)), t)

    return ok1 && ok2
end

3

C#196バイト

using System.Linq;class P{bool T(string v){var r=v.Length==36;for(var i=0;i<v.Length;i++)r&=new[]{8,13,18,23}.Any(t=>t==i)?v[i]=='-':v[i]>47&&v[i]<58|v[i]>64&&v[i]<71|v[i]>96&&v[i]<103;return r;}}

ゴルフをしていない:

using System.Linq;
class P
{
    public bool T(string v)
    {
        var r = v.Length == 36;
        for (var i = 0; i < v.Length; i++)
            r &= new[] { 8, 13, 18, 23 }.Any(t => t == i) 
                ? v[i] == '-' 
                : v[i] > 47 && v[i] < 58 | v[i] > 64 && v[i] < 71 | v[i] > 96 && v[i] < 103;
        return r;
    }
}

メソッドTはnull以外の任意の文字列で呼び出すことができtruefalseそうでない場合は有効なGUID を返します。これは一定時間の検証です。3つの文字のコストであなたは方法(変更早期終了することができますi < v.Lengthしますi < v.Length && r)。

後でバイトカウントをさらに下げようとします。

私は明らかにそのGuid.ParseExact方法のどこに面白さがあるのか​​を無視しています。ここでは、86バイトでさらにゴルフを試みることなく、次のようになります

using System;class P{bool T(string v){Guid x;return Guid.TryParseExact(v,"D",out x);}}

ゴルフをしていない:

using System;
class P
{
    bool T(string v)
    {
        Guid x;
        return Guid.TryParseExact(v, "D", out x);
    }
}

2

Python 2、99 112バイト

def f(u):
 try:u=u.split()[0];int(u.replace('-',''),16);print[8,4,4,4,12]==map(len,u.split('-'))
 except:print 0

有効な入力では、印刷しTrueます。無効な入力では、無効である理由に応じて、Falseまたはを出力し0ます。Falseそして、0Pythonで両方falseyあります。

関数は3つのことを確認する必要があります。

  • ハイフン以外の文字はすべて数字または ABCDEF
  • 正確に4つのハイフンがあります
  • 最初のハイフンの前に8文字、最後のハイフンの後に12文字、他の2つのハイフンの間に4文字あります

以下に、それらのチェック方法を示す内訳を示します。少し古いですが、おなかがすいているので、後で更新します。

def f(u):
    try:
        int(u.replace('-',''),16) # Remove all hyphens from the string and parse what's
                                  # left as a base 16 number. Don't do anything with this
                                  # number, but throw an exception if it can't be done.

        return[8,4,4,4,12]==map(len,u.split('-')) # Split the string at each hyphen and
                                                  # get the length of each resulting
                                                  # string. If the lengths == [8,4,4,4,12],
                                                  # there are the right number of groups
                                                  # with the right lengths, so the string
                                                  # is valid.
    except:
        return 0 # The only way to get here is if the string (minus hyphens) couldn't be
                 # parsed as a base 16 int, so there are non-digit, non-ABCDEF characters
                 # and the string is invalid.

私はあなたが両方のインスタンスを置き換える場合は、2つのバイトを保存することができますねreturnprint。(この場合print、Python 3では動作が異なるため、間違いなくPython 2になります。)
mathmandan

1
Python 3では機能しませんmap。リストではなく「マップオブジェクト」を返すようになったためです。
ティムペデリック

このint関数はスペースを許可するため、これはpython 2(おそらく3も)では機能しません0FCE98ac-1326-4c79-8EBC-94908da8B03。可能であれば、ここで削除されたPyth回答のコメントを参照してください。
ブルー

2

Python 2、57バイト

組み込みの良さに感謝します!-文字列を引用符で囲んでください。

import uuid
try:uuid.UUID(input());print 1
except:print 0

5
リンク先のドキュメントによると、それは1入力用に印刷されます12345678123456781234567812345678
デニス

これは働いていた場合は、実行してバイトを保存することができるだろうtry:print uuid.UUID(input())必要だとすべてがあなたがtruthy値を印刷しているため
undergroundmonorail

2
このプログラムは多くのUUID形式を受け入れますが、質問ではハイフンを含む36文字のUUID形式のみが必要です。
ジェイコブクラル

2
入力文字列が文字列に変換し直されたuuidと等しいかどうかをチェックすることにより、更新されたルールに対処してこれを救うことができます。すぐに真実の価値を与えます。
agtoever

2

Pyth、39バイト

&&!+1xzd.xi:zK\-k16ZqxKc+zK1mid36"8dinz

ここで試してみてください


「ここで試してみてください」リンクにの\文字がないK\-kため、そのまま実行できません。
アレックス

これは現在修正されています
ブルー

2

Perl 6の 83の   67バイト

# 83 bytes
{
  (
    my@a=.uc.split('-')
  ).map(*.comb)⊆('0'..'9','A'..'F')
&&
  @a».chars~~(8,4,4,4,12)
}

# 67 bytes
{
  (
    $/=.split('-')
  ).map({:16($_)//|()})==5
&&
  $/».chars~~(8,4,4,4,12)
}

(カウントには必要ないため、改行やインデントは含まれません)

使用法:

# give it a name
my &code = {...}

say map &code, «
  D293DBB2-0801-4E60-9141-78EAB0E298FF
  0FCE98AC-1326-4C79-8EBC-94908DA8B034
  0fce98ac-1326-4c79-8ebc-94908da8b034
  0FCE98ac-1326-4c79-8EBC-94908da8B034
  00000000-1326-4c79-8EBC-94908da8B034
»;
# (True True True True True)

say map &code, «
  0GCE98AC-1326-4C79-8EBC-94908DA8B034
 '0FCE98AC 1326-4C79-8EBC-94908DA8B034'
  0FCE98AC-13264C79-8EBC-94908DA8B034
  0FCE98AC-13264-C79-8EBC-94908DA8B034
  0FCE98ACD-1326-4C79-8EBC-94908DA8B034
  0FCE98AC-1326-4C79-8EBC-94908DA8B034-
  0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
»;
# (False False False False False False False)

2

Common Lisp-161

(lambda(s &aux(u(remove #\- s)))(and(=(length s)36)(=(length u)32)(every(lambda(p)(char=(char s p)#\-))'(8 13 18 23))(ignore-errors(parse-integer u :radix 16))))

trueの場合に返される値は、数値としてのハッシュであり、有用な結果です。

非ゴルフ

(defun uuid-p (string &aux (undashed (remove #\- string)))
  (and
   ;; length of input string must be 36
   (= (length string) 36)

   ;; there are exactly 4 dashes
   (= (length undashed) 32)

   ;; We check that we find dashes where expected
   (every (lambda (position)
            (char= (char string position) #\-))
          '(8 13 18 23))

   ;; Finally, we decode the undashed string as a number in base 16,
   ;; but do not throw an exception if this is not possible.
   (ignore-errors
    (parse-integer undashed :radix 16))))

@Jojodmoはい、間違いなく!ありがとう
coredump

2

F#44文字

fun s->System.Guid.TryParseExact(s,"D")|>fst

F#ではout、outパラメーターを省略することでパラメーターを持つ関数を呼び出すことができます。戻り時の値は、関数の真の戻り値と組み合わされてタプルになります。

ここでは、タプルがfst関数にパイプされ、最初のメンバーが返されます。この場合、TryParseExactのブール値の戻り値で、呼び出しの成功または失敗を示します。

正しい形式のチェックとして、true文字列の長さが36文字の場合にのみ戻ります。

RobIIIのC#の答えを見る前は、TryParseExactを使用することを考えていなかったため、私の答えは3文字長くなることでした。

fun s->System.Guid.TryParse s|>fst&&s.Length=36

TryParse(string, Guid) 次の形式の入力を受け入れます。

00000000000000000000000000000000 
00000000-0000-0000-0000-000000000000 
{00000000-0000-0000-0000-000000000000} 
(00000000-0000-0000-0000-000000000000)
{0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}

これらのうち、2番目の文字のみが36文字です。


2

Python 2、93 89 85バイト

lambda u:(set(u)<=set("-0123456789abcdefABCDEF"))*map(len,u.split("-"))==[8,4,4,4,12]

このmap()呼び出しは、セクションが正しい長さであることを保証し、all()各文字がハイフンまたは任意の大文字の16進数であることをテストします。ジェネレーター式は、文字列全体を反復処理することで各文字をテストしているため、最もパフォーマンスの高いメソッドではありませんが、テストケースを満たす必要があります。

>>> f=lambda u:(set(u)<=set("-0123456789abcdefABCDEF"))*map(len,u.split("-"))==[8,4,4,4,12]
>>> testcases = """\
... D293DBB2-0801-4E60-9141-78EAB0E298FF
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034
... 0fce98ac-1326-4c79-8ebc-94908da8b034
... 0FCE98ac-1326-4c79-8EBC-94908da8B034
... 00000000-0000-0000-0000-000000000000""".splitlines()
>>> failcases = """\
... 0GCE98AC-1326-4C79-8EBC-94908DA8B034
... 0FCE98AC 1326-4C79-8EBC-94908DA8B034
... 0FCE98AC-13264C79-8EBC-94908DA8B034
... 0FCE98AC-13264-C79-8EBC-94908DA8B034
... 0FCE98ACD-1326-4C79-8EBC-94908DA8B034
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034-
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
... 00000000-0000-0000-000 -000000000000
... 00000000-0000-0000- 000-000000000000""".splitlines()
>>> all(f(u) for u in testcases)
True
>>> any(f(u) for u in failcases)
False
>>> 

最短の正しいPythonの答えがなぜ投票されたのか、誰もが考えていますか?説明が足りない?
rsandwick3

Jojodmo-これについて混乱が生じた場合は、提案された変更を拒否しませんでした-AFキャラクターを見逃していたため、すでに編集を行っていました(ネガティブケースをテストしているウィンドウからコピーしました) -私はそれが提起されたことさえ知らずにあなたの提案を拒否しました。あなたがそれを提案したことを私が知った時までに、@ nimiはすでに見出しを修正していました。それがこのコミュニティに非常に貧弱に反映されるので、私はそれが下票とは何の関係もないことを非常に願っています。とにかく、私はそれが他のことだと仮定し、もう少し説明を追加します。
rsandwick3

2
ブロックf=内の文字列の前後のスペースを削除できallます。
FryAmTheEggman

ああ、すてきなキャッチ-編集
rsandwick3

1
all(..)包含テストを設定するように変換することにより、8(または6、括弧の追加が必要な場合があります)バイトを節約できますset(u)<=set("-0123456789abcdefABCDEF")
409_Conflict

1

SAS、171 144 141

data;infile stdin;file stdout;input a$9b$14c$19d$24;e=(a!!b!!c!!d='----')*length(_infile_)=36*(1-missing(put(input(compress(_infile_,,'adk'),$hex32.),$hex32.)));put e;run;

実際には、この特定の言語のあまり知られていない機能の1つであるstdinとstdoutを使用します。これまでに示した例で機能しますが、すべてのケースで機能するわけではありません。おそらく改善することができます。

より良いアプローチ-一度に1つのキャラクター:

data;infile stdin;file stdout;do i=1 to 37;input@i c$1.@;a+ifn(i in(9,14,19,24),c='-',n(input(c,hex.))-36*(i>36&c^=''));end;b=a=36;put b;run;

中央の表現からさらに6キャラクターをゴルフしました!

ゴルフをしていない:

data;
infile stdin;
file stdout;
do i=1 to 37;
input@i c$1.@;
a+ifn(i in(9,14,19,24),c='-',n(input(c,hex.))-36*(i>36&c^=''));
end;
b=a=36;
put b;
run;

これにより、ログにかなりの数の警告とメモが生成されますが、それらをstdoutまたはstderrに出力しないため、これは公平なゲームだと思います。


1

C、391バイト

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define F printf("0")
#define T printf("1")
#define E return 0
main(){char s[99],*t;int k=1,l,i;scanf("%99[^\n]",s);if(s[strlen(s)-1]=='-'){F;E;}t=strtok(s,"-");while(t!=NULL){for(i=0,l=0;t[i]!=0;i++,l++){if(!isxdigit(t[i])){F;E;}}if((k==1&&l!=8)||((k>1&&k<5)&&l!=4)||(k==5&&l!=12)){F;E;}k++;t=strtok(NULL,"-");}if(k==6){T;E;};F;}

1

MATLAB、126バイト

function f(a)
b='-';if length(a)==36&&a(9)==b&&a(13)==b&&a(17)==b&&a(21)==b;a(a==b)=[];if any(isnan(hex2dec(a)));0;end;1;end;0

1

Python 3、134バイト

def a(i):
 try:l=[1+int(k,16)and(len(k)==c)for k,c in zip(i.split("-"),[8,4,4,4,12])];return(len(l)==5)&(0 not in l)
 except:return 0

int(k、16)は、kを基数16のintにキャストしようとします。0-9a-fA-F-以外の文字では失敗します。その場合、偽の0を返します。そのintに1を追加すると、保証された真実の値が得られます。str.split()ですべてのハイフンを取り除いたため、値-1を取得できず、0以外のintはすべて真実です。


1

C関数、102

ルールの変更により、以前のc scanf()ベースの回答が許可されなかったため、競合を許可する必要があると考えられる別のc回答isxdigit()次に示します。

i;f(char *s){for(i=8;i<24;i+=5)s[i]=s[i]-45?1:s[i]+3;for(i=0;isxdigit(s[i]);i++);return i==36&&!s[i];}

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

  • -関連する位置で文字(ASCII 45)を確認します-その場合は、0s(ASCII 48(= 45 + 3))に置き換えます
  • 各文字をチェックして文字列を歩く isxdigit()
  • 文字列の長さが36で最終文字がNULの場合、TRUEを返します。

1

バッチ、148 139 + 2 = 150 141のバイト

@set/pu=
@for %%d in (1 2 3 4 5 6 7 8 9 A B C D E F)do @set u=!u:%%d=0!
@if -!u!==-00000000-0000-0000-0000-000000000000 exit/b0
@exit/b1

への/vスイッチを使用する必要があるため、2バイトを追加しましたCMD.EXE

成功するとERRORLEVEL 0で終了し、失敗すると1で終了します。

編集:主に:=大文字と小文字を区別しないためにいくつかのバイトを保存しましたが、他の微調整もありました。


1

Java、345バイト

interface q{static void main(String[]a){int i=-1;char[]b=a[0].toCharArray();java.io.PrintStream u=System.out;if(b.length>36||b.length<36)u.print(1<0);if(b[8]!='-'||b[13]!='-'||b[18]!='-'||b[23]!='-')u.print(1<0);while(++i<b.length){if(i!=8&&i!=13&&i!=18&&i!=23){if(!((b[i]>='0'&&b[i]<='F')||(b[i]>='a'&&b[i]<='f')))u.print(1<0);}}u.print(1>0);}}

入力は最初のコマンドライン引数です。出力はエラーコードです(0は有効なUUID、1は無効であることを意味します)

コメントなしでゴルフ:

interface q {
    static void main(String[] a) {
        int i = -1;                                                             // Index
        char[] b = a[0].toCharArray();                                          // Characters from input
        java.io.PrintStream u = System.out;                                     // STDOUT
        if (b.length > 36||b.length < 36)                                       // If input length is not 36
            u.print(1<0);                                                       // Invalid
        if (b[8]!='-'||b[13]!='-'||b[18]!='-'||b[23]!='-')                      // If hasn't got separators at correct positions
            u.print(1<0);                                                       // Invalid
        while (++i<b.length) {                                                  // Iterate over all characters
            if (i!=8 && i!=13 & i!=18 && i!=23) {                               // If not at separator indexes
                if ( !( (b[i]>='0'&&b[i]<='F') || (b[i]>='a'&&b[i]<='f') ))     // If incorrect hexadecimal number
                    u.print(1<0);                                               // Invalid
            }
        }
        u.print(1>0);                                                           // Valid
    }
}

編集:STDOUTの部分に気づかなかった。エラーが修正されました。


いいね!if(b.length>36||b.length<36)単純に置き換えることができif(b.length!=36)ます。また、真理値を印刷できるため、の0代わりに1<0、およびの1代わりに単純に印刷できます1>0
ジョジョドモ

@Jojodmo投票に基づいて、真理値はif(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); } Javaの形式であるため、ブール値は真理値ですが1、そうで0はありません。挑戦のOPのようなものを言うときにのみ:「あなたの出力は、真/の偽、0/1、空にすることができます/空でない;あなたが使用しているものを指定限り。」あなたが実際に使用することができます0し、1代わりにtrue/falsetruthyとして/ falsey値。
ケビンCruijssen

1
クッキーのゴルフのヒントに関しては、@ Jojodmoは実際にそれを置き換えるのに適していif(b.length!=36)ます。to と同様に、複数の場所に配置||できます。することができます; に置き換えることができます; 可能性があります(102の可能性がありますが、同じバイトカウントであるため、問題ではありません)。私はあなたがどのように使用したかが好きです、私はそれを覚えておくべきです!ほんとありがと。|&&&if(...!='-')if(...!=45)int i=-1; ... while(++i<b.length){for(int i=-1;++i<b.length;){'F'70'f'java.io.PrintStream u=System.out;
ケビンCruijssen

1

Swift 3、50バイト

文字列を渡す s

import Foundation
print(UUID(uuidString:s) != nil)

1

PHP、109バイト

trueの場合は1、falseの場合は0を出力します

for($t=($l=strlen($a=$argn))==36;$i<$l;$i++)$t*=$i>7&$i<24&!($i%5-3)?$a[$i]=="-":ctype_xdigit($a[$i]);echo$t;

$i>7&$i<24&!($i%5-3) 5バイト短い in_array($i,[8,13,18,23])

112バイト

echo array_filter(str_split($argn),function($i){return!ctype_xdigit($i);})==[8=>"-",13=>"-",18=>"-",23=>"-"]?:0;

113バイト

echo array_diff(str_split(strtolower($argn)),array_map(dechex,range(0,15)))==[8=>"-",13=>"-",18=>"-",23=>"-"]?:0;

0

Java、172バイト 168バイト(Thanks Wheat Wizard)

私はjava.util.UUIDを使用していたのでちょっと気味が悪いが、ここに行く:

import java.util.UUID;class ValidUUID{public static void main(String[] a){try{UUID.fromString(a[0]);System.out.println(1);}catch(Exception e){System.out.println(0);}}}

ゴルフされていないバージョン:

import java.util.UUID;

class ValidUUID {

    public static void main(String[] a) {
        try {
            UUID.fromString(a[0]);
            System.out.println(1);
        } catch(Exception e) {System.out.println(0);}
    }
}

サイトへようこそ!私はあなたが間にスペースを削除することができると思うtry{
小麦ウィザード

@WheatWizardありがとう:Dまた、 "0と1の周りを削除できることに気づいた
ryxn

2
String[]との間のスペースを削除できるはずaです。また、あなたは交換することができるはずprintlnprint
clismique

1
クラス名は1文字にすることができます。java.util.UUID.fromStringインポートする代わりに使用できます。
ポケ

0

AWK、98バイト

BEGIN{FS=""}{for(j=4;k<NF;){h+=(j+=5)<25?$j=="-":0
s+=strtonum("0x"$++k 1)>0}$0=h+s==36&&NF==36}1

単に各文字で行を分割し、各文字が16進数であるかどうか、および適切な場所にハイフンがあるかどうかを確認します。 strtonum無効な文字をに変換します00m(および任意に選択された無効な文字)を比較するには、追加の手順が必要です。幸いにも01有効な16進数ですが、そうでm1はありません。

最初は2つのforループを作成しましたが、それらをまとめて1バイト節約しました。:)

注:GAWK入力を16進数として読み取ることができますが、これには非常に長いコマンドラインオプションが必要です。

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