Martin vs Dennis - Babak 1: Siapa yang memiliki lebih banyak perwakilan?

33

Saya tahu ada banyak tantangan tentang "dua pegolf kode terbaik di dunia", tetapi yang ini sedikit lebih unik, karena Putaran 1 dalam serangkaian tantangan (masa depan) yang melibatkan keduanya.


Tugas Anda adalah menulis sebuah program atau fungsi yang mengembalikan dua string ASCII non-spasi putih yang berbeda, sesuai dengan orang yang memiliki reputasi lebih pada saat program dijalankan, antara Dennis ♦ dan Martin Ender ♦ . Bagian yang sulit adalah Anda harus menampilkan string "tie" yang tepat jika reputasinya identik (tidak mungkin), dan dua string ASCII non-spasi putih yang disebutkan di atas harus berbeda dari "tie" * .

Tidak ada input yang dapat diambil, seperti nama pengguna atau id pengguna. Seperti biasa, penyingkat URL dilarang, dan begitu juga celah umum.

Contoh:

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 

PENTING! Voting pada posting oleh Dennis & Martin dengan tujuan semata-mata mempengaruhi dasi untuk menguji solusi di bawah ini merupakan pemungutan suara yang ditargetkan yang dilarang di seluruh jaringan Stack Exchange. Jika Anda ingin menguji bahwa suatu solusi menghasilkan output yang benar, tiemaka ubah ID di dalamnya menjadi 2 pengguna yang Anda tahu terikat. Lihat posting Meta ini untuk detail lebih lanjut.

* Saya pikir tidak ada yang akan menggunakan itu

Tuan Xcoder
sumber
33
"... dua pegolf kode terbaik di dunia ..." [butuh rujukan]
Martin Ender
9
Bisakah kita berasumsi bahwa mereka akan selalu menjadi # 1 dan # 2 di komunitas ini?
Ovs
7
Pengingat yang ramah: pemungutan suara yang ditargetkan dilarang di seluruh jaringan Stack Exchange. Voting pada Martin dan posting saya hanya untuk menguji kiriman untuk tantangan ini tidak diperbolehkan.
Dennis
2
@Shaggy Sangat bagus Anda telah menambahkan catatan itu. Semoga, pengguna yang terlibat akan berhenti melakukan itu
Tn. Xcoder
1
Untuk @MartinEnder di atas, kutipan tidak diperlukan untuk fakta yang merupakan pengetahuan umum.
Gryphon - Reinstate Monica

Jawaban:

20

05AB1E , 65 64 byte

Kode:

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

Menggunakan penyandian 05AB1E .


Penjelasan:

•в=6{• mengkonversi nomor tersebut в=6{ dari basis 255 ke basis 10, menghasilkan 1201208478 . Babak pertama adalah ID dari Dennis (12012) dan bagian kedua adalah ID of Martin (8478). Dibagi menjadi potongan-potongan 5 menggunakan untuk mendapatkan array berikut:

['12012', '08478']

Untungnya, kita dapat meninggalkan nol di depan dari ID Martin, karena ini masih berfungsi (periksa tautan sebelum mengklik untuk melihat nol di depan).

Kami sekarang loop melalui array ini menggunakan vydan membangun string berikut dari kode 05AB1E ini:

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

Sedangkan ÿ elemen iterator saat ini (menggunakan interpolasi string) Cobalah secara online!

Setelah membuat tautan, .wmembaca semua data dari tautan, menghasilkan sejumlah besar teks. Untuk mengikis reputasi dari ini, kita perlu membagi pada string title="reputation". Atau dalam versi yang lebih terkompresi: ’„Ö="ˆ"’. Split pada string ini (dengan ¡) dan dapatkan elemen kedua (dengan ) dan pertahankan 100 karakter pertama (dengan т£).

Sekarang, teks tergores kami terlihat seperti ini:

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

<div class="ba

Bagian ini mudah, kami hanya menghapus apa pun kecuali angka untuk tetap nomor reputasi, yang kami punya builtin ( þ). Kami mengakhiri loop dan membungkus semuanya menjadi sebuah array }}).

Akhirnya, kita bisa terus memproses nomor reputasi:

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

Yang menghasilkan D, Matau tie.

Adnan
sumber
2
Saya tidak tahu bahwa 05AB1E dapat mengakses API internet, jawaban ini mengejutkan saya => +1
Tn. Xcoder
Saya selalu suka bagaimana Anda dan orang lain menemukan cara untuk mendapatkan nomor tertentu. :) +1 Btw, apakah bagian " elemen kedua (dengan 1è) and keep the first **100 characters** (with т£. " Seharusnya sepenuhnya dalam kode-blok, atau haruskah itu menjadi " elemen kedua (dengan ) dan menyimpan 100 karakter pertama (dengan т£). " Sebagai gantinya? Saya kira salah ketik, tetapi jika seharusnya seperti ini saya bingung ..
Kevin Cruijssen
@KevinCruijssen Huh, saya tidak tahu bagaimana itu terjadi, tapi sekarang sudah diperbaiki. Terimakasih atas peringatannya! :)
Adnan
sepertinya salah (saya tidak tahu bagaimana cara memperbaiki kode semacam ini, maaf) Dennis: 140,033,; Martin: 140,003, tapi saya mencoba kode Anda di sini tio.run/nexus/05ab1e#@/... , hasilnya tie. Bukankah seharusnya ouput Dsaja?
Eddie
@ Eddie .wmemerlukan akses web, yang dibatasi pada TIO (ini menjalankan 05AB1E dalam mode aman). Di penerjemah offline, itu harus bekerja.
Adnan
19

PowerShell v3 +, 147 123 119 103 101 96 Bytes

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

Disimpan 24 byte menggunakan true / false output, bukan nama.

Menyimpan 4 lainnya dengan merestrukturisasi cek akhir.

disimpan 16 dengan hanya mendapatkan reputasi dari dua pengguna dari permintaan, menghemat harus menggunakan |% r*n lebih dari sekali, juga berarti kita dapat menyingkirkan seperti sejuta tanda kurung, dan dua variabel tidak berguna.

-2 Berkat TessellatingHeckler - menggunakan pelarian karakter alih-alih dua tanda kutip untuk url, juga menghapus@ dari array yang tidak diperlukan (oopsi)

menggunakan .ToStringtrik aneh yang saya tidak pernah tahu ada sampai sekarang direkomendasikan oleh TessellatingHeckler -5, dan akhirnya di bawah 100.


Versi yang mengembalikan nama:

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

ini terlihat cukup berantakan karena pemendekan nama parameter.

di mana pun |% r*nmuncul, kami mendapatkan ReputatioN, dan |% d*adalahDisplay_name

menggunakan Invoke-RestMethod(alias irm) untuk menanyakan API, menyimpan hasil bernama Items(menggunakan |% I*), ke dalam dua variabel $a& $b, satu untuk setiap pegolf pro, trik ToString( |% T*g) menghasilkan salah satu nilai D, Matau Tiejika jumlahnya ganjil / genap / nol.

colsw
sumber
Saya tidak berharap PowerShell menjadi yang terpendek. +1
Rɪᴋᴇʀ
@Riker Pyth mungkin sudah, tetapi memiliki bug yang mengerikan.
Erik the Outgolfer
1
Baik, kamu menang; tidak mungkin aku akan mengalahkan ini sekarang!
Shaggy
9
Jadi 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163panjang kode Anda adalah byte? : P
totallyhuman
1
@TessellatingHeckler memeriksa jawaban untuk bit terakhir, Anda mendapatkannya di bawah 100! - tidak pernah tahu ToStringbekerja seperti itu dengan angka +/-, akan mengingat untuk masa depan.
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'

Bukan jawaban Python terpendek, tapi yang terpendek sejauh ini yang tidak membuat asumsi.

Mencetak 1jika Martin memiliki lebih banyak perwakilan, -1jika saya melakukannya.

Dennis
sumber
14

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

Bodoh fetchdan itu bodoh, mahalPromise !

Diasumsikan, seperti yang diperbolehkan saat ini, bahwa Dennis & Martin akan selalu menjadi 2 pengguna teratas. Perlu dijalankan dari tingkat root api.stackexchange.com. Mengembalikan Promiseobjek (seperti yang sekarang diizinkan oleh konsensus ) yang mengandung tieatau objek JSON untuk siapa pun yang memiliki perwakilan paling banyak pada saat itu. Jika objek JSON tidak dianggap sebagai output yang valid, tambahkan 5 byte untuk .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Disimpan 11 byte berkat Kevin menyarankan agar saya mengembalikan profil linkdaripada huruf pertamadisplay_name , yang juga memberikan pemeriksaan lebih baik di masa depan terhadap mereka mengubah nama pengguna mereka untuk memulai dengan huruf yang sama!
  • 5 byte disimpan mengadaptasi tip dari kamoroso94 pada solusi saya yang lain.

Cobalah

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)


Alternatif

Jika suatu saat tiba bahwa Dennis & Martin tidak di atas dan kami masih ingin tahu siapa yang memiliki perwakilan paling banyak di antara mereka maka kami akan membutuhkan yang berikut, dengan biaya tambahan 10 byte.

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
Shaggy
sumber
2
Anda dapat mengubah .display_name[0]ke .display_name, atau alternatif bahkan lebih pendek yang masih unik bagi mereka berdua: .link. ;) Atau hanya seluruh JSON, tapi saya tidak yakin apakah itu cocok dengan popup peringatan.
Kevin Cruijssen
Terima kasih, @KevinCruijssen; Saya harus menggunakan ekstrak nama pengguna karena Martin berisi spasi, yang tidak diizinkan. Teriakan yang bagus saat menggunakan link, saya menggunakan permintaan API yang difilter untuk hanya mengembalikan informasi yang saya butuhkan.
Shaggy
@KevinCruijssen Saya telah membuang seluruh halaman HTML ke sembulan peringatan ketika berhadapan dengan pengembalian AJAX. Itu bisa menanganinya.
Draco18s
@ Draco18s, alertmeskipun objek JSON, hanya akan ditampilkan [object Object].
Shaggy
@ Shaggy Benar, benar, tentu saja.
Draco18s
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 terima kasih kepada @KevinCruijssen

Mencetak tautan ke pengguna yang memiliki reputasi lebih

Asumsikan mereka berada di # 1 dan # 2


Tanpa membuat asumsi apa pun, 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]]
ovs
sumber
6

Python, 226 225 221 byte

Saya merasa ini terlalu panjang.

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

Mencetak "True"jika Martin memiliki lebih banyak perwakilan daripada Dennis, "False"jika Dennis memiliki lebih banyak rep daripada Martin, dan "tie"jika mereka memiliki yang sama (secara teoritis. Saya tidak dapat menguji ini: P).

https-> httpuntuk 1 byte berkat @KevinCruijssen! re as r, r.sub-> re, re.subuntuk 4 byte, terima kasih kepada @ovs!

HyperNeutrino
sumber
Saya tidak sepenuhnya yakin, tapi apakah mungkin untuk mengubah httpske http? Saya tahu PPCG benar-benar https sekarang, tapi mungkin itu mengarahkan otomatis ke HTTPS ketika Anda menavigasi ke HTTP dengan Python, seperti halnya di browser?
Kevin Cruijssen
@KevinCruijssen Ah ya, saya tidak tahu apa yang saya pikirkan di sana. Terima kasih!
HyperNeutrino
1
Anda tidak perlu re as R. Cukup gunakan import requests as r,redanre.sub
Ovs
@ovs Heh, pendekatan orisinal saya berbeda Terima kasih!
HyperNeutrino
Saya pikir Anda dapat menggunakan cmpfungsi untuk menyimpan beberapa byte dengan mengganti tiga baris terakhir dengan sesuatu sepertiprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo
6

PHP, 167 Bytes

mencetak -1 untuk Dennis, 1 untuk Martin Ender. dasi jika ada dasi

<?=($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;
Jörg Hülsermann
sumber
4

Python 2 , 228 223 204 199 byte

Saya melakukan ini di hotspot seluler jadi ... itu tidak bagus ... Asumsikan keduanya akan selalu sama dalam seratus ribu. Tidak menganggap apa pun sekarang. : 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]

Mencetak Truejika Dennis memiliki reputasi lebih dari Martin, Falsesebaliknya dan Tiejika mereka ... terikat.

benar-benar manusiawi
sumber
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

Diformat dan dijelaskan

Pertama, kami meringkuk w3m API (dan menggunakan --compressed, atau singkat --comuntuk un-gzip) :

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

Itu beberapa JSON. Perhatikan bahwa urutannya stabil, tidak berdasarkan pada reputasi. JQ kemudian memproses JSON, yang dibuat untuk itu.

.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

Kami menggunakan di 1/xatas untuk menghasilkan kesalahan pembagian-oleh-nol ketika min == maks, jadi dalam situasi seri. The ||echo tiebash menangkap itu.

Perhatikan bahwa peringatan dicetak pada stderr oleh JQ dalam kasus itu, tetapi kami menganggap hanya stdout hasil aktual dari program;)

opatut
sumber
1
Anda dapat menggunakan w3malih-alih curl --commenyimpan beberapa byte. Juga, saya pikir perlu disebutkan bahwa ini membutuhkan jq 1.5, karena jq 1.4 tidak meningkatkan kesalahan pembagian dengan nol.
Dennis
Benar, terima kasih atas petunjuknya. W3m persis seperti yang saya cari.
opatut
1

Stackexchange API Data Explorer , 184 180 byte

Terima kasih kepada @Kevin Cruijssen untuk -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

Cetakan 1 untuk Dennis dan 2 untuk Martin

Karena saya baru kemarin mengetahui tentang SEADE, ini seharusnya sangat mudah dikalahkan.

Coba di sini

Roman Gräf
sumber
Anda dapat mengubah 'D'dan 'M'ke 0dan 1.
Kevin Cruijssen