Середня довжина Google


24

Я плутався з функцією запиту на адресу Pyth, і помітив, що google завжди давав відповідь трохи меншої довжини для мене, як правило, ~10500символів.

Отже, ваше завдання в цьому виклику - роздрукувати середню довжину відповіді html з http://google.com.

Технічні характеристики

  • Ви візьмете дані, nякі є кількістю запитів.
  • Для кожного запиту ви будете робити запит на отримання HTTP.
  • Ви будете рахувати тіло відповіді (текст html), а не заголовки.
  • Виведіть середнє арифметичне довжин відповідей.
  • Ви можете отримати доступ лише до URL-адреси http://google.com, не будь-який інший.
  • Це , тому найкоротший код у байтах виграє!

Приклад виводу для введення 10: 10560.1

(Я для цього використовував Python urllib)

PS: Хтось знає, чому Google це робить?


1
Як не дивно, http://google.comзавжди повертає 261 байт для мене ... але https://google.com/ncrможе повернути більше.
Ніл

@Neil Незнайко, http://google.comзавжди повертає для мене 10422 байти ...
LegionMammal978

Чи можна повернути співвідношення цілих чисел (тобто точний дріб)?
LegionMammal978

5
@Neil Ви отримуєте 261 байт, оскільки фактично отримуєте перенаправлення URL-адреси, код 302, який має в тілі нову URL-адресу, яку слід слідкувати. Деякі програми, як curl на linux, потребують конкретного аргументу, щоб автоматично слідувати цій новій URL-адресі.
seshoumara

3
@seshoumara TBH виклик не визначає наступні перенаправлення, тому я б очікував, що відповідь Ніла за замовчуванням буде правильною відповіддю, оскільки він обробляє фактичну відповідь HTTP, що http://google.comнадсилається. Звичайно, це не суть виклику, тому виклик повинен бути відредагований IMO, щоб це відобразити.
Аарон

Відповіді:


20

Утиліти Bash +, 56 53 49 48 байт

Оновлення: збережено 4 байти завдяки Digital Trauma та ще 1 байт завдяки Деннісу

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

У своїй оригінальній відповіді я використовував yesу поєднанні з xargsдля імітації циклу for. Але curlможна прийняти в якості списку URL-адреси, тому yesнасправді потрібен лише вихід з .

Коли curlзвертається до google.com , він отримує сторінку переспрямування 302, яка має нову URL-адресу в розділі тіла, тому -Lпотрібна опція, щоб слідувати за нею.

Приклад запуску: відповідь друкується на STDOUT, я переадресовую STDERR тільки для наочності

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

Пояснення: (первісно поданого коду)

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: я замінив wc -mз wc, тому що навіть якщо без аргументів він друкує більше 2 статистики , ніж той , який я хотів, той же dcсценарій , дотримуючись цей висновок ще працює, тому що граф ми хочемо, до щастя, знаходиться на вершині стека під час синтаксичного аналізу.


@DigitalTrauma Дуже приємно, не потрібно xargs. Дякую, я оновив відповідь.
seshoumara

2
Вам не потрібно -s. За замовчуванням дозволений вихід з режимом STDERR.
Денніс

@Dennis Спасибі, відповідь оновлена.
seshoumara

17

MATL , 28 байт

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

Gif або цього не сталося:

введіть тут опис зображення

Як це працює

:                      % 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

12

PowerShell , 48 байт

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

Пояснення

  1. Створіть діапазон від 1до вхідного цілого числа.
  2. Для кожного значення в діапазоні Invoke-RestMethod( irm) домашня сторінка google. Результат не JSON, тому він поверне тіло дослівно, а не десеріалізує його.
  3. Надішліть це Measure-Object( measure), отримавши середнє значення Lengthвластивості вхідних рядків (тіл).
  4. Розгорніть отриману Averageвластивість.

не знав, що |% A*це можливо, я завжди уникав, measureтому що я думав, що ти не можеш підкреслити назву власності ...
colsw

2
@ConnorLSW Так, це я нещодавно виявив, готуючи презентацію про код гольфу в PowerShell. Перевірте також |? A*якісь цікаві речі. Мені потрібно переглянути свої файли презентацій і додати цей матеріал до теми підказки.
британіст


10

Java 8, 197 184 182 181 байт

Гольф:

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

Безголівки:

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

Це витікає ресурси, але це невелика ціна, яку потрібно заплатити за пошук найменших байтів.


1
Можливі вдосконалення: 1. подвійний -> float 2. google.com -> google.com 3. можливо, вказівка ​​кодування не потрібна, має бути якийсь застарілий метод. Ви повинні зберегти 20 байтів
kukis

@kukis спасибі, що поголив 13 байт.

n->{int s=0,i=0;for(;i<n;++i)try{...}catch(Exception e){}return s*1.0/n;}. Не впевнений, чи можете ви замінити замість s*1.0/nнього s*1f/n, але варто спробувати
Роман Гряф

@ RomanGräf так, це працює. Спасибі!

for(;i<n;++i)можна змінити на for(;i++<n;)-1 байт.
Kevin Cruijssen

7

Pyth, 25 байт

.OmslM'"http://google.com

'- це відкрита функція в Pyth, і коли їй надається рядок, починаючи з http, вона виконує GET резюме на цьому веб-сайті. Повернене значення - це список bytesоб’єктів. На жаль, Pyth's sне знає, як об'єднати ці об'єкти, тому замість цього lsя використовую slMдля отримання загальної довжини. Це виконується в кілька разів, рівне вхідному значенню m, а результати усереднюються .O.


7

05AB1E , 15 байт

Код:

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

Пояснення:

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

Використовує кодування CP-1252 . При запуску в автономному перекладачі я отримую наступне:

> 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

У вас є вбудований веб-сайт google.com або щось інше відбувається!
Pureferret

@Pureferret Це фактично стислий рядок у словнику. Ви можете спробувати тут :).
Аднан

Чи дозволено використання мов, присвячених гольфу? Якщо так, то я теоретично можу скласти мову, яка буде робити все це в один байт
kukis

@kukis Використання виділених мов для гри в гольф дозволено, якщо і лише в тому випадку, якщо використовувана мовна версія не відкладає виклик. Якщо ви складаєте мову, яка може виконувати всі ці речі в один байт, але компілятор був зроблений після виклику, це порушення і цього, і цього .
Аднан

7

PHP, 90 78 байт

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);
  • Використовуються більш короткі функції / змінні та видаляється непотрібна синтаксична конструкція, як згадують коментатори

2
Ласкаво просимо до codegolf.se! join(file())замість того, щоб file_get_contents()заощадити кілька байтів.
Крістоф

2
Крім того, ви можете скинути фігурні дужки та пробіл після echo. Також ви можете використовувати $iзамість $argv[1]цього дільник.
користувач59178

6

Математика, 58 байт

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

Анонімна функція. Приймає число в якості введення та повертає число як вихід.


Навіщо вам це потрібно N@? Ви не друкуєте його, тому немає приводу добре його форматувати.
Павло

@Pavel OP вказав, що точні дроби не допускаються.
LegionMammal978

3

Пітон, 102 байти

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

Або, якщо ми можемо повернути цілі числа, а не плаваючі, відповідь може бути 98 байтами:

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

1
Ви можете видалити там пару пробілів. )for x in[. Крім того, якщо ви обмежитеся Python 3, розділення автоматично буде поплавковим поділом, і ви можете його видалити 0.0.
mbomb007

1
Крім того, не потрібен []в 2 - ом випадку - sumпотрібноgenerator
Бахрома

3

CJam , 23 байти

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

Не працює в TIO з міркувань безпеки.

Тестовий запуск

$ 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

Як це працює

 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.

1

CJam, 27 байт

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

CJam передбачає HTTP, якщо не вказано.

Пояснення

{"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)

1

Clojure, 102 байти

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

Безголівки:

(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")))це локальна функція, яка рахує байти від http-запиту до google, repeatedlyвикликає функцію n разів і складає список із повернених підрахунків, разом зменшує підсумки, і, нарешті, ділиться на n, щоб скласти середнє значення. Зниження починається з 0,0, щоб вивести результат на поплавок, інакше поділ призведе до раціонального. Вся річ загорнута в анонімну функцію, яка потребує кількості запитів, щоб назвати запит.


Клянусь, я не скопіював цю відповідь! Моє закінчилося досить близько до вашого. (clojure.java.io/reader)Частина непотрібно речі. Це робиться автоматично за кадром, якщо ви передаєте рядок.
Carcigenicate

1

Python 3, 95 байт

Рекурсивне рішення

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

де n=i=int(input())

бібліотека запитів


Здається, запити є зовнішньою бібліотекою, тому ви хочете додати посилання на нього. Щось на кшталтPython 3 + [Requests](http://docs.python-requests.org/en/master/user/install/#install), 95 bytes
Ink Value

@ValueInk, додано, вам не потрібно встановлювати його, хоча він постачається з python3 (принаймні, для мене він прийшов за замовчуванням). Чому інша відповідь пітона не потребує цього робити?
Мігель

urllib2є рідною (попередньо встановленою) бібліотекою Python docs.python.org/2/library/urllib2.html, тому кожен, хто завантажує Python, може негайно запустити свій код. Я не можу запустити ваш код на моєму Python 3 без цієї бібліотеки.
Значення чорнила

@ValueInk немає проблем, мій перший внесок тут, я не знав
Мігель

1

Perl, 66 байт

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

51 байт + 14 байт для -MLWP::Simple<space>+ 1 байт для -p.

Просте рішення за допомогою LWP :: Simple . getФункція експортується за замовчуванням і повертає вміст відповіді на успіх.

Perl 5.14+, 94 93 байт (лише основні модулі)

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

79 байт + 13 байт для -MHTTP::Tiny<space>+ 1 байт для -p.

Використовує HTTP :: Tiny , який є в ядрі з Perl 5.14.

Як це працює

Це:

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

є еквівалентом цього непрямого синтаксису об'єкта :

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

і зберігає три байти. getМетод повертає hashref з зберігаються під contentключ.

Щоб отримати фактичний вміст відповіді, ми робимо:

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

що еквівалентно:

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

але зберігає один байт, коли ми додаємо length:

length(foo)->{bar}  # wrong, equivalent to (length(foo))->{bar}
length+(foo)->{bar}
length${+foo}{bar}

0

Ребол, 69 байт

n: 0 loop i: do input[n: n + length? read http://www.google.com]n / i

0

Clojure, 70 байт

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

Складка на nвеликій дальності. Підсумовує довжину кожного запиту, потім ділить його на кількість запитів. Завдяки тому, як Clojure обробляє поділ, це повертає дріб, а не десятковий. Якщо це неприйнятно, я можу це виправити ціною в пару байтів.

(defn avg-request-len [n]
  (/
    (reduce (fn [acc _]
              (+ acc (count (slurp "http://google.com"))))
            0
            (range n))
    n))


0

Звичайний Lisp + quicklisp / dexador , 23 + 72 = 95 байт

Якщо в системі встановлено швидкий доступ, він завантажить і встановить dexador як необхідний.

Прелюдія:

(ql:quickload :dexador)

Код

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

Безголівки:

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

Пояснення

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

Це виконує веб-запит до google та повертає п'ять значень:

  1. Веб-запит сам як рядок або байтовий масив (залежно від типу вмісту)
  2. Код статусу http
  3. Хеш-карта заголовків відповідей http
  4. Об'єкт QURI, що представляє остаточний URI, після вирішення переадресацій
  5. Сокет, який використовується для спілкування з веб-сервером (якщо він не був закритий сервером або одним із додаткових аргументів для функції)

(length (dex:get ...))

Якщо ви не вимагаєте експлікації інакше, Common Lisp відкине всі повернені значення, окрім першого, тому функція довжини бачить лише сам відповідь http і повертає довжину цієї рядки.

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

Це обчислює довжину відповіді n разів і додає їх.

(/ (loop ...) n)

Це ділить підсумовані довжини на n для обчислення середнього.

(lambda (n) ...)

Це перетворює тіло коду в анонімну функцію, яка приймає n як аргумент і повертає середню довжину відповіді для n веб-запитів на http://google.com .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.