Martin vs Dennis - Ronda 1: ¿Quién tiene más representante?

33

Sé que ha habido muchos desafíos sobre "los dos mejores golfistas de código del mundo", pero este es un poco más único, ya que es la Ronda 1 en una serie de desafíos (futuros) que involucran a los dos.


Su tarea es escribir un programa o función que devuelva dos cadenas ASCII distintas de espacios en blanco, correspondientes a la que tiene más reputación en el momento en que se ejecuta el programa, entre Dennis ♦ y Martin Ender ♦ . La parte difícil es que debe generar el "lazo" de cadena exacto en caso de que la reputación sea idéntica (no probable), y las dos cadenas ASCII distintas de espacios en blanco mencionadas anteriormente deberían ser diferentes a "lazo" * .

No se pueden realizar entradas, como nombres de usuario o ID de usuario. Como de costumbre, los acortadores de URL están prohibidos, al igual que las lagunas comunes.

Ejemplos:

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 

¡IMPORTANTE! Votar en publicaciones de Dennis & Martin con el único propósito de afectar un empate para probar las soluciones a continuación constituye una votación dirigida que está prohibida en toda la red de Stack Exchange. Si desea probar que una solución se genera correctamente tie, cambie las ID en ella a las de 2 usuarios que sabe que están vinculados. Vea esta publicación de Meta para más detalles.

* Creo que nadie hubiera usado eso, de todos modos

Sr. Xcoder
fuente
33
"... los dos mejores golfistas de código del mundo ..." [cita requerida]
Martin Ender
9
¿Podemos suponer que siempre serán # 1 y # 2 en esta comunidad?
2017
77
Un recordatorio amistoso: el voto dirigido está prohibido en toda la red de Stack Exchange. No está permitido votar en Martin y mis publicaciones solo para probar los envíos a este desafío .
Dennis
2
@ Shaggy Es genial que hayas agregado esa nota. Con suerte, los usuarios involucrados dejarán de hacerlo
Sr. Xcoder
1
Para @MartinEnder en la parte superior, las citas son innecesarias para hechos que son de conocimiento común.
Gryphon - Restablece a Mónica el

Respuestas:

20

05AB1E , 65 64 bytes

Código:

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

Utiliza la codificación 05AB1E .


Explicación:

•в=6{•convierte el número в=6{de la base 255 a la base 10, lo que resulta en 1201208478 . La primera mitad es la identificación de Dennis (12012) y la segunda mitad es la identificación de Martin (8478). Dividir en piezas de 5 usando para obtener la siguiente matriz:

['12012', '08478']

Afortunadamente, podemos dejar el cero inicial de la ID de Martin, ya que esto seguirá funcionando (verifique el enlace antes de hacer clic para ver el cero inicial).

Ahora vyrecorremos esta matriz usando y construimos la siguiente cadena a partir de este código 05AB1E:

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

Mientras que ÿes el elemento actual del iterador (usando interpolación de cadenas) ¡ Pruébelo en línea!

Después de construir el enlace, .wlee todos los datos del enlace, lo que resulta en una gran cantidad de texto. Para raspar la reputación de esto, necesitamos dividirnos en la cadena title="reputation". O en una versión más comprimido: ’„Ö="ˆ"’. Dividir en este trozo de cuerda (con ¡) y obtener el segundo elemento (con ) y mantener los primeros 100 caracteres (con т£).

Ahora, nuestro texto raspado se parece un poco a esto:

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

<div class="ba

Esta parte es fácil, simplemente eliminamos cualquier cosa menos dígitos para seguir siendo el número de reputación, para lo cual tenemos un builtin ( þ). Terminamos el ciclo y envolvemos todo en una matriz }}).

Finalmente, podemos pasar a procesar los números de reputación:

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

Lo que da como resultado D, Mo tie.

Adnan
fuente
2
No sabía que 05AB1E puede acceder a las API de Internet, este tipo de respuesta me sorprende => +1
Sr. Xcoder
Siempre me gusta cómo tú y los demás idean formas de obtener un número determinado. :) 1 Por cierto, es la parte " segundo elemento (con 1è) and keep the first **100 characters** (with т£. " Supone que es completamente de código de bloques, o debe ser " segundo elemento (con ) y dejar los primeros 100 caracteres (con т£). " En lugar? Supongo un error tipográfico, pero si se supone que es así, estoy confundido ..
Kevin Cruijssen
@KevinCruijssen Huh, no tengo idea de cómo sucedió eso, pero ahora está solucionado. ¡Gracias por el aviso! :)
Adnan
parece incorrecto (no sé cómo corregir este tipo de código, lo siento) Dennis: 140,033; Martin: 140,003, pero probé su código aquí tio.run/nexus/05ab1e#@/… , produce tie. ¿No debería salir en su Dlugar?
Eddie
@Eddie .wrequiere acceso web, que está restringido en TIO (ejecuta 05AB1E en modo seguro). En el intérprete sin conexión, debería funcionar.
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"

Se guardaron 24 bytes usando la salida verdadero / falso en lugar de los nombres.

Salvó otros 4 reestructurando los controles finales.

ahorró 16 al obtener solo la reputación de los dos usuarios de la solicitud, ahorra tener que usar |% r*nmás de una vez, también significa que podemos deshacernos de un millón de corchetes y dos variables inútiles.

-2 gracias a TessellatingHeckler : al usar un carácter de escape en lugar de dos comillas dobles para la url, también se eliminó @de la matriz que no era necesaria (oopsie)

usé un .ToStringtruco extraño que nunca supe que existía hasta ahora recomendado por TessellatingHeckler -5, y finalmente por debajo de 100.


Versión que devuelve nombres:

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

Esto se ve bastante desordenado debido al acortamiento de los nombres de los parámetros.

en cualquier lugar |% r*nparece que estamos obteniendo el ReputatioN, y |% d*es elDisplay_name

usa Invoke-RestMethod(alias irm) para consultar la API, almacena el resultado llamado Items(conseguido |% I*), en las dos variables $a& $b, una para cada jugador profesional, el truco ToString( |% T*g) da como resultado uno de los valores D, Mo Tiesi el número es impar / par / cero.

colsw
fuente
No esperaba que powershell fuera el más corto. +1
Rɪᴋᴇʀ
Es probable que @Riker Pyth lo hubiera estado, pero tiene un error horrible.
Erik the Outgolfer
1
Bien, tu ganas; de ninguna manera voy a vencer esto ahora!
Shaggy
9
¿Entonces su código tiene una 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163longitud de bytes? : P
totalmente humano
1
@TessellatingHeckler comprueba la respuesta para el último bit, ¡lo tienes por debajo de 100! - Nunca supe que ToStringfuncionó así con números +/-, lo recordaré para el futuro.
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'

No es la respuesta más corta de Python, sino la más corta hasta ahora que no hace ninguna suposición.

Imprime 1si Martin tiene más representante, -1si yo tengo.

Dennis
fuente
14

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

¡Estúpido fetchy su Promiseencadenamiento estúpido y costoso !

Asume, según lo permitido actualmente, que Dennis & Martin siempre serán los 2 usuarios mejor clasificados. Debe ejecutarse desde el nivel raíz de api.stackexchange.com. Devuelve un Promiseobjeto (como ahora lo permite el consenso ) que contiene tieo el objeto JSON para quien tenga más representantes en ese momento. Si el objeto JSON no se considera salida válida, agregue 5 bytes para .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • ¡Ahorré 11 bytes gracias a que Kevin sugirió que devolviera el perfil en linklugar de la primera letra del display_name, lo que también proporciona una mejor protección contra el futuro en contra de que cambien sus nombres de usuario para comenzar con la misma letra!
  • 5 bytes guardados adaptando una sugerencia de kamoroso94 en otra solución mía.

Intentalo

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)


Alternativa

Si llega un momento en que Dennis y Martin no están en la cima y aún queremos saber quién tiene la mayor cantidad de representantes entre ellos, necesitaríamos lo siguiente, a un costo de 10 bytes adicionales.

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
Lanudo
fuente
2
Puede cambiar .display_name[0]a .display_name, o una alternativa aún más corto que todavía es único para los dos: .link. ;) O solo el JSON completo, pero no estoy seguro de si cabe en la ventana emergente de alerta.
Kevin Cruijssen
Gracias, @KevinCruijssen; Tuve que usar un extracto del nombre de usuario ya que Martin contiene un espacio, que no está permitido. Sin linkembargo, bueno, estaba usando una consulta API filtrada para devolver solo la información que necesitaba.
Shaggy
@KevinCruijssen He volcado páginas HTML completas en ventanas emergentes de alerta cuando se trata de devoluciones de AJAX. Puede manejarlo.
Draco18s
@ Draco18s, alertaunque se mostrará un objeto JSON [object Object].
Shaggy
@ Shaggy Cierto, cierto, lo haría.
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 gracias a @KevinCruijssen

Imprime un enlace al usuario que tiene más reputación

Asume que están en el # 1 y # 2


Sin hacer ninguna suposición, 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
fuente
6

Python, 226 225 221 bytes

Siento que esto es demasiado largo.

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 tiene más representante que Dennis, "False"si Dennis tiene más representante que Martin y "tie"si tienen el mismo (en teoría. No puedo probar esto: P).

https-> httppor 1 byte gracias a @KevinCruijssen! re as r, r.sub-> re, re.subpor 4 bytes gracias a @ovs!

Hiperneutrino
fuente
No estoy completamente seguro, pero ¿es posible cambiar httpsa http? Sé que PPCG es completamente https ahora, pero ¿tal vez se dirige automáticamente a HTTPS cuando navegas a HTTP en Python, tal como lo hace en un navegador?
Kevin Cruijssen
@KevinCruijssen Ah sí, no sé lo que estaba pensando allí. ¡Gracias!
HyperNeutrino
1
No es necesario re as R. Solo use import requests as r,reyre.sub
ovs
@ovs Heh, mi enfoque original fue diferente ¡Gracias!
HyperNeutrino
Creo que puede usar la cmpfunción para guardar algunos bytes reemplazando las últimas tres líneas con algo comoprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo
6

PHP, 167 bytes

imprime -1 para Dennis, 1 para Martin Ender. empate en caso de empate

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

Python 2 , 228 223 204 199 bytes

Hice esto en un punto de acceso móvil, así que ... no es genial ... Asume que ambos siempre estarán en los mismos cien mil. No asume nada ahora. :RE

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]

Imprime Truesi Dennis tiene más reputación que Martin, de lo Falsecontrario y Tiesi están ... atados.

totalmente humano
fuente
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

Formateado y explicado

Primero, enrollamos w3m la API (y usamos --compressed, o abreviamos --compara descomprimir) :

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

Eso es algo de JSON. Observe que el pedido no es estable, no se basa en la reputación. JQ luego procesa el JSON, que es para lo que está hecho.

.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

Usamos lo 1/xanterior para generar un error de división por cero cuando min == max, por lo que en una situación de empate. El ||echo tieen bash atrapa eso.

Tenga en cuenta que JQ imprime una advertencia en stderr en ese caso, pero consideramos solo stdout el resultado real del programa;)

Opatut
fuente
1
Puede usar en w3mlugar de curl --comguardar algunos bytes. Además, creo que vale la pena mencionar que esto requiere jq 1.5, ya que jq 1.4 no generó un error de división por cero.
Dennis
Es cierto, gracias por la pista. W3m es exactamente lo que estaba buscando.
Opatut
1

Stackexchange API Data Explorer , 184 180 bytes

Gracias a @Kevin Cruijssen por -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

Imprime 1 para Dennis y 2 para Martin

Ya que ayer aprendí sobre SEADE, esto debería ser muy fácil de superar.

Pruébalo aquí

Roman Gräf
fuente
Puedes cambiar 'D'y 'M'a 0y 1.
Kevin Cruijssen