Verifique se o computador está conectado à Internet

49

Escreva um programa que, conforme o script tenha acesso à Internet, produza uma saída que seja "Truthy / Falsey" . Você pode tentar se conectar a qualquer site existente, a seu critério (não use um site obscuro que tenha apenas 10% de tempo de atividade - tente manter acima de 80% de tempo de atividade anual). Se o site estiver inativo, seu programa não precisa funcionar.

Deve ser um programa independente ou uma função . Você pode usar bibliotecas fora da biblioteca padrão para conseguir isso. As brechas padrão são proibidas. Esse é o código golf, portanto o código com a menor contagem de bytes vence.

Exemplo de pseudocódigo:

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

Este é o meu primeiro post sobre código de golfe, por isso, se isso violar alguma regra ou for um tolo, por favor me avise.

EDIT: Devido a inúmeras sugestões, removi a restrição de contagem de bytes UTF-8

Restioson
fonte
4
Em vez de truee false, recomendo permitir que qualquer um de nossos padrões seja verdade e falsidade . Além disso, por internet, você quer dizer a rede fora da sua rede local? Os programas ainda precisam funcionar se o Google estiver inativo ou em outro site grande?
Azul
3
A contagem de bytes geralmente é feita na codificação nativa ou mais conveniente do idioma, que nem sempre é UTF-8. A menos que você a ter uma boa razão para impor UTF-8, eu acho que a codificação deve ser deixada à escolha do programador
Luis Mendo
4
Vejo que quase todo mundo está usando g.gl/http://g.gl/ , mas to./http://to./ parece ser um byte mais curto (nem todos os idiomas o veem como um URL válido).
Kevin Cruijssen 13/01
9
Commodore básica:PRINT "0"
Mark
3
A própria máquina em que estou digitando isso é tecnicamente parte da "Internet", pois pode ser acessada de fora (via NAT e encaminhamento de porta). Então, se você pensar sobre isso, o script "internet detecção" provavelmente pode ser reduzido a "verdadeira" :)
zeppelin

Respostas:

29

Bash (com dnsutils ), 3 bytes

Envia uma solicitação de DNS para "." (Raiz do DNS), o código de saída é 0 para obter sucesso e> 0 em caso contrário.

Golfe

dig

Teste

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

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

aviso Legal

Obviamente, isso só funcionará se o servidor DNS estiver na rede do provedor, ou seja, na "Internet" (como a rede do provedor normalmente faz parte dela) ou se o sistema estiver usando um servidor DNS público (como 8.8.8.8 do Google, que os sistemas baseados no Android usam), caso contrário, você pode obter uma cópia em cache de um servidor LAN local (ou host local).

Mas suponho que isso não seja contrário às regras do , pois obviamente há mais de um sistema em que isso funciona como pretendido.

Os métodos de HTTP puro também podem fornecer falsos positivos, devido a um proxy de armazenamento em cache intermediário, e não é garantido que funcionem em todos os lugares, portanto, isso não é algo exclusivo desse método.

Uma versão um pouco mais confiável, 8 bytes

dig +tra

(uma pequena homenagem a @ Dig ital Tra uma!)

Ativa o "modo de rastreamento", que forçará a escavação a fazer a pesquisa recursiva por si só (consulte https://serverfault.com/a/778830 ), evitando problemas de cache.

zepelim
fonte
Citação de man dig: A menos que seja solicitado a consultar um servidor de nomes específico, o dig tentará cada um dos servidores listados em /etc/resolv.conf . Se nenhum endereço de servidor utilizável for encontrado, o dig enviará a consulta ao host local .
Titus
@ Titus, sim, isso está correto, veja "isenção de responsabilidade" como parte da minha resposta, mas enquanto o servidor DNS (conforme especificado no seu resolv.conf) estiver do lado do seu provedor, ele funcionará perfeitamente.
Zeppelin
Sua solução depende de uma instalação não padrão; Eu consideraria isso explorar uma brecha. Você ainda pode ganhar com os dois bytes adicionais.
Titus
11
> Sua solução depende de uma instalação não padrão. Não, é exatamente como funciona na minha máquina (e isso já é suficiente, de acordo com o Meta). Além disso, o uso do servidor DNS do seu provedor é uma configuração bastante comum (e normalmente estará no seu resolv.conf também).
Zeppelin
2
a configuração padrão depende de quais configurações você usou no momento da instalação, se você configurou a rede usando DHCP e o resolv.conf provavelmente aponta para o seu roteador. se você configurou a rede manualmente, ele terá o servidor DNS que você indicou.
Jasen 14/01
19

Utilitários Bash + GNU, 8

  • 5 bytes salvos graças ao @Muzer.
wget to.

As outras respostas do shell verificam o código de retorno e ecoam alguma saída de status de acordo. Isso é desnecessário. O código de retorno do shell já é um código Truthy / Falsey utilizável e acessível no $?parâmetro que é idiomático para o bash. O código de retorno 0 significa True. Código de retorno> 0 significa Falso.

Em uso:

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:~$ 
Trauma Digital
fonte
2
Use um domínio como, em to.vez de 8.8.8.8, para economizar bastante.
Muzer
@Muzer yes - thanks
Digital Trauma
2
@Muzer menos que haja um local de toque o resolvedor está configurado para encontrar, ainda vai para o caminho certo (e talvez ser capaz de ping em um local, toé o suficiente de estar conectado à internet )
Christian Sievers
2
@ MUUER OK, toàs vezes funciona e às vezes não. Eu acho que algum cache está acontecendo. Vou usar to.apenas por segurança.
Digital Trauma
4
Por que esse domínio é válido?
Kos
9

Lote, 8 bytes

ping to.

pingserá definido ERRORLEVELcomo 1se o endereço não puder ser resolvido ou alcançado.

Neil
fonte
7

05AB1E , 11 9 bytes

2 bytes salvos em "para". cortesia de ev3commander

…to..wgX›

Verifica se o tamanho do conteúdo em http: // to . é maior que 1.
.wretorna 0 em erro.

Emigna
fonte
11
Sempre um +1 para respostas
05AB1E
@WorseDoughnut E por que isso?
mbomb007
3
@ mbomb007 Acabo de ser um grande fã do idioma desde que Adnan começou a trabalhar nele e publicá-lo aqui; é definitivamente uma linguagem fascinante para se aprofundar.
WorseDoughnut
11
@WorseDoughnut Já existe um hiperlink na resposta.
mbomb007
Você não pode se conectar a. salvar um byte?
precisa saber é o seguinte
5

MATL , 15 14 bytes

Um byte salvo graças a Kevin Cruijssen sugestão de

'http://to.'Xi

A saída é feita por STDOUT. Isso exibe uma seqüência de caracteres não vazia contendo caracteres diferentes de zero (que é verdade) se houver uma conexão com a Internet; e não exibe nada (o que é falso) se não houver conexão.

Isso não pode ser testado on-line porque Xinão é permitido nos intérpretes on-line.

Explicação

'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
Luis Mendo
fonte
Você consideraria urlread('http://g.gl')uma resposta correta por si só? Irá um erro e deixará a área de trabalho vazia se a conexão estiver inoperante. Ele exibirá uma mensagem de erro, mas tecnicamente isso é para STDERR ...? Eu pensei que era um pouco exagerado, então eu fiz dessa maneira . Mas pular tryparece dar o mesmo resultado que o seu código, ou? Você deixa a pilha vazia também, não é? Resposta agradável pelo caminho ... :)
Stewie Griffin
@StewieGriffin Thanks! Sim, acho que urlread('http://g.gl')é válido (e é o mesmo que o meu código faz), como STDERR é ignorado por padrão, e um STDOUT vazio é Falsas no MATLAB
Luis Mendo
11
isso funcionaria em ftpvez de http- salvar outro byte?
Floris
11
@Floris Bom ver você também aqui! Infelizmente ftpdo doesn parecem trabalhar para que o site
Luis Mendo
11
Olá @LuisMendo sim, às vezes eu perambulo por outros sites ... que pena que o ftp não funciona!
Floris 14/01
5

Bash 66 62 21 bytes

ping -c1 g.gl echo $?

Obrigado @Alex L. pela dica de redução de URL.

Versão não destruída:

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

Esta é a minha primeira resposta no Bash, não tenho certeza se reduzi o script o suficiente.

Abel Tom
fonte
Acho que você pode usar um URL mais curto que o google.com, o que permitiria diminuir o código. Algo como g.gl.
precisa saber é o seguinte
3
Você também deve ser capaz de apenas ao echo $?invés dessa declaração if inteira.
SomethingDark
4
você perdeu "alguns" ;na linha do golfe.
Ipor Sircer
@IporSircer Thanks. :) @SomethingDark Olá, echo $? imprime um 0if success, ou então retorna a 2nesse caso. Eu não olhei para o código-fonte da implementação de, pingmas estou assumindo, existem diferentes códigos de retorno, dependendo do status. Por isso, usei if elseestratégia.
Abel Tom
@AbelTom - pode-se argumentar que 0 é verdade e não-0 é falsey.
SomethingDark
5

R, 20 bytes

curl::has_internet()

Há uma função para exatamente essa tarefa no curlpacote.

Billywob
fonte
11
+1 boa descoberta. Para os curiosos como eu, esta função é implementada como:function() !is.null(nslookup("r-project.org", error = FALSE))
plannapus
Contagem equivalente: httr::url_ok('g.gl')(embora obsoleta).
Jonathan Carroll
5

Java, 72 bytes

a->new java.net.InetSocketAddress("to.",80).getAddress().isReachable(9);
Huntro
fonte
3
Você precisa especificar o nome java.net.InetSocketAddress
4

Perl, 15 bytes

print`curl to.`

Correr com:

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

curlproduz coisas STDERR, não se importe com elas. Se o computador tiver acesso à Internet, ele imprimirá algumas linhas de html (verdade), caso contrário, ele não imprimirá nada (falso).

Salvei 1 bytes usando to.(em vez do meu anterior b.io) graças a @Kevin Cruijssen.

dada
fonte
Não foi possível alternar para o bash e remover o print?
precisa saber é o seguinte
11
@ BlueRaja-DannyPflughoeft Sim, isso funcionaria (já existe uma resposta no bash (eles usam em wgetvez de, curlmas é a mesma coisa)).
Dada
4

C #, 87 bytes

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

Se uma exceção é considerada falsey, o que eu não acho que seja, então são 65 bytes:

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

Também tentei usar o link, http://to.conforme indicado por @KevinCruijssen, mas ele não parecia funcionar.

TheLethalCoder
fonte
4

8 , 23 21 bytes

Dois bytes salvos graças à sugestão de Kevin Cruijssen e à minha descoberta:http: // parece funcionar tão bem quantohttp: // para . (salvando outro byte)

"http://to" net:get .

Se o site http: // to puder ser acessado, ele será impresso true. Caso contrário, ele imprime false. Ele deixa os dados recuperados na pilha.

Chaos Manor
fonte
11
TOS significa t op o f s aderência. Eu acho que você quer dizer que apenas deixa os dados na pilha.
Roman Gräf
Está certo. Eu melhorei minha explicação. Obrigado.
Chaos Manor
@ ev3commander Você já tentou com http: // to ? Funciona no meu caso (vejo uma página padrão do Apache2 Ubuntu). Parece que não há necessidade de acrescentar '.' ou '/'
Chaos Manor
3

MATLAB, 32 22 bytes

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

Explicação:

Se a conexão à Internet estiver ativa, isso resultará em ans(a variável padrão) uma string com todo o código html em texto sem formatação (o que é verdadeiro no MATLAB).

Se a conexão à Internet estiver inativa, isso gravará uma mensagem de erro no STDERR e deixará a área de trabalho vazia (o que é falso no MATLAB).

Infelizmente, urlreadrequer um endereço de URL completo , portanto g.glnão é suficiente. 11 dos 22 bytes são, portanto, apenas o endereço da URL.


Abordagem alternativa:

Uma solução que captura o erro e deixa um 0 (também falso ) no espaço de trabalho se a conexão estiver inoperante:

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

0;inicializa a variável padrão anspara 0, que está falseem MATLAB. Então vamos tryler o URL. Isso causará um erro se a conexão à Internet estiver inativa ou uma matriz de caracteres, se não (que está trueno MATLAB).

Não precisamos pegar nada, então acabamos. Se a chamada urlread foi bem-sucedida, anshaverá uma longa sequência com o conteúdo do site, caso contrário ans=0.

Stewie Griffin
fonte
3

Bash, 39 bytes

exec 4<>/dev/tcp/to./80&&echo 1||echo 0
GB
fonte
11
! exec 4<>/dev/tcp/to./80;echo $?
Jasen
ou se você não precisar imprimir verdadeiro / falso, mas pode simplesmente devolvê-lo,exec 4<>/dev/tcp/to./80
Jasen
3

JavaScript ES6, 71 43 bytes

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

Alertas 1 se online, alerta uma string vazia se estiver offline. Agradeço a Patrick Roberts por me ajudar a eliminar alguns bytes

Versão antiga

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

Alertas [object Reponse]se online, alertas 0se offline

Removido o trecho de código, ele não funciona porque é carregado de um domínio diferente sem o CORS, mas funciona no console do navegador

Zanchi
fonte
Hmm. Isso imprime corretamente "true" quando estou conectado, mas não imprime nada se eu o desconectar e executar no navegador. Em qual navegador / SO você testou isso? Eu estou usando chrome-win7
DJMcMayhem
@DJMcMayhem Como está o seu cache?
Ismael Miguel
@DJMcMayhem Eu testei no Chrome, Win10. Cache de pessoas com deficiência a partir do separador de rede e verificadas offline para teste online / offline
Zanchi
Este pode ser um programa completo em 52 bytes:fetch('://to.').then(a=>alert(1)).catch(a=>alert(0))
Patrick Roberts
2

JavaScript ES6, 90 81 bytes

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

JavaScript ES6, 22 21 bytes (inválido)

Alguns navegadores não oferecem suporte total ou produzem o resultado esperado ao usar o navigator.onLine.

f=a=>navigator.onLine
Tom
fonte
2
Esta resposta implica que isso não vai sempre retornar falso quando não estiver conectado à internet
Azul
Você pode salvar um byte adicionando um parâmetro ao lambda, assim:f=a=>
XavCo7 13/01
11
Embora sua resposta ainda pareça inválida, você pode se livrar f=.
Mama Fun Roll
11
78 bytes: a=>{with(new Image()){src="//placehold.it/1x1";onload=b=>a(1);onerror=c=>a()}}´ (got rid of f = `e usado with(){})
Ismael Miguel
2

Scala, 54 bytes

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

Bem simples; executa um comando ping em http://ai./e retorna true se sair com 0 ou false caso contrário.

corvus_192
fonte
2

Brainfuck (não concorrente) 21 bytes

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

O Brainfuck não pode se conectar à Internet (pelo que sei); portanto, como o programa não consegue se conectar, a resposta é sempre 0

Não concorrente porque parece estar dentro da brecha padrão de saída codificada , mesmo que este programa tecnicamente esteja correto para o desafio.

Cody
fonte
O Brainfuck não pode se conectar, mas o computador em que estou executando isso ainda pode estar conectado à Internet (ou não). Uma solução adequada para o cérebro é um programa que sempre responde "não sei"
Kos
2
@Kos "Eu não sei" não é truthy / Falsey
Restioson
Não é "Eu não sei", é "Eu não posso, portanto, a resposta é não"
Cody
talvez apenas imprima o byte '\ 0', pois esse também é 0. você teria um código de apenas 1 byte
12431234123412341234123
2

Powershell, 64 26 23 bytes

Economizou 38 bytes, graças a Shawn Esterman

Economizou 3 bytes e script reparado, graças ao briantist

Test-Connection -q g.gl
Horváth Dávid
fonte
Conexão de teste - Silencioso para.
Shawn Esterman
O PowerShell não pode resolver to., você precisaria usar g.gl. Além disso, você pode reduzi-lo para Test-Connection -q g.gl.
Briantist
2

PHP, 23 PHP + Ondulação, 14

Usando o operador backtick do PHP:

<?=`curl to.`;

Resposta original:

Vou tentar começar:

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

Isso não produz nada se x.gl não puder ser alcançado e Arrayse for.

Outra versão em que não tenho certeza se eles se encaixam:

<?=getmxrr('x.gl',$a);  // 22 chars
Christoph
fonte
4
Re "é uma brecha", acho que o consenso normal é que conta como um dialeto de linguagem (então a resposta é PHP + Curl, 15 bytes ).
Uma matriz conta como verdade? Eu vou permitir que ele concorra de qualquer maneira, já que é minha pergunta. Apenas por interesse.
Restioson
O @Restioson php converte um array para a string "Array"quando você tenta imprimi-lo ( <?=) e o boolean false será convertido em "". Portanto, o valor de retorno real não é uma matriz, mas uma sequência não vazia ou uma sequência vazia.
Christoph
@Cristoph Eu não acho que as contagens "array" como truthy ou Falsey
Restioson
@Restioson É uma string que converte implicitamente em boolean true. Um ramo if ("Array") echo 'thruthy';seriam tomadas, portanto, é truthy . A cadeia vazia não pegaria o galho e, portanto, é falsa.
Christoph
2

Solicitações Python 3 +, 59 55 53 bytes

Tem que haver uma resposta de pedidos, certo?

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

O status de saída é 0 para internet, 1 para não internet. Exemplo:

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

Changelog:

  • -4 bytes (obrigado Mego)
matsjoyce
fonte
Você pode encurtar isso usando um protocolo diferente ( ftp, talvez) e fazendo except:0/0.
Mego
@Ego eu acho que os pedidos só faz http (s). Eu adicionei o 0/0.
precisa saber é o seguinte
1

Elixir, 33 bytes

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

0 se conectado, 1 caso contrário.

movsx
fonte
1

PowerShell , 12 bytes

!!(irm g.gl)
briantist
fonte
1

Mathematica 10 Bytes

Supondo que você tenha uma cópia válida do Mathematica e credenciais de login em user.wolfram.com

CloudPut@1

gravará o valor 1 na nuvem. Verdade: CloudObject [""] Falsey: $ Falha

CloudGet@%

Retornará o valor 1 que foi carregado na nuvem.

Kelly Lowder
fonte
11
Observe que, por padrão, os snippets REPL não são permitidos. Coloque &depois para transformá-lo em uma função sem nome.
LegionMammal978
Você pode me indicar um link?
Low
Consulte Padrão para o Código Golf: Programa, Função ou Snippet? .
precisa saber é o seguinte
11
Na minha opinião, esta é a melhor resposta aqui. Mas o objeto Cloud conta como verdade? Eu diria que o 1 na nuvem é verdade. Boa resposta!
Restioson
@ LegionMammal978, posso colocar o código, como está, em um arquivo de pacote .wl e executá-lo como um "programa", conforme permitido pela pergunta original. Normalmente, esse tipo de pergunta exige uma função com entradas; nenhuma entrada do usuário é necessária. Além disso, testar minha função truthy / false como funciona funciona tão bem com ou sem o &. No CloudPut@1&===$Failed& não faz absolutamente nenhuma diferença. Por fim, o programa retorna e imprime a saída, portanto, não é de fato um trecho REPL, como você sugere.
precisa
1

Python 2.7, 70 77 bytes

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

Usa 1 para verdade, 0 para falsidade. O a.uk redireciona para uma empresa de roupas para motocicletas. Economizou 3 bytes atribuindo a uma variável e imprimindo isso. E outro para o "to". truque (confirmado para trabalhar com urllib), dois para se livrar dos recuos traquinas.

Chris H
fonte
Eu acho que from urllib import*poderia salvar um char (e soltar, é l.claro).
Nick T
@NickT eu esqueci que você poderia largar o espaço entre importe *então eu acho que você está certo, mas eu estou no celular e eu vou corrigi-lo mais tarde
Chris H
1

Julia + Bash (com dnsutils), 10 bytes

run(`dig`)

`command`em julia cria um cmdobjeto que pode ser executado run.

Rɪᴋᴇʀ
fonte
0

Clojure, 49 bytes

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

Retorna 1se ele pode se conectar e, nilcaso contrário.

Apenas tentativas para slurpa página; lançando uma NoRouteToHostExceptionexceção em caso de falha, que é capturada.

Infelizmente, o protocolo e o ponto parecem ser obrigatórios.

Carcinigenicado
fonte
0

Javascript (Nashorn), 61 bytes

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

Baseado na resposta Java do Huntro.

SuperJedi224
fonte