Jak się masz?

20

Martin stworzył fajny fragment, który można wykorzystać do śledzenia wyniku w odpowiedziach na wyzwania. To świetnie i wszystko, ale czy nie byłoby lepiej, gdybyś sam mógł to śledzić?

Utwórz program, który porówna liczbę bajtów sam w sobie z resztą odpowiedzi na to pytanie i zwróci „Jestem numerem n”.

Zasady:

  • Liczba bajtów we własnej odpowiedzi może być zapisana na stałe w kodzie

  • Funkcja może przyjmować adres URL jako dane wejściowe lub może być zakodowana na stałe. Znaki dla adresu URL nie będą się liczyć do liczby bajtów, więc nie trzeba używać skracacza adresów URL.

  • adresów URL do odpowiedzi nie można zakodować na stałe

  • Wynik dla odpowiedzi można znaleźć w nagłówku (tak samo jak fragment kodu Martina).

  • Nagłówek odpowiedzi musi mieć poprawny format (opisany poniżej).

  • Jeśli możliwe jest uruchomienie programu online, udostępnij link do kompilatora online (lub fragment kodu, który można wykonać z odpowiedzi). Jeśli nie jest to możliwe, proszę pokazać, jak wywołać tę funkcję i pokazać dane wyjściowe z własnego kompilatora (w momencie, gdy opublikowałeś odpowiedź. Nie musisz jej aktualizować, chyba że chcesz).

  • Musisz porównać odpowiedź z innymi odpowiedziami na to pytanie. Samo pisanie scenariusza I'm answer number 1.w jakimś języku nie jest legalne.

  • Jeśli inne odpowiedzi mają taką samą liczbę bajtów jak Twoja, możesz wybrać, czy chcesz być najlepszy, czy gorszy.

Nagłówek musi być sformatowany:

# Language Name, N bytes

Nie można użyć przekreślenia itp., Więc jeśli rozmiar kodu zostanie zmieniony, pokaż go pogrubionym tekstem pod nagłówkiem lub wskaż w inny sposób.

Dane wyjściowe muszą być I'm answer number n., gdzie liczba noznacza pozycję (końcowe znaki nowej linii / spacje są OK). Zatem najkrótsza odpowiedź wyświetli: „Jestem odpowiedzią nr 1”, druga to „Jestem odpowiedzią nr 2”. itp.

To jest kod golfowy, więc wygra najkrótsza odpowiedź w bajtach.

Stewie Griffin
źródło
Jeśli inne odpowiedzi mają taką samą liczbę bajtów jak Twoja, możesz wybrać, czy chcesz być najlepszy, czy gorszy. Może data postu powinna rozstrzygać, więc nie masz dwóch odpowiedzi, które twierdzą, że są takie same. Lub możesz użyć standardu, że jeśli są związane, oba są powiązane na wyższe miejsce.
mbomb007,
2
Nie jestem pewien, czy to zadziała. Większość (dobrych) tłumaczy internetowych nie pozwala na zwijanie innych stron internetowych, ale w wyzwaniu mówi, że kod musi działać na tłumaczu internetowym.
spaghetto
Porozmawiajmy o tym na czacie.
spaghetto
Czy należy liczyć jakieś cudzysłowy wokół adresu URL? Niektóre odpowiedzi obecnie wykluczają je z listy, inne je uwzględniają.
hvd,

Odpowiedzi:

2

Perl, 107 bajtów

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

Nieco mniej golfa:

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

Przykładowe użycie

$ perl my_rank.pl
I'm answer number 1.
primo
źródło
7

Python 2, 145 bajtów

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)

Wyjście z 10.10.2015 17:30:00 UTC:

I'm answer number 1.

Nie naliczyłem żadnego adresu URL dla mojego wyniku, jeśli powinienem skomentować, ile powinienem do niego dodać. Ma zapisany na stałe wynik, zakłada, że ​​jest już opublikowany. Zepsuje się, jeśli zostanie opublikowanych więcej niż 99 odpowiedzi.

niebieski
źródło
6

AutoIt, 175 bajtów

(202 bajty - 27 dla adresu 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&".")

Wyjście z 2015-10-09 17:47:00 UTC:

I'm answer number 1.
mınxomaτ
źródło
Nigdy nie słyszałem o Autolt, ale to prawda, że ​​to nie zadziała, jeśli nazwa języka zawiera przecinek? (Nie wiem, czy są jakieś takie języki, więc nie jestem pewien, czy to ma znaczenie)
Stewie Griffin,
@StewieGriffin Tak, ale nie pamiętam też żadnego języka z przecinkiem ;-). Jeśli się pojawi, zmienię to.
mınxomaτ
@minxomat Nazwa wygląda jak ma lzamiast I, więc źle ją odczytałem. Jedynym powodem, dla którego zdałem sobie z tego sprawę, jest obejrzenie artykułu w Wikipedii , który ma szeryf.
mbomb007,
Tylko czekam, aż ktoś wymyśli język z przecinkiem, aby sabotować tę odpowiedź ...
Darrel Hoffman,
@DarrelHoffman Cóż, musiałby mieć przecinek i spację w kolejności ^ ^
mınxomaτ 10.10.15
4

JavaScript (ES7), 149 bajtów

283 bajtów - 134 dla adresu URL. Nigdy wcześniej nie korzystałem z żądań HTTP, ale proszę bardzo ...

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

Testy zakończyły się pomyślnie w przeglądarce Firefox 41.

Najpierw przegląda nagłówki wszystkich odpowiedzi w celu znalezienia ich liczby bajtów, a następnie znajduje pierwszą pozycję z liczbą bajtów 243 149. Obecnie jest skonfigurowana do sprawdzania tylko pierwszych 100 odpowiedzi, i pęknie, jeśli ktoś osiągnie mniej niż 100 bajtów, ale na razie działa. ;)

Dzięki @GeorgeReith za znacznie krótszą technikę. Stara wersja korzystająca z AJAX (243 bajty):

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()
ETHprodukcje
źródło
Wygląda dobrze ... chociaż może się złamać, jeśli ktoś opublikuje kolejną 151-bajtową odpowiedź
George Reith,
@GeorgeReith Nah, nie powinno. OP twierdzi, że więzi mogą zostać zerwane w obu kierunkach, a to po prostu da się wyprzedzić.
ETHproductions
Ach, wyedytował to. Mimo to prawdopodobnie lepiej jest posortować według daty utworzenia, aby zwiększyć prawdopodobieństwo, że znajdzie Twoją zamiast jednego z nielicznych, którzy opublikowali wcześniej i edytują swoją odpowiedź.
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.Nadal w głównym poście; czy coś nie rozumiem?
ETHprodukcje
Bez przeprosin Czytałem historię edycji i się zdezorientowałem.
George Reith,
4

PHP, 158 159 164 bajty

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 bajtów z 'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T'niezliczonych

Sformatowana wersja z niepoliczonymi ciągami:

<?
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)
    ),
    ".";
  • Ładuje odpowiedź JSON (jeden raz na odpowiedź, aby zaoszczędzić 5 bajtów dzięki @Blackhole)
  • Zbiera ciała odpowiedzi w $h
  • zamienia cały tekst na „1” (prawda), jeśli liczba bajtów wynosi <= 159, lub „” (fałsz) w przeciwnym razie
  • sumuje wyniki

Sekwencje znaków, takie jak, ¶Ø’ßž‘Œˆšß‘Š’šßsą poprawnymi stałymi nazwami w PHP, ale ponieważ stałe nie istnieją, są traktowane jak literał łańcuchowy. ~odwraca je, ten na "I'm answer number "(zapisywanie bajtu dla każdego znaku cudzysłowu)

Stosowanie

php -derror_reporting=0 howareyou.php

Jestem odpowiedzią nr 1.

Fabian Schmengler
źródło
Czy $azmienna jest naprawdę konieczna? Dlaczego po prostu nie robisz $h[]=json_decode(…)[items][+$i++][body]? Nawiasem mówiąc, jakie są te dziwne postacie?
Blackhole,
Słuszna uwaga. Spowoduje to nowe żądanie dla każdej odpowiedzi, ale kogo to obchodzi :) Dziwne znaki są bitowo odwróconymi ciągami. Są to prawidłowe stałe nazwy w PHP, które są używane jako literały ciągów, jeśli nie istnieją, więc mogę zapisać cudzysłowy. Na przykład " "(3 bajty) można zmniejszyć do (2 bajtów)
Fabian Schmengler,
Rzeczywiście znalazłem wyjaśnienie tej odpowiedzi . Ponieważ jest to niezwykła metoda, myślę, że dobrym pomysłem byłoby wyjaśnienie jej ponownie tutaj w poście :).
Blackhole
Myślę, że można zrobić wiele lepiej, jeśli pominąć json_decodei tylko spliton ':'albo coś, np codepad.org/7rZg06by
primo
Dobry pomysł, ale obawiam się, że może to być zawodne, ponieważ w kodach źródłowych będzie dużo dwukropków. Umieszczenie „Jestem odpowiedzią numer” przed otwierającym znacznikiem PHP oszczędza co najmniej dwa bajty, dzięki za to!
Fabian Schmengler
3

JavaScript (ES6), 186 bajtów

(335–149 bajtów dla adresu 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
źródło
Nie miałem pojęcia, że ​​możesz to zrobić w ten sposób! Czy mogę zapytać, dlaczego użyłeś \x3Czamiast <?
ETHprodukcje 10.10.15
@ETHproductions Ponieważ przeglądarka od razu szuka zamykającego znacznika skryptu i w przeciwnym razie nie wykona skryptu, opóźnia to zamknięcie znacznika skryptu do momentu wstawienia. Używa JSONP z wywołaniem zwrotnym i zależy od API, czy to obsługuje, ale na szczęście robi to zmiana stosu. Szczerze mówiąc, nie do końca rozumiem jego uzasadnienie, ale jest to uzasadniona kwestia.
George Reith,
1

Awk, 153 bajty

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

Powinno to zostać zapisane w pliku ai działać jak:

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

Odejmuję 68 bajtów http://codegolf.stackexchange.com/questions/60204/how-are-you-doingi dodam 13 do kodu ładowania początkowego awk -v u=i -f a.

Mniej golfa, może być jeszcze krótszy:

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

Zawsze preferuje się w związkach. Liczba bajtów w każdym jest zakodowana na stałe.

Wersja bardziej golfowa ma skrypt wywołujący się i wysyłający wartość wyjściową przez system. W każdym przypadku liczy się tylko mniej niż zakodowany przyrost wartości r, który następnie należy skorygować z powrotem, 1jeśli prowadzi.

To nie poprawnie odnaleźć bajtów jeśli nie spacje między bytesa </h1>i pewnie wielu innych przypadkach nie są brane pod uwagę.

Na dzień Sun Oct 11 05:17:51 UTC 2015dzisiejszy daje to:

I'm answer number 3.
n0741337
źródło
Ponieważ po raz pierwszy gram w golfa, daj mi znać, jeśli naruszyłem jakieś zasady, luki, liczby itp. Lub jakie ulepszenia mogę wprowadzić.
n0741337,
Myślę, że musisz wydrukować „Jestem numerem odpowiedzi” zamiast „Jestem numerem”.
lirtosiast
@ThomasKwa Hah! Wiedziałem, że to zbyt piękne, aby mogło być prawdziwe. Dzięki i naprawione. Czy dodanie bajtów z powrotem wymaga przekreślenia?
n0741337,
Nie potrzebujesz jednego, tak jak nie potrzebujesz przekreślenia, gdy grasz w bajty.
lirtosiast
1

GNU Awk, 156 bajtów

(Inspirowane przez n0741337 jest rozwiązanie Awk ).

Ten robi to wszystko sam, bez uruchamiania zewnętrznego polecenia.

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}

Oczekuje nazwy hosta i ścieżki jako osobnych wartości. Biorąc pod uwagę, że są dostępne za darmo, mam nadzieję, że nie łamie to zasad.

Przykładowy przebieg:

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
człowiek w pracy
źródło