Come te la passi?


20

Martin ha creato un bel frammento che può essere utilizzato per tenere traccia del punteggio per le risposte alle sfide. È fantastico, ma non sarebbe meglio se tu potessi tenerne traccia tu stesso?

Crea un programma che confronta i conteggi dei byte in sé con il resto delle risposte a questa domanda e restituisce "Sono la risposta numero n".

Regole:

  • Il conteggio dei byte nella tua risposta può essere codificato nel codice

  • La funzione può prendere l'URL come input o può essere codificata. I caratteri per l'URL non verranno conteggiati nel conteggio dei byte, quindi non è necessario utilizzare un accorciatore di URL.

  • gli indirizzi url alle risposte non possono essere codificati

  • Il punteggio per le risposte si trova nell'intestazione (allo stesso modo dello snippet di Martin).

  • L'intestazione della risposta deve avere il formato corretto (descritto di seguito).

  • Se è possibile eseguire il programma online, si prega di condividere un collegamento a un compilatore online (o uno snippet di codice che può essere eseguito dalla risposta). Se non è possibile, mostra come chiamare la funzione e mostra l'output dal tuo compilatore (al momento in cui hai pubblicato la risposta. Non è necessario aggiornarlo a meno che tu non voglia ovviamente).

  • Devi effettivamente confrontare la risposta con le altre risposte a questa domanda. Scrivere semplicemente una sceneggiatura I'm answer number 1.in qualche lingua non è legale.

  • Se le altre risposte hanno lo stesso numero di byte delle tue, puoi scegliere se vuoi essere migliore o peggiore di esse.

L'intestazione deve essere formattata:

# Language Name, N bytes

Il barrato ecc. Non può essere utilizzato, quindi se si modifica la dimensione del codice, mostrarlo in grassetto sotto l'intestazione o indicarlo in altro modo.

L'output deve essere I'm answer number n., dove il numero nè la posizione (la nuova riga finale / gli spazi sono OK). Quindi, verrà emessa la risposta più breve: "Sono la risposta numero 1.", la seconda sarà "Sono la risposta numero 2." eccetera.

Questo è il codice golf, quindi vincerà la risposta più breve in byte.


Se le altre risposte hanno lo stesso numero di byte delle tue, puoi scegliere se vuoi essere migliore o peggiore di esse. Forse la data del post dovrebbe essere un pareggio, quindi non hai due risposte che affermano di essere lo stesso numero. Oppure, potresti usare lo standard che se sono legati, sono entrambi legati per il posto più alto.
mbomb007,

2
Non sono sicuro che funzionerà. La maggior parte dei (bravi) interpreti online non consente di arricciare altre pagine Web, ma nella sfida afferma che il codice deve essere eseguito su un interprete online.
uno spaghetto il

Parliamone in chat.
uno spaghetto il

È necessario contare le virgolette intorno all'URL? Alcune risposte attualmente le escludono dal conteggio, altre le includono.
hvd,

Risposte:


2

Perl, 107 byte

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

Leggermente meno golfato:

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

Esempio di utilizzo

$ perl my_rank.pl
I'm answer number 1.

7

Python 2, 145 byte

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)

Uscita dal 10-10-2015 alle 17:30:00 UTC:

I'm answer number 1.

Non ho conteggiato nessuno degli URL per il mio punteggio, se dovessi per favore commentare quanto dovrei aggiungere ad esso. Ha il proprio punteggio hardcoded in esso, presuppone che sia già pubblicato. Si interromperà se vengono pubblicate più di 99 risposte.


6

AutoIt, 175 byte

(202 byte - 27 per 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&".")

Uscita dal 2015-10-09 alle 17:47:00 UTC:

I'm answer number 1.

Non ho mai sentito parlare di Autolt, ma è corretto che questo non funzionerà se il nome della lingua contiene una virgola? (Non so se ci siano tali lingue, quindi non sono sicuro che sia importante)
Stewie Griffin,

@StewieGriffin Sì, ma non ricordo nemmeno una lingua con una virgola ;-). Se ne viene fuori, lo cambierò.
mınxomaτ,

@minxomat Il nome sembra che abbia un linvece di un I, quindi l'ho letto male. L'unica ragione per cui mi sono reso conto che è vedendo l' articolo di Wikipedia , che ha un serif.
mbomb007,

Sto solo aspettando che qualcuno inventi una lingua con una virgola per sabotare questa risposta ...
Darrel Hoffman,

@DarrelHoffman Beh, dovrebbe avere una virgola e uno spazio consecutivi nel suo nome ^^
mınxomaτ

4

JavaScript (ES7), 149 byte

283 byte - 134 per l'URL. Non ho mai usato richieste HTTP prima, ma qui va ...

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

Testato con successo su Firefox 41.

Prima controlla le intestazioni di tutte le risposte per trovare i loro conteggi dei byte, quindi trova la prima posizione con il conteggio dei byte 243 149. Attualmente è impostato per controllare solo le prime 100 risposte e si romperà se qualcuno arriva sotto i 100 byte, ma funziona per ora. ;)

Grazie a @GeorgeReith per la tecnica molto più breve. Vecchia versione con AJAX (243 byte):

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

Sembra buono ... anche se probabilmente si romperà se qualcuno pubblica un'altra risposta di 151 byte
George Reith,

@GeorgeReith Nah, non dovrebbe. L'OP afferma che i legami possono essere spezzati in entrambi i modi, e questo si posizionerà semplicemente davanti all'altro.
ETHproductions

Ah, l'ha modificato. Probabilmente è comunque meglio ordinare in base alla data di creazione invece di renderlo più probabile che trovi il tuo anziché uno dei pochi che hanno pubblicato prima e modificare la loro risposta.
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.È ancora nel post principale; sto fraintendendo qualcosa?
ETHproductions

Nessuna scusa stavo leggendo la cronologia delle modifiche e mi sono confuso.
George Reith,

4

PHP, 158 159 164 byte

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

Versione formattata con stringhe non golfate:

<?
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)
    ),
    ".";
  • Carica la risposta JSON (una volta per risposta effettivamente per salvare 5 byte, grazie a @Blackhole)
  • Raccoglie i corpi di risposta in $h
  • sostituisce il testo intero con "1" (vero) se il conteggio dei byte è <= 159 o "" (falso) altrimenti
  • somma i risultati

Le sequenze di caratteri simili ¶Ø’ßž‘Œˆšß‘Š’šßsono nomi di costanti validi in PHP, ma poiché le costanti non esistono vengono trattate come stringhe letterali. ~li inverte, questo in "I'm answer number "(salvando un byte per un segno di virgolette ciascuno)

uso

php -derror_reporting=0 howareyou.php

Sono la risposta numero 1.


La $avariabile è davvero necessaria? Perché non lo fai semplicemente $h[]=json_decode(…)[items][+$i++][body]? A proposito, cosa sono questi strani personaggi?
Blackhole,

Buon punto. Questo farà una nuova richiesta per ogni risposta ma chi se ne frega :) Gli strani caratteri sono stringhe invertite bit per bit. Sono nomi di costanti validi in PHP che vengono utilizzati come letterali stringa se non esistono, quindi posso salvare le virgolette. Ad esempio " "(3 byte) può essere ridotto a (2 byte)
Fabian Schmengler,

In effetti, ho trovato la tua spiegazione su questa risposta . Dal momento che è un metodo insolito, penso che potrebbe essere una buona idea spiegarlo di nuovo qui nel tuo post :).
Blackhole,

Penso che puoi fare molto meglio se salti il json_decodee solo splitsu ':'o qualcosa del genere, ad esempio: codepad.org/7rZg06by
primo

Buona idea ma temo che potrebbe essere inaffidabile in quanto ci saranno un sacco di due punti nei codici sorgente. Mettere "Sono il numero di risposta" prima che il tag PHP di apertura salvi almeno due byte, grazie per quello!
Fabian Schmengler,

3

Javascript (ES6), 186 byte

(335 - 149 byte per 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>`)


Non avevo idea che tu potessi farlo in quel modo! Posso chiederti perché hai usato \x3Cinvece di <?
ETHproductions

@ETHproductions Poiché il browser cerca immediatamente il tag di script di chiusura e non esegue lo script altrimenti, ciò impedisce la chiusura del tag di script fino al post inserimento. Utilizza JSONP con un callback e dipende dall'API se lo supporta, ma fortunatamente stackexchange lo fa. Onestamente non capisco perfettamente il ragionamento, ma è un problema legittimo.
George Reith,

1

Awk, 153 byte

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

Questo dovrebbe essere salvato in un file aed eseguito come:

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

Sto sottraendo i 68 byte per http://codegolf.stackexchange.com/questions/60204/how-are-you-doinge aggiungendo 13 al codice per il bootstrap awk -v u=e -f a.

Meno golf, questo può essere ancora più breve:

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

Si preferisce sempre nei legami. Il conteggio dei byte è codificato in ciascuno di essi.

La versione più golfy ha lo script che si chiama e genera il valore di uscita tramite il sistema. In ogni caso conta solo in meno dell'incremento del valore hardcoded r, che deve essere regolato nuovamente 1se è in testa.

Questo non riuscirà a trovare correttamente i byte se c'è spazio tra bytese </h1>e probabilmente un numero di altri casi che non ho preso in considerazione.

A partire da Sun Oct 11 05:17:51 UTC 2015, questo dà:

I'm answer number 3.

Dato che è la prima volta che gioco a golf, per favore fatemi sapere se ho violato regole, scappatoie, conteggi ecc. O quali miglioramenti potrei apportare.
n0741337

Penso che devi stampare "Sono il numero di risposta" anziché "Sono il numero".
lirtosiast,

@ThomasKwa Hah! Sapevo che era troppo bello per essere vero. Grazie e riparato. L'aggiunta di byte indietro richiede un barrato?
n0741337,

Non ne hai bisogno, proprio come non hai bisogno di un barrato quando giochi a golf byte.
lirtosiast,

1

GNU Awk, 156 byte

(Ispirato n0741337 's soluzione Awk .)

Questo fa tutto da solo, senza eseguire comandi esterni.

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}

Si aspetta nome host e percorso come valori separati. Dato che sono disponibili gratuitamente, si spera che questo non rompa le regole.

Esecuzione di esempio:

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
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.