Controlla se il computer è connesso a Internet


49

Scrivi un programma che, a seconda che lo script abbia accesso a Internet, produca un output che è "Truthy / Falsey" . Puoi provare a connetterti a qualsiasi sito esistente, a tua discrezione (non utilizzare un sito ombreggiato che ha solo il 10% di uptime - cerca di mantenere un uptime superiore all'80% annuale). Se il sito non è attivo , il programma non deve funzionare.

Deve essere un programma autonomo o una funzione . A tale scopo è possibile utilizzare librerie esterne alla libreria standard. Sono vietate le scappatoie standard . Questo è il golf del codice, quindi vince il codice con il numero di byte più breve.

Esempio di pseudocodice:

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

Questo è il mio primo post sul golf del codice, quindi se questo viola qualsiasi regola o è un imbroglione, per favore avvisami.

EDIT: a causa di numerosi suggerimenti, ho rimosso la restrizione del conteggio dei byte UTF-8


4
Invece di truee false, raccomando di consentire una qualsiasi delle nostre impostazioni predefinite per verità e falsità . Inoltre, per internet, intendi la rete esterna alla tua rete locale? I programmi devono ancora funzionare se si dice che Google non funziona o qualsiasi altro sito di grandi dimensioni?
Blue

3
Il conteggio dei byte viene solitamente eseguito nella codifica nativa o più comoda della lingua, che non è sempre UTF-8. A meno che tu non abbia una buona ragione per imporre UTF-8, penso che la codifica debba essere lasciata alla scelta del programmatore
Luis Mendo,

4
Vedo che quasi tutti usano g.gl/http://g.gl/ , ma to./http://to./ sembra essere più corto di un byte (non tutte le lingue lo vedono come un URL valido).
Kevin Cruijssen,

9
Commodore Basic:PRINT "0"
Mark

3
La stessa macchina su cui sto scrivendo, è tecnicamente una parte di "Internet", in quanto è possibile accedervi dall'esterno (tramite NAT e port forwarding). Quindi, se ci pensate, lo script "rilevamento internet" può probabilmente essere ridotto a "vero" :)
zeppelin

Risposte:


29

Bash (con dnsutils ), 3 byte

Invia una richiesta DNS per "." (DNS root), il codice di uscita è 0 per esito positivo e> 0 in caso contrario.

golfed

dig

Test

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

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

Clausola di esclusione della responsabilità

Questo ovviamente funzionerà solo se il tuo server DNS è nella rete del provider, cioè in "Internet" (poiché la rete del tuo provider ne fa normalmente parte), o se il tuo sistema utilizza un server DNS pubblico (come 8.8.8.8 da Google, che utilizzano i sistemi basati su Android), in caso contrario, è possibile ottenere una copia memorizzata nella cache da un server LAN locale (o localhost).

Ma suppongo che ciò non sia contrario alle regole del , dato che ci sono ovviamente più di un sistema in cui questo funziona come previsto.

I metodi Pure-HTTP possono anche dare falsi positivi, a causa di un proxy di memorizzazione nella cache intermedio, e non sono garantiti per funzionare ovunque, quindi non è qualcosa di unico in questo metodo.

Una versione leggermente più affidabile, 8 byte

dig +tra

(un piccolo omaggio a @ Dig ital Tra uma!)

Abilita la "modalità traccia", che costringerà lo scavo a fare la ricerca ricorsiva da solo (consultare https://serverfault.com/a/778830 ), evitando problemi di cache.


Citazione da man dig: a meno che non venga detto di interrogare un server dei nomi specifico, dig cercherà ciascuno dei server elencati in /etc/resolv.conf . Se non viene trovato alcun indirizzo server utilizzabile, dig invierà la query all'host locale .
Tito

@Titus, sì, è corretto, vedi parte "disclaimer" della mia risposta, ma fintanto che il tuo server DNS (come specificato nel tuo resolv.conf) è dalla parte del tuo provider, funziona semplicemente bene.
Zeppelin,

La tua soluzione dipende da un'installazione non predefinita; Considero che sfruttando una scappatoia. Puoi ancora vincere con i due byte aggiuntivi.
Tito

1
> La tua soluzione dipende da un'installazione non predefinita No, è esattamente come funziona sulla mia macchina (e questo è già abbastanza secondo Meta). Inoltre, usando il server DNS del tuo provider, è davvero una configurazione abbastanza comune (e normalmente si troverà anche nel tuo resolv.conf).
Zeppelin,

2
le impostazioni predefinite dipendono dalle impostazioni utilizzate al momento dell'installazione se è stata configurata la rete tramite DHCP, quindi resolv.conf probabilmente punta al router. se hai configurato la rete manualmente, avrà qualsiasi server DNS che hai nominato.
Jasen,

19

Utilità Bash + GNU, 8

  • 5 byte salvati grazie a @Muzer.
wget to.

Le altre risposte della shell controllano il codice di ritorno e rispecchiano di conseguenza un output dello stato. Questo non è necessario. Il codice di ritorno della shell è già un codice Truthy / Falsey utilizzabile e accessibile nel $?parametro che è idiomatico per bash. Il codice di ritorno 0 significa True. Codice di ritorno> 0 significa Falso.

In 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:~$ 

2
Usa un dominio come to.piuttosto che 8.8.8.8per risparmiare parecchio.
Muzer,

@Muzer si - grazie
Digital Trauma

2
@Muzer a meno che non ci sia un locale toche il risolutore è configurato per trovare, andrà comunque a quello giusto (e forse essere in grado di eseguire il ping di un locale toè abbastanza per essere connesso a Internet )
Christian Sievers

2
@Muzer OK, a tovolte funziona e talvolta no. Immagino che ci sia un po 'di cache in corso. Userò to.solo per sicurezza.
Trauma digitale

4
Perché è un dominio valido?
Kos,

9

Lotto, 8 byte

ping to.

pingverrà impostato ERRORLEVELsu 1se l'indirizzo non può essere risolto o raggiunto.


7

05AB1E , 11 9 byte

Salvato 2 byte su "a". per gentile concessione di ev3commander

…to..wgX›

Verifica se la lunghezza del contenuto in http: // a . è maggiore di 1.
.wrestituisce 0 in caso di errore.


1
Sempre un +1 per 05AB1E risponde
Peggio ancora, il

@WorseDoughnut E perché?
mbomb007,

3
@ mbomb007 Sono appena stato un grande fan della lingua da quando Adnan ha iniziato a lavorarci e pubblicandolo qui; è sicuramente un linguaggio affascinante da approfondire.
Peggio ancora,

1
@WorseDoughnut C'è già un collegamento ipertestuale nella risposta.
mbomb007,

Non riesci a connetterti a. salvare un byte?
ev3commander

5

MATL , 15 14 byte

Un byte salvato grazie al suggerimento di Kevin Cruijssen

'http://to.'Xi

L'uscita è tramite STDOUT. Questo mostra una stringa non vuota contenente caratteri diversi da zero (che è vero) se esiste una connessione a Internet; e non mostra nulla (il che è falso) se non c'è connessione.

Questo non può essere testato online perché Xinon è consentito negli interpreti online.

Spiegazione

'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

Considereresti urlread('http://g.gl')una risposta OK da sola? Si interromperà e lascerà lo spazio di lavoro vuoto se la connessione non è attiva. Verrà visualizzato un messaggio di errore, ma tecnicamente questo è STDERR ...? Ho pensato che fosse un po 'allungato, quindi l'ho fatto in questo modo . Ma saltare trysembra dare lo stesso risultato del tuo codice, o? Lasci la pila vuota anche tu? Bella risposta a proposito ... :)
Stewie Griffin

@StewieGriffin Grazie! Sì, penso che urlread('http://g.gl')sia valido (ed è lo stesso del mio codice), poiché STDERR è ignorato per impostazione predefinita e uno STDOUT vuoto è falso in MATLAB
Luis Mendo,

1
funzionerebbe con ftpinvece di http- salvare un altro byte?
Floris,

1
@Floris Piacere di vederti anche qui! Sfortunatamente ftpnon sembra funzionare per quel sito
Luis Mendo il

1
Ciao @LuisMendo sì a volte vado in cerca di altri siti ... peccato che l'ftp non funzioni!
Floris,

5

Bash 66 62 21 byte

ping -c1 g.gl echo $?

Grazie @Alex L. per il suggerimento sull'accorciamento dell'URL.

Versione non golfata:

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

Questa è la mia prima risposta in Bash, non sono sicuro di aver abbreviato abbastanza la sceneggiatura.


Penso che tu possa utilizzare un URL più breve di google.com, che ti permetterebbe di abbreviare il codice. Qualcosa come g.gl.
HyperNeutrino,

3
Dovresti anche essere in grado di fare semplicemente echo $?invece dell'intera istruzione if.
SomethingDark

4
ti sei perso "alcuni" ;nella linea del golf.
Ipor Sircer,

@IporSircer Grazie. :) @SomethingDark Ciao, echo $? stampa un 0if successo, altrimenti restituisce un 2in questo caso. Non ho esaminato il codice sorgente dell'implementazione di pingma sto assumendo, ci sono diversi codici di ritorno a seconda della valutazione. Quindi, ho usato la if elsestrategia.
Abel Tom

@AbelTom - si potrebbe affermare che 0 è vero e non 0 è falso.
SomethingDark

5

R, 20 byte

curl::has_internet()

C'è una funzione esattamente per questa attività nel curlpacchetto.


1
+1 bella scoperta. Per i curiosi come me, questa funzione è implementata come:function() !is.null(nslookup("r-project.org", error = FALSE))
plannapus

Conteggio equivalente: httr::url_ok('g.gl')(anche se deprecato).
Jonathan Carroll,

5

Java, 72 byte

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

3
Devi specificare il nome java.net.InetSocketAddress

4

Perl, 15 byte

print`curl to.`

Corri con:

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

curlproduce cose STDERR, non importa. Se il computer ha accesso a Internet, stamperà alcune righe di html (verità), altrimenti non stamperà nulla (falsa).

Salvato 1 byte usando to.(invece del mio precedente b.io) grazie a @Kevin Cruijssen.


Non potresti passare a bash e rimuovere il print?
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft Yup, avrebbe funzionato (c'è già una risposta in bash (usano wgetinvece invece curlma è la stessa cosa)).
Dada,

4

C #, 87 byte

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

Se un'eccezione è considerata falsa, cosa che non credo sia, allora si tratta di 65 byte:

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

Ho anche provato a utilizzare il link http://to.come indicato da @KevinCruijssen ma non sembra funzionare.


4

8 , 23 21 byte

Due byte salvati grazie al suggerimento di Kevin Cruijssen e alla mia scoperta:http: // sembra funzionare così comehttp: // a . (salvataggio di un altro byte)

"http://to" net:get .

Se il sito http: // to può essere raggiunto, viene stampato true. Altrimenti stampa false. Lascia i dati recuperati nello stack.


1
TOS significa t op o f s tack. penso che intendi che lascia i dati nello stack.
Roman Gräf,

Giusto. Ho migliorato la mia spiegazione. Grazie.
Chaos Manor,

@ ev3commander Hai provato con http: // a ? Funziona nel mio caso (vedo una pagina predefinita Ubuntu di Apache2). Sembra che non sia necessario aggiungere "." o '/'
Chaos Manor

3

MATLAB, 32 22 byte

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

Spiegazione:

Se la connessione Internet è ansattiva , ciò comporterà (la variabile predefinita) una stringa con l'intero codice html in testo normale (che è vero in MATLAB).

Se la connessione Internet non è attiva, questo scriverà un messaggio di errore su STDERR e lascerà lo spazio di lavoro vuoto (che è falso in MATLAB).

Sfortunatamente, urlreadrichiede un indirizzo URL completo , quindi g.glnon è sufficiente. 11 dei 22 byte sono quindi solo l'indirizzo url.


Approccio alternativo:

Una soluzione che rileva l'errore e lascia uno 0 (anche falso ) nell'area di lavoro se la connessione non è attiva:

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

0;inizializza la variabile predefinita anssu 0, che è falsein MATLAB. Quindi tryleggiamo l'URL. Questo darà un errore se la connessione a Internet è inattiva, o un array di caratteri in caso contrario (che è truein MATLAB).

Non abbiamo bisogno di catturare nulla, quindi finiamo. Se la chiamata urlread ha avuto esito positivo, in caso contrario anssarà una stringa lunga con il contenuto del sito Web ans=0.


3

Bash, 39 byte

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

1
! exec 4<>/dev/tcp/to./80;echo $?
Jasen,

o se non hai bisogno di stampare vero / falso ma puoi semplicemente restituirlo,exec 4<>/dev/tcp/to./80
Jasen

3

JavaScript ES6, 71 43 byte

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

Avvisi 1 se online, avvisa una stringa vuota se offline. Grazie a Patrick Roberts per avermi aiutato a radere qualche byte

Vecchia versione

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

Avvisi [object Reponse]se online, avvisi 0se offline

Rimosso lo snippet di codice, non funziona perché si carica da un dominio diverso senza CORS, ma funziona nella console del browser


Hmm. Questo stampa correttamente "vero" quando sono connesso, ma non stampa nulla se mi disconnetto ed eseguo nel mio browser. In quale browser / sistema operativo hai provato questo? Sto usando Chrome-
Win7

@DJMcMayhem Come va la tua cache?
Ismael Miguel,

@DJMcMayhem Ho provato in Chrome, Win10. Cache disabilitata dalla scheda di rete e selezionata Offline per testare offline / online
Zanchi

Questo può essere un programma completo in 52 byte:fetch('://to.').then(a=>alert(1)).catch(a=>alert(0))
Patrick Roberts,

2

JavaScript ES6, 90 81 byte

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

JavaScript ES6, 22 21 byte (non valido)

Alcuni browser non supportano completamente o non producono il risultato previsto quando si utilizza navigator.onLine.

f=a=>navigator.onLine

2
Questa risposta implica che questo non restituirà sempre falso quando non è connesso a Internet
Blue

È possibile salvare un byte aggiungendo un parametro al lambda, in questo modo:f=a=>
XavCo7

1
Anche se la tua risposta sembra ancora non valida, puoi sbarazzartene f=.
Mama Fun Roll

1
78 byte: a=>{with(new Image()){src="//placehold.it/1x1";onload=b=>a(1);onerror=c=>a()}}´ (got rid of f = `e usato with(){})
Ismael Miguel,

2

Scala, 54 byte

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

Abbastanza semplice; esegue un comando ping http://ai./e restituisce true se esce con 0 o false in caso contrario.


2

Brainfuck (non concorrenziale) 21 byte

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

Brainfuck non può connettersi a Internet (per quanto ne so), quindi poiché il programma non è in grado di connettersi, la risposta è sempre 0

Non competitiva perché sembra rientrare nella scappatoia standard di output hardcoded, anche se questo programma è tecnicamente corretto per la sfida.


Brainfuck non riesce a connettersi, ma il computer su cui sto eseguendo questo può comunque essere connesso a Internet (o meno). Una soluzione brainfuck adeguata è un programma che risponde sempre "Non lo so"
Kos

2
@Kos "Non lo so" non è verità / falsità
Restioson

Non è "Non lo so", è "Non posso quindi la risposta è no"
Cody

forse basta stampare il byte '\ 0' poiché anche questo è 0. avresti un codice di solo 1 byte
12431234123412341234123

2

Powershell, 64 26 23 byte

Risparmiato 38 byte, grazie a Shawn Esterman

Salvato 3 byte e script riparato, grazie a briantist

Test-Connection -q g.gl

Test-Connection -Quiet to.
Shawn Esterman,

PowerShell non può essere risolto to., dovresti g.glinvece usarlo . Inoltre puoi accorciarlo a Test-Connection -q g.gl.
Briantist

2

PHP, 23 PHP + Curl, 14

Utilizzando l'operatore backtick di PHP:

<?=`curl to.`;

Risposta originale:

Proverò a iniziare:

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

Questo non produce nulla se x.gl non può essere raggiunto e Arrayse lo è.

Un'altra versione in cui non sono abbastanza sicuro se si adattano:

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

4
Ri "è una scappatoia", penso che il normale consenso sia che conta come un dialetto linguistico (quindi la risposta è PHP + Curl, 15 byte ).

Un array conta come vero? Permetterò comunque di competere, poiché è la mia domanda. Solo per interesse.
Restioson,

@Restioson php converte un array nella stringa "Array"quando provi a stamparlo ( <?=) e falso booleano verrà convertito in "". Quindi il valore restituito effettivo non è un array ma una stringa non vuota o una stringa vuota.
Christoph,

@Cristoph Non credo che "Array" valga come verità o falsità
Restioson

@Restioson È una stringa che si converte implicitamente in vero booleano. Un ramo if ("Array") echo 'thruthy';sarebbe preso quindi è vero . La stringa vuota non prenderebbe il ramo ed è quindi falsa.
Christoph,

2

Richieste Python 3 +, 59 55 53 byte

Ci deve essere una risposta alle richieste, giusto?

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

Lo stato di uscita è 0 per Internet, 1 per nessuna Internet. Esempio:

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

changelog:

  • -4 byte (grazie Mego)

Potresti accorciarlo usando un protocollo diverso ( ftp, forse), e facendo except:0/0.
Mego

@Mego Penso che le richieste facciano solo http (s). Ho aggiunto lo 0/0.
matsjoyce,

1

Elisir, 33 byte

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

0 se collegato, 1 altrimenti.



1

Mathematica 10 byte

Supponendo di disporre di una copia valida di Mathematica e delle credenziali di accesso su user.wolfram.com

CloudPut@1

scriverà il valore 1 sul cloud. Truthy: CloudObject [""] Falsey: $ Failed

CloudGet@%

Restituirà il valore 1 che è stato caricato sul cloud.


1
Tieni presente che, per impostazione predefinita, i frammenti REPL non sono consentiti. Metti in &seguito per trasformarlo in una funzione senza nome.
LegionMammal978,

Puoi indicarmi un link?
Kelly Lowder,


1
Secondo me, questa è la risposta migliore qui. Ma l'oggetto Cloud è considerato vero? Direi che l'1 nel cloud è vero, però. Bella risposta!
Restioson,

@ LegionMammal978, posso inserire il codice così com'è in un file del pacchetto .wl ed eseguirlo come "programma" come consentito dalla domanda originale. Di solito questo tipo di domande richiede una funzione con input; non è necessario alcun input da parte dell'utente. Inoltre, testare la mia verità / falso come funzione funziona altrettanto bene con o senza &. Nel CloudPut@1&===$Failed& non fa assolutamente alcuna differenza. Infine, il programma restituisce e stampa l'output, quindi non è in realtà uno snippet REPL come suggerisci.
Kelly Lowder,

1

Python 2.7, 70 77 byte

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 per verità, 0 per falsa. a.uk reindirizza a un'azienda di abbigliamento per moto. Salvato 3 byte assegnando a una variabile e stampandola. E un altro per il "to". trucco (confermato per funzionare con urllib), due per sbarazzarsi dei fastidiosi rientri.


Penso che from urllib import*potrebbe salvare un carattere (e l.ovviamente cadere ).
Nick T,

@NickT Ho dimenticato che potresti lasciare spazio tra di loro importe *quindi penso che tu abbia ragione, ma sono sul cellulare e lo aggiusterò più tardi
Chris H,

1

Julia + Bash (con dnsutils), 10 byte

run(`dig`)

`command`in julia crea un cmdoggetto con cui può essere eseguito run.


0

Clojure, 49 byte

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

Restituisce 1se può connettersi e in caso nilcontrario.

Tenta solo di accedere alla slurppagina; generare NoRouteToHostExceptionun'eccezione in caso di errore, che viene rilevato.

Sfortunatamente, il protocollo e il punto sembrano essere obbligatori.


0

Javascript (Nashorn), 61 byte

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

Basato sulla risposta Java di Huntro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.