Martin vs Dennis - Rodada 1: Quem tem mais repetições?

33

Eu sei que houve muitos desafios sobre "os dois melhores jogadores de código do mundo", mas este é um pouco mais exclusivo, sendo a Rodada 1 em uma série de desafios (futuros) envolvendo os dois.


Sua tarefa é escrever um programa ou função que retorne duas seqüências ASCII diferentes de espaço em branco, correspondendo àquele que tem mais reputação no momento em que o programa é executado, entre Dennis ♦ e Martin Ender ♦ . A parte complicada é que você deve gerar a string exata "tie" caso a reputação seja idêntica (não provável) e as duas strings ASCII diferentes de espaço em branco não mencionados acima mencionadas devem ser diferentes de "tie" * .

Nenhuma entrada pode ser obtida, como nomes de usuário ou IDs de usuário. Como de costume, os encurtadores de URL são proibidos e as brechas comuns.

Exemplos:

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! A votação em posts de Dennis & Martin com o único objetivo de afetar um empate, a fim de testar as soluções abaixo, constitui votação direcionada, proibida na rede Stack Exchange. Se você quiser testar se uma solução é exibida corretamente tie, altere os IDs para aqueles de 2 usuários que você sabe que estão vinculados. Veja esta publicação do Meta para mais detalhes.

* Eu acho que ninguém teria usado isso, de qualquer maneira

Mr. Xcoder
fonte
33
"... os dois melhores jogadores de código do mundo ..." [necessário para citação]
Martin Ender
9
Podemos supor que eles sempre serão os nºs 1 e 2 nesta comunidade?
ovs
7
Um lembrete amigável: a votação direcionada é proibida em toda a rede do Stack Exchange. Não é permitido votar nas postagens de Martin e minhas apenas para testar envios para esse desafio .
Dennis
2
@ Shagy É ótimo que você tenha adicionado essa nota. Felizmente, os usuários envolvidos vai parar de fazer isso
Mr. Xcoder
1
Para o @MartinEnder na parte superior, as citações são desnecessárias para fatos que são de conhecimento comum.
Gryphon - Restabelece Monica

Respostas:

20

05AB1E , 65 64 bytes

Código:

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

Usa a codificação 05AB1E .


Explicação:

•в=6{•converte o número в=6{da base 255 para a base 10, resultando em 1201208478 . A primeira metade é o ID de Dennis (12012) e a segunda metade é o ID de Martin (8478). Divida em pedaços de 5 usando para obter a seguinte matriz:

['12012', '08478']

Felizmente, podemos deixar o zero inicial do ID de Martin, pois isso ainda funcionará (verifique o link antes de clicar para ver o zero inicial).

Agora, passamos por esse array usando vye construímos a seguinte string desse código 05AB1E:

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

Considerando que ÿé o elemento atual do iterador (usando interpolação de string) Experimente online!

Depois de construir o link, .wlê todos os dados do link, resultando em uma enorme quantidade de texto. Para tirar a reputação disso, precisamos dividir a string title="reputation". Ou em uma versão mais comprimido: ’„Ö="ˆ"’. Divida esse pedaço de corda (com ¡) e obtenha o segundo elemento (com ) e mantenha os primeiros 100 caracteres (com т£).

Agora, nosso texto raspado se parece um pouco com isso:

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

<div class="ba

Essa parte é fácil, apenas removemos qualquer coisa, exceto dígitos, para permanecer o número da reputação, para o qual criamos um ( þ). Terminamos o loop e agrupamos tudo em uma matriz }}).

Por fim, podemos continuar processando os números de reputação:

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

O que resulta em D, Mou tie.

Adnan
fonte
2
Eu não sabia que as APIs de acesso 05AB1E lata de internet, esta resposta tipo me surpreende => 1
O Sr. Xcoder
Eu sempre gosto de como você e outras pessoas criam maneiras de obter um determinado número. :) +1 Btw, a parte " segundo elemento (com 1è) and keep the first **100 characters** (with т£. " Deveria estar completamente em blocos de código ou deveria ser " segundo elemento (com ) e manter os primeiros 100 caracteres (com т£). ")? um erro de digitação, mas se é suposto ser assim estou confuso ..
Kevin Cruijssen
@KevinCruijssen Huh, não tenho ideia de como isso aconteceu, mas está corrigido agora. Obrigado pela atenção! :)
Adnan
parece incorreto (não sei como corrigir esse tipo de código, desculpe) Dennis: 140,033,; Martin: 140,003, mas eu tentei o seu código aqui tio.run/nexus/05ab1e#@/… , ele produz tie. Não deveria sair em Dvez disso?
Eddie
@ Eddie .wrequer acesso à web, que é restrito no TIO (ele executa 05AB1E no modo de segurança). No intérprete offline, ele deve 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"

Salva 24 bytes usando saída true / false em vez dos nomes.

Economizou outros 4 reestruturando as verificações finais.

economizou 16 obtendo apenas a reputação dos dois usuários da solicitação, economiza a necessidade de usar |% r*nmais de uma vez, também significa que podemos nos livrar de um milhão de colchetes e duas variáveis ​​inúteis.

-2 graças a TessellatingHeckler - usando um caractere de escape em vez de duas aspas duplas para o URL, também removeu o @da matriz que era desnecessária (oopsie)

usou um .ToStringtruque estranho que eu nunca soube que existia até agora recomendado por TessellatingHeckler -5 e, finalmente, abaixo de 100.


Versão que retorna nomes:

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

isso parece bastante confuso devido ao encurtamento dos nomes dos parâmetros.

em qualquer lugar |% r*naparece que estamos recebendo o ReputatioN, e |% d*é oDisplay_name

usos Invoke-RestMethod(apelido irm) para consultar a API, armazena o resultado com o nome Items(obtido usando |% I*), para as duas variáveis $ae $b, um para cada golfista profissional de, os ToString( |% T*g) truque resulta em um dos valores D, Mou Tiese o número for ímpar / par / zero.

colsw
fonte
Eu não esperava que o PowerShell fosse o mais curto. +1
Rɪᴋᴇʀ
O @Riker Pyth provavelmente teria sido, mas tem um bug horrível.
Erik the Outgolfer
1
Tudo bem, você venceu; de jeito nenhum eu vou vencer isso agora!
Shaggy
9
Então seu código tem 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163bytes de comprimento ..? : P
totallyhuman
1
@TessellatingHeckler verifique a resposta para o último bit, você conseguiu abaixo de 100! - nunca soube que ToStringfuncionou assim com +/- números, lembrarei para o 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'

Não é a resposta mais curta do Python, mas a mais curta até agora que não faz nenhuma suposição.

Imprime 1se Martin tiver mais representantes, -1se eu tiver.

Dennis
fonte
14

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

Estúpido fetche seu estúpido, Promiseencadeamento caro !

Supõe, como atualmente permitido, que Dennis & Martin sempre serão os 2 usuários mais bem classificados. Precisa ser executado a partir do nível raiz de api.stackexchange.com. Retorna um Promiseobjeto (como agora é permitido por consenso ) contendo tieou o objeto JSON para quem tiver mais representantes no momento. Se o objeto JSON não for considerado uma saída válida, adicione 5 bytes para .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Economizei 11 bytes graças a Kevin, sugerindo que eu retorne o perfil linkem vez da primeira letra do display_name, que também fornece uma melhor proteção contra o futuro, alterando seus nomes de usuário para começar com a mesma letra!
  • 5 bytes economizados ao adaptar uma dica do kamoroso94 em outra solução minha.

Tente

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)


Alternativo

Se chegar a hora de Dennis e Martin não estarem no topo e ainda queremos saber quem tem mais representantes entre eles, precisaremos do seguinte, a um custo de 10 bytes adicionais.

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
Shaggy
fonte
2
Você pode mudar .display_name[0]para .display_name, ou uma alternativa ainda mais curto que ainda é único para ambos: .link. ;) Ou apenas o JSON inteiro, mas não tenho certeza se ele se encaixa no alerta-pop-up.
Kevin Cruijssen
Obrigado, @KevinCruijssen; Eu tive que usar um extrato do nome de usuário, pois o Martin's contém um espaço, o que não é permitido. Bom grito ao usar link, no entanto, eu estava usando uma consulta de API filtrada para retornar apenas as informações necessárias.
Shaggy
@KevinCruijssen Despejei páginas HTML inteiras em pop-ups de alerta ao lidar com retornos AJAX. Pode lidar com isso.
Draco18s
@ Draco18s, no entanto, alertum objeto JSON será exibido [object Object].
Shaggy
@ Shaggy Verdade, verdade, seria.
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 graças a @KevinCruijssen

Imprime um link para o usuário com mais reputação

Assume que eles estão nos nºs 1 e 2


Sem fazer nenhuma suposição, 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
fonte
6

Pitão, 226 225 221 bytes

Eu sinto que isso é muito longo.

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"se Martin tem mais representantes que Dennis, "False"se Dennis tem mais representantes que Martin e "tie"se eles têm o mesmo (teoricamente. Não posso testar isso: P).

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

HyperNeutrino
fonte
Não tenho muita certeza, mas é possível mudar httpspara http? Eu sei que o PPCG é totalmente https agora, mas talvez ele direcione automaticamente para HTTPS quando você navega para HTTP em Python, assim como em um navegador?
Kevin Cruijssen
@KevinCruijssen Ah, sim, não sei o que estava pensando lá. Obrigado!
HyperNeutrino # 10/17
1
Você não precisa re as R. Basta usar import requests as r,reere.sub
ovs
@ hes Heh, minha abordagem original foi diferente Obrigado!
HyperNeutrino 10/10
Eu acho que você pode usar a cmpfunção para salvar alguns bytes, substituindo as últimas três linhas com algo parecidoprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo
6

PHP, 167 bytes

imprime -1 para Dennis, 1 para Martin Ender. empate em 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
fonte
4

Python 2 , 228 223 204 199 bytes

Eu fiz isso em um hotspot móvel, então ... não é ótimo ... Supõe que os dois sempre estarão na mesma cem mil. Não assume nada agora. : 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]

Imprime Truese Dennis tem mais reputação que Martin, Falsecaso contrário e Tiese eles estão ... empatados.

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

Formatado e explicado

Primeiro, enrolamos a API do w3m (e usamos ou abreviamos para descompactar o gzip) :--compressed--com

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

Isso é algum JSON. Observe que o pedido não é estável, não com base na reputação. A JQ processa o JSON, para o que foi criado.

.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 1/xacima para gerar um erro de divisão por zero quando min == max, portanto, em uma situação de empate. O ||echo tiein bash pega isso.

Observe que um aviso é impresso no stderr pelo JQ nesse caso, mas consideramos apenas stdout o resultado real do programa;)

opatut
fonte
1
Você pode usar em w3mvez de curl --comsalvar alguns bytes. Além disso, acho que vale a pena mencionar que isso requer o jq 1.5, pois o jq 1.4 não aumentou em zero o erro de divisão.
Dennis
Verdade, obrigado pela dica. W3m é exatamente o que eu estava procurando.
Opatut 13/05/19
1

Stackexchange API Data Explorer , 184 180 bytes

Obrigado 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 e 2 para Martin

Desde ontem, eu aprendi sobre o SEADE, isso deve ser muito superável.

Experimente aqui

Roman Gräf
fonte
Você pode mudar 'D'e 'M'para 0e 1.
Kevin Cruijssen