44
1
Given a string input, write a program that prints a truthy value to STDOUT or equivalent if the input is a valid UUID, without using regexes.
A valid UUID is
32 hexadecimal digits, displayed in five groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36 characters (32 alphanumeric characters and four hyphens).
Test Cases
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)
Rules
- Regular Expressions are not allowed
- Literal pattern matching which is like a regex is not allowed. For example, using
[0-9a-fA-F]
or other hexadecimal identifiers (we'll call thisn
) and then matchingnnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn
orn[8]-n[4]-n[4]-n[4]-n[12]
is not allowed - The input may either be taken from
STDIN
or as an argument to a function - The input is case insensitive
- It is safe to assume that the input will not contain linefeeds or newlines.
- The input may contain any printable ASCII characters (spaces included)
- A truthy value must be printed to
STDOUT
or equivalent if the input is a valid uuid - A falsey value must be printed to
STDOUT
or equivalent if the input is not a valid uuid - If using a function, instead of using
STDOUT
, the output can be the return value of the function - The truthy/falsey value cannot be printed to
STDERR
. - Standard loopholes apply
- This is code-golf, so the shortest program in bytes wins. Good luck!
Leaderboard
This is a Stack Snippet that generates both a leaderboard and an overview of winners by language.
To ensure your answer shows up, please start your answer with a headline using the following Markdown template
## Language Name, N bytes
Where N is the size, in bytes, of your submission
If you want to include multiple numbers in your header (for example, striking through old scores, or including flags in the byte count), just make sure that the actual score is the last number in your header
## Language Name, <s>K</s> X + 2 = N bytes
var QUESTION_ID=66496;var OVERRIDE_USER=20634;function answersUrl(e){return"//api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"//api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(-?\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
32
Poor Retina. D:
– BrainSteel – 2015-12-13T19:44:47.440Related – FryAmTheEggman – 2015-12-13T20:44:17.930
8
Just for reference, I can come up with a 28-byte Retina solution. (So not a crazy advantage over the golfing languages although it would currently be leading.)
– Martin Ender – 2015-12-13T22:53:00.8075
Are Lua's patterns allowed? They are certainly not regular expressions.
– manatwork – 2015-12-14T09:50:41.080You have to make language list case insensitive... – Qwertiy – 2015-12-14T20:28:31.590
What should the output be for
0FCE98AC13264C798EBC94908DA8B034
? – Jacob Krall – 2015-12-15T16:27:07.567Expanding the question - what should the output be for input.length!=36? e.g.
{dddddddd-dddd-dddd-dddd-dddddddddddd}
,{0xdddddddd, 0xdddd, 0xdddd,{0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd}}
– Jacob Krall – 2015-12-15T16:29:01.2731@JacobKrall I'm pretty sure it's "falsy" to all of your questions. I think the challenge is fairly clear that only strings of the form
\h{8}-\h{4}-\h{4}-\h{4}-\h{12}
(where\h
is a hexadecimal digit) are valid. – Martin Ender – 2015-12-15T17:24:09.370@MartinBüttner: I agree, but there are currently several answers which use built-in
uuid
constructors, which accept other formats. – Jacob Krall – 2015-12-15T17:26:36.857@MartinBüttner If that's indeed the case, the question should be edited to explicitly state that it is expecting canonical-form parsing, and not just valid-UUID parsing.
0FCE98AC13264C798EBC94908DA8B034
is a valid UUID, just not in canonical form. – AdmBorkBork – 2015-12-15T18:52:39.840@Jojodmo Those test cases, particularly the one without hyphens, were added after a majority of answers were posted, mine included. Hence my asking for clarification. – AdmBorkBork – 2015-12-15T19:40:28.243
Are scanf()-style format specifiers also disgualified as being like a regex?
– Digital Trauma – 2015-12-15T22:08:58.547@Jojodmo I guess that disqualifies both my answers then :(. I'm still leaving them up though as I think this was not clear in the question as originally written. – Digital Trauma – 2015-12-15T23:48:23.453
@What about APIs like
– Digital Trauma – 2015-12-15T23:49:03.397isxdigit()
which operate on a single character at a time?@DigitalTrauma isxdigit would be fine. Also, I'm pretty sure you posted your answer before I added the part about literal pattern matching, so feel free to leave it up, just make sure you say that it is not competative – Jojodmo – 2015-12-15T23:51:25.317
Can answers use .NET languages and call System.Guid.TryParse? – phoog – 2015-12-17T05:52:45.313
@phoog Yes, but it has to only accept the format
8-4-4-4-12
– Jojodmo – 2015-12-17T06:40:36.277