Martin vs Dennis - Tour 1: Qui a plus de représentant?

33

Je sais qu'il y a eu beaucoup de défis concernant "les deux meilleurs golfeurs selon le code au monde", mais celui-ci est un peu plus unique, puisqu'il fait partie du premier tour d'une série de (futurs) défis les impliquant.


Votre tâche consiste à écrire un programme ou une fonction renvoyant deux chaînes ASCII différentes, sans espace, correspondant à celle qui a plus de réputation au moment où le programme est exécuté, entre Dennis ♦ et Martin Ender ♦ . La difficulté réside dans le fait que vous devez générer la chaîne exacte "tie" dans le cas où la réputation est identique (peu probable), et que les deux chaînes ASCII autres que des espaces blancs mentionnées ci-dessus doivent être différentes de "tie" * .

Aucune entrée ne peut être prise, tels que les noms d'utilisateur ou les identifiants d'utilisateur. Comme d'habitude, les raccourcisseurs d'URL sont interdits, de même que les failles communes.

Exemples:

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 

IMPORTANT! Voter sur les messages de Dennis & Martin dans le seul but de créer une égalité afin de tester les solutions ci-dessous constitue un vote ciblé qui est interdit sur le réseau Stack Exchange. Si vous souhaitez vérifier qu'une solution génère correctement les résultats, tiemodifiez les identifiants qu'il contient par ceux de deux utilisateurs que vous savez liés. Voir ce post Meta pour plus de détails.

* Je pense que personne n'aurait utilisé ça, de toute façon

M. Xcoder
la source
33
"... les deux meilleurs codes-golfeurs du monde ..." [citation nécessaire]
Martin Ender
9
Pouvons-nous supposer qu’ils seront toujours les n ° 1 et n ° 2 de cette communauté?
Ovs
7
Un rappel amical: le vote ciblé est interdit sur tout le réseau Stack Exchange. Le vote sur Martin et mes messages juste pour les soumissions de test à ce défi est pas permis.
Dennis
2
@Shaggy C'est génial que vous ayez ajouté cette note. Espérons que les utilisateurs concernés cesseront de le faire
M. Xcoder
1
Pour @MartinEnder en haut, les citations sont inutiles pour des faits qui sont de notoriété publique.
Gryphon - Réintégrer Monica

Réponses:

20

05AB1E , 65 64 octets

Code:

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

Utilise le codage 05AB1E .


Explication:

•в=6{•convertit le nombre в=6{de la base 255 à la base 10, ce qui donne 1201208478 . La première moitié étant l'ID de Dennis (12012) et la seconde moitié étant l'ID de Martin (8478). Diviser en morceaux de 5 en utilisant pour obtenir le tableau suivant:

['12012', '08478']

Heureusement, nous pouvons laisser le zéro initial de l'ID de Martin, puisque cela fonctionnera toujours (vérifiez le lien avant de cliquer pour voir le zéro principal).

Nous vyparcourons maintenant ce tableau en utilisant et construisons la chaîne suivante à partir de ce code 05AB1E:

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

Considérant que ÿl’élément actuel de l’itérateur (utilisant l’interpolation de chaîne) est à essayer en ligne!

Une fois le lien .wcréé, toutes les données du lien sont lues, ce qui génère une énorme quantité de texte. Pour gratter la réputation de cela, nous devons diviser la chaîne title="reputation". Ou dans une version plus compressée: ’„Ö="ˆ"’. Séparez ce morceau de chaîne (avec ¡) et obtenez le deuxième élément (avec ) et conservez les 100 premiers caractères (avec т£).

Maintenant, notre texte gratté ressemble un peu à ceci:

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

<div class="ba

Cette partie est facile, nous enlevons simplement tout ce qui reste sauf les chiffres pour rester le numéro de réputation, pour lequel nous avons un builtin ( þ). Nous terminons la boucle et enveloppons tout dans un tableau }}).

Enfin, nous pouvons traiter les numéros de réputation:

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

Ce qui entraîne soit D, Msoit tie.

Adnan
la source
2
Je ne savais pas que 05AB1E pouvait accéder aux API Internet, cette réponse m'étonne gentiment => +1
M. Xcoder
J'aime toujours comment vous et les autres trouvez des moyens d'obtenir un certain nombre. :) +1 Btw, la partie " deuxième élément (avec 1è) and keep the first **100 characters** (with т£. " Est-elle supposée être complètement en code-blocs, ou devrait-elle être " deuxième élément (avec ) et conserver les 100 premiers caractères (avec т£). " À la place? Je suppose une faute de frappe, mais si c'est supposé être comme ça, je suis confus ..
Kevin Cruijssen
@KevinCruijssen Euh, je n'ai aucune idée de la façon dont cela s'est passé, mais c'est réglé maintenant. Merci pour l'information! :)
Adnan
il semble incorrect (je ne sais pas comment corriger ce genre de code, désolé), Dennis: 140,033; Martin: 140,003, mais j’ai essayé votre code ici tio.run/nexus/05ab1e#@/… , cédé tie. Ne devrait-il pas sortir à la Dplace?
Eddie
@ Eddie .wnécessite un accès Web, qui est limité sur TIO (il exécute 05AB1E en mode sans échec). Dans l'interprète hors ligne, cela devrait fonctionner.
Adnan
19

PowerShell v3 +, 147 123 119 103 101 96 Octets

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

24 octets enregistrés en utilisant une sortie vrai / faux au lieu des noms.

A sauvé 4 autres en restructurant les derniers contrôles.

sauvé 16 en obtenant seulement les réputations des deux utilisateurs de la demande, évite de devoir utiliser |% r*nplusieurs fois, signifie également que nous pouvons nous débarrasser d'un million de crochets et de deux variables inutiles.

-2 grâce à TessellatingHeckler - l'utilisation d'un caractère d'échappement au lieu de deux guillemets doubles pour l'URL, a également supprimé @le tableau qui n'était pas nécessaire (oopsie)

utilisé un .ToStringtour étrange que je ne savais pas existé jusqu’à présent recommandé par TessellatingHeckler -5, et finalement inférieur à 100.


Version qui renvoie les noms:

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

cela semble assez compliqué à cause du raccourcissement des noms de paramètres.

n'importe où |% r*napparaît nous obtenons le ReputatioN, et |% d*est leDisplay_name

utilise Invoke-RestMethod(alias irm) pour interroger l'API, stocke le résultat nommé Items(obtenu avec |% I*) dans les deux variables $a& $b, une pour chaque golfeur, l' astuce ToString( |% T*g) donne l'une des valeurs D, Mou Tiesi le nombre est impair / pair / zéro.

Colsw
la source
Je ne m'attendais pas à ce que PowerShell soit le plus court. +1
Rɪᴋᴇʀ
@Riker Pyth aurait probablement été, mais il a un horrible bug.
Erik l'Outgolfer
1
Bien, vous gagnez; aucun moyen je vais battre ça maintenant!
Shaggy
9
Donc, votre code est 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163long bytes ..? : P
totalement humain
1
@TessellatingHeckler vérifie la réponse pour le dernier bit, tu l'as eu en dessous de 100! - Jamais su ToStringtravailler comme ça avec +/- chiffres, se souviendra pour l'avenir.
Colsw
16

Python 2 , 160 octets

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'

Pas la réponse la plus courte en Python, mais la plus courte jusqu'à présent qui ne repose sur aucune hypothèse.

Imprime 1si Martin a plus de représentant, -1si je le fais.

Dennis
la source
14

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

Stupide fetchet son Promiseenchaînement stupide et coûteux !

En supposant, comme autorisé actuellement, Dennis & Martin seront toujours les 2 utilisateurs les mieux classés. Doit être exécuté à partir du niveau racine de api.stackexchange.com. Retourne un Promiseobjet (comme cela est maintenant autorisé par consensus ) contenant tieou l'objet JSON pour celui qui a le plus de représentants à ce moment. Si l'objet JSON n'est pas considéré comme une sortie valide, ajoutez 5 octets pour .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • 11 octets sauvés, grâce à Kevin qui a suggéré que je retourne le profil linkplutôt que la première lettre de la display_name, ce qui leur permet également de mieux résister à l'avenir, car ils changent de nom d'utilisateur pour commencer par la même lettre!
  • 5 octets enregistrés en adaptant une astuce de kamoroso94 sur une autre de mes solutions.

L'essayer

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

S'il arrive un moment où Dennis et Martin ne sont pas au sommet et que nous voulons toujours savoir qui a le plus de représentants entre eux, nous aurions besoin de ce qui suit, au coût de 10 octets supplémentaires.

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
Hirsute
la source
2
Vous pouvez changer .display_name[0]à .display_name, ou une alternative encore plus courte qui est encore unique pour les deux: .link. ;) Ou juste le JSON entier, mais je ne suis pas sûr que ça rentre dans le popup d'alerte.
Kevin Cruijssen
Merci, @KevinCruijssen; J'ai dû utiliser un extrait du nom d'utilisateur car Martin contient un espace, ce qui n'est pas autorisé. Criant d'utiliser link, cependant, j'utilisais une requête d'API filtrée pour ne renvoyer que les informations dont j'avais besoin.
Shaggy
@KevinCruijssen J'ai vidé des pages HTML entières dans des fenêtres d'alerte lors du traitement des déclarations AJAX. Il peut le gérer.
Draco18s
@ Draco18s, alertun objet JSON, cependant, ne fera que s'afficher [object Object].
Shaggy
@Shaggy C'est vrai, c'est vrai.
Draco18s
9

Python 3, 160 157 151 octets

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 octets grâce à @KevinCruijssen

Imprime un lien vers l'utilisateur ayant plus de réputation

Suppose qu'ils sont sur les n ° 1 et n ° 2


Sans faire d'hypothèses, Python 2, 157 octets :

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
la source
6

Python, 226 225 221 bytes

J'ai l'impression que c'est trop long.

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

Imprime "True"si Martin a plus de représentant que Dennis, "False"si Dennis a plus de représentant que Martin et "tie"s'ils ont le même (théoriquement. Je ne peux pas tester ceci: P).

https-> httppour 1 octet grâce à @KevinCruijssen! re as r, r.sub-> re, re.subpendant 4 octets grâce à @ovs!

HyperNeutrino
la source
I'm not entirely sure, but is it possible to change https to http? I know PPCG is completely https now, but perhaps it auto-directs to HTTPS when you navigate to HTTP in Python, just as it does in a browser?
Kevin Cruijssen
@KevinCruijssen Ah yes, I don't know what I was thinking there. Thanks!
HyperNeutrino
1
You don't need re as R. Just use import requests as r,re and re.sub
ovs
@ovs Heh, my original approach was different Thanks!
HyperNeutrino
I think you can use the cmp function to save some bytes by replacing the last three lines with something like print['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo
6

PHP, 167 Bytes

prints -1 for Dennis , 1 for Martin Ender. tie in case of a tie

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

Python 2, 228 223 204 199 bytes

I did this on a mobile hotspot so... it's not great... Assumes both of them will always be in the same hundred thousand. Doesn't assume anything now. :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]

Prints True if Dennis has more reputation than Martin, False otherwise and Tie if they are... tied.

totallyhuman
la source
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

Formatted and explained

First, we curl w3m the API (and use --compressed, or short --com to un-gzip):

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

That's some JSON. Notice the order ist stable, not based on reputation. JQ then processes the JSON, which is what it's made for.

.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

We use 1/x above to generate an division-by-zero error when min==max, so in a tie situation. The ||echo tie in bash catches that.

Note that a warning is printed on stderr by JQ in that case, but we consider only stdout the actual result of the program ;)

opatut
la source
1
You can use w3m instead of curl --com to save a few bytes. Also, I think it's worth mentioning that this requires jq 1.5, as jq 1.4 didn't raise an error for division by zero.
Dennis
True, thanks for the hint. W3m is exactly what I was looking for.
opatut
1

Stackexchange API Data Explorer, 184 180 bytes

Thanks to @Kevin Cruijssen for -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

Prints 1 for Dennis and 2 for Martin

Since i only yesterday learned about the SEADE this should be very beatable.

Try it here

Roman Gräf
la source
You can change 'D' and 'M' to 0 and 1.
Kevin Cruijssen