Martin vs Dennis - Round 1: Chi ha più rappresentante?


33

So che ci sono state molte sfide su "i due migliori golfisti del codice al mondo", ma questo è un po 'più unico, essendo Round 1 in una serie di (future) sfide che coinvolgono i due.


Il tuo compito è scrivere un programma o una funzione che restituisca due diverse stringhe ASCII non di spazio bianco, corrispondenti a quella che ha più reputazione al momento dell'esecuzione del programma, tra Dennis ♦ e Martin Ender ♦ . La parte difficile è che devi generare esattamente la stringa "tie" nel caso in cui la reputazione sia identica (non probabile), e le due diverse stringhe ASCII non di spazio sopra menzionate dovrebbero essere diverse da "tie" * .

Non è possibile accettare input, come nomi utente o ID utente. Come al solito, gli accorciatori di URL sono vietati, così come le scappatoie comuni.

Esempi:

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! Votare su post di Dennis & Martin al solo scopo di influenzare un pareggio al fine di testare le soluzioni di seguito costituisce un voto mirato che è proibito attraverso la rete di scambio di stack. Se vuoi testare che una soluzione emette correttamente tieallora cambia gli ID in essa con quelli di 2 utenti che sai essere legati. Vedi questo post Meta per maggiori dettagli.

* Penso che nessuno l'avrebbe usato, comunque


33
"... i due migliori golfisti del mondo ..." [citazione necessaria]
Martin Ender

9
Possiamo presumere che saranno sempre il numero 1 e il numero 2 in questa comunità?
Ovs,

7
Un promemoria amichevole: è vietato il voto mirato su tutta la rete di scambio di stack. Non è ammesso il voto sui post di Martin e sui miei post solo per testare gli invii a questa sfida .
Dennis,

2
@Shaggy È fantastico che tu abbia aggiunto quella nota. Si spera che gli utenti coinvolti smetteranno di farlo
Mr. Xcoder,

1
Per @MartinEnder nella parte superiore, le citazioni non sono necessarie per fatti che sono di conoscenza comune.
Gryphon - Ripristina Monica il

Risposte:


20

05AB1E , 65 64 byte

Codice:

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

Utilizza la codifica 05AB1E .


Spiegazione:

•в=6{•converte il numero в=6{dalla base 255 alla base 10, risultando in 1201208478 . La prima metà è l'ID di Dennis (12012) e la seconda metà è l'ID di Martin (8478). Dividi in pezzi di 5 usando per ottenere il seguente array:

['12012', '08478']

Fortunatamente, possiamo lasciare lo zero iniziale dall'ID di Martin, poiché funzionerà comunque (controlla il link prima di fare clic per vedere lo zero iniziale).

Passiamo ora attraverso questo array usando vye costruiamo la seguente stringa da questo codice 05AB1E:

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

Considerando che ÿè l'elemento corrente dell'iteratore (usando l'interpolazione di stringhe) Provalo online!

Dopo aver creato il collegamento, .wlegge tutti i dati dal collegamento, risultando in un'enorme quantità di testo. Per cancellare la reputazione da questo, dobbiamo dividere la stringa title="reputation". O in una versione più compressa: ’„Ö="ˆ"’. Dividi su questo pezzo di stringa (con ¡) e ottieni il secondo elemento (con ) e mantieni i primi 100 caratteri (con т£).

Ora, il nostro testo raschiato sembra un po 'così:

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

<div class="ba

Questa parte è semplice, rimuoviamo qualsiasi cosa tranne le cifre per rimanere il numero di reputazione, per il quale abbiamo un builtin ( þ). Terminiamo il ciclo e avvolgiamo tutto in un array }}).

Infine, possiamo continuare a elaborare i numeri di reputazione:

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

Che si traduce in uno D, Mo tie.


2
Non sapevo che 05AB1E potesse accedere alle API di Internet, questo tipo di risposta mi sorprende => +1
Mr. Xcoder,

Mi piace sempre il modo in cui tu e gli altri trovate un modo per ottenere un certo numero. :) +1 A proposito, la parte " secondo elemento (con 1è) and keep the first **100 characters** (with т£. " Dovrebbe essere completamente in blocchi di codice, oppure dovrebbe essere " secondo elemento (con ) e mantenere i primi 100 caratteri (con т£). " un errore di battitura, ma se dovrebbe essere così sono confuso ..
Kevin Cruijssen,

@KevinCruijssen Huh, non ho idea di come sia successo, ma ora è stato risolto. Grazie per il testa a testa! :)
Adnan,

sembra errato (non so come correggere questo tipo di codice, scusate) Dennis: 140,033,; Martin: 140,003, ma ho provato qui il tuo codice tio.run/nexus/05ab1e#@/… , ha ceduto tie. Non dovrebbe Dinvece uscire ?
Eddie,

@Eddie .wrichiede l'accesso al Web, che è limitato su TIO (esegue 05AB1E in modalità provvisoria). Nell'interprete offline, dovrebbe funzionare.
Adnan,

19

PowerShell v3 +, 147 123 119 103 101 96 byte

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

24 byte salvati utilizzando l'output true / false anziché i nomi.

Ne ho salvati altri 4 ristrutturando i controlli finali.

salvato 16 ottenendo solo la reputazione dei due utenti dalla richiesta, risparmiando di dover usare |% r*npiù di una volta, inoltre significa che possiamo sbarazzarci di come un milione di parentesi e due variabili inutili.

-2 grazie a TessellatingHeckler - usando un carattere di escape invece di due virgolette per l'url, è stato rimosso anche @l'array che non era necessario (oopsie)

usato uno strano .ToStringtrucco che non sapevo esistesse fino ad ora raccomandato da TessellatingHeckler -5, e infine inferiore a 100.


Versione che restituisce nomi:

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

questo sembra piuttosto disordinato a causa della riduzione dei nomi dei parametri.

ovunque |% r*nappare stiamo ottenendo il ReputatioN, ed |% d*è ilDisplay_name

usa Invoke-RestMethod(alias irm) per interrogare l'API, memorizza il risultato chiamato Items(ottenuto usando |% I*), nelle due variabili $ae $b, uno per ogni giocatore di golf pro, il trucco ToString( |% T*g) risulta in uno dei valori D, Mo Tiese il numero è pari / dispari / zero.


Non mi aspettavo che PowerShell fosse il più corto. +1
Rɪᴋᴇʀ

@Riker Pyth sarebbe stato presumibilmente, ma ha un bug orribile.
Erik the Outgolfer,

1
Bene, tu vinci; in nessun modo lo batterò adesso!
Shaggy,

9
Quindi il tuo codice è 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163lungo byte ..? : P
totalmente umano

1
@TessellatingHeckler controlla la risposta per l'ultimo bit, hai ottenuto sotto 100! - Mai saputo che ha ToStringfunzionato così con +/- numeri, ricorderò per il futuro.
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'

Non la risposta più breve di Python, ma la più breve finora che non fa ipotesi.

Stampa 1se Martin ha più rappresentante, -1se lo faccio.


14

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

Stupido fetche il suo stupido, costoso Promiseincatenamento!

Suppone, come attualmente consentito, che Dennis & Martin saranno sempre i 2 utenti migliori. Deve essere eseguito dal livello principale di api.stackexchange.com. Restituisce un Promiseoggetto (come è ora consentito dal consenso ) contenente tieo l'oggetto JSON per chiunque abbia il maggior numero di rappresentanti in quel momento. Se l'oggetto JSON non è considerato un output valido, aggiungere 5 byte per .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Ho salvato 11 byte grazie a Kevin che mi ha suggerito di restituire il profilo linkanziché la prima lettera del display_name, che fornisce anche una migliore protezione contro il futuro contro di loro cambiando i loro nomi utente per iniziare con la stessa lettera!
  • 5 byte salvati adattando un suggerimento da kamoroso94 su un'altra mia soluzione.

Provalo

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

Se arriva un momento in cui Dennis e Martin non sono in cima e vogliamo ancora sapere chi ha il maggior numero di rappresentanti tra di loro, allora avremmo bisogno di quanto segue, al costo di ulteriori 10 byte.

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

2
È possibile modificare .display_name[0]a .display_name, o un'alternativa ancora più breve che è ancora unica per entrambi: .link. ;) O solo l'intero JSON, ma non sono sicuro che si adatti al popup di avviso.
Kevin Cruijssen,

Grazie, @KevinCruijssen; Ho dovuto usare un estratto del nome utente poiché Martin contiene uno spazio, che non è permesso. Un buon grido sull'uso link, però, stavo usando una query API filtrata per restituire solo le informazioni di cui avevo bisogno.
Shaggy,

@KevinCruijssen Ho scaricato intere pagine HTML in popup di avviso quando ho a che fare con i ritorni AJAX. Può gestirlo.
Draco18s,

@ Draco18s, alerttuttavia, verrà visualizzato solo un oggetto JSON [object Object].
Shaggy,

@Shaggy Vero, vero, lo sarebbe.
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 grazie a @KevinCruijssen

Stampa un collegamento per l'utente con più reputazione

Suppone che siano su # 1 e # 2


Senza fare ipotesi, 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]]

6

Python, 226 225 221 byte

Sento che questo è troppo lungo.

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

Stampa "True"se Martin ha più rappresentante di Dennis, "False"se Dennis ha più rappresentante di Martin, e "tie"se ne hanno lo stesso (teoricamente. Non posso provarlo: P).

https-> httpper 1 byte grazie a @KevinCruijssen! re as r, r.sub-> re, re.subper 4 byte grazie a @ovs!


Non ne sono del tutto sicuro, ma è possibile passare httpsa http? So che PPCG è completamente https ora, ma forse si dirige automaticamente su HTTPS quando navighi su HTTP in Python, proprio come fa in un browser?
Kevin Cruijssen,

@KevinCruijssen Ah sì, non so cosa stavo pensando lì. Grazie!
HyperNeutrino,

1
Non hai bisogno re as R. Basta usare import requests as r,reere.sub
ovs,

@ovs Heh, il mio approccio originale era diverso Grazie!
HyperNeutrino,

Penso che puoi usare la cmpfunzione per salvare alcuni byte sostituendo le ultime tre righe con qualcosa del genereprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo

6

PHP, 167 byte

stampe -1 per Dennis, 1 per Martin Ender. cravatta in caso di pareggio

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

L'ho fatto su un hotspot mobile, quindi ... non è eccezionale ... Suppone che saranno sempre nelle stesse centinaia di migliaia. Non assume nulla ora. : 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]

Stampa Truese Dennis ha più reputazione di Martin, Falsealtrimenti e Tiese sono ... legati.


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

Formattato e spiegato

Innanzitutto, arricciamo w3m l'API (e usiamo --compressed, o abbreviamo --comper decomprimere) :

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

Questo è un po 'di JSON. Si noti che l'ordine è stabile, non basato sulla reputazione. JQ elabora quindi il JSON, che è ciò per cui è stato creato.

.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

Usiamo 1/xsopra per generare un errore di divisione per zero quando min == max, quindi in una situazione di parità. Il ||echo tiein bash lo capisce.

Si noti che in questo caso viene stampato un avviso su stderr da JQ, ma consideriamo solo stdout il risultato effettivo del programma;)


1
È possibile utilizzare w3minvece di curl --comsalvare alcuni byte. Inoltre, penso che valga la pena ricordare che questo richiede jq 1.5, poiché jq 1.4 non ha generato un errore di divisione per zero.
Dennis,

Vero, grazie per il suggerimento. W3m è esattamente quello che stavo cercando.
opatut

1

Stackexchange API Data Explorer , 184 180 byte

Grazie a @Kevin Cruijssen per -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

Stampa 1 per Dennis e 2 per Martin

Dato che solo ieri ho saputo della SEADE, questo dovrebbe essere molto battibile.

Provalo qui


Puoi cambiare 'D'e 'M'a 0e 1.
Kevin Cruijssen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.