马丁vs丹尼斯-第一轮:谁的代表更多?


33

我知道关于“世界上最好的两个代码高尔夫球手”存在很多挑战,但这是一个更加独特的问题,它是涉及其中两个的一系列(未来)挑战中的第一回合


您的任务是编写一个程序或函数,以在DennisMartin Ender之间返回两个不同的非空白ASCII字符串,这些字符串与运行该程序时享有较高声誉的字符串相对应。棘手的部分是,如果信誉相同(不太可能),则必须输出精确的字符串“ tie”,并且上述两个不同的非空白ASCII字符串应与“ tie” *不同

不能接受任何输入,例如用户名或用户ID。与往常一样,URL缩短器是被禁止的,常见的漏洞也是被禁止的。

例子:

Let the chosen string for Dennis be "D" and the chosen one for Martin Ender be "M" (should be specified)

If Dennis' rep > Martin Ender's rep => D
If it's the other way around => M
If it's a tie => tie 

重要!Dennis&Martin仅出于影响平局的目的投票投票,以测试以下解决方案,这是在Stack Exchange网络上禁止的有针对性的投票。如果要测试解决方案是否正确输出,tie则将其中的ID更改为您知道绑定的2个用户的ID。有关更多详细信息,请参见此Meta帖子

* 我想无论如何都不会使用它


33
“……世界上最好的两个代码管理员……” [引证需要]
马丁·恩德

9
我们是否可以假设他们在该社区中始终是第一和第二?
ovs '17

7
温馨提示:在整个Stack Exchange网络上禁止有针对性的投票。马丁投票和我的帖子只是为了测试提交到这一挑战不是允许的。
丹尼斯,

2
@Shaggy很高兴您添加了该笔记。希望所涉及的用户将停止这样做
Xcoder先生17年

1
对于顶部的@MartinEnder,不需要引用是众所周知的事实。
狮ry-恢复莫妮卡

Answers:


20

05AB1E65 64字节

码:

•в=6{•5ôvy’ƒËŠˆ.‚‹º.ŒŒ/†š/ÿ’.w’„Ö="ˆ"’¡1èт£þ}})ZQā*O<“D M·‡“#è

使用05AB1E编码。


说明:

•в=6{•将数字в=6{从255 转换为10,结果为1201208478。上半部分是丹尼斯(12012)的ID,下半部分是马丁(8478)的ID。分割成5个使用,得到以下数组:

['12012', '08478']

幸运的是,我们可以在Martin的ID中保留前导零,因为它仍然可以工作(在单击链接以查看前导零之前,请检查链接)。

现在,我们使用vy05AB1E代码遍历此数组并构造以下字符串:

’ƒËŠˆ.‚‹º.ŒŒ/†š/ÿ’  -->  codegolf.stackexchange.com/users/ÿ

ÿ迭代器的当前元素是(使用字符串插值)在线尝试!

构造链接后,.w从链接中读取所有数据,从而生成大量文本。为了从中抹去名声,我们需要分割字符串title="reputation"。或更压缩的版本:’„Ö="ˆ"’。分割这条字符串(带有¡),获取第二个元素(带有),并保留前100个字符(带有т£)。

现在,我们的抓取文本看起来像这样:

>
        139,883 <span class="label-uppercase">reputation</span>
   </div>

<div class="ba

这部分很容易,我们只需除去数字以外的所有内容即可保留信誉号,为此我们有一个内置(þ)。我们结束循环并将所有内容包装到一个数组中}})

最后,我们可以继续处理信誉编号:

ZQā*O<“D M·‡“#è   -   On stack: an array in the format [Dennis rep, Martin rep]

Z                 # Get the maximum of the array
 Q                # Check for equality with the array
  ā*              # Multiply by it's index (1-indexed)
    O<            # Sum and decrement by 1
      “D M·‡“#    # Push the array ['D', 'M', 'tie']
              è   # Get the element on the index of the sum

这会导致两种DMtie


2
我不知道05AB1E可以访问Internet API,这种回答让我感到惊讶=> +1
Xcoder先生17年

我一直喜欢您和其他人想出办法来获得一定数目的方法。:) +1 Btw是“ 第二个元素(带有1è) and keep the first **100 characters** (with т£ ”)应该完全位于代码块中,还是应该是“ 第二个元素(带有)并保留前100个字符(带有т£)。 ”而不是?一个错字,但如果它应该是这样的,我糊涂..
凯文Cruijssen

@KevinCruijssen嗯,我不知道那是怎么发生的,但是现在已经解决。感谢您的注意!:)
阿德南(Adnan)

似乎不正确(抱歉,我不知道如何更正此类代码)Dennis: 140,033Martin: 140,003,但是我在这里tio.run/nexus/05ab1e#@/…尝试了您的代码,它产生了tie。不是应该输出D吗?
艾迪(Eddie)

@Eddie .w需要Web访问,该访问受TIO限制(它在安全模式下运行05AB1E)。在离线解释器中,它应该可以工作。
阿德南

19

PowerShell的V3 +,147 123 119 103 101 96个字节

$a,$b=irm api.stackexchange.com/users/12012`;8478?site=codegolf|% I*|% r*n;$a-$b|% T*g "D;M;Tie"

使用true / false输出而不是名称保存了24个字节。

通过重组最终检查节省了另外4个。

通过仅从请求中获得两个用户的信誉节省了16,节省了|% r*n多次使用的麻烦,这也意味着我们可以摆脱一百万个括号和两个无用的变量。

-2感谢TessellatingHeckler-使用转义字符而不是两个双引号作为url,还@从数组中删除了不需要的(oopsie)

使用了一个.ToString我以前不知道的怪异技巧,直到TessellatingHeckler -5 推荐它,最后将其降至100以下。


返回名称的版本:

$a,$b=irm "api.stackexchange.com/users/12012;8478?site=codegolf"|% I*
if(($c=$a|% r*n)-eq($d=$b|% r*n)){"tie"}else{@(($a|% d*),($b|% d*))[$c-lt$d]}

由于参数名称的缩短,这看起来很混乱。

|% r*n出现的任何地方都会出现ReputatioN,并且|% d*Display_name

使用Invoke-RestMethod(别名irm)查询API,将命名为Items(使用赢得)的结果存储|% I*到两个变量$a&中$b,每个职业高尔夫球手使用一个变量,ToString|% T*g)技巧生成一个值DM或者Tie如果数字为奇/偶/零。


我没想到Powershell是最短的。+1
Rɪᴋᴇʀ

@Riker Pyth本来应该是,但是它有一个可怕的错误。
暴民埃里克(Erik the Outgolfer)'17年

1
好,你赢了;我现在无法击败它!
毛茸茸的

9
所以你的代码是103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163字节长..?:P
完全人类的,

1
@TessellatingHeckler检查最后一位的答案,您知道答案在100以下!-从来不知道ToString使用+/-数字会那样工作,会记住未来。
colsw

16

Python 2,160字节

from requests import*
print cmp(*[get('http://api.stackexchange.com/users/12012;8478?%ssite=codegolf&filter=!9aK21rboZ'%s).text for s in'order=asc&',''])or'tie'

不是最短的Python答案,而是到目前为止没有做任何假设的最短的答案。

如果我1有更多代表,-1则打印。


14

的JavaScript(ES6),167 156 146 144个 141 132 103字节

愚蠢fetch及其愚蠢,昂贵的Promise链接!

假设当前允许,Dennis&Martin将始终是排名第二的用户。需要从的根目录运行api.stackexchange.com。返回包含(或JSON)对象的Promise对象(目前已达到共识),tie该对象或对象为当时拥有最多代表的对象。如果JSON对象未被视为有效输出,请为添加5个字节.link

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • 感谢Kevin建议我返回个人资料link而不是的第一个字母display_name,从而节省了11个字节,这也为他们提供了更好的针对将来的建议,以防他们更改用户名以相同的字母开头!
  • 在我的另一种解决方案上改编了kamoroso94的技巧,节省了5个字节。

试试吧

f=
_=>fetch`//api.stackexchange.com/users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
f().then(console.log)


另类

如果某个时候丹尼斯和马丁不在顶部,而我们仍然想知道谁之间的代表最多,那么我们将需要以下内容,但需要额外的10个字节。

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)

2
您可以更改.display_name[0].display_name,或者甚至更短的替代方案,这两种方案仍然是唯一的:.link。;)或只是整个JSON,但是我不确定它是否适合警报弹出窗口。
凯文·克鲁伊森

谢谢,@KevinCruijssen; 我必须使用用户名的摘录,因为马丁的用户名包含空格,这是不允许的。使用时请大声疾呼link,但是我使用的是经过筛选的API查询,只返回我需要的信息。
毛茸茸的

@KevinCruijssen在处理AJAX返回时,我已经将整个HTML页面转储到警报弹出窗口中。它可以处理。
Draco18s

@ Draco18s,alert带有JSON对象,将仅显示[object Object]
毛茸茸的

@Shaggy是的,的确如此。
Draco18s

9

Python 3中,160个 157 151字节

from requests import*
a,b,*c=get('http://api.stackexchange.com/users?site=codegolf').json()['items']
r='reputation'
print(['tie',a['link']][a[r]>b[r]])

-3个字节,感谢@KevinCruijssen

向具有较高声誉的用户打印链接

假设它们在#1和#2上


不作任何假设,Python 2,157个字节

from requests import*
a,b=get('http://api.stackexchange.com/users/8478;12012?site=codegolf').json()['items']
r='reputation'
print['tie',a['link']][a[r]>b[r]]

6

Python中,226个 225 221字节

我觉得这太长了。

import requests as r,re
def f(i):d=re.sub('[, ]','',r.get('http://codegolf.stackexchange.com/users/'+i).text);D=d.index('"reputation">')+14;return int(d[D:d.index('<',D)])
a=f('8478')
b=f('12012')
print([a>b,'tie'][a==b])

"True"如果Martin的代表比Dennis多,"False"Dennis的代表比Martin多,并且"tie"如果他们的代表相同,则打印(理论上,我无法测试:P)。

https-> http1个字节,感谢@KevinCruijssen! re as r, r.sub-> re, re.sub4个字节,感谢@ovs!


我不确定,但是可以更改httpshttp吗?我知道PPCG现在完全是https,但是当您在Python中导航到HTTP时,就像在浏览器中一样,它也许会自动重定向到HTTPS?
凯文·克鲁伊森

@KevinCruijssen啊,是的,我不知道我在想什么。谢谢!
HyperNeutrino

1
您不需要re as R。只需使用import requests as r,rere.sub
OVS

@ovs嘿,我的原始方法与众不同谢谢!
HyperNeutrino

我认为您可以使用该cmp函数来节省一些字节,方法是将最后三行替换为类似的内容print['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo

6

PHP,167字节

为Dennis打印-1,为Martin Ender打印1。领带打成平手

<?=($b=($t=json_decode(gzdecode(join(file('http://api.stackexchange.com/users/12012;8478?site=codegolf&order=asc'))))->items)[0]->reputation<=>$t[1]->reputation)?:tie;

4

Python 2中228个 223 204 199字节

我是在移动热点上这样做的,所以...这不是很好... 假设他们两个总是在相同的十万。现在不承担任何责任。:D

import urllib as l,re
f=lambda i:int(re.search('n">\s*([\d,]+)',l.urlopen('http://codegolf.stackexchange.com/users/%d'%i).read()).group(1).replace(',',''))
d,m=f(12012),f(8478)
print[d>m,'Tie'][d==m]

True如果丹尼斯的声誉比马丁高,False则打印,否则打印,Tie如果它们……并列。


4

击+ JQ140个 133字节的

w3m 'api.stackexchange.com/users/12012;8478?site=codegolf&sort=name'|jq '.items|map(.reputation)|1/(index(min)-index(max))'||echo tie

格式化并解释

首先,我们卷曲 w3m API (并使用--compressed,或简称--com为un-gzip)

w3m 'api.stackexchange.com/users/12012;8478?site=codegolf&sort=name'

那是一些JSON。请注意顺序是稳定的,而不是基于声誉。然后,JQ处理JSON,这就是它的用途。

.items                          # take the items array
| map(.reputation)              # extract only the reputations
| 1 / 
  (index(min)-index(max))       # This checks if the bigger value is first (1) or last (-1) in array

1/x当min == max时,我们使用上面的方法生成零除误差,因此在平局情况下。在||echo tiebash中捕获这一点。

请注意,在这种情况下,JQ将在stderr上打印警告,但我们仅考虑stdout程序的实际结果;)


1
您可以使用w3m而不是curl --com节省一些字节。另外,我认为值得一提的是这需要jq 1.5,因为jq 1.4不会引发除以零的错误。
丹尼斯,

是的,谢谢您的提示。W3m正是我想要的。
opatut

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.