Comment allez vous?

20

Martin a créé un bel extrait qui peut être utilisé pour garder une trace du score pour les réponses aux défis. C'est génial et tout, mais ne serait-il pas préférable que vous puissiez en faire le suivi vous-même?

Créez un programme qui compare le nombre d'octets en lui-même avec le reste des réponses à cette question et renvoie «Je suis le numéro de réponse n».

Règles:

  • Le nombre d'octets dans votre propre réponse peut être codé en dur dans le code

  • La fonction peut prendre l'URL en entrée, ou elle peut être codée en dur. Les caractères de l'URL ne compteront pas pour le nombre d'octets, il n'est donc pas nécessaire d'utiliser un raccourcisseur d'URL.

  • les adresses URL des réponses ne peuvent pas être codées en dur

  • Le score des réponses se trouve dans l'en-tête (de la même manière que l'extrait de Martin).

  • L'en-tête de réponse doit avoir le format correct (décrit ci-dessous).

  • S'il est possible d'exécuter le programme en ligne, veuillez partager un lien vers un compilateur en ligne (ou un extrait de code qui peut être exécuté à partir de la réponse). Si ce n'est pas possible, veuillez montrer comment appeler la fonction et afficher la sortie de votre propre compilateur (au moment où vous avez publié la réponse. Vous n'avez pas besoin de la mettre à jour à moins que vous ne le vouliez bien sûr).

  • Vous devez réellement comparer la réponse avec les autres réponses à cette question. Le simple fait d'écrire un script I'm answer number 1.dans une langue n'est pas légal.

  • Si d'autres réponses ont le même nombre d'octets que le vôtre, vous pouvez choisir si vous voulez être le meilleur ou le pire d'entre elles.

L'en-tête doit être formaté:

# Language Name, N bytes

Le barré, etc. ne peut pas être utilisé, donc si la taille du code est modifiée, affichez-le en gras sous l'en-tête ou indiquez-le d'une autre manière.

La sortie doit être I'm answer number n., où le nombren est la position (les sauts de ligne / espaces sont OK). Ainsi, la réponse la plus courte affichera: "Je suis la réponse numéro 1.", la seconde sera "Je suis la réponse numéro 2." etc.

C'est le golf de code, donc la réponse la plus courte en octets gagnera.

Stewie Griffin
la source
Si d'autres réponses ont le même nombre d'octets que le vôtre, vous pouvez choisir si vous voulez être le meilleur ou le pire d'entre elles. Peut-être que la date de publication devrait être un bris d'égalité, donc vous n'avez pas deux réponses prétendant être le même nombre. Ou, vous pouvez utiliser la norme selon laquelle s'ils sont à égalité, ils sont tous les deux à égalité pour la place la plus élevée.
mbomb007
2
Je ne suis pas sûr que cela fonctionnera. La plupart des (bons) interprètes en ligne n'autorisent pas le curling d'autres pages Web, mais dans le défi, il est dit que le code doit s'exécuter sur un interprète en ligne.
un spaghetto du
Parlons de cela dans le chat.
un spaghetto du
Faut-il compter les citations autour de l'URL? Certaines réponses les excluent actuellement du décompte, d'autres les incluent.
HVD

Réponses:

2

Perl, 107 octets

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

Un peu moins golfé:

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), '.';

Exemple d'utilisation

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

Python 2, 145 octets

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)

Sortie du 2015-10-10 17:30:00 UTC:

I'm answer number 1.

Je n'ai compté aucune URL pour mon score, si je devais s'il vous plaît commenter combien je devrais y ajouter. A son propre score codé en dur, suppose qu'il est déjà publié. Se cassera si jamais plus de 99 réponses sont affichées.

Bleu
la source
6

AutoIt, 175 octets

(202 octets - 27 pour l'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&".")

Sortie du 2015-10-09 17:47:00 UTC:

I'm answer number 1.
mınxomaτ
la source
Je n'ai même jamais entendu parler d'Autolt, mais est-il exact que cela ne fonctionnera pas si le nom de la langue contient une virgule? (Je ne sais pas s'il existe de telles langues, donc je ne sais pas si cela importe)
Stewie Griffin
@StewieGriffin Oui, mais je ne me souviens pas non plus d'une langue avec une virgule ;-). Si quelqu'un arrive, je le changerai.
mınxomaτ
@minxomat Le nom semble avoir un lau lieu d'un I, donc je l'ai mal lu. La seule raison pour laquelle je m'en suis rendu compte, c'est en voyant l'article Wikipedia , qui a un empattement.
mbomb007
Il suffit d'attendre que quelqu'un invente une langue avec une virgule pour saboter cette réponse ...
Darrel Hoffman
@DarrelHoffman Eh bien, il faudrait qu'il y ait une virgule et un espace consécutif dans son nom ^^
mınxomaτ
4

JavaScript (ES7), 149 octets

283 octets - 134 pour l'URL. Je n'ai jamais utilisé de requêtes HTTP auparavant, mais voici ...

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

Testé avec succès dans Firefox 41.

D'abord, il regarde à travers les en-têtes de toutes les réponses pour trouver leur nombre d'octets, puis il trouve la première position avec le nombre d'octets 243 149. Il est actuellement configuré pour vérifier uniquement les 100 premières réponses, et se cassera si quelqu'un obtient moins de 100 octets, mais cela fonctionne pour l'instant. ;)

Merci à @GeorgeReith pour la technique beaucoup plus courte. Ancienne version utilisant AJAX (243 octets):

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
la source
Vous
George Reith
@GeorgeReith Nah, ça ne devrait pas. L'OP dit que les liens peuvent être rompus dans les deux sens, et cela se placera juste devant l'autre.
ETHproductions
Ah, il a édité ça. Il est probablement préférable de trier par date de création au lieu de cela pour le rendre plus probable qu'il trouve le vôtre au lieu de l'un des rares qui a posté avant et édité sa réponse.
George Reith du
@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.C'est toujours dans le post principal; ai-je mal compris quelque chose?
ETHproductions
Pas d'excuses, je lisais l'historique des modifications et je suis devenu confus.
George Reith du
4

PHP, 158 159 164 octets

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 octets de 'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T'non comptés

Version formatée avec des chaînes non golfées:

<?
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)
    ),
    ".";
  • Charge la réponse JSON (une fois par réponse en fait pour économiser 5 octets, grâce à @Blackhole)
  • Collecte les corps de réponse dans $h
  • remplace le texte entier par "1" (vrai) si le nombre d'octets est <= 159, ou "" (faux) sinon
  • résume les résultats

Les séquences de caractères comme ¶Ø’ßž‘Œˆšß‘Š’šßsont des noms de constantes valides en PHP, mais comme les constantes n'existent pas, elles sont traitées comme des chaînes de caractères. ~les inverse, celui-ci à "I'm answer number "(enregistrer un octet pour un guillemet chacun)

Usage

php -derror_reporting=0 howareyou.php

Je suis la réponse numéro 1.

Fabian Schmengler
la source
La $avariable est-elle vraiment nécessaire? Pourquoi tu ne le fais pas tout simplement $h[]=json_decode(…)[items][+$i++][body]? Quels sont ces personnages étranges, au fait?
Blackhole
Bon point. Cela fera une nouvelle demande pour chaque réponse mais peu importe :) Les caractères étranges sont des chaînes inversées au niveau du bit. Ce sont des noms constants valides en PHP qui sont utilisés comme littéraux de chaîne s'ils n'existent pas, donc je peux enregistrer les guillemets. Par exemple " "(3 octets) peut être réduit à (2 octets)
Fabian Schmengler
En effet, j'ai trouvé votre explication sur cette réponse . Puisque c'est une méthode inhabituelle, je pense que ce pourrait être une bonne idée de l'expliquer à nouveau ici dans votre message :).
Blackhole
Je pense que vous pouvez faire beaucoup mieux si vous sautez le json_decodeet juste splitsur ':'ou quelque chose, par exemple: codepad.org/7rZg06by
primo
Bonne idée mais je crains que ce ne soit pas fiable car il y aura beaucoup de deux-points dans les codes sources. Mettre "Je suis le numéro de réponse" avant la balise PHP d'ouverture enregistre au moins deux octets, merci pour cela!
Fabian Schmengler du
3

Javascript (ES6), 186 octets

(335 - 149 octets pour l'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
la source
Je n'avais aucune idée que tu pouvais le faire de cette façon! Puis-je vous demander pourquoi vous avez utilisé \x3Cau lieu de <?
ETHproductions
@ETHproductions Étant donné que le navigateur recherche immédiatement la balise de script de fermeture et n'exécute pas le script autrement, cela reporte la fermeture de la balise de script jusqu'à la fin de l'insertion. Il utilise JSONP avec un rappel et dépend de l'API s'il le prend en charge, mais heureusement stackexchange le fait. Honnêtement, je ne comprends pas bien le raisonnement, mais c'est une question légitime.
George Reith
1

Awk, 153 octets

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

Cela devrait être enregistré dans un fichier aet exécuté comme:

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

Je soustrais les 68 octets http://codegolf.stackexchange.com/questions/60204/how-are-you-doinget j'ajoute 13 au code pour le bootstrappingawk -v u= et -f a.

Moins golfé, cela peut être encore plus court:

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)"."}'

Il se préfère toujours dans les liens. Le nombre d'octets est codé en dur dans chacun.

La version plus golfy a le script s'appelant lui-même et sortant la valeur de sortie via le système. Dans chaque cas, le décompte est inférieur à l'incrément de valeur codé en dur r, qui doit ensuite être ajusté1 s'il est en tête.

Cela échouera à trouver correctement les octets s'il y a un espace entre byteset</h1> et probablement un certain nombre d'autres cas , je n'ai pas pris en considération.

En date du Sun Oct 11 05:17:51 UTC 2015, cela donne:

I'm answer number 3.
n0741337
la source
Comme c'est la première fois que je joue au golf, veuillez me faire savoir si j'ai violé des règles, des failles, des comptes, etc. ou quelles améliorations je pourrais apporter.
n0741337
Je pense que vous devez imprimer "Je suis le numéro de réponse" plutôt que "Je suis le numéro".
lirtosiast
@ThomasKwa Hah! Je savais que c'était trop beau pour être vrai. Merci et réparé. L'ajout d'octets en retour nécessite-t-il un barrage?
n0741337
Vous n'en avez pas besoin, tout comme vous n'avez pas besoin d'un barré lorsque vous jouez des octets au golf.
lirtosiast
1

GNU Awk, 156 octets

(Inspiré de la solution Awk de n0741337 .)

Celui-ci fait tout lui-même, sans exécuter de commande externe.

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}

Attend le nom d'hôte et le chemin d'accès en tant que valeurs distinctes. Étant donné qu'ils sont disponibles gratuitement, j'espère que cela n'enfreint pas les règles.

Exemple d'exécution:

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
homme au travail
la source