Martin vs Dennis - Runde 1: Wer hat mehr Repräsentanten?

33

Ich weiß, dass es viele Herausforderungen bezüglich der "zwei besten Code-Golfer der Welt" gegeben hat, aber diese ist etwas einzigartiger, da sie in der ersten Runde einer Reihe von (zukünftigen) Herausforderungen besteht, an denen beide beteiligt sind.


Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die zwei verschiedene Nicht-Whitespace-ASCII-Zeichenfolgen zwischen Dennis ♦ und Martin Ender ♦ zurückgibt . Der schwierige Teil ist, dass Sie die exakte Zeichenfolge "tie" ausgeben müssen, falls die Reputation identisch ist (nicht wahrscheinlich) und die beiden oben genannten nicht-Whitespace-ASCII-Zeichenfolgen sich von "tie" * unterscheiden sollten .

Es können keine Eingaben wie Benutzernamen oder Benutzer-IDs vorgenommen werden. Wie üblich sind URL-Kürzungen verboten, ebenso wie die üblichen Schlupflöcher.

Beispiele:

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 

WICHTIG! Die Abstimmung über Posts von Dennis & Martin zum alleinigen Beeinflussen eines Unentschieden, um die folgenden Lösungen zu testen, stellt eine gezielte Abstimmung dar, die im gesamten Stack Exchange-Netzwerk verboten ist. Wenn Sie testen möchten, ob eine Lösung ordnungsgemäß ausgegeben tiewird, ändern Sie die darin enthaltenen IDs in die IDs von zwei Benutzern, von denen Sie wissen, dass sie gebunden sind. Weitere Details finden Sie in diesem Meta-Beitrag .

* Ich glaube, das hätte sowieso niemand benutzt

Mr. Xcoder
quelle
33
"... die zwei besten Code-Golfer der Welt ..."
Martin Ender
9
Können wir davon ausgehen, dass sie in dieser Community immer die ersten und zweiten Plätze belegen werden?
Ovs
7
Eine freundliche Erinnerung: Gezieltes Abstimmen ist im gesamten Stack Exchange-Netzwerk verboten. Es ist nicht gestattet, über Martins und meine Beiträge abzustimmen, um Beiträge für diese Herausforderung zu testen .
Dennis
2
@ Shaggy Es ist großartig, dass Sie diese Notiz hinzugefügt haben. Hoffentlich hören die beteiligten Benutzer damit auf
Mr. Xcoder
1
Für @MartinEnder an der Spitze sind Zitate für allgemein bekannte Fakten nicht erforderlich.
Gryphon - Reinstate Monica

Antworten:

20

05AB1E , 65 64 Bytes

Code:

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

Verwendet die 05AB1E- Codierung.


Erläuterung:

•в=6{•konvertiert die Zahl в=6{von Basis 255 in Basis 10, was zu 1201208478 führt . Die erste Hälfte ist die ID von Dennis (12012) und die zweite Hälfte ist die ID von Martin (8478). Teilen Sie sie in 5er-Teile auf , um das folgende Array zu erhalten:

['12012', '08478']

Glücklicherweise können wir die führende Null von Martins ID lassen, da dies immer noch funktioniert (überprüfen Sie den Link, bevor Sie auf die führende Null klicken).

Wir durchlaufen nun dieses Array vyund konstruieren den folgenden String aus diesem 05AB1E-Code:

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

While ÿist das aktuelle Element des Iterators (unter Verwendung von String-Interpolation). Probieren Sie es online aus!

.wLiest nach dem Erstellen der Verknüpfung alle Daten aus der Verknüpfung, was zu einer großen Textmenge führt. Um den Ruf davon abzukratzen, müssen wir uns auf die Saite aufteilen title="reputation". Oder in einer komprimierten Version: ’„Ö="ˆ"’. Teilen Sie diesen String (mit ¡) auf und erhalten Sie das zweite Element (mit ). Behalten Sie die ersten 100 Zeichen (mit т£) bei.

Unser Text sieht nun ungefähr so ​​aus:

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

<div class="ba

Dieser Teil ist einfach, wir entfernen nur alles außer Ziffern , um die Reputationsnummer zu erhalten, für die wir eine eingebaute ( þ) haben. Wir beenden die Schleife und wickeln alles in ein Array }}).

Schließlich können wir die Reputationszahlen verarbeiten:

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

Was ergibt entweder D, Moder tie.

Adnan
quelle
2
Ich wusste nicht, dass 05AB1E auf Internet-APIs zugreifen kann. Diese Antwort überrascht mich => +1
Mr. Xcoder
Mir gefällt immer, wie Sie und andere Wege finden, um eine bestimmte Zahl zu erhalten. :) +1 Übrigens, soll der Teil " zweites Element (mit 1è) and keep the first **100 characters** (with т£. " Vollständig in Codeblöcken sein, oder sollte er " zweites Element (mit ) und die ersten 100 Zeichen (mit т£) behalten . " Stattdessen? Ein Tippfehler, aber wenn es so sein soll, bin ich verwirrt.
Kevin Cruijssen
@ KevinCruijssen Huh, ich habe keine Ahnung, wie das passiert ist, aber es ist jetzt behoben. Vielen Dank für die Köpfe hoch! :)
Adnan
es scheint falsch (ich weiß nicht, wie ich diese Art von Code korrigieren soll, sorry) Dennis: 140,033; Martin: 140,003, aber ich habe deinen Code hier ausprobiert tio.run/nexus/05ab1e#@/… , es ergibt sich tie. Sollte es nicht Dstattdessen ausgegeben werden?
Eddie
@Eddie .werfordert einen Webzugriff , der auf TIO beschränkt ist (es wird 05AB1E im abgesicherten Modus ausgeführt). Im Offline-Interpreter sollte es funktionieren.
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"

24 Bytes mit True / False-Ausgabe anstelle der Namen gespeichert.

Sparte weitere 4 durch Restrukturierung der Endkontrolle.

Durch das Abrufen nur der Reputation der beiden Benutzer aus der Anfrage werden 16 gespart, und durch das mehrmalige Verwenden der beiden Benutzer werden |% r*nMillionen von Klammern und zwei unbrauchbare Variablen entfernt.

-2 dank TessellatingHeckler - mit einem Escape-Zeichen anstelle von zwei Anführungszeichen für die URL wurde auch @das nicht benötigte Array entfernt (oopsie)

benutzte einen seltsamen .ToStringTrick, von dem ich nie wusste, dass er bis jetzt von TessellatingHeckler -5 empfohlen wurde , und schließlich unter 100.


Version, die Namen zurückgibt:

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

Dies sieht aufgrund der Kürzung der Parameternamen ziemlich chaotisch aus.

irgendwo |% r*nerscheint, dass wir das bekommen ReputatioN, und |% d*ist dasDisplay_name

Verwendet Invoke-RestMethod(Alias irm), um die API abzufragen, speichert das Ergebnis mit dem Namen Items(verwendet |% I*) in den beiden Variablen $a& $b, eine für jeden Golfer. Der Trick ToString( |% T*g) führt zu einem der Werte D, Moder Tiewenn die Zahl ungerade / gerade / ist. Null.

colsw
quelle
Ich hatte nicht damit gerechnet, dass die Powershell die kürzeste sein würde. +1
Rɪᴋᴇʀ
@ Riker Pyth wäre es vermutlich gewesen, aber es hat einen schrecklichen Bug.
Erik der Outgolfer
1
Gut, du gewinnst; Auf keinen Fall werde ich das jetzt schlagen!
Shaggy
9
Also ist dein Code 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163bytes lang ..? : P
totalhuman
1
@TessellatingHeckler überprüfe die Antwort für das letzte Bit, du hast es unter 100! - Habe noch nie ToStringso mit +/- Zahlen gearbeitet, werde mich für die Zukunft erinnern.
colsw
16

Python 2 , 160 Bytes

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'

Nicht die kürzeste Python-Antwort, aber die kürzeste, die bisher keine Vermutungen zulässt.

Druckt, 1wenn Martin mehr Repräsentanten hat, -1wenn ich das tue.

Dennis
quelle
14

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

Dumm fetchund seine dummen, teuer PromiseVerkettungs!

Nimmt an, dass Dennis & Martin, wie derzeit erlaubt, immer die 2 bestplatzierten Benutzer sein werden. Muss von der Root-Ebene von ausgeführt werden api.stackexchange.com. Gibt ein PromiseObjekt zurück (wie dies jetzt nach Konsens zulässig ist ), tiedas ein JSON-Objekt enthält, oder das JSON-Objekt für denjenigen, der zur Zeit die meisten Repräsentanten hat. Wenn das JSON-Objekt nicht als gültige Ausgabe betrachtet wird, fügen Sie 5 Bytes für hinzu .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Dank Kevin, der vorschlägt, dass ich das Profil linkanstelle des ersten Buchstabens des zurückgebe display_name, wurden 11 Bytes gespart , was auch eine bessere Zukunftssicherheit bietet, wenn die Benutzernamen geändert werden und mit demselben Buchstaben begonnen wird!
  • 5 Bytes gespart, indem ein Tipp von kamoroso94 auf einer anderen Lösung von mir angepasst wurde .

Versuch es

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)


Alternative

Wenn Dennis & Martin einmal nicht an der Spitze stehen und wir immer noch wissen wollen, wer die meisten Mitarbeiter hat, dann benötigen wir die folgenden Daten zum Preis von zusätzlichen 10 Byte.

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
Zottelig
quelle
2
Sie können ändern , .display_name[0]zu .display_name, oder eine noch kürzere Alternative , die für beide von ihnen immer noch einzigartig ist: .link. ;) Oder nur das gesamte JSON, aber ich bin mir nicht sicher, ob es in das Alert-Popup passt.
Kevin Cruijssen
Vielen Dank, @ KevinCruijssen; Ich musste einen Auszug aus dem Benutzernamen verwenden, da Martins ein Leerzeichen enthält, das nicht erlaubt ist. Guter Ruf über die Verwendung link, aber ich wurde mit einer gefilterten API - Abfrage nur die Info kehre ich brauchte.
Shaggy
@KevinCruijssen Ich habe beim Umgang mit AJAX-Rückgaben ganze HTML-Seiten in Warnungs-Popups abgelegt. Es kann damit umgehen.
Draco18s
@Draco18s, alertein JSON-Objekt, wird nur angezeigt [object Object].
Shaggy
@ Shaggy Richtig, richtig, würde es.
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 Bytes dank @KevinCruijssen

Druckt einen Link zu dem Benutzer, der mehr Reputation hat

Angenommen, sie sind auf # 1 und # 2


Ohne irgendwelche Annahmen zu machen, Python 2, 157 Bytes :

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
quelle
6

Python, 226 225 221 Bytes

Ich denke, das ist zu lang.

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

Gibt aus, "True"ob Martin mehr Wiederholungen als Dennis hat, "False"ob Dennis mehr Wiederholungen als Martin hat und "tie"ob sie die gleichen haben (theoretisch. Ich kann das nicht testen: P).

https-> httpfür 1 Byte danke an @KevinCruijssen! re as r, r.sub-> re, re.subfür 4 Bytes dank @ovs!

HyperNeutrino
quelle
Ich bin nicht ganz sicher, aber ist es möglich , zu ändern , httpszu http? Ich weiß, dass PPCG jetzt vollständig https ist, aber möglicherweise wird es automatisch zu HTTPS umgeleitet, wenn Sie in Python zu HTTP navigieren, genau wie in einem Browser?
Kevin Cruijssen
@ KevinCruijssen Ah ja, ich weiß nicht, was ich dort gedacht habe. Vielen Dank!
HyperNeutrino
1
Das brauchst du nicht re as R. Verwenden Sie einfach import requests as r,reandre.sub
ovs
@ovs Heh, mein ursprünglicher Ansatz war anders Danke!
HyperNeutrino
Ich denke, Sie können die cmpFunktion verwenden, um einige Bytes zu sparen, indem Sie die letzten drei Zeilen durch so etwas wieprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo
6

PHP, 167 Bytes

druckt -1 für Dennis, 1 für Martin Ender. Krawatte im Falle einer Krawatte

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

Python 2 , 228 223 204 199 Bytes

Ich habe das auf einem mobilen Hotspot gemacht, also ... ist es nicht großartig ... Angenommen, beide werden immer in der gleichen Hunderttausend sein. Nimmt jetzt nichts an. : 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]

Druckt, Truewenn Dennis mehr Ansehen hat als Martin, Falseansonsten und Tiewenn sie ... gebunden sind.

total menschlich
quelle
4

Bash + jq , 140 133 Bytes

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

Formatiert und erklärt

Erstens haben wir curl die API W3M (und Verwendung --compressedoder kurz --comzu un-gzip) :

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

Das ist etwas JSON. Beachten Sie, dass die Bestellung stabil ist und nicht auf dem Ruf basiert. JQ verarbeitet dann den JSON, für den er gemacht ist.

.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

Wir verwenden 1/xoben, um einen Division-durch-Null-Fehler zu erzeugen, wenn min == max, also in einer Bindungssituation. Die ||echo tiein Bash fängt das auf.

Beachten Sie, dass in diesem Fall eine Warnung auf stderr von JQ gedruckt wird, aber wir betrachten nur stdout das tatsächliche Ergebnis des Programms;)

opatut
quelle
1
Sie können w3mstatt verwenden curl --com, um ein paar Bytes zu speichern. Ich denke auch, dass es erwähnenswert ist, dass dies jq 1.5 erfordert, da jq 1.4 keinen Fehler für die Division durch Null erzeugt.
Dennis
Stimmt, danke für den Hinweis. W3m ist genau das, wonach ich gesucht habe.
13.
1

Stackexchange API Data Explorer , 184 180 Byte

Vielen Dank an Kevin Cruijssen für -4 Bytes

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

Drucke 1 für Dennis und 2 für Martin

Da ich erst gestern von der SEADE erfahren habe, sollte dies sehr schlagbar sein.

Probieren Sie es hier aus

Roman Gräf
quelle
Sie können 'D'und 'M'zu 0und ändern 1.
Kevin Cruijssen