Martin vs Dennis - 1. Tur: Kim daha fazla rep var?


33

"Dünyanın en iyi iki kod golfçüsü" ile ilgili birçok zorluk olduğunu biliyorum, ancak bu biraz daha benzersiz, bunlardan ikisini içeren bir dizi (gelecekteki) mücadelenin 1. Turu .


Göreviniz, programın çalıştırıldığı anda Dennis ♦ ve Martin Ender ♦ arasında daha fazla üne sahip olana karşılık gelen iki farklı boşluk olmayan ASCII dizesini döndüren bir program veya işlev yazmaktır . İşin zor yanı, ünün aynı olması (muhtemel olmayan) olması durumunda "tie" dizgesini tam olarak vermeniz gerektiği ve yukarıda belirtilen iki farklı boşluk olmayan ASCII dizgesinin "tie" işaretinden * farklı olması gerektiğidir .

Kullanıcı adları veya kullanıcı kimlikleri gibi girdi alınamaz. Her zamanki gibi, URL kısaltıcılar yasaktır ve ortak boşluklar da öyle.

Örnekler:

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 

ÖNEMLİ! Aşağıdaki çözümleri test etmek amacıyla yalnızca bir bağı etkilemek amacıyla Dennis & Martin tarafından gönderilen yazılara oy vermek, Stack Exchange ağı genelinde yasaklanan hedefli oylamayı teşkil eder. Bir çözümün düzgün şekilde çıktığını test etmek istiyorsanız, tieiçindeki kimlikleri bağlı olduğunu bildiğiniz 2 kullanıcınınkiyle değiştirin. Daha fazla ayrıntı için bu Meta postayı görün .

* Bence hiç kimse bunu kullanmazdı.


33
"... dünyanın en iyi iki kod golfçüsü ..." [kaynak belirtilmeli]
Martin Ender

9
Bu toplulukta daima 1. ve 2. sıra olacağını varsayabilir miyiz?
ovs

7
Dostça bir hatırlatma: Stack Exchange ağının tamamında oy amaçlı oy kullanımı yasaktır. Martin Oy olduğunu ve sadece bu meydan okumaya Test gönderimleri Yayınlarımdaki edilir değil izin verdi.
Dennis

2
@Shaggy Bu notu eklemiş olmanız harika. Umarım, katılan kullanıcılar bunu yapmayı bırakacaktır
Bay Xcoder

1
@MartinEnder'in tepesine, ortak bilgi olan gerçekler için alıntı yapılmaya gerek yok.
Gryphon - Monica

Yanıtlar:


20

05AB1E , 65 64 bayt

Kod:

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

05AB1E kodlamasını kullanır .


Açıklama:

•в=6{•sayıyı в=6{taban 255'ten taban 10'a dönüştürür, sonuçta 1201208478 . İlk yarı Dennis'in kimliği (12012), ikinci yarı ise Martin kimliği (8478). Aşağıdaki diziyi elde etmek için 5 parçaya bölün :

['12012', '08478']

Neyse ki, baştaki sıfırı Martin'in ID'sinden çıkarabiliriz, çünkü bu çalışmaya devam edecektir (baştaki sıfırı görmek için tıklatmadan önce bağlantıyı kontrol ediniz).

Şimdi bu diziyi kullanarak vybu 05AB1E kodundan aşağıdaki dizgiyi kullanarak döngü kurarız:

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

Oysa ÿyineleyicinin şu anki elemanıdır (string interpolasyonu kullanarak) Çevrimiçi deneyin!

Bağlantıyı oluşturduktan sonra, .wbüyük miktarda metinle sonuçlanan bağlantıdaki tüm verileri okur. Bundan itibarı sıyırmak için ipte ayrılmamız gerekir title="reputation". Ya da daha sıkıştırılmış bir sürümü olarak: ’„Ö="ˆ"’. Bu dizgede (with ¡) ayırın ve ikinci öğeyi (with ) alın ve ilk 100 karakteri (with т£) tutun .

Şimdi, alıntı metinimiz biraz şuna benziyor:

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

<div class="ba

Bu kısım kolaydır, sadece bir builtin ( ) sahibi olduğumuz itibar numarası olarak kalması için rakamlardan başka bir şey kaldırırız þ. Döngüyü sonlandırıp her şeyi bir diziye sarıyoruz }}).

Son olarak, itibar sayıları işlemeye devam edebiliriz:

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

Ya hangi sonuçları D, Mveya tie.


2
05AB1E'nin internet API'lerine erişebildiğini bilmiyordum, bu cevap beni şaşırtıyor => +1
Bay Xcoder

Her zaman sizin ve başkalarının belirli bir numarayı elde etmenin yollarını bulmasını seviyorum. :) Btw 1, "kısmıdır ile ikinci eleman ( 1è) and keep the first **100 characters** (with т£. Kod bloklar halinde tamamen olması gerekiyordu" ya olması gerektiği " ile ikinci eleman ( ) ve birinci tutmak 100 karakter ile ( т£). " Yerine? Sanırım bir yazım hatası, ancak böyle olması gerekiyorsa kafam karıştı ..
Kevin Cruijssen

@KevinCruijssen Huh, bunun nasıl olduğu hakkında hiçbir fikrim yok, ama şimdi düzeltildi. Başınız için teşekkürler! :)
Adnan

yanlış görünüyor (bu tür bir kodu nasıl düzelteceğimi bilmiyorum, üzgünüm) Dennis: 140,033; Martin: 140,003, ama kodunu burada denedim tio.run/nexus/05ab1e#@/… , bu verim tie. Çıkması gerekmiyor Dmu?
Eddie

@Eddie .w, TIO'da kısıtlanan web erişimini gerektirir (güvenli modda 05AB1E'yi çalıştırır). Çevrimdışı tercümanda çalışması gerekir.
Adnan

19

PowerShell v3 +, 147 123 119 103 101 96 Bayt

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

İsimler yerine doğru / yanlış çıktı kullanılarak 24 bayt kaydedildi.

Son kontrolleri yeniden yapılandırarak 4 tane daha kurtardım.

İki kullanıcının yalnızca isteklerini talepten elde ederek elde ettiği tasarruf 16, |% r*nbirden fazla kez kullanmak zorunda kalmadan tasarruf sağlar , aynı zamanda milyonlarca parantez ve iki gereksiz değişkenden kurtulabileceğimiz anlamına gelir.

-2 sayesinde TessellatingHeckler - yerine URL için iki doublequotes bir kaçış kömürü kullanılarak da kaldırılır @un ihtiyaç duyulan (Oppssss) idi diziden

TessellatingHeckler -5 .ToStringtarafından tavsiye edilen ve nihayet 100'ün altında olan şimdiye kadar varolmadığım hiç bir zaman garip bir numara kullandım .


Adları döndüren sürüm:

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

parametre adlarının kısalması nedeniyle bu oldukça karışık görünüyor.

her yerde |% r*nbiz alıyoruz görünür ReputatioNve |% d*olduğuDisplay_name

kullanımları Invoke-RestMethod(takma ad irm) depolar, adlı sonucu API sorgulamak için Items(kazanılmış kullanarak |% I*iki değişken içine,) $a& $bher profesyonel golfçü en için bir,, ToString( |% T*gdeğerlerden birini) hile sonuçları D, Mveya Tieçift sayı ise tek / / sıfır.


Powershell'in en kısa olmasını beklemiyordum. +1
Rɪᴋᴇʀ

@Riker Pyth muhtemelen olurdu, ama korkunç bir böcek var.
Outgolfer Erik,

1
Tamam, sen kazandın; Mümkün değil şimdi bunu yeneceğim!
Shaggy

9
Yani kodunuz 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163bayt uzunluğunda ..? : P
totallyhuman

1
@TessellatingHeckler son bitin cevabını kontrol et, 100'ün altında aldın! - ToString+/- numaralarla bu şekilde çalıştığını asla bilmiyordum , gelecek için hatırlayacağım.
colsw

16

Python 2,160 bayt

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'

En kısa Python cevabı değil, fakat şimdiye kadarki en kestirisi herhangi bir varsayımda bulunmuyor.

1Martin daha fazla temsilcisi varsa yazdırır , -1eğer yaparsam.


14

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

Aptal fetchve aptal, pahalı Promisezincirleme!

Şu anda izin verildiği gibi, Dennis & Martin’in her zaman en üstteki 2 kullanıcı olacağını varsayar. Kök seviyesinden çalıştırılması gerekiyor api.stackexchange.com. O Promiseanda en çok temyizde bulunan kişiyi içeren bir nesneyi (şimdi konsensüsün izin verdiği şekilde ) tieveya JSON nesnesini döndürür . JSON nesnesi geçerli çıktı olarak kabul edilmezse, bunun için 5 bayt ekleyin .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Kevin, 11 linkmektuptan tasarruf sağladı ve bu display_name, ilk harfinden ziyade profili geri döndürdüğümü önerdi ; bu , aynı zamanda bu harfle başlayacak kullanıcı adlarını değiştirmelerine karşı geleceğe yönelik daha iyi bir prova sağlama!
  • 5 bayt , bir başka kameri çözüm üzerinde kamoroso94'ten bir ucu uyarlayarak kaydetti .

Dene

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

Dennis & Martin'in en üstte olmadığı bir zaman gelirse ve hala aralarında en fazla temanın kim olduğunu bilmek istiyorsak, ek 10 bayt pahasına aşağıdakilere ihtiyacımız var.

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

2
Değişebilirsin .display_name[0]için .display_name, ya da yine her ikisi için de benzersizdir bile kısa bir alternatif: .link. ;) Veya yalnızca tüm JSON, ancak alarm-popup'a uyup uymadığından emin değilim.
Kevin Cruijssen

Teşekkürler, @KevinCruijssen; Martin'in izinsiz olduğu bir alan içerdiğinden, kullanıcı adının bir özetini kullanmak zorunda kaldım. Kullanırken iyi bir not linkolsa da, yalnızca ihtiyaç duyduğum bilgiyi döndürmek için filtrelenmiş bir API sorgusu kullanıyordum.
Shaggy

@KevinCruijssen AJAX iadeleri ile uğraşırken, tüm HTML sayfalarını uyarı pop-up'larına attım. Üstesinden gelebilir.
Draco18,

@ Draco18'ler alertbir JSON nesnesi olsa da, sadece gösterecektir [object Object].
Shaggy

@Shaggy Doğru, doğru.
Draco18,

9

Python 3, 160 157 151 bayt

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

@KevinCruijssen sayesinde -3 bayt

Daha fazla üne sahip olan kullanıcıya bir bağlantı yazdırır

1. ve 2. sırada olduklarını varsayalım.


Herhangi bir varsayımda bulunmadan, Python 2, 157 bayt :

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 bayt

Bunun çok uzun olduğunu hissediyorum.

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'nin Dennis'ten daha fazla temsilcisi "False"varsa, Dennis'in Martin'den daha fazla temsilcisi "tie"varsa ve eğer aynıysa (Teorik olarak. Bunu test edemiyorum: P) yazdırır .

https-> http1 byte için @KevinCruijssen! re as r, r.sub-> re, re.sub@ovs sayesinde 4 byte için!


Tam olarak emin değilim, ama değiştirmek mümkündür httpsiçin http? PPCG'nin şimdi tamamen https olduğunu biliyorum, ancak Python'da HTTP'ye giderken, tıpkı bir tarayıcıda olduğu gibi, HTTPS'ye otomatik olarak yönlendiriliyor?
Kevin Cruijssen

@KevinCruijssen Ah evet, orada ne düşündüğümü bilmiyorum. Teşekkürler!
HyperNeutrino

1
İhtiyacın yok re as R. Sadece kullanın import requests as r,revere.sub
ovs

@ Hov, orjinal yaklaşımım farklıydı Teşekkürler!
HyperNeutrino

cmpSon üç satırı değiştirerek bazı baytları kaydetmek için işlevi kullanabileceğinizi düşünüyorumprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo

6

PHP, 167 Bayt

Dennis için -1, Martin Ender için 1 olarak basar. kravat halinde bağlamak

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

Bunu mobil bir etkin noktada yaptım, bu yüzden ... bu harika değil ... İkisinin de her zaman aynı yüz binde olacağını varsayalım. Şimdi hiçbir şey varsaymıyor. : 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]

Baskılar TrueDennis Martin fazla itibar varsa Falseaksi ve Tieeğer olurlarsa ... bağladılar.


4

Bash + jq , 140 133 bayt

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

Biçimlendirildi ve açıklandı

İlk olarak, curl API w3m (ve kullanımını --compressed, ya da kısa --comun-gzip için) :

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

Bu biraz JSON. Siparişin, itibara dayalı değil kararlı olduğunu fark edin. JQ daha sonra bunun için yapılan JSON'u işler.

.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

Kullandığımız 1/xböylece bir bağlama durumda, bir bölme-ile-sıfır hata dakika == maksimum üretmek için, yukarıda. ||echo tieBash yakalar söyledi.

Bu durumda JQ tarafından stderr üzerine bir uyarı yazdırıldığını unutmayın, ancak programın gerçek sonucunu yalnızca stdout olarak kabul ederiz;)


1
Birkaç bayt kaydetmek w3myerine kullanabilirsiniz curl --com. Ayrıca, bunun jq 1.5 gerektirdiğinden bahsetmeye değer olduğunu düşünüyorum, çünkü jq 1.4 sıfıra bölme hatası vermedi.
Dennis,

Doğru, ipucu için teşekkürler. W3m tam olarak aradığım şeydi.
opatut

1

Stackexchange API Veri Gezgini , 184 180 bayt

-4 bytes için @Kevin Cruijssen'e teşekkürler

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

Dennis için 1 ve Martin için 2 yazdırıldı

Sadece SEADE hakkında dün öğrendim, bu çok yenilebilir olmalı.

Burada dene


'D'Ve 'M'ile 0ve değiştirebilirsiniz 1.
Kevin Cruijssen 19:17
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.