Średnia długość Google

24

Bałam się z funkcją żądania adresu URL Pyth'a i zauważyłem, że Google zawsze udzielało mi odpowiedzi o nieco innej długości, zwykle ~10500znaków.

Twoim zadaniem w tym wyzwaniu jest wydrukowanie średniej długości odpowiedzi HTML http://google.com.

Okular

  • Podejmiesz dane, nktóre są liczbą żądań do złożenia.
  • Dla każdego żądania utworzysz żądanie HTTP get.
  • Policzysz treść odpowiedzi (tekst HTML), a nie nagłówki.
  • Wyprowadza średnią arytmetyczną długości odpowiedzi.
  • Możesz uzyskać dostęp tylko do adresu URL http://google.com, a nie do żadnego innego.
  • To jest , więc wygrywa najkrótszy kod w bajtach !

Przykładowe dane wyjściowe dla danych wejściowych 10: 10560.1

(Użyłem urllibdo tego Pythona )

PS: czy ktoś wie, dlaczego Google to robi?

Maltysen
źródło
1
Dziwne, http://google.comzawsze zwraca mi 261 bajtów ... https://google.com/ncrmoże jednak zwrócić więcej.
Neil
@Neil Odd, http://google.comzawsze zwraca mi
10422
Czy można zwrócić stosunek liczb całkowitych (tj. Dokładny ułamek)?
LegionMammal978
5
@ Nee Otrzymujesz 261 bajtów, ponieważ faktycznie otrzymujesz przekierowanie adresu URL, kod 302, który ma w treści nowy adres URL do śledzenia. Niektóre programy, takie jak curl on Linux, potrzebują konkretnego argumentu, aby automatycznie podążać za tym nowym adresem URL.
seshoumara
3
@seshoumara TBH wyzwanie nie określa, że ​​należy podążać za przekierowaniami, więc domyślnie oczekiwałbym, że odpowiedź Neila będzie poprawna, ponieważ obsługuje rzeczywistą odpowiedź HTTP, która http://google.comwysyła. Oczywiście nie o to chodzi w wyzwaniu, więc wyzwanie powinno być edytowane przez IMO, aby to odzwierciedlić.
Aaron

Odpowiedzi:

20

Bash + narzędzia systemowe, 56 53 49 48 bajtów

Aktualizacja: zapisano 4 bajty dzięki Digital Trauma i 1 bajt więcej dzięki Dennis

curl -L `yes google.com|sed $1q`|wc|dc -e1k?$1/p

W mojej oryginalnej odpowiedzi użyłem yesw połączeniu z xargsemulacją pętli for. Ale curlmoże zaakceptować jako dane wejściowe listę adresów URL, więc tylko dane wyjściowe yessą faktycznie potrzebne.

Gdy curluzyskuje dostęp do google.com , otrzymuje stronę przekierowującą 302, która ma nowy adres URL w sekcji treści, więc -Lkonieczne jest skorzystanie z tej opcji.

Uruchom przykład: odpowiedź jest wypisywana na STDOUT, przekierowuję STDERR tylko dla jasności

me@LCARS:/PPCG$ ./google_length.sh "8" 2> /dev/null
10583.2

Objaśnienie: (pierwotnie przesłanego kodu)

yes google.com|     # repeatedly output a line containing the string "google.com"
sed $1q|            # print the first $1 lines only (shorter than head -$1)
xargs curl -sL|     # xargs reads the input lines and executes "curl -sL" with the
                    #current input line as an additional argument.
wc -m|              # count the number of characters
dc -e1k?$1/p        # dc script: set precision to 1, read input, push $1 and divide

Edit: Wymieniłem wc -mz wc, bo nawet jeśli bez argumentów drukuje 2 więcej niż jednego statystyk chciałem, ten sam dcskrypt po to wyjście nadal działa, ponieważ chcemy liczyć się, szczęśliwie, umieszczone na górze stosu podczas parsowania.

seshoumara
źródło
@DigitalTrauma Bardzo miło, nie ma potrzeby xargs. Dzięki, zaktualizowałem odpowiedź.
seshoumara
2
Nie trzeba -s. Wyjściowe przesyłanie do STDERR jest domyślnie dozwolone.
Dennis
@Dennis Dzięki, odpowiedź zaktualizowana.
seshoumara
17

MATL , 28 bajtów

:"'http://google.com'Xin]vYm

Gif lub tak się nie stało:

enter image description here

Jak to działa

:                      % Implicitly input n. Push [1 2 ... n]
"                      % For each
  'http://google.com'  %   Push this string
  Xi                   %   URL read. Gives a string
  n                    %   Number of elements
]                      % End
v                      % Concatenate stack contents into a vertical vector
Ym                     % Mean. Implicitly display
Luis Mendo
źródło
12

PowerShell , 48 bajtów

1.."$args"|%{irm google.com}|measure Le* -a|% A*

Wyjaśnienie

  1. Utwórz zakres od 1 do całkowitej liczby wejściowej.
  2. Dla każdej wartości w zakresie Invoke-RestMethod (irm ) strona główna Google. Wynikiem nie jest JSON, więc zwróci ciało dosłownie zamiast deserializować.
  3. Wyślij to do Measure-Object(measure ), uzyskując średnią zLength właściwości ciągów wejściowych (obiektów).
  4. Rozwiń uzyskaną Averagewłaściwość.
briantist
źródło
nie wiedziałem, że |% A*to możliwe, zawsze tego unikałem, measureponieważ myślałem, że nie można
użyć
2
@ConnorLSW tak, właśnie to odkryłem podczas przygotowywania prezentacji na temat golfa kodu w PowerShell. Sprawdź też |? A*kilka fajnych rzeczy. Muszę spojrzeć na moje pliki prezentacji i dodać te rzeczy do wątku ze wskazówkami.
briantistka
10

Java 8, 197 184 182 181 bajtów

Gra w golfa:

n->{int s=0,i=0;while(i++<n)try{s+=new java.util.Scanner(new java.net.URL("http://google.com").openStream()).useDelimiter("\\A").next().length();}catch(Exception e){}return s*1f/n;}

Nie golfowany:

public class AverageLengthOfGoogle {

  public static void main(String[] args) {
    float bytes = f(n -> {
      int s = 0, i = 0;
      while (i++ < n) {
        try {
          s += new java.util.Scanner(new java.net.URL("http://google.com").openStream())
              .useDelimiter("\\A").next().length();
        }
        catch (Exception e) {
        }
      }
      return s * 1f / n;
    } , 10);
    System.out.println(bytes);
  }

  private static float f(java.util.function.IntFunction<Float> f, int n) {
    return f.apply(n);
  }
}

To przecieka zasoby, ale jest to niewielka cena do zapłacenia w poszukiwaniu najmniejszej ilości bajtów.


źródło
1
Możliwe ulepszenia: 1. podwójne -> zmiennoprzecinkowe 2. google.com -> google.com 3. być może określenie kodowania nie jest konieczne, powinna być jakaś przestarzała metoda Powinieneś zaoszczędzić jakieś 20 bajtów
kukis
@kukis dzięki, że zgoliłem 13 bajtów.
n->{int s=0,i=0;for(;i<n;++i)try{...}catch(Exception e){}return s*1.0/n;}. Nie jestem pewien, czy możesz wymienić s*1.0/nw zamian s*1f/n, ale warto spróbować
Roman Gräf
@ RomanGräf tak, to działa. Dzięki!
for(;i<n;++i)można zmienić for(;i++<n;)na -1 bajt.
Kevin Cruijssen
7

Pyth, 25 bajtów

.OmslM'"http://google.com

'jest funkcją otwartą w Pyth, a gdy otrzyma ciąg rozpoczynający się od http, wykonuje żądanie GET dla tej witryny. Zwracana wartość to lista bytesobiektów. Niestety, Pyth snie wie, jak połączyć te obiekty, więc zamiast tego lsużywam slMdo uzyskania całkowitej długości. Odbywa się to kilka razy równa wartości wejściowej przez m, a wyniki są uśredniane przez .O.

isaacg
źródło
7

05AB1E , 15 bajtów

Kod:

F’Š¹.ŒŒ’.wgO}¹/

Wyjaśnienie:

F           }     # Input times do..
 ’Š¹.ŒŒ’          #   Push the string "google.com"
        .w        #   Read all and wrap into a string
          g       #   Get the length
           O      #   Sum it up with the total
             ¹/   # Divide by input

Wykorzystuje kodowanie CP-1252 . Po uruchomieniu w tłumaczu offline otrzymuję następujące informacje:

> py -3 05AB1E.py -c test.abe
1
11039.0

> py -3 05AB1E.py -c test.abe
2
11070.0

> py -3 05AB1E.py -c test.abe
3
11046.666666666666

> py -3 05AB1E.py -c test.abe
4
11029.75

> py -3 05AB1E.py -c test.abe
5
11015.8
Adnan
źródło
Albo masz wbudowaną stronę google.com, albo dzieje się coś innego!
Pureferret
@Pureferret To właściwie skompresowany ciąg słownika. Możesz to wypróbować tutaj :).
Adnan
Czy dozwolone jest używanie języków związanych z golfem? Jeśli tak, to teoretycznie mogę wymyślić język, który zrobi te wszystkie rzeczy w jednym bajcie
kukis
@kukis Używanie dedykowanych języków gry w golfa jest dozwolone, tylko wtedy, gdy używana wersja językowa nie jest datowana na wyzwanie. Jeśli wymyślisz język, który potrafi robić wszystkie te rzeczy w jednym bajcie, ale kompilator powstał po wyzwaniu, jest to naruszenie zarówno tego, jak i tego .
Adnan
7

PHP, 90 78 bajtów

while($i++<$argv[1]){$s+=strlen(file_get_contents('http://google.com'));}echo $s/$argv[1];

while($i++<$argv[1])$s+=strlen(join(file('http://google.com')));echo$s/($i-1);
  • Użyto krótszych funkcji / zmiennych i usunięto niepotrzebną konstrukcję składniową, o czym wspominali komentatorzy
Michael Tsang
źródło
2
Witamy na codegolf.se! join(file())zamiast file_get_contents()oszczędzać ci kilka bajtów.
Christoph
2
Ponadto możesz upuścić nawiasy klamrowe i odstęp po echo. Możesz także użyć $izamiast $argv[1]dzielnika.
user59178
6

Mathematica, 58 bajtów

N@Mean[StringLength@URLFetch@"http://google.com"~Table~#]&

Funkcja anonimowa. Pobiera liczbę jako dane wejściowe i zwraca liczbę jako dane wyjściowe.

LegionMammal978
źródło
Dlaczego musisz N@? Nie drukujesz go, więc nie ma powodu, aby ładnie go formatować.
Pavel
@Pavel OP określił, że dokładne ułamki nie są dozwolone.
LegionMammal978
3

Python, 102 bajty

import urllib2
f=lambda n:sum([len(urllib2.urlopen(x).read()) for x in ['http://google.com']*n],0.0)/n

Lub, jeśli możemy zwrócić liczby całkowite zamiast liczb zmiennoprzecinkowych, odpowiedź może wynosić 98 bajtów:

import urllib2
f=lambda n:sum([len(urllib2.urlopen(x).read()) for x in ['http://google.com']*n])/n
całkowicie nieokreślony
źródło
1
Możesz usunąć kilka spacji. )for x in[. Ponadto, jeśli ograniczysz się do Pythona 3, podział będzie automatycznie podziałem zmiennoprzecinkowym i możesz go usunąć 0.0.
mbomb007
1
Nie potrzebujesz również []w drugim przypadku - sumtrwagenerator
Bahrom
3

CJam , 23 bajty

rd_"google.com"a*:gs,\/

Nie działa na TIO ze względów bezpieczeństwa.

Testowe uruchomienie

$ echo -n 'rd_"google.com"a*:gs,\/' > google-avg.cjam
$ wc -c google-avg.cjam
23 google-avg.cjam
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10663.2
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10650.0
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10651.0
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10651.4
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10673.5

Jak to działa

 rd                      e# Read a double from STDIN. Let's call it D.
   _                     e# Push a copy of D.
    "google.com"a        e# Wrap the string in an array, pushing ["google.com"].
                 *       e# Repeat the array D times.
                  :g     e# Map `get` over the array, making D requests to the URL.
                    s    e# Combine all D responses into a single string.
                     ,   e# Compute the length.
                      \  e# Swap the length with the original D.
                       / e# Perform division.
Dennis
źródło
1

CJam, 27 bajtów

{"google.com"g,}ri*]_:+\,d/

CJam zakłada HTTP, jeśli nie jest określony.

Wyjaśnienie

{"google.com"g,}             A block which fetches from http://google.com and gets its length
                ri*          Run this block a number of times equal to the input
                   ]         Collect all the results in an array
                    _        Duplicate the array
                     :+      Sum it
                       \     Swap back to the original array
                        ,    Get its length
                         d/  Cast to double and divide 
                              (without casting, it would be integer division)
Business Cat
źródło
1

Clojure, 102 bajty

(fn[n](/(reduce + 0.0(repeatedly n #(count(slurp(clojure.java.io/reader"http://www.google.com")))))n))

Nie golfowany:

(fn [n]
  (/
   (reduce + 0.0
           (repeatedly n
                       #(count (slurp (clojure.java.io/reader "http://www.google.com")))))
   n))

#(count (slurp (clojure.java.io/reader "http://www.google.com")))jest funkcją lokalną, która zlicza bajty z żądania HTTP do Google, repeatedlywywołuje funkcję n razy i tworzy listę ze zwróconych zliczeń, zmniejsza sumy wyników razem, a na koniec jest dzielona przez n, aby uzyskać średnią. Zmniejszenie rozpoczyna się od wartości 0,0, aby wymusić wynik na liczbę zmiennoprzecinkową - w przeciwnym razie podział byłby racjonalny. Całość jest zapakowana w anonimową funkcję, która tyle razy nazywa nazwę żądania.

djeis
źródło
Przysięgam, że nie skopiowałem tej odpowiedzi! Mój skończył całkiem blisko twojego. Ta (clojure.java.io/reader)część jest niepotrzebna. Odbywa się to automatycznie za kulisami, jeśli podasz ciąg znaków.
Carcigenicate
1

Python 3, 95 bajtów

Rozwiązanie rekurencyjne

import requests as r
f=lambda n,t:f(n-1,t+len(r.get('http://google.com').text)) if n>0 else t/i

gdzie n=i=int(input())

biblioteka żądań

Miguel
źródło
Żądania wydają się być biblioteką zewnętrzną, więc będziesz chciał dodać do niej link. Coś w styluPython 3 + [Requests](http://docs.python-requests.org/en/master/user/install/#install), 95 bytes
Value Ink
@ValueInk, dodane, nie trzeba go jednak instalować, pochodzi z python3 (przynajmniej domyślnie przyszedł dla mnie). Dlaczego druga odpowiedź pytona nie musi tego robić?
Miguel
urllib2jest natywną (wstępnie zainstalowaną) biblioteką Python docs.python.org/2/library/urllib2.html, dzięki czemu każdy, kto pobierze Python, może natychmiast uruchomić swój kod. Nie mogę uruchomić twojego kodu na moim Pythonie 3 bez tej biblioteki.
Wartość tuszu
@ValueInk nie ma problemu, mój pierwszy wkład tutaj, nie wiedziałem
Miguel
1

Perl, 66 bajtów

perl -MLWP::Simple -pe'map$t+=length get"http://google.com",1..$_;$_=$t/$_'

51 bajtów + 14 bajtów dla -MLWP::Simple<space>+ 1 bajtu dla-p .

Proste rozwiązanie za pomocą LWP :: Proste . getFunkcja jest domyślnie eksportowane i zwraca zawartość odpowiedzi na sukces.

Perl 5.14+, 94 93 bajty (tylko moduły podstawowe)

perl -MHTTP::Tiny -pe'map$t+=length${+get{new HTTP::Tiny}"http://google.com"}{content},1..$_;$_=$t/$_'

79 bajtów + 13 bajtów dla -MHTTP::Tiny<space>+ 1 bajtu dla -p.

Używa HTTP :: Tiny , który jest rdzeniem od Perla 5.14.

Jak to działa

To:

get{new HTTP::Tiny}"http://google.com"

jest pośrednim odpowiednikiem składni obiektowej tego:

HTTP::Tiny->new->get("http://google.com")

i oszczędza trzy bajty. getMetoda zwraca hashref z treścią przechowywane pod contentkluczem.

Aby uzyskać rzeczywistą treść odpowiedzi, wykonujemy:

${+get{new HTTP::Tiny}"http://google.com"}{content}

co jest równoważne z:

(get{new HTTP::Tiny}"http://google.com")->{content}

ale oszczędza jeden bajt, gdy dodajemy length:

length(foo)->{bar}  # wrong, equivalent to (length(foo))->{bar}
length+(foo)->{bar}
length${+foo}{bar}
ThisSuitIsBlackNot
źródło
0

Rebol, 69 bajtów

n: 0 loop i: do input[n: n + length? read http://www.google.com]n / i
draegtun
źródło
0

Clojure, 70 bajtów

#(/(reduce(fn[a _](+ a(count(slurp"http://google.com"))))0(range %))%)

Krotnie w ndługim zasięgu. Podsumowuje długość każdego żądania, a następnie dzieli je przez liczbę żądań. Ze względu na sposób, w jaki Clojure obsługuje podział, zwraca to ułamek, a nie dziesiętny. Jeśli jest to nie do przyjęcia, mogę to naprawić kosztem kilku bajtów.

(defn avg-request-len [n]
  (/
    (reduce (fn [acc _]
              (+ acc (count (slurp "http://google.com"))))
            0
            (range n))
    n))
Carcigenicate
źródło
0

Rubinowy, 73 + 10 = 83 bajty

Używa -rnet/httpflagi.

->n{s=0.0;n.times{s+=Net::HTTP.get(URI"http://www.google.com").size};s/n}
Wartość tuszu
źródło
0

Common Lisp + quicklisp / dexador , 23 + 72 = 95 bajtów

Jeśli Quicklisp jest zainstalowany w systemie, pobierze i zainstaluje dexador w razie potrzeby.

Preludium:

(ql:quickload :dexador)

Kod

(lambda(n)(/(loop :repeat n :sum(length(dex:get"http://google.com")))n))

Nie golfowany:

(lambda (n)
  (/ (loop :repeat n 
           :sum (length (dex:get "http://google.com")))
     n))

Wyjaśnienie

(dex:get "http://google.com")

Spowoduje to wykonanie żądania internetowego do Google i zwrócenie pięciu wartości:

  1. Samo żądanie sieciowe jako tablica ciągów lub bajtów (w zależności od typu zawartości)
  2. Kod stanu http
  3. Mapa skrótowa nagłówków odpowiedzi http
  4. Obiekt QURI reprezentujący końcowy identyfikator URI po rozwiązaniu przekierowań
  5. Gniazdo używane do komunikacji z serwerem WWW (jeśli nie zostało zamknięte przez serwer lub jeden z opcjonalnych argumentów funkcji)

(length (dex:get ...))

Jeśli nie zażądasz inaczej jawności, Common Lisp odrzuci wszystkie zwracane wartości inne niż pierwsza, więc funkcja długości widzi tylko odpowiedź HTTP i zwraca długość tego ciągu.

(loop :repeat n :sum (length ...))

Oblicza to długość odpowiedzi n razy i dodaje je.

(/ (loop ...) n)

Dzieli to zsumowane długości przez n, aby obliczyć średnią.

(lambda (n) ...)

To zawija treść kodu w anonimowej funkcji, która bierze n jako argument i zwraca średnią długość odpowiedzi dla n żądań internetowych na http://google.com .

djeis
źródło