Перевірте, чи комп'ютер підключений до Інтернету


49

Напишіть програму, яка відповідно до того, чи має сценарій доступ до Інтернету, дає вихід, який є "Truthy / Falsey" . Ви можете спробувати підключитися до будь-якого існуючого веб-сайту на власний розсуд (не використовуйте тінистий сайт, який має лише 10% часу роботи - намагайтеся не перевищувати 80% річного часу роботи). Якщо сайт не працює, програма не повинна працювати.

Це повинна бути окрема програма або функція . Для цього ви можете використовувати бібліотеки поза стандартною бібліотекою. Стандартні лазівки заборонені. Це кодовий гольф, тому виграє код з найкоротшим числом байтів.

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

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

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

EDIT: Через численні пропозиції я зняв обмеження кількості байтів UTF-8


4
Замість того , trueі falseя рекомендую дозволяє будь-якому з наших по замовчуванням для truthy і falsiness . Також під інтернетом ви маєте на увазі мережу поза локальною мережею? Чи повинні програми ще працювати, якщо скажімо, що Google не працює або будь-який інший великий сайт?
Синій

3
Підрахунок байтів зазвичай робиться в рідній мові або найзручнішому кодуванні, яке не завжди є UTF-8. Якщо у вас немає вагомих причин застосувати UTF-8, я думаю, що кодування слід залишити на вибір програміста
Луїс Мендо

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

9
Commodore Basic:PRINT "0"
Марк

3
Сама машина, на якій я це набираю, технічно є частиною "Інтернету", оскільки це можна отримати ззовні (через NAT та переадресацію портів). Отже, якщо ви це подумаєте, сценарій "виявлення Інтернету", ймовірно, може бути зведений до "справжнього" :)
zeppelin

Відповіді:


29

Bash (з dnsutils ), 3 байти

Надсилає запит DNS для "." (DNS-корінь), вихідний код 0 для успіху та> 0 в іншому випадку.

Гольф

dig

Тест

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

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

Відмова від відповідальності

Це, очевидно, працює лише в тому випадку, якщо ваш DNS- сервер сидить у мережі провайдера, тобто в "Інтернеті" (оскільки мережа вашого постачальника зазвичай є його частиною) або якщо ваша система використовує загальнодоступний сервер DNS (наприклад, 8.8.8.8 від Google, яку використовують системи на базі Android), інакше ви можете отримати кешовану копію з локального локального сервера (або localhost).

Але я припускаю, що це не суперечить правилам , оскільки, очевидно, існує більше однієї системи, де це працює за призначенням.

Методи Pure-HTTP також можуть давати помилкові позитиви, завдяки проміжному проксі-кешуванню, і не гарантовано, що вони працюють всюди, тому це не є унікальним для цього методу.

Трохи надійніша версія, 8 байт

dig +tra

(невелика данина @ Dig ital Tra uma!)

Вмикає "режим слідування", який змусить копати сам робити рекурсивний пошук (див. Https://serverfault.com/a/778830 ), уникаючи будь-яких проблем із кешем.


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

@Titus, так, це правильно, дивіться частину моєї відповіді "відмова від відповідальності", але поки ваш DNS-сервер (як зазначено у резолюції.conf) на стороні вашого провайдера, це працює добре.
зеппелін

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

1
> Ваше рішення залежить від установки, що не встановлюється за замовчуванням, саме так воно працює на моїй машині (і цього вже достатньо згідно Meta). Більше того, використання DNS-сервера вашого провайдера дійсно є досить поширеною настройкою (і зазвичай це також буде у вашому разрешенні.conf).
цепелін

2
defualt settigns залежить від того, які параметри ви використовували під час встановлення, якщо ви налаштували мережу за допомогою DHCP, тоді резолюція.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достатньо підключити до локального інтернету достатньо для підключення до Інтернету )
Крістіан Сіверс,

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

@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

Bash 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

Це моя перша відповідь на Баша, я не впевнений, що я досить скоротив сценарій.


Я думаю, ви можете скористатися коротшою URL-адресою, ніж google.com, що дозволить скоротити код. Щось на зразок gg.
HyperNeutrino

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

4
ви пропустили "дещо" ;на лінії гольфу.
Іпор Сірсер

@IporSircer Дякую :) @SomethingDark Привіт, echo $? друкує 0успіх if, інакше він повертає a 2в цьому випадку. Я не заглянув у вихідний код реалізації, pingале я припускаю, що існують різні коди повернення залежно від рівня навчання. Отже, я використовував if elseстратегію.
Авель Том

@AbelTom - можна стверджувати, що 0 - це правда, а не-0 - фальси.
ЩосьТарк

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 (truthy), інакше він не надрукує нічого (фальшивий).

Збережено 1 байт, використовуючи to.(замість попереднього b.io) завдяки @Kevin Cruijssen.


Не могли ви перейти на баш і видалити print?
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft Yup, це б спрацювало (хоч у башті вже є відповідь (вони використовуються 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 байт

Два байти збереглися завдяки пропозиції Кевіна Круїссена та моєму відкриттю:http: // to, здається, працює так само добреhttp: // to . (збереження іншого байта)

"http://to" net:get .

Якщо сайт http: // to можна отримати, він надрукує true. Інакше він друкує false. Він залишає отримані дані в стеку.


1
TOS означає t op o f s tack. я думаю, ти маєш на увазі, що це просто залишає дані в стеку.
Роман Ґраф

Це вірно. Я покращив своє пояснення. Дякую.
Садиба Хаос

@ 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 (також хибне ) в робочій області, якщо з'єднання відсутнє:

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 $?
Ясен

або якщо вам не потрібно надрукувати справжнє / неправдиве, але ви можете просто повернути його,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
Ця відповідь означає, що це не завжди повернеться помилковим, якщо не буде підключено до Інтернету
Синій

Можна зберегти байт, додавши параметр до лямбда, наприклад:f=a=>
XavCo7

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 "Я не знаю" - не truthy / falsey
Restioson

Це не "я не знаю", це "я не можу, тому відповідь ні"
Коді

можливо, просто надрукуйте байт '\ 0', оскільки це також 0. у вас був би код лише 1 байт
12431234123412341234123

2

Powershell, 64 26 23 байт

Збережено 38 байт, завдяки Шоуну Естерману

Збережено 3 байти та відремонтовано сценарій, завдяки брианісту

Test-Connection -q g.gl

Тест-підключення - тихо.
Шон Естерман

PowerShell не може вирішити to., вам доведеться використовувати g.glзамість цього. Додатково ви можете скоротити його Test-Connection -q g.gl.
британіст

2

PHP, 23 PHP + Curl, 14

Використання оператора backtick PHP:

<?=`curl to.`;

Оригінальна відповідь:

Я спробую почати:

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

Це не дає нічого, якщо не вдасться досягти x.gl і Arrayякщо він є.

Ще одна версія, де я не зовсім впевнений, чи підходять вони:

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

4
Re "це лазівка", я думаю, що нормальна консенсус полягає в тому, що вона вважається мовним діалектом (тому відповідь - PHP + Curl, 15 байт ).

Чи вважається масив правдоподібним? Я дозволяю йому все-таки змагатися, оскільки це моє питання. Просто з інтересу.
Рестіосон

@Restioson php перетворює масив у рядок, "Array"коли ви намагаєтеся надрукувати його ( <?=), і булева помилка буде перетворена в "". Отже, фактичне повернене значення - це не масив, а не порожній рядок або порожній рядок.
Крістоф

@ Крістоф, я не думаю, що "масив" вважається триутою чи фальсією
Restioson

@Restioson Це рядок, який неявно перетворюється на булеву істину. Взятимуть гілку 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

Журнал змін:

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

Ви можете скоротити це, використовуючи інший протокол ( ftpможливо) і виконайте це except:0/0.
Mego

@Mego Я думаю, що запити роблять лише http (и). Я додав 0/0.
matsjoyce

1

Еліксир, 33 байти

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

0, якщо підключено, 1 інакше.



1

Математика 10 байт

Припустимо, що у вас є дійсна копія Mathematica та облікові дані для входу на user.wolfram.com

CloudPut@1

запише значення хмари 1. Truthy: CloudObject [""] Falsey: $ Помилка

CloudGet@%

Поверне значення 1, яке було завантажено в хмару.


1
Зауважте, що за замовчуванням фрагменти REPL заборонені. Поставте &потім, щоб перетворити його в неназвану функцію.
LegionMammal978

Чи можете ви вказати на посилання?
Келлі Лоудер


1
На мою думку, це найкраща відповідь тут. Але чи вважає об’єкт Cloud хід справжнім? Я б сказав, що 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

Джулія + Баш (з dnsutils), 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 на Huntro.

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