Проверьте, подключен ли компьютер к Интернету


49

Напишите программу, которая в зависимости от того, имеет ли сценарий доступ к Интернету, выдает результат «Правда / Ложь» . Вы можете попытаться подключиться к любому существующему сайту по своему усмотрению (не используйте сомнительный сайт, у которого только 10% времени безотказной работы - старайтесь поддерживать более 80% годового времени безотказной работы). Если сайт не работает, ваша программа не не имеет к работе.

Это должна быть отдельная программа или функция . Вы можете использовать библиотеки за пределами стандартной библиотеки для достижения этой цели. Стандартные лазейки запрещены. Это код гольф, поэтому выигрывает код с самым коротким числом байтов.

Пример псевдокода:

function a:
    try:
        connect to internet 
        return 1
    catch error:
        return 0

Это мой первый пост о коде гольфа, поэтому, если он каким-либо образом нарушает какие-либо правила или является обманом, пожалуйста, предупредите меня.

РЕДАКТИРОВАТЬ: из-за многочисленных предложений, я снял ограничение на количество байтов UTF-8


4
Вместо trueи falseя рекомендую разрешить любые наши значения по умолчанию для правдивости и ложности . Кроме того, под интернетом вы подразумеваете сеть за пределами вашей локальной сети? Программы все еще должны работать, если, скажем, Google не работает или любой другой большой сайт?
Blue

3
Подсчет байтов обычно выполняется в родной или наиболее удобной кодировке языка, которая не всегда соответствует UTF-8. Если у вас нет веских оснований для применения UTF-8, я думаю, что кодировка должна быть оставлена ​​на
Луис Мендо

4
Я вижу, что почти все используют g.gl/http://g.gl/ , но to./http://to./ кажется на один байт короче (не все языки видят это как действительный URL-адрес).
Кевин Круйссен

9
Commodore Basic:PRINT "0"
Отметить

3
Сама машина, на которой я это печатаю, технически является частью «Интернета», так как к ней можно получить доступ извне (через NAT и переадресацию портов). Итак, если вы думаете об этом, «интернет обнаружения» сценарий , вероятно , может быть сведена к «истинному» :)
дирижабль

Ответы:


29

Баш (с днсутилс ), 3 байта

Отправляет DNS-запрос на "." (DNS root), код выхода равен 0 для успеха и> 0 в противном случае.

Golfed

dig

Контрольная работа

% dig >/dev/null; echo $?;        
0

% nmcli nm wifi off
% dig >/dev/null; echo $?;
9

отказ

Очевидно, это будет работать только в том случае, если ваш DNS- сервер находится в сети провайдера, то есть в «Интернете» (поскольку сеть вашего провайдера обычно является его частью), или если ваша система использует общедоступный DNS-сервер (например, 8.8.8.8). от Google, которую используют системы на базе Android), иначе вы можете получить кэшированную копию с сервера локальной сети (или локального хоста).

Но я предполагаю, что это не противоречит правилам , так как очевидно, что существует несколько систем, в которых это работает, как задумано.

Методы Pure-HTTP также могут давать ложные срабатывания из-за промежуточного прокси-сервера кэширования и не гарантируют, что они будут работать везде, так что это не является чем-то уникальным для этого метода.

Чуть более надежная версия, 8 байт

dig +tra

(Небольшая дань @ Dig ital Tra uma!)

Включает «режим трассировки», который заставляет dig самостоятельно выполнять рекурсивный поиск (см. Https://serverfault.com/a/778830 ), избегая проблем с кешем.


Цитата из man dig: Если не указано запрашивать конкретный сервер имен, dig попробует каждый из серверов, перечисленных в /etc/resolv.conf . Если не найдено доступных адресов серверов, dig отправит запрос на локальный хост .
Тит

@ Titus, да, это правильно, смотрите часть моего ответа на "отказ от ответственности", но пока ваш DNS-сервер (как указано в вашем resolv.conf) находится на стороне вашего провайдера, он работает просто замечательно.
Цеппелин

Ваше решение зависит от установки не по умолчанию; Я считаю, что эксплуатировать лазейку. Вы все еще можете выиграть с двумя дополнительными байтами.
Тит

1
> Ваше решение зависит от не установленной по умолчанию установки Nope, это именно то, как она работает на моей машине (и этого уже достаточно согласно Meta). Более того, использование DNS-сервера вашего провайдера действительно довольно распространенная установка (и она обычно будет также в вашем resolv.conf).
Цеппелин

2
defualt settigns зависит от того, какие настройки вы использовали во время установки, если вы настроили сеть с использованием DHCP, а затем resolv.conf, вероятно, указывает на ваш маршрутизатор. если вы настроили сеть вручную, у нее будет назначенный вами DNS-сервер.
Ясен

19

Утилиты Bash + GNU, 8

  • 5 байтов сохранено благодаря @Muzer.
wget to.

Другие ответы оболочки проверяют код возврата и выводят соответствующий вывод состояния. Это не нужно. Код возврата оболочки уже является пригодным для использования кодом Truthy / Falsey и доступен в $?параметре, который идиоматичен для bash. Код возврата 0 означает True. Код возврата> 0 означает Ложь.

В использовании:

ubuntu@ubuntu:~$ wget to.
--2017-01-13 09:10:51--  http://to./
Resolving to. (to.)... 216.74.32.107, 216.74.32.107
Connecting to to. (to.)|216.74.32.107|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11510 (11K) [text/html]
Saving to: index.html.6

index.html.6        100%[===================>]  11.24K  --.-KB/s    in 0.04s   

2017-01-13 09:10:51 (285 KB/s) - index.html.6 saved [11510/11510]

ubuntu@ubuntu:~$ echo $?
0
ubuntu@ubuntu:~$ sudo ifconfig ens33 down
ubuntu@ubuntu:~$ wget to.
--2017-01-13 09:11:00--  http://to./
Resolving to. (to.)... failed: Temporary failure in name resolution.
wget: unable to resolve host address to.’
ubuntu@ubuntu:~$ echo $?
4
ubuntu@ubuntu:~$ sudo ifconfig ens33 up
ubuntu@ubuntu:~$ # Local network up, upstream link down
ubuntu@ubuntu:~$ wget to.
--2017-01-13 09:11:34--  http://to./
Resolving to. (to.)... failed: Name or service not known.
wget: unable to resolve host address to.’
ubuntu@ubuntu:~$ echo $?
4
ubuntu@ubuntu:~$ 

2
Используйте домен, как, to.а не 8.8.8.8, чтобы сэкономить довольно много.
Музер

@Muzer да - спасибо
Digital Trauma

2
@Muzer, если нет локального источника, toкоторый распознаватель сконфигурирован для поиска, он все равно перейдет на правильный (и, возможно, toдостаточно
Christian Sievers

2
@Muzer Хорошо, toиногда работает, а иногда нет. Я предполагаю, что происходит некоторое кеширование. Я буду использовать to.только для безопасности.
Цифровая травма

4
Почему это действительный домен?
Кос

9

Пакетный, 8 байт

ping to.

pingбудет установлен ERRORLEVELв 1случае , если адрес не может быть разрешен или достигнут.


7

05AB1E , 11 9 байтов

Сохранено 2 байта на «к». предоставлено ev3commander

…to..wgX›

Проверяет, если длина содержимого в http: // to . больше 1.
.wвозвращает 0 при ошибке.


1
Всегда +1 для ответов
05AB1E

@WorseDoughnut А почему это?
mbomb007

3
@ mbomb007 Просто был большим поклонником языка с тех пор, как Аднан начал работать над ним и публиковать здесь; это определенно захватывающий язык, чтобы вникать.
WorseDoughnut

1
@WorseDoughnut Там уже гиперссылка в ответе.
mbomb007

Вы не можете подключиться к. сохранить байт?
ev3commander

5

MATL , 15 14 байтов

Один байт сохранен благодаря Kevin Cruijssen внушения «s

'http://to.'Xi

Выход через STDOUT. Это отображает непустую строку, содержащую ненулевые символы (что правда), если есть подключение к Интернету; и ничего не отображает (что ложно), если нет соединения.

Это не может быть проверено онлайн, потому что Xiв онлайн-переводчиках это запрещено.

объяснение

'http://to.'  % Push this string
Xi            % Return contents of that URL as a string. If there is no Internet
              % connection this gives an error, with no output on STDOUT

Считаете ли вы urlread('http://g.gl')хорошим ответом сам по себе? Это приведет к ошибке и оставит рабочее пространство пустым, если соединение не работает. Он будет отображать сообщение об ошибке, но технически это STDERR ...? Я думал, что это немного растянуто, поэтому я сделал это таким образом . Но пропуск, tryкажется, дает тот же результат, что и ваш код, или? Ты тоже оставляешь стек пустым? Хороший ответ, кстати ... :)
Стьюи Гриффин

@ StewieGriffin Спасибо! Да, я думаю, что urlread('http://g.gl')это допустимо (и то же самое, что и мой код), так как STDERR по умолчанию игнорируется, а пустой STDOUT является ложным в MATLAB
Луис Мендо

1
это будет работать ftpвместо http- сохранить еще один байт?
Флорис

1
@Floris Приятно видеть тебя здесь! К сожалению ftp, похоже, что это не работает для этого сайта
Луис Мендо

1
Здравствуйте @LuisMendo да я иногда крадусь по другим сайтам ... Жаль, что FTP не работает!
Флорис

5

Баш 66 62 21 байт

ping -c1 g.gl echo $?

Спасибо @Alex L. за совет по сокращению URL.

Безголовая версия:

r=$(ping -c1 g.gl)
if [ $? -ne 0 ];
 then echo "0"
else echo "1"
fi

Это мой первый ответ на Bash, я не уверен, что достаточно сократил сценарий.


Я думаю, что вы можете использовать более короткий URL, чем google.com, что позволило бы сократить код. Что-то вроде g.gl.
HyperNeutrino

3
Вы также должны иметь возможность просто echo $?вместо этого целого заявления if.
SomethingDark

4
Вы пропустили "некоторые" ;в линии гольфа.
Ипор Сирсер

@IporSircer Спасибо. :) @SomethingDark Здравствуйте, echo $? печатает, 0если успешно, иначе он возвращает 2в этом случае. Я не смотрел в исходный код реализации, pingно я предполагаю, что есть разные коды возврата в зависимости от стуации. Следовательно, я использовал if elseстратегию.
Авель Том

@AbelTom - можно утверждать, что 0 является правдой, а не 0 - ложью.
SomethingDark

5

R, 20 байтов

curl::has_internet()

В curlпакете есть функция именно для этой задачи .


1
+1 хорошая находка. Для таких любопытных, как я, эта функция реализована так:function() !is.null(nslookup("r-project.org", error = FALSE))
plannapus

Эквивалентный счет: httr::url_ok('g.gl')(хотя и не рекомендуется).
Джонатан Кэрролл

5

Java, 72 байта

a->new java.net.InetSocketAddress("to.",80).getAddress().isReachable(9);

3
Вам необходимо указать полностью определенное имяjava.net.InetSocketAddress

4

Perl, 15 байт

print`curl to.`

Бежать с:

perl -e 'print`curl to.`' 2> /dev/null

curlвыводит вещи на себя STDERR, не обращайте на них внимания. Если компьютер имеет доступ к Интернету, он напечатает несколько строк html (правда), в противном случае он ничего не напечатает (ложь).

Сохранено 1 байт с помощью to.(вместо моего предыдущего b.io) благодаря @Kevin Cruijssen.


Не могли бы вы переключиться на Bash и удалить print?
BlueRaja - Дэнни Пфлюгофт

1
@ BlueRaja-DannyPflughoeft Да, это сработало бы (хотя в bash уже есть ответ (они используют wgetвместо, curlно это одно и то же)).
Дада

4

C #, 87 байт

_=>{try{new System.Net.WebClient().OpenRead("http://g.gl");return 1;}catch{return 0;}};

Если исключение считается ложным, чего я не считаю, то это 65 байт:

_=>new System.Net.WebClient().OpenRead("http://g.gl").ReadByte();

Я также попытался использовать ссылку, http://to.как заявлено @KevinCruijssen, но, похоже, она не работает.


4

8 , 23 21 байт

Два байта сохраняется благодаря Kevin Cruijssen по предложению и к моему открытию:http: // to, кажется, работает так же хорошо, какhttp: // to . (сохранение другого байта)

"http://to" net:get .

Если сайт http: // to может быть достигнут, он печатает true. В противном случае это печатает false. Он оставляет полученные данные в стеке.


1
ТОС означает , т ор о е с липкости. Я думаю, вы имеете в виду, что он просто оставляет данные в стеке.
Роман Греф

Верно. Я улучшил свое объяснение. Благодарю.
Усадьба Хаоса

@ ev3commander Вы пробовали с http: // to ? Это работает в моем случае (я вижу страницу Apache2 Ubuntu по умолчанию). Кажется, что нет необходимости добавлять '.' или '/'
Поместье Хаоса

3

MATLAB, 32 22 байта

urlread('http://g.gl')

Объяснение:

Если подключение к Интернету установлено, это приведет к тому, что ans(переменная по умолчанию) будет строкой со всем html-кодом в виде простого текста (что верно в MATLAB).

Если подключение к Интернету не работает, это выведет сообщение об ошибке в STDERR и оставит рабочее пространство пустым (что неверно в MATLAB).

К сожалению, urlreadтребуется полный URL-адрес , поэтому g.glне достаточно. Таким образом, 11 из 22 байтов являются просто URL-адресом.


Альтернативный подход:

Решение, которое улавливает ошибку и оставляет 0 (также false ) в рабочей области, если соединение не работает:

0;try urlread('http://g.gl'),end

0;инициализирует переменную ansпо умолчанию 0, которая находится falseв MATLAB. Тогда мы будем tryчитать URL. Это выдаст ошибку, если интернет-соединение не работает, или символьный массив, если нет (который находится trueв MATLAB).

Нам не нужно ничего ловить, поэтому мы просто заканчиваем. Если вызов urlread прошел успешно, ansв противном случае будет длинная строка с содержимым сайта ans=0.


3

Баш, 39 байт

exec 4<>/dev/tcp/to./80&&echo 1||echo 0

1
! exec 4<>/dev/tcp/to./80;echo $?
Ясен

или если вам не нужно печатать true / false, а просто вернуть его,exec 4<>/dev/tcp/to./80
Jasen

3

JavaScript ES6, 71 43 байта

fetch``.then(a=>alert(1)).catch(a=>alert``)

Оповещения 1, если онлайн, оповещения о пустой строке, если офлайн. Спасибо Патрику Робертсу за помощь в сборе некоторых байтов

Старая версия

_=>fetch('http://enable-cors.org').then(a=>alert(a)).catch(a=>alert(0))

Оповещения, [object Reponse]если онлайн, оповещения, 0если офлайн

Удален фрагмент кода, он не работает, потому что загружается из другого домена без CORS, но работает в консоли браузера


Хм. Это правильно печатает «true», когда я подключен, но ничего не печатает, если я отключаюсь и запускаю его в своем браузере. В каком браузере / ОС вы это тестировали? Я использую chrome-win7
DJMcMayhem

@DJMcMayhem Как твой кеш?
Исмаэль Мигель

@DJMcMayhem Я тестировал в Chrome, Win10. Отключил кеш на вкладке сети и проверил в автономном режиме для тестирования в автономном режиме / онлайн
Zanchi

Это может быть полная программа в 52 байта:fetch('://to.').then(a=>alert(1)).catch(a=>alert(0))
Патрик Робертс

2

JavaScript ES6, 90 81 байт

f=a=>{i=new Image();i.src="//placehold.it/1x1";i.onload=b=>a(1);i.onerror=c=>a()}

JavaScript ES6, 22 21 байт ( неверно )

Некоторые браузеры не полностью поддерживают или дают ожидаемый результат при использовании navigator.onLine.

f=a=>navigator.onLine

2
Этот ответ подразумевает, что это не всегда возвращает false, когда не подключен к Интернету
Blue

Вы можете сохранить байт, добавив параметр к f=a=>
лямбде

1
Хотя ваш ответ все еще кажется неверным, от него можно избавиться f=.
Mama Fun Roll

1
78 байт: a=>{with(new Image()){src="//placehold.it/1x1";onload=b=>a(1);onerror=c=>a()}}´ (got rid of f = `и используется with(){})
Исмаэль Мигель

2

Scala, 54 байта

x=>(Runtime.getRuntime exec "ping -c 1 ai."waitFor)<1

Довольно просто; выполняет команду ping http://ai./и возвращает true, если она завершается с 0, или false в противном случае.


2

Brainfuck (неконкурентный) 21 байт

++++++[>++++++++<-]>.

Brainfuck не может подключиться к Интернету (насколько я знаю), поэтому, поскольку программа не может подключиться, ответ всегда 0

Не конкурирует, потому что кажется, что попадает под жестко закодированную стандартную лазейку вывода , даже если эта программа технически подходит для этой задачи.


Brainfuck не может подключиться, но компьютер, на котором я работаю, все еще может быть подключен к Интернету (или нет). Правильное решение для ума - это программа, которая всегда отвечает «я не знаю»
Кос

2
@ Kos "Я не знаю" не правда / фальси
Restioson

Это не «я не знаю», это «я не могу, поэтому ответ - нет»
Коди

возможно, просто напечатайте байт '\ 0', так как это также 0. У вас будет код только 1 байт
12431234123412341234123

2

Powershell, 64 26 23 байта

Сохранено 38 байтов, благодаря Шону Эстерману

Сохранено 3 байта и исправлен скрипт, спасибо briantist

Test-Connection -q g.gl

Test-Connection -Quiet to.
Шон Эстерман

PowerShell не может разрешить to., вам придется использовать g.glвместо этого. Кроме того, вы можете сократить его до Test-Connection -q g.gl.
бриантист

2

PHP, 23 PHP + Curl, 14

Использование оператора обратного вызова PHP:

<?=`curl to.`;

Оригинальный ответ:

Я постараюсь начать:

<?=file('http://x.gl');

Это ничего не выдает, если x.gl не может быть достигнуто и Arrayесли это так.

Другая версия, где я не совсем уверен, подходят ли они:

<?=getmxrr('x.gl',$a);  // 22 chars

4
Что касается «лазейки», то я думаю, что нормальный консенсус заключается в том, что он считается языковым диалектом (поэтому ответ PHP + Curl, 15 байтов ).

Массив считается правдивым? Я все же позволю ему конкурировать, так как это мой вопрос. Просто из интереса.
Restioson

@Restioson php преобразует массив в строку, "Array"когда вы пытаетесь распечатать его ( <?=) и логическое значение false будет преобразовано в "". Таким образом, фактическим возвращаемым значением является не массив, а непустая строка или пустая строка.
Кристоф

@ Кристоф Я не думаю, что «Массив» считается истинным или ложным
Restioson

@Restioson Это строка, которая неявно преобразуется в логическое значение true. Ветка if ("Array") echo 'thruthy';будет взята, поэтому это правда . Пустая строка не займет ветку и, следовательно, будет ложной.
Кристоф

2

Python 3 + запросы, 59 55 53 байта

Должен быть ответ на запросы, верно?

from requests import*
try:get("http://to.")
except:Z

Состояние выхода 0 для интернета, 1 для интернета нет. Пример:

$ python inet.py 
$ echo $?
0
$ # Remove ethernet cable
$ python inet.py 
$ echo $?
1

Changelog:

  • -4 байта (спасибо Мего)

Вы можете сократить это, используя другой протокол ( ftpвозможно) и выполнив except:0/0.
Mego

@Mego Я думаю, что запросы только делает http (s). Я добавил 0/0.
matsjoyce

1

Эликсир, 33 байта

{:ok,_}=:inet.getaddr('to',:inet)

0, если подключен, 1 в противном случае.



1

Mathematica 10 байт

Предполагая, что у вас есть действительная копия Mathematica и учетные данные для входа на user.wolfram.com

CloudPut@1

запишет значение 1 в облако. Правда: CloudObject [""] Falsey: $ Failed

CloudGet@%

Вернет значение 1, которое было загружено в облако.


1
Обратите внимание, что по умолчанию фрагменты REPL не допускаются. Поместите &потом, чтобы превратить его в неназванную функцию.
LegionMammal978

Можете ли вы указать мне ссылку?
Келли Лоудер


1
На мой взгляд, это лучший ответ здесь. Но считается ли объект Облака правдивым? Я бы сказал, что 1 в облаке - это правда. Хороший ответ!
Restioson

@ LegionMammal978, я могу поместить код, как есть, в файл пакета .wl и запустить его как «программу», насколько это допустимо для исходного вопроса. Обычно такого рода вопросы требуют функции с входными данными; ввод пользователя не требуется. Кроме того, тестирование моей функции «истина / ложь» работает так же хорошо с или без &. В CloudPut@1&===$Failed& нет абсолютно никакой разницы. Наконец, программа возвращает и печатает выходные данные, так что на самом деле это не фрагмент REPL, как вы предлагаете.
Келли Лоудер

1

Python 2.7, 70 77 байт

from urllib import*
a=1
try:urlopen('http://to.')
except:a=0
print a

import urllib as l
try: 
 l.urlopen('http://a.uk')
 print 1
except:
 print 0

Использует 1 для правдивых, 0 для ложных. a.uk перенаправляет в компанию по производству мотоциклетной одежды. Сохранено 3 байта путем присвоения переменной и ее печати. И еще один для "до". трюк (подтвержденный для работы с urllib), два для избавления от надоедливых отступов.


Я думаю, что from urllib import*может сохранить символ (и, l.конечно, падение ).
Ник Т

@NickT Я забыл, что вы могли бы сократить расстояние между ними, importи *поэтому я думаю, что вы правы, но я нахожусь на мобильном телефоне, и я исправлю это позже
Крис Х

1

Юлия + Баш (с днсутилсом), 10 байт

run(`dig`)

`command`В Джулии создает cmdобъект, который может быть запущен с run.


0

Clojure, 49 байтов

#(try(slurp"http://to.")1(catch Exception _ nil))

Возвращает, 1если он может подключиться, и в nilпротивном случае.

Просто попытки slurpна страницу; выбрасывать NoRouteToHostExceptionисключение при неудаче, которая ловится.

К сожалению, протокол и точка кажутся обязательными.


0

Javascript (Нашорн), 61 байт

print(new java.net.InetSocketAddress("to.",80).getAddress())

Основано на ответе Хантро на Java.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.