Como vai você?

20

Martin criou um bom snippet que pode ser usado para acompanhar a pontuação das respostas aos desafios. Isso é ótimo e tudo, mas não seria melhor se você pudesse acompanhar isso sozinho?

Crie um programa que compare as contagens de bytes em si com o restante das respostas a esta pergunta e retorne "Sou a resposta número n".

Regras:

  • A contagem de bytes em sua própria resposta pode ser codificada no código

  • A função pode levar o URL como entrada ou pode ser codificado. Os caracteres do URL não contam para a contagem de bytes, portanto, não é necessário usar um encurtador de URL.

  • endereços de URL para respostas não podem ser codificados

  • A pontuação para as respostas pode ser encontrada no cabeçalho (da mesma forma que o snippet de Martin).

  • O cabeçalho da resposta deve ter o formato correto (descrito abaixo).

  • Se for possível executar o programa online, compartilhe um link para um compilador online (ou um trecho de código que possa ser executado a partir da resposta). Se não for possível, mostre como chamar a função e mostre a saída do seu próprio compilador (no momento em que você postou a resposta. Você não precisa atualizá-la a menos que queira, é claro).

  • Você precisa comparar a resposta com as outras respostas a esta pergunta. Simplesmente escrever um script I'm answer number 1.em algum idioma não é legal.

  • Se outras respostas tiverem o mesmo número de bytes que o seu, você poderá escolher se deseja ser o melhor ou o pior delas.

O cabeçalho deve estar formatado:

# Language Name, N bytes

Strike-through etc não pode ser usado; portanto, se o tamanho do código for alterado, mostre-o em negrito abaixo do cabeçalho ou indique-o de outra maneira.

A saída deve ser I'm answer number n., onde o número né a posição (nova linha / espaços à direita estão OK). Portanto, a resposta mais curta será exibida: "Sou a resposta número 1.", a segunda será "Sou a resposta número 2." etc.

Isso é código de golfe, então a resposta mais curta em bytes vencerá.

Stewie Griffin
fonte
Se outras respostas tiverem o mesmo número de bytes que o seu, você poderá escolher se deseja ser o melhor ou o pior delas. Talvez a data da postagem deva ser um desempate, para que você não tenha duas respostas afirmando ser o mesmo número. Ou você pode usar o padrão de que, se eles estão empatados, ambos estão empatados no lugar mais alto.
mbomb007
2
Não tenho certeza se isso vai funcionar. A maioria dos (bons) intérpretes online não permite a ondulação de outras páginas da Web, mas no desafio diz que o código precisa ser executado em um intérprete online.
a spaghetto
Vamos falar sobre isso no chat.
a spaghetto
É necessário contar alguma cotação em torno do URL? Atualmente, algumas respostas os excluem da contagem, outros os incluem.
hvd 10/10

Respostas:

2

Perl, 107 bytes

use LWP;print"I'm answer number ",1+grep($_<107,LWP::UserAgent->new->get('http://codegolf.stackexchange.com/q/60204')->content=~/<h1>.+, (\d+)/g),'.';

Um pouco menos golfe:

use LWP;
$agent = new LWP::UserAgent();
$response = $agent->get('http://codegolf.stackexchange.com/q/60204');
@answers = $response->content =~ m/<h1>.+, (\d+)/g;
print "I'm answer number ", 1+grep($_<107, @answers), '.';

Uso da amostra

$ perl my_rank.pl
I'm answer number 1.
primo
fonte
7

Python 2, 145 bytes

from requests import*
print"I'm answer number %s."%(sorted([int(a["body"].split(",")[1].split()[0])for a in get('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=activity&site=codegolf&filter=!SWJ_BpAceOT6L*G2Qa').json()["items"]]).index(145)+1)

Saída de 2015-10-10 17:30:00 UTC:

I'm answer number 1.

Não contei nenhum URL para a minha pontuação, por favor, comente o quanto devo adicionar a ele. Tem uma pontuação própria codificada nela, assume que ela já foi publicada. Quebrará se forem postadas mais de 99 respostas.

Azul
fonte
6

AutoIt, 175 bytes

(202 bytes - 27 para o URL)

#include<String.au3>
$0=_StringBetween
$1=1
For $2 In $0(BinaryToString(InetRead("http://q.codegolf.xyz/60204")),'<h1>',' b')
$1+=$0($2,', ','')[0]<175?1:0
Next
ConsoleWrite("I'm answer number "&$1&".")

Saída de 2015-10-09 17:47:00 UTC:

I'm answer number 1.
mınxomaτ
fonte
Eu nunca ouvi falar de Autolt, mas é correto que isso não funcione se o nome do idioma tiver uma vírgula? (Eu não sei se existem tais línguas, então eu não tenho certeza se isso importa)
Stewie Griffin
@StewieGriffin Sim, mas também não me lembro de nenhum idioma com vírgula ;-). Se alguém aparecer, eu mudarei.
Mcnxomaτ # 9/15
@ minxomat O nome parece ter um em lvez de um I, então eu o interpretei errado. A única razão pela qual percebi isso é ver o artigo da Wikipedia , que tem uma serifa.
mbomb007
Apenas esperando que alguém invente uma linguagem com uma vírgula para sabotar esta resposta ...
Darrel Hoffman 10/10
@DarrelHoffman Bem, ele teria que ter uma vírgula e um espaço consecutivo em que o nome ^^
mınxomaτ
4

JavaScript (ES7), 149 bytes

283 bytes - 134 para o URL. Eu nunca usei solicitações HTTP antes, mas aqui vai ...

x=z=>alert(`I'm answer number ${[for(y of z.items)y.body.match(/, (\d+)/)[1]].sort().indexOf("149")+1}.`);document.write('<script src="//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T&callback=x">\x3C/script>')

Testado com sucesso no Firefox 41.

Primeiro, ele examina os cabeçalhos de todas as respostas para encontrar a contagem de bytes e, em seguida, encontra a primeira posição com a contagem de bytes 243 149. Atualmente, está configurado para verificar apenas as 100 primeiras respostas e será interrompido se alguém tiver menos de 100 anos. bytes, mas funciona por enquanto. ;)

Obrigado a @GeorgeReith pela técnica muito mais curta. Versão antiga usando AJAX (243 bytes):

x=new XMLHttpRequest,x.onreadystatechange=_=>{if(x.readyState==4&&x.status==200)alert(`I'm answer number ${[for(y of JSON.parse(x.responseText).items)y.body.match(/, (\d+)/)[1]].sort((a,b)=>a-b).indexOf("243")+1}.`)},x.open("GET","//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T",!0),x.send()
ETHproductions
fonte
Com boa aparência ... embora seja possível quebre se alguém postar outra resposta de 151 bytes #
George Reith
@GeorgeReith Nah, não deveria. O OP diz que os laços podem ser quebrados de qualquer maneira, e isso só se colocará à frente do outro.
ETHproductions 10/10
Ah, ele editou isso. Ainda assim, provavelmente é melhor classificar por data de criação, para aumentar a probabilidade de encontrar a sua em vez de uma das poucas que postaram antes e editar a resposta.
George Reith
@GeorgeReith If other answers have the same number of bytes as your own, you can choose if you want to be best or worse of them.Isso ainda está no post principal; estou entendendo mal alguma coisa?
ETHproductions
Desculpe, eu estava lendo o histórico de edições e fiquei confuso.
George Reith
4

PHP, 158 159 164 bytes

I'm answer number <?for(;$h[]=json_decode(fread(gzopen('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r),1e4),1)[items][+$i++][body];);echo array_sum(preg_filter(~„ÑÕß×£›ÔÖ߆‹šŒÃЗÎÑÕ‚Œš,~ÛÎÃÎÊÇ,$h)),~Ñ;

127 bytes de 'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T'não contados

Versão formatada com seqüências de caracteres não destruídas:

<?
for(;
    $h[]=json_decode(
        fread(
            gzopen(
                'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r
            ), 1e4
        ), 1
    )[items][+$i++][body];
);
echo"I'm answer number ",
    array_sum(
        preg_filter('{.* (\d+) bytes</h1.*}se','$1<159', $h)
    ),
    ".";
  • Carrega a resposta JSON (uma vez por resposta, na verdade, para salvar 5 bytes, graças a @Blackhole)
  • Coleta corpos de resposta em $h
  • substitui o texto inteiro por "1" (verdadeiro) se a contagem de bytes for <= 159 ou "" (falso) caso contrário
  • soma os resultados

As seqüências de caracteres como ¶Ø’ßž‘Œˆšß‘Š’šßsão nomes constantes válidos no PHP, mas como as constantes não existem, são tratadas como cadeias literais. ~inverte-os, este para "I'm answer number "(salvando um byte para uma aspas cada)

Uso

php -derror_reporting=0 howareyou.php

Eu sou a resposta número 1.

Fabian Schmengler
fonte
A $avariável é realmente necessária? Por que você simplesmente não faz $h[]=json_decode(…)[items][+$i++][body]? Quais são esses personagens estranhos, a propósito?
Blackhole 9/10
Bom ponto. Isso fará uma nova solicitação para cada resposta, mas quem se importa :) Os caracteres estranhos são seqüências de caracteres invertidas bit a bit. Eles são nomes constantes válidos no PHP que são usados ​​como literais de strings se não existirem, para que eu possa salvar as aspas. Por exemplo " "(3 bytes) pode ser reduzido para (2 bytes)
Fabian Schmengler
Na verdade, eu encontrei sua explicação sobre esta resposta . Como esse é um método incomum, acho que seria uma boa ideia explicá-lo novamente aqui no seu post :).
Blackhole 9/10
Eu acho que você pode fazer muito melhor se você pular o json_decodee apenas splitsobre ':'ou algo assim, por exemplo: codepad.org/7rZg06by
primo
Boa ideia, mas receio que possa não ser confiável, pois haverá muitos dois pontos nos códigos-fonte. Colocar "Sou o número da resposta" antes da tag PHP de abertura economiza pelo menos dois bytes, obrigado por isso!
Fabian Schmengler
3

Javascript (ES6), 186 bytes

(335 - 149 bytes para o URL)

a=d=>alert(`I'm answer number ${d.items.map(q=>(y=[q.body.match(/, (\d+)/)[1],(x=q.owner.user_id==11182)])&&x?z=y:y).sort().indexOf(z)+1}.`)
document.write(`<script src="https://api.stackexchange.com/questions/60204/answers?pagesize=100&order=desc&sort=activity&site=codegolf&filter=!)Q2B_A19OPkd2j8JforD00f5&callback=a">\x3C/script>`)

George Reith
fonte
Eu não tinha idéia de que você poderia fazer dessa maneira! Posso perguntar por que você usou em \x3Cvez de <?
ETHproductions
@ETHproductions Como o navegador procura a tag de script de fechamento imediatamente e não executa o script de outra forma, isso adia o fechamento da tag de script até a inserção posterior. Ele usa JSONP com um retorno de chamada e depende da API, se é compatível, mas felizmente stackexchange. Honestamente, eu não entendo completamente o motivo, mas é uma questão legítima.
George Reith
1

Awk, 153 bytes

BEGIN{if(u){print"I\047m answer number "system("curl -s "u"|awk -f a")".";exit}FS="1>.*,|es<\/h"}NF==3{r+=($2+0)<153?1:0}END{exit(r<1?1:r)}

Isso deve ser salvo em um arquivo ae executado como:

awk -v u=http://codegolf.stackexchange.com/questions/60204/how-are-you-doing -f a

Estou subtraindo os 68 bytes http://codegolf.stackexchange.com/questions/60204/how-are-you-doinge adicionando 13 ao código para o bootstrapping awk -v u=e -f a.

Menos golfe, isso pode ser ainda mais curto:

curl -s http://codegolf.stackexchange.com/questions/60204/how-are-you-doing | awk -F"1>.*,|es<\/h" 'NF==3{r+=(0+$2)<103?1:0}END{print"I\047m answer number "(r<1?1:0)"."}'

Sempre se prefere em laços. A contagem de bytes é codificada em cada um.

A versão mais golfe tem o script se chamando e produzindo o valor de saída via sistema. Em cada caso, apenas conta menos do que o incremento de valor codificado r, que deve ser ajustado novamente 1se estiver à frente.

Isso vai deixar de encontrar corretamente bytes se há espaço em branco entre bytese </h1>e, provavelmente, uma série de outros casos eu não ter considerado.

A partir de Sun Oct 11 05:17:51 UTC 2015, isso fornece:

I'm answer number 3.
n0741337
fonte
Como esta é minha primeira vez jogando golfe, informe-me se violei alguma regra, brechas, contagens etc. ou que melhorias eu poderia fazer.
N0741337 11/11
Eu acho que você precisa imprimir "Eu sou o número da resposta" em vez de "Eu sou o número".
Lirtosiast
@ThomasKwa Hah! Eu sabia que era bom demais para ser verdade. Obrigado e consertado. A adição de bytes de volta requer um strike-through?
N0741337 11/11
Você não precisa de um, assim como não precisa de um tachado quando joga fora bytes.
Lirtosiast
1

GNU Awk, 156 bytes

(Inspirado por n0741337 de solução Awk .)

Este faz tudo sozinho, sem executar o comando externo.

BEGIN{d="/inet/tcp/0/"h"/80"
print"GET "p" HTTP/1.1\nHost:"h"\n"|&d
while(d|&getline)n+=match($0,/1>.*, ([0-9]+)/,m)&&m[1]<156
print"I'm answer number",n+1}

Espera nome do host e caminho como valores separados. Dado que eles estão disponíveis gratuitamente, espero que isso não viole as regras.

Exemplo de execução:

bash-4.3$ awk -v h=codegolf.stackexchange.com -v p=/questions/60204/how-are-you-doing -f number.awk 
I'm answer number 4
homem a trabalhar
fonte