Martin vs Dennis - รอบที่ 1: ใครมีตัวแทนมากขึ้น


33

ฉันรู้ว่ามีความท้าทายมากมายเกี่ยวกับ "นักกอล์ฟสองคนที่ดีที่สุดในโลก" แต่สิ่งนี้มีความพิเศษมากขึ้นอีกเล็กน้อยการอยู่ในรอบที่ 1ในความท้าทาย (อนาคต) ที่เกี่ยวข้องกับพวกเขาทั้งสองคน


งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ให้ผลตอบแทนสองสายที่ไม่ใช่ช่องว่าง ASCII ที่แตกต่างกันเพื่อให้ตรงกับคนที่มีชื่อเสียงมากขึ้นในขณะที่โปรแกรมที่วิ่งระหว่างเดนนิส♦และมาร์ตินเอนเดอร์♦ ส่วนที่ยุ่งยากคือคุณต้องส่งออกที่แน่นอนสตริง"ผูก"ในกรณีที่มีชื่อเสียงเป็นเหมือนกัน (ไม่น่า) และทั้งสองไม่ใช่ช่องว่างสตริง ASCII ที่แตกต่างกันดังกล่าวข้างต้นควรจะแตกต่างกว่า"ผูก" *

ไม่สามารถรับอินพุตได้เช่นชื่อผู้ใช้หรือรหัสผู้ใช้ ตามปกติแล้วตัวย่อ 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แล้วเปลี่ยนรหัสในผู้ใช้ 2 คนที่คุณรู้ว่าจะเชื่อมโยง ดูโพสต์ Meta นี้สำหรับรายละเอียดเพิ่มเติม

* ฉันคิดว่าคงไม่มีใครใช้มัน


33
"... สองนักกอล์ฟที่ดีที่สุดในโลก ... " [จำเป็นต้องมี]
Martin Ender

9
เราคิดได้ไหมว่าพวกเขาจะเป็นอันดับ 1 และอันดับ 2 ในชุมชนนี้เสมอ
OVS

7
เตือนความจำที่เป็นมิตร: ห้ามการลงคะแนนเป้าหมายในเครือข่ายสแต็ก Exchange ทั้งหมด การลงคะแนนใน Martin's และโพสต์ของฉันเพียงเพื่อทดสอบการส่งต่อความท้าทายนี้ไม่ได้รับอนุญาต
เดนนิส

2
@Shaggy เป็นเรื่องดีที่คุณได้เพิ่มบันทึกย่อนั้น หวังว่าผู้ใช้ที่เกี่ยวข้องจะหยุดทำเช่นนั้น
Mr. Xcoder

1
หากต้องการ @MartinEnder ที่ด้านบนการอ้างอิงจะไม่จำเป็นสำหรับข้อเท็จจริงที่มีความรู้ทั่วไป
Gryphon - Reinstate Monica

คำตอบ:


20

05AB1E , 65 64 ไบต์

รหัส:

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

ใช้การเข้ารหัส05AB1E


คำอธิบาย:

•в=6{•แปลงตัวเลขв=6{จากฐาน 255 ฐาน 10 ส่งผลให้ใน1201208478 ครึ่งแรกเป็น ID ของ Dennis (12012) และครึ่งหลังเป็น ID ของ Martin (8478) แบ่งออกเป็น 5 ส่วนโดยใช้เพื่อรับอาเรย์ต่อไปนี้:

['12012', '08478']

โชคดีที่เราสามารถปล่อยให้ศูนย์นำหน้าจาก ID ของ Martin เนื่องจากยังคงใช้งานได้ (ตรวจสอบลิงก์ก่อนคลิกเพื่อดูศูนย์นำหน้า)

ตอนนี้เราวนรอบอาร์เรย์นี้โดยใช้vyและสร้างสตริงต่อไปนี้จากรหัส 05AB1E นี้:

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

ในขณะÿที่องค์ประกอบปัจจุบันของตัววนซ้ำ (ใช้การแก้ไขสตริง) ลองออนไลน์!

หลังจากสร้างลิงก์แล้วให้.wอ่านข้อมูลทั้งหมดจากลิงก์ซึ่งจะทำให้เกิดข้อความจำนวนมาก title="reputation"ขูดชื่อเสียงจากนี้เราต้องแยกสตริง ’„Ö="ˆ"’หรือในรุ่นที่ถูกบีบอัดเพิ่มเติมได้ที่: แยกบนส่วนของสตริงนี้ (พร้อม¡) และรับองค์ประกอบที่สอง (พร้อม) และเก็บ100 ตัวแรก(พร้อมт£)

ตอนนี้ข้อความที่คัดลอกมาของเรามีลักษณะดังนี้:

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

<div class="ba

ส่วนนี้เป็นเรื่องง่ายเราเพียงลบอะไรเลยยกเว้นตัวเลขเพื่อรักษาหมายเลขชื่อเสียงซึ่งเรามี builtin ( þ) }})เราจบห่วงและห่อทุกอย่างลงในอาร์เรย์

สุดท้ายเราสามารถดำเนินการกับหมายเลขชื่อเสียง:

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

ซึ่งส่งผลอย่างใดอย่างหนึ่งD, หรือMtie


2
ฉันไม่ทราบว่า 05AB1E สามารถเข้าถึงอินเทอร์เน็ต API ได้คำตอบนี้ทำให้ฉันประหลาดใจ => +1
Mr. Xcoder

ฉันมักจะชอบวิธีที่คุณและคนอื่น ๆ คิดหาวิธีที่จะได้จำนวน :) +1 Btw เป็นส่วน " องค์ประกอบที่สอง (กับ1è) and keep the first **100 characters** (with т£. " ควรจะสมบูรณ์ในบล็อกรหัสหรือควรจะเป็น " องค์ประกอบที่สอง (กับ) และเก็บ100 ตัวแรก(กับт£). " ฉันเดา การพิมพ์ผิด แต่ถ้ามันควรจะเป็นเช่นนี้ผมสับสน ..
เควิน Cruijssen

@KevinCruijssen Huh ฉันไม่รู้ว่ามันเกิดขึ้นได้อย่างไร แต่ตอนนี้ได้รับการแก้ไขแล้ว ขอบคุณสำหรับหัวขึ้น! :)
Adnan

ดูเหมือนว่าไม่ถูกต้อง (ผมไม่ทราบวิธีการแก้ไขชนิดของรหัสนี้ขอโทษ) Dennis: 140,033; Martin: 140,003แต่ฉันพยายามรหัสของคุณที่นี่tio.run/nexus/05ab1e#@/...tieก็ให้ผลผลิต มันควรจะเป็น ouput Dแทนไหม?
Eddie

@Eddie .wต้องการการเข้าถึงเว็บซึ่งถูก จำกัด บน TIO (ทำงาน 05AB1E ในเซฟโหมด) ในล่ามออฟไลน์มันควรจะทำงาน
Adnan

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"

บันทึก 24 ไบต์โดยใช้เอาต์พุตจริง / เท็จแทนชื่อ

บันทึกอีก 4 รายการโดยปรับโครงสร้างการตรวจสอบขั้นสุดท้าย

บันทึก 16 โดยได้รับเพียงชื่อเสียงของผู้ใช้สองคนจากคำขอบันทึกไม่ต้องใช้|% r*nมากกว่าหนึ่งครั้งยังหมายความว่าเราสามารถกำจัดเช่นวงเล็บล้านและตัวแปรไร้ประโยชน์สอง

-2 ต้องขอบคุณTessellatingHeckler - การใช้ตัวหลบหลีกแทน doublequotes สองอันสำหรับ 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) ผลการเคล็ดลับในหนึ่งของค่าD, MหรือTieถ้าจำนวนเป็นคี่ / คู่ / ศูนย์.


ฉันไม่ได้คาดหวังว่า powerhell จะสั้นที่สุด +1
Rɪᴋᴇʀ

@Riker Pyth น่าจะเป็นไปได้ แต่มีข้อผิดพลาดที่น่ากลัว
Erik the Outgolfer

1
สบายดีคุณชนะ ไม่มีทางที่ฉันจะเอาชนะมันได้ในตอนนี้!
Shaggy

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 จะเป็นผู้ใช้อันดับ 2 เสมอ api.stackexchange.comจะต้องมีการเรียกใช้จากระดับรากของ ส่งคืนPromiseวัตถุ (ตามที่ได้รับอนุญาตในตอนนี้โดยความสอดคล้อง ) ที่มีtieหรือวัตถุ JSON สำหรับผู้ที่มีตัวแทนมากที่สุดในเวลานั้น ถ้าวัตถุ JSON ไม่ถือว่าการส่งออกที่ถูกต้องแล้วเพิ่ม 5 .linkไบต์

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • บันทึกไว้ 11 ไบต์ขอบคุณเควินแนะนำให้ฉันส่งคืนโปรไฟล์linkแทนที่จะเป็นตัวอักษรตัวแรกของจดหมายdisplay_nameซึ่งให้การพิสูจน์ตัวตนในอนาคตที่ดีกว่ากับพวกเขาเปลี่ยนชื่อผู้ใช้ของพวกเขาเพื่อเริ่มต้นด้วยตัวอักษรเดียวกัน!
  • 5 ไบต์บันทึกการปรับทิปจากkamoroso94บนอีกโซลูชันหนึ่งของฉัน

ลองมัน

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 ทั้งหมด แต่ฉันไม่แน่ใจว่าเหมาะกับการแจ้งเตือนป๊อปอัปหรือไม่
Kevin Cruijssen

ขอบคุณ @KevinCruijssen; ฉันต้องใช้ชื่อผู้ใช้แยกเป็นของมาร์ตินมีช่องว่างซึ่งไม่ได้รับอนุญาต linkแม้ว่าจะใช้งานได้ดี แต่ฉันใช้แบบสอบถาม API ที่กรองแล้วเพื่อส่งคืนข้อมูลที่ฉันต้องการเท่านั้น
Shaggy

@KevinCruijssen ฉันได้ทิ้งหน้า HTML ทั้งหมดไว้ในป๊อปอัปแจ้งเตือนเมื่อจัดการกับผลตอบแทน AJAX มันสามารถจัดการได้
Draco18s

@ Draco18s ซึ่งalertมีวัตถุ JSON จะแสดง[object Object]ขึ้นมา
Shaggy

@Shaggy จริงจริงมันจะ
Draco18s

9

Python 3, 160 157 151 bytes

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"ถ้ามาร์ตินมีตัวแทนมากกว่าเดนนิส"False"ถ้าเดนนิสมีตัวแทนมากกว่ามาร์ตินและ"tie"ถ้าพวกเขามีเหมือนกัน (ในทางทฤษฎีฉันไม่สามารถทดสอบสิ่งนี้ได้: P)

https-> httpสำหรับ 1 ไบต์ต้องขอบคุณ @KevinCruijssen! re as r, r.sub-> re, re.subสำหรับ 4 ไบต์ต้องขอบคุณ @ovs!


ฉันไม่แน่ใจว่าทั้งหมด แต่ก็เป็นไปได้ที่จะเปลี่ยนhttpsไปhttp? ฉันรู้ว่า PPCG นั้นสมบูรณ์แบบ https ในตอนนี้ แต่บางทีมันอาจส่งไปที่ HTTPS โดยอัตโนมัติเมื่อคุณไปที่ HTTP ใน Python เหมือนกับในเบราว์เซอร์
Kevin Cruijssen

@KevinCruijssen อ่าใช่ฉันไม่รู้ว่าฉันคิดอะไรอยู่ที่นั่น ขอบคุณ!
HyperNeutrino

1
re as Rคุณไม่จำเป็นต้อง เพียงแค่ใช้import requests as r,reและre.sub
OVS

@ovs Heh วิธีการดั้งเดิมของฉันแตกต่างกันขอบคุณ!
HyperNeutrino

ฉันคิดว่าคุณสามารถใช้cmpฟังก์ชั่นเพื่อบันทึกไบต์โดยแทนที่สามบรรทัดสุดท้ายด้วยอะไรทำนองนั้นprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo

6

PHP, 167 ไบต์

พิมพ์ -1 สำหรับ Dennis, 1 สำหรับ Martin Ender เสมอในกรณีที่เสมอ

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

Bash + jq , 140 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 == สูงสุดดังนั้นในสถานการณ์ที่เสมอกัน ||echo tieในจับทุบตีว่า

โปรดทราบว่าคำเตือนจะถูกพิมพ์ลงบน stderr โดย JQ ในกรณีนั้น แต่เราพิจารณาเฉพาะผลลัพธ์ที่แท้จริงของโปรแกรม;)


1
คุณสามารถใช้w3mแทนcurl --comการบันทึกไม่กี่ไบต์ นอกจากนี้ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงว่าต้องใช้ jq 1.5 เนื่องจาก jq 1.4 ไม่ได้เกิดข้อผิดพลาดในการหารด้วยศูนย์
Dennis

จริงขอบคุณสำหรับคำใบ้ W3m เป็นสิ่งที่ฉันกำลังมองหา
opatut

1

Stackexchange API Data Explorer , 184 180 ไบต์

ขอบคุณ @Kevin Cruijssen สำหรับ -4 ไบต์

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

พิมพ์ 1 สำหรับ Dennis และ 2 สำหรับ Martin

ตั้งแต่ฉันเพียงเมื่อวานนี้ได้เรียนรู้เกี่ยวกับSEADEนี้ควรจะสามารถชนะได้มาก

ลองที่นี่


คุณสามารถเปลี่ยน'D'และ'M'ไปและ0 1
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.