Martin vs Dennis - Vòng 1: Ai có nhiều đại diện hơn?


33

Tôi biết đã có rất nhiều thử thách về "hai tay golf giỏi nhất thế giới", nhưng đây là một thử thách độc đáo hơn một chút, là Vòng 1 trong một loạt các thử thách (tương lai) liên quan đến hai người họ.


Nhiệm vụ của bạn là viết một chương trình hoặc hàm trả về hai chuỗi ASCII không phải khoảng trắng khác nhau, tương ứng với chuỗi có nhiều danh tiếng hơn tại thời điểm chương trình được chạy, giữa Dennis ♦Martin Ender ♦ . Phần khó khăn là bạn phải xuất ra chuỗi "tie" chính xác trong trường hợp danh tiếng giống hệt nhau (không có khả năng) và hai chuỗi ASCII không khoảng trắng khác nhau được đề cập ở trên phải khác với "tie" * .

Không thể nhập dữ liệu, chẳng hạn như tên người dùng hoặc id người dùng. Như thường lệ, các công cụ rút ngắn URL bị cấm và các lỗ hổng phổ biến cũng vậy.

Ví dụ:

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 

QUAN TRỌNG! Bỏ phiếu trên các bài đăng của Dennis & Martin với mục đích duy nhất là ảnh hưởng đến cà vạt nhằm kiểm tra các giải pháp bên dưới cấu thành biểu quyết nhắm mục tiêu bị cấm trên mạng Stack Exchange. Nếu bạn muốn kiểm tra xem một giải pháp đầu ra đúng cách tiethì hãy thay đổi ID trong đó thành 2 người dùng mà bạn biết sẽ bị ràng buộc. Xem bài viết Meta này để biết thêm chi tiết.

* Tôi nghĩ rằng không ai sẽ sử dụng nó, dù sao


33
"... hai người chơi gôn giỏi nhất thế giới ..." [cần dẫn nguồn]
Martin Ender

9
Chúng ta có thể cho rằng họ sẽ luôn là số 1 và số 2 trong cộng đồng này không?
trứng

7
Một lời nhắc nhở thân thiện: bỏ phiếu nhắm mục tiêu bị cấm trên toàn bộ mạng Stack Exchange. Bỏ phiếu trên Martin và các bài đăng của tôi chỉ để kiểm tra bài nộp cho thử thách này là không được phép.
Dennis

2
@Shaggy Thật tuyệt khi bạn đã thêm ghi chú đó. Hy vọng, những người dùng liên quan sẽ ngừng làm điều đó
Ông Xcoder

1
Để @MartinEnder ở đầu, các trích dẫn là không cần thiết cho các sự kiện là kiến ​​thức phổ biến.
Gryphon - Tái lập Monica

Câu trả lời:


20

05AB1E , 65 64 byte

Mã số:

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

Sử dụng mã hóa 05AB1E .


Giải trình:

•в=6{•chuyển đổi số в=6{từ cơ sở 255 sang cơ sở 10, kết quả là 1201208478 . Nửa đầu là ID của Dennis (12012) và nửa sau là ID của Martin (8478). Chia thành 5 phần bằng cách sử dụng để có được mảng sau:

['12012', '08478']

May mắn thay, chúng ta có thể để số 0 đứng đầu từ ID của Martin, vì điều này vẫn hoạt động (kiểm tra liên kết trước khi nhấp để xem số 0 đứng đầu).

Bây giờ chúng ta lặp qua mảng này bằng cách sử dụng vyvà xây dựng chuỗi sau từ mã 05AB1E này:

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

Trong khi đó ÿlà phần tử hiện tại của iterator (sử dụng phép nội suy chuỗi) Hãy thử trực tuyến!

Sau khi xây dựng liên kết, .wđọc tất cả dữ liệu từ liên kết, dẫn đến một lượng lớn văn bản. Để loại bỏ danh tiếng từ điều này, chúng ta cần phải phân chia trên chuỗi title="reputation". Hoặc trong một phiên bản nén hơn : ’„Ö="ˆ"’. Tách trên đoạn chuỗi này (với ¡) và lấy phần tử thứ hai (với ) và giữ phần đầu tiên 100 ký tự (với т£).

Bây giờ, văn bản bị loại bỏ của chúng tôi trông giống như thế này:

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

<div class="ba

Phần này rất dễ, chúng tôi chỉ cần xóa bất cứ thứ gì trừ chữ số để giữ nguyên số danh tiếng mà chúng tôi có số tích hợp (þ ). Chúng tôi kết thúc vòng lặp và bọc mọi thứ thành một mảng }}).

Cuối cùng, chúng ta có thể tiếp tục xử lý các số danh tiếng:

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

Mà kết quả trong một D, Mhoặc tie.


2
Tôi không biết rằng 05AB1E có thể truy cập API internet, câu trả lời này làm tôi ngạc nhiên => +1
Ông Xcoder

Tôi luôn thích cách bạn và những người khác nghĩ ra cách để có được một con số nhất định. :) +1 Btw, là phần " phần tử thứ hai (với 1è) and keep the first **100 characters** (with т£. " Được cho là hoàn toàn trong các khối mã, hoặc nó phải là " phần tử thứ hai (với ) và giữ 100 ký tự đầu tiên (với т£). " một lỗi đánh máy, nhưng nếu nó được cho là như thế này thì tôi đã nhầm lẫn ..
Kevin Cruijssen

@KevinCruijssen Huh, tôi không biết điều đó đã xảy ra như thế nào, nhưng giờ nó đã được sửa. Cảm ơn cho những người đứng đầu lên! :)
Ad Nam

có vẻ không đúng (tôi không biết cách sửa loại mã này, xin lỗi) , Dennis: 140,033; Martin: 140,003, nhưng tôi đã thử mã của bạn ở đây tio.run/nexus/05ab1e#@/ , nó mang lại tie. Nó không nên Dthay thế?
Eddie

@Eddie .wyêu cầu truy cập web, bị hạn chế trên TIO (nó chạy 05AB1E ở chế độ an toàn). Trong trình thông dịch ngoại tuyến, nó sẽ hoạt động.
Ad Nam

19

PowerShell v3 +, 147 123 119 103 101 96 byte

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

Đã lưu 24 byte bằng đầu ra true / false thay vì tên.

Lưu thêm 4 bằng cách cơ cấu lại các kiểm tra cuối cùng.

đã lưu 16 bằng cách chỉ nhận được danh tiếng của hai người dùng từ yêu cầu, tiết kiệm phải sử dụng |% r*nnhiều lần, cũng có nghĩa là chúng ta có thể thoát khỏi hàng triệu dấu ngoặc và hai biến vô dụng.

-2 nhờ TessellatingHeckler - sử dụng char char thoát thay vì hai doublequote cho url, cũng đã xóa @khỏi mảng không cần thiết (oopsie)

đã sử dụng một .ToStringmánh khóe kỳ lạ mà tôi chưa từng biết đến cho đến bây giờ được giới thiệu bởi TessellatingHeckler -5, và cuối cùng dưới 100.


Phiên bản trả về tên:

$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]}

điều này có vẻ khá lộn xộn do việc rút ngắn tên tham số.

bất cứ nơi nào |% r*nchúng ta xuất hiện ReputatioN, và |% d*Display_name

sử dụng Invoke-RestMethod(bí danh irm) để truy vấn API, lưu trữ kết quả tên Items(nhận được sử dụng |% I*), vào hai biến $a& $b, một cho mỗi vận động viên golf chuyên nghiệp, những ToString( |% T*g) lừa dẫn đến một trong những giá trị D, Mhoặc Tienếu số là chẵn / lẻ / số không.


Tôi không mong đợi powershell là ngắn nhất. +1
Rɪᴋᴇʀ

@Riker Pyth có lẽ đã từng, nhưng nó có một lỗi khủng khiếp.
Erik the Outgolfer

1
Tốt, bạn thắng; không có cách nào tôi sẽ đánh bại điều này bây giờ!
Xù xì

9
Vì vậy, mã của bạn là 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163byte dài ..? : P
hoàn toàn là

1
@TessellatingHeckler kiểm tra câu trả lời cho bit cuối cùng, bạn đã nhận được nó dưới 100! - không bao giờ biết ToStringlàm việc như thế với số +/-, sẽ nhớ cho tương lai.
colsw

16

Python 2 , 160 byte

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'

Không phải là câu trả lời Python ngắn nhất, mà là câu trả lời ngắn nhất cho đến nay không đưa ra bất kỳ giả định nào.

In 1nếu Martin có nhiều đại diện hơn, -1nếu tôi làm.


14

JavaScript (ES6), 167 156 146 144 141 132 103 byte

Ngốc fetchvà ngu ngốc, đắt tiềnPromise xích !

Giả sử, như hiện tại được cho phép, Dennis & Martin sẽ luôn là 2 người dùng được xếp hạng hàng đầu. Cần phải được chạy từ cấp độ gốc của api.stackexchange.com. Trả về một Promiseđối tượng (như được cho phép bởi sự đồng thuận ) có chứa tiehoặc đối tượng JSON cho bất kỳ ai có nhiều đại diện nhất vào thời điểm đó. Nếu đối tượng JSON không được coi là đầu ra hợp lệ thì hãy thêm 5 byte cho .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Đã lưu 11 byte nhờ Kevin đề nghị tôi trả lại hồ sơ linkthay vì chữ cái đầu tiên củadisplay_name , cũng cung cấp bằng chứng tương lai tốt hơn để chống lại việc họ thay đổi tên người dùng để bắt đầu bằng cùng một chữ cái!
  • 5 byte được lưu thích ứng với một mẹo từ kamoroso94 trên một giải pháp khác của tôi.

Thử nó

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)


Thay thế

Nếu có một thời gian mà Dennis & Martin không đứng đầu và chúng tôi vẫn muốn biết ai có nhiều đại diện nhất giữa họ thì chúng tôi cần những điều sau đây, với chi phí thêm 10 byte.

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

2
Bạn có thể thay đổi .display_name[0]thành .display_name, hoặc một sự thay thế thậm chí ngắn hơn mà vẫn là duy nhất cho cả hai : .link. ;) Hoặc chỉ toàn bộ JSON, nhưng tôi không chắc liệu nó có phù hợp với cửa sổ bật lên cảnh báo hay không.
Kevin Cruijssen

Cảm ơn, @KevinCruijssen; Tôi đã phải sử dụng một trích xuất tên người dùng vì Martin chứa một khoảng trắng, không được phép. Tốt hét về việc sử dụng link, tuy nhiên, tôi đã sử dụng một truy vấn API lọc để chỉ trả lại các thông tin tôi cần.
Xù xì

@KevinCruijssen Tôi đã chuyển toàn bộ trang HTML vào cửa sổ bật lên cảnh báo khi xử lý trả về AJAX. Nó có thể xử lý nó.
Draco18

@ Draco18s, alertmặc dù vậy, một đối tượng JSON sẽ chỉ hiển thị [object Object].
Xù xì

@Shaggy Đúng, đúng, nó sẽ.
Draco18

9

Python 3, 160 157 151 byte

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 byte nhờ @KevinCruijssen

In một liên kết để người dùng có danh tiếng hơn

Giả sử họ ở vị trí số 1 và số 2


Không đưa ra bất kỳ giả định nào, Python 2, 157 byte :

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

Con trăn, 226 225 221 byte

Tôi cảm thấy như thế này là quá dài.

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

In "True"nếu Martin có nhiều đại diện hơn Dennis, "False"nếu Dennis có nhiều đại diện hơn Martin và"tie" nếu họ có cùng (về mặt lý thuyết. Tôi không thể kiểm tra điều này: P).

https-> httpcho 1 byte nhờ @KevinCruijssen! re as r, r.sub-> re, re.subcho 4 byte nhờ @ovs!


Tôi không hoàn toàn chắc chắn, nhưng nó có thể thay đổi httpsthành http? Tôi biết PPCG hoàn toàn https bây giờ, nhưng có lẽ nó tự động chuyển hướng đến HTTPS khi bạn điều hướng đến HTTP bằng Python, giống như trong trình duyệt?
Kevin Cruijssen

@KevinCruijssen À đúng rồi, tôi không biết tôi đang nghĩ gì ở đó. Cảm ơn!
HyperNeutrino

1
Bạn không cần re as R. Chỉ cần sử dụng import requests as r,rere.sub
ovs

@ovs Heh, cách tiếp cận ban đầu của tôi là khác Cảm ơn!
HyperNeutrino

Tôi nghĩ rằng bạn có thể sử dụng cmpchức năng để lưu một số byte bằng cách thay thế ba dòng cuối cùng bằng một cái gì đó nhưprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo

6

PHP, 167 byte

in -1 cho Dennis, 1 cho Martin Ender. cà vạt trong trường hợp cà vạt

<?=($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 byte

Tôi đã làm điều này trên một điểm truy cập di động để ... nó không tuyệt vời ... Giả sử cả hai sẽ luôn ở cùng một trăm nghìn. Không giả định bất cứ điều gì bây giờ. : 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]

In Truenếu Dennis có nhiều danh tiếng hơn Martin, Falsenếu không và Tienếu chúng bị ... trói.


4

Bash + jq , 140 133 byte

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

Định dạng và giải thích

Đầu tiên, chúng tôi cuộn tròn w3m API (và sử dụng --compressedhoặc viết tắt --comlà un-gzip) :

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

Đó là một số JSON. Lưu ý thứ tự ist ổn định, không dựa trên danh tiếng. JQ sau đó xử lý JSON, đó là những gì nó được tạo ra.

.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

Chúng tôi sử dụng 1/xở trên để tạo ra lỗi chia cho 0 khi min == max, vì vậy trong tình huống hòa. Các ||echo tietrong đánh bắt bash đó.

Lưu ý rằng một cảnh báo được in trên thiết bị lỗi chuẩn của JQ trong trường hợp đó, nhưng chúng tôi chỉ xem xét đến kết quả thực tế của chương trình;)


1
Bạn có thể sử dụng w3mthay vì curl --comđể lưu một vài byte. Ngoài ra, tôi nghĩ rằng điều đáng nói là điều này đòi hỏi jq 1.5, vì jq 1.4 không gây ra lỗi khi chia cho 0.
Dennis

Đúng, cảm ơn cho gợi ý. W3m chính xác là những gì tôi đang tìm kiếm.
opatut

1

Trình khám phá dữ liệu API Stackexchange , 184 180 byte

Cảm ơn @Kevin Cruijssen cho -4 byte

DECLARE @M int,@D int;SELECT @M=reputation from users where id=8478;SELECT @D=reputation from users where id=12012;IF @D=@M PRINT('tie')ELSE BEGIN;IF @D>@M PRINT(1)ELSE PRINT(2)END

In 1 cho Dennis và 2 cho Martin

Vì tôi mới chỉ biết hôm qua về SEADE nên điều này rất dễ bị đánh bại.

Hãy thử nó ở đây


Bạn có thể thay đổi 'D''M'đến 01.
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.