语言是什么?


17

最近,PPCG设计排行榜在解析答案html标头时遇到了一些麻烦

在此挑战中,您将在解析答案标题时自己动手。


示例测试用例

这些示例输入不是实际的测试用例),只是您可以了解输入可能

Input: <h1>Python 3, 32 bytes</h1>
Desired Output: Python 3

Input: <h1>JavaScript, 13 chars / 32 bytes</h1>
Desired Output: JavaScript

Input: <b>VeryBadlyFormattedHeader v3 : (32 bytes)</b>

规格

您的程序应小于等于150个字节

系统会为您提供一行答案标题的html,您需要尽最大努力来成功提取该语言。输入内容可能包含unicode字符。

输出案例很重要。

测验

Github Gist测试用例

每行只有一个测试用例。格式为:

<lang_name> - <rest_of_the_line_is_the_header>

计分

你的分数是:

 Number Correct
----------------
  Total Number

(这是一个百分比)

抢七局是最短的代码。


应该有一个像最短代码这样的平局决胜局,因为100%的得分是可以实现的。
user81655 '16

1
#测试案例中甚至没有出现最常见的标头样式?
edc65 '16

那么语言通常是输入的第一个单词吗?
TanMath

@ edc65我相信这是解析答案的HTML输出,而不是Markdown源。
Kroltan '16

5
用正则表达式解析HTML?接下来怎么办?
尼尔

Answers:


11

视网膜0.8.2,100%,75 71 70 68 67 64 59 53 51字节

<.*?>

(,| [-&(–5]| [0-7]\d)(?! W|...\)).*

2 |:

现在这基本上是代码高尔夫,所以我不得不切换语言。

在线尝试!

验证

$ wget -q https://gist.githubusercontent.com/vihanb/1d99599b50c82d4a6d7f/raw/cd8225de96e9920db93613198b012749f9763e3c/testcases
$ grep -Po '(?<= - ).*' < testcases > input
$ grep -Po '^.*?(?= - )' < testcases > output
$ mono retina/Retina.exe headers.ret < input | head -n -1 | diff -s - output
Files - and output are identical

怎么运行的

该代码由三个简单的替换(或消除)组成。我们没有尝试匹配语言名称,而是去除了构成它一部分的输入字符串的所有部分。

  1. <.*?> 将与所有HTML标签匹配,因此替换操作会将其从输入中删除。

    .*?可以匹配任意数量的字符,但是由于?使量词变得懒惰,它将匹配可能允许整个模式匹配的最小数量。这样可以避免删除整个输入(始终以a开头<和结尾)>

    现在,语言名称以其余修改后的输入字符串的第一个字符开头。

  2. 在使用该语言的名称之后,我们几乎总是会找到以下结尾之一:

    ,-&(5,或一个空格,接着两位数字。

    前两个结尾很常见,Python 2 &amp; PuLP...应将其解析为Python 2Ruby (2.2.2p95)...as Ruby>PHP – 3302 bytesas PHPPerl 5...as Perl

    (,| [-&(–5]| \d\d).* 会匹配所有这些结尾(及其后的所有字符),但会导致一些误报:

    • ,将与语言名称中的逗号匹配Help, WarDoq!

    • (将匹配的版本JavaScript (ESx)Java (1.8)

    • \d\d将与中的版本匹配Ti-Basic 84

    我们可以使用[0-7]\d代替来解决第三个问题\d\d,以避免匹配8in 84

    对于其他有问题的情况,我们使用负前瞻(?! W|...\)),如果前面的模式后面跟着W(如Help, WarDoq!)或正好三个字符和右括号(如(ES6)(1.8)),则将阻止匹配。

    放在一起,将所有(,| [-&(–5]| [0-7]\d)(?! W|...\)).*匹配的语言名称。

  3. 我们剩下两个问题案例:

    <h1>Python <s>2</s> 3, <s>255</s> <s>204</s> <s>180</s> 178 bytes</h1>
    <h1><a href="http://sylwester.no/zozotez/" rel="nofollow">Zozotez Lisp</a>: 73</h1>
    

    被解析为

    Python 2 3
    Zozotez Lisp:
    

    我们可以通过删除:输出来修复第一个,而通过从输出中删除来解决第二个。

    这可以通过替换2 |:为空字符串来实现。


16

Bash,100%,100字节

sed sX..s.2./s.XX|grep -Po '(?<=>)[^<]+?(?=(,(?! W)| [-&–5]| ?<| [0-79]\d| ?\((?!E|1\.)))'|head -1

Ideone上在线尝试。

验证

$ wget -q https://gist.githubusercontent.com/vihanb/1d99599b50c82d4a6d7f/raw/cd8225de96e9920db93613198b012749f9763e3c/testcases
$ grep -Po '(?<= - ).*' < testcases > input
$ grep -Po '^.*?(?= - )' < testcases > output
$ while read line; do bash headers.sh <<< "$line"; done < input | diff -s - output
Files - and output are identical

2
呵呵,我真的以为这困难……干得好!
Downgoat


4

Jolf,13字节,85.94%,无竞争

ρΥpΔid=',H',E
  pΔi         remove all HTML tags from input, preserving content
 Υ   d=',H     slice from beginning until a member is a comma
ρ         ',E  replace said comma with the empty string  

我的计算机上有此更新。令我烦恼的是,我忘记为解释器更新相应的代码。我不想拍摄100%。也许每个人都应该将其标头设置为相同的\ _(\)_ /¯


剥离标签是一个好主意。那在我的视网膜答案中节省了三个字节。
丹尼斯

@丹尼斯谢谢!很高兴它有所帮助。
科纳·奥布莱恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.