Rileva MS Windows


80

Sfida

Crea un programma che restituisca un valore di verità quando eseguito su Microsoft Windows (per semplicità resteremo con Windows 7, 8.1 e 10) e un valore di falsa quando eseguito su qualsiasi altro sistema operativo (OSX, FreeBSD, Linux).

Regole

  • Il codice che non viene eseguito / compilato su una piattaforma non viene conteggiato come valore di falso.

Criteri vincenti

Lo sto etichettando come , quindi vince il punteggio più basso, ma sono anche molto interessato a vedere soluzioni creative a questo problema.


7
I programmi possono essere emessi dal codice di uscita? ( normalmente consentito )
FlipTack

13
Puoi dare un elenco definito di quali sistemi operativi questo deve funzionare?
FlipTack

2
Quale dovrebbe essere il risultato in Windows RT?
Adám,

6
Potresti voler specificare alcuni specifici sistemi non Windows che devono essere supportati. Ci sono alcuni dibattiti nei commenti su cose come DOS e OS2.
jpmc26

2
Probabilmente abbiamo bisogno di un consenso su ciò che conta come verità e falsità per i codici di uscita; la convenzione normale è 0 per vero e qualsiasi altra cosa per falso, ma molte risposte lo trattano come l'opposto, e la definizione "istruzione if" ovviamente non si applica.

Risposte:


77

Vim, 2 byte

<C-a>1

Su Windows, <C-a>(ctrl + a) è mappato per impostazione predefinita su Select All. Se si digita a 1in modalità Seleziona in Windows, sostituisce la selezione con ciò che è stato digitato (1) lasciando un 1 nel buffer.

Su altri sistemi operativi, <C-a>per impostazione predefinita è associato Increment number. Poiché non c'è alcun numero da incrementare, è un no-op, quindi 1 aumenta il conteggio ma in termini di buffer è un no-op.

1 è vero in Vim e una stringa vuota è falsa


Sembra 3 battiture. Ctrl + a + 1
Pavel

12
Penso che per questo meta post meta.codegolf.stackexchange.com/questions/8995/… Le risposte Vim sono generalmente valutate senza i modificatori (specialmente dato che la prima risposta sul post usa <ctrl + a> come esempio per 1 byte)
nmjcman101,

4
@Pavel è Ctrl + a, 1. Se così fosse Ctrl + a + 1, verrebbe conteggiato come una sequenza di tasti.
Captain Man

7
Bella, adoro questa risposta!
DJMcMayhem

È piuttosto elegante, mi piace.
Dan

109

MATLAB, 4 byte

ispc

Dalla documentazione :

tf = ispcrestituisce 1 logico (vero) se la versione del software MATLAB® è per la piattaforma Microsoft® Windows®. Altrimenti, restituisce 0 logico (falso).

Ci sono anche le funzioni ismace isunix. Lascio al lettore capire cosa fanno queste funzioni. Mego ha gentilmente chiesto dei diagrammi che spiegano ismace isunixquindi ho provato a illustrarlo qui:

inserisci qui la descrizione dell'immagine

Non è stato chiesto un diagramma di ispcma posso rivelare che il comportamento è abbastanza simile, tranne sostituto OSXe Unixcon Windows.


Secondo approccio:

Ecco un secondo approccio con l' getenvutilizzo di 23 byte che dovrebbero essere a prova di proiettile, a meno che non ci sia un altro sistema operativo che inizia con W:

x=getenv('OS');x(1)==87

getenv 'name'cerca nell'elenco dell'ambiente di sistema operativo sottostante il testo del modulo name=value, dove si nametrova il vettore del carattere di input. Se trovato, MATLAB® restituisce il valore del vettore carattere. Se non è possibile trovare il nome specificato, viene restituita una matrice vuota.


4
I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Dennis,

55

Python 2.7.10 , 24 byte

import os
0/('['>os.sep)

Grazie a FlipTack per 3 byte

Questo programma sfrutta il fatto che Windows è l'unico sistema operativo da utilizzare \come separatore di percorsi. Normalmente questo è frustrante e negativo, ma per una volta è in realtà un vantaggio. Su Windows, '['>os.sepè falso e quindi 0/0viene calcolato, causando ZeroDivisionErrore uscendo con un codice di uscita diverso da zero. Su piattaforme non Windows, '['>os.sepè vero, rendendo l'espressione 0/1, che non fa nulla, e il programma esce con il codice di uscita 0.


DOS utilizza anche una barra rovesciata come separatore di percorso e ha almeno un'implementazione di Python 2.
Isanae,

5
@isanae Ho modificato il titolo per specificare Python 2.7 - l'unica implementazione di Python 2 su DOS è un arcaico, buggy 2.4.2
Mego

OS / 2 utilizza anche una barra rovesciata e ha un'implementazione di Python 2.7;)
isanae

9
@isanae Ecco, ho specificato 2.7.10. Buona fortuna a trovarne una porta.
Mego

2
apparentemente deve solo dare risultati corretti su 3 versioni recenti di Windows e presumibilmente versios altrettanto recenti degli altri tre sistemi elencati, OS2 e DOS non contano,
Jasen

45

x86 Assembly, 7 bytes (Ispirato dalla risposta di Runemoro )

31 DB 89 D8 40 CD 80

O

xor ebx, ebx 
mov eax, ebx
inc eax
int 0x80

Descrizione

Prima di tutto, imposteremo eaxa 1(il numero di chiamata di sistema per exit(int val)per Linux, FreeBSDe OSX). Quindi, chiameremo il gate di interrupt 0x80che è il gate di chiamata di sistema per Linux, FreeBSDe OSX. Ciò causerebbe la chiusura del programma con lo stato di ebxcui è 0( false).

Su Windows int 0x80è un gate non valido (utilizza 2ecome gate syscall) e si bloccherebbe il programma, causando la chiusura con un codice di uscita positivo ( true).

Modifica: non funzionerebbe OSXpoiché ha una convenzione di passaggio di argomenti diversa su 32 bit (dallo stack).

Riferimenti e ulteriori letture


3
È geniale!
z0rberg è il

Perché l'incidente ha un valore vero? È perché EAX (in genere il valore restituito) è 1? Inoltre, EAX è garantito per essere 0 all'avvio del programma? O ti serve xor eax, eaxlì?
Cole Johnson,

3
@ColeJohnson: gli arresti anomali rilevati dal sistema operativo (sui sistemi operativi in ​​genere utilizzati con x86) non lasciano mai un codice di uscita pari a 0, poiché è riservato per la chiusura corretta. (Normalmente il codice di uscita è un valore traballante che il sistema operativo riserva specificamente per questa circostanza.) Tuttavia, non sono sicuro che abbia senso contare 0 come falso e 1 come verità nei codici di uscita del programma, dato che la normale convenzione è la esatto contrario (con 0 che è l'unica vera verità, ad es. il programma UNIX / Linux / POSIX standard falseesce con il codice 1 mentre trueesce con il codice 0).

1
Questa risposta assume implicitamente che i registri eaxe ebxvengono cancellati a zero all'avvio del programma (sulla non-Windows), che è non è garantita se non ricordo male. Presuppone inoltre esplicitamente che la convenzione syscall per il passaggio degli argomenti per Linux corrisponda a quella per FreeBSD e OSX, il che sarebbe davvero sorprendente.
zwol,

1
@ Sebastian-LaurenţiuPlesciuc Bella domanda. mov eax, 1verrebbe tradotto in \xB8\x01\x00\x00\x00, che è molto più lungo del semplice spostamento del registro e della chiamata inc.
Shmuel H.

29

C, 44 43 38 36 byte

Grazie a @Downgoat per un byte! barrato 44 è ancora regolare 44
Grazie a @Neil per due byte!

f(){return
#ifdef WIN32
!
#endif
0;}

Inizialmente stavo per suggerire che è possibile salvare un sacco di byte spostando il 0da ifdefe cambiando 1in !, ma penso che funzioni _WIN32+0ancora meglio.
Neil,

Se c99 è OK, puoi cambiare f in main e rimanere return 1;all'interno dell'ifdef e rimuovere l'altro, poiché main senza ritorno in c99 deve restituire 0.
simon

11
Questa è una direttiva del compilatore. Se viene compilato su un sistema Windows ed eseguito su un sistema Linux, ad esempio, restituirà comunque 1.
Micheal Johnson

4
@MichealJohnson no. Posso compilarlo su linux (usando mingw32gcc msvc) e ottenere il codice che ritorna vero quando eseguito su Windows. Non conosco nessun compilatore linux ospitato su Windows. se vuoi sostenere livelli di emulazione come "vino", tutte le altre risposte probabilmente soffrono dello stesso problema
Jasen,

1
Non sono sicuro che WIN32 sia appena definito, ma sia definito su zero. Se è il caso successivo, puoi solo dire #if WIN32. Su non Windows, poiché WIN32 non è definito, il preprocessore è tenuto a trattarlo come 0.
Shahbaz

27

PHP, 22 byte

`<?=PATH_SEPARATOR>":";`  

stampa 1se il separatore di percorso è punto e virgola (due punti o vuoto per tutti gli altri sistemi operativi tranne DOS e OS / 2), altrimenti nulla.

anche 22 byte , ma non così sicuro:

<?=strpos(__FILE__,92);

stampa un numero intero positivo se il percorso del file contiene una barra rovesciata; nient'altro.
Un'alternativa sicura con 27 byte : <?=DIRECTORY_SEPARATOR>"/";stampe 1o niente.

Una strana scoperta : <?=__FILE__[1]==":";( 20 byte ) dovrebbe essere, neanche sicuro, ma ok. Ma sebbene __FILE__finga di essere una stringa (ho provato var_dumpe gettype), l'indicizzazione genera un errore, a meno che non venga copiata da qualche altra parte (funziona anche la concatenazione) o la usi come parametro di funzione.

Modifica:
<?=(__FILE__)[1]==":";(anche 22 byte ) funziona in PHP 7; ma questo perché le parentesi copiano il valore della costante in una variabile temporanea.

27 byte : <?=stripos(PHP_OS,win)===0;
verifica se la PHP_OScostante predefinita inizia con win(senza distinzione tra maiuscole e minuscole; Windows, WIN32, WINNT, ma non CYGWIN o Darwin); stampa 1per Windows, altrimenti niente.

17/18 byte :

<?=strlen("
")-1;

stampa 1se è stato memorizzato con l'interruzione di riga di Windows (anche su DOS, OS / 2 e Atari TOS - anche se dubito che qualcuno abbia mai compilato PHP per TOS), altro 0.

Puoi anche controllare la costante PHP_EOL.

più opzioni:

PHP_SHLIB_SUFFIXè dllsu Windows, ma non necessariamente solo lì.
php_uname()restituisce informazioni sul sistema operativo e altro; inizia con Windowsper Windows.
$_SERVER['HTTP_USER_AGENT']conterrà Windowsquando viene chiamato in un browser su Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 byte) funziona in PHP> = 5.3

conclusione

L'unico modo sicuro per dire se è davvero Windows, non qualcosa di simile, sembra essere un controllo sul nome del sistema operativo. Per PHP: php_os()può essere disabilitato per motivi di sicurezza; ma PHP_OSprobabilmente conterrà sempre le informazioni desiderate.


4
I nomi dei file su * nix possono contenere barre rovesciate, quindi questo non è assolutamente infallibile. Le regole non dicono che debba essere infallibile, quindi, quindi ¯ \ _ (ツ) _ / ¯
Giordania

@Jordan: hai ragione. Ho aggiunto queste informazioni alla descrizione. Grazie.
Tito

4
Un'alternativa: <?=class_exists(COM);. La classe COMè disponibile solo su Windows, per quanto ne so. Questo dovrebbe farti risparmiare un byte.
Ismael Miguel,

@IsmaelMiguel Per te è abbastanza una diversa risposta per pubblicarla come tale. (Tuttavia, potrebbe non
valerne la

1
@ wizzwizz4 Non ne vale la pena. La risposta verrebbe spinta all'oblio. Ecco perché ho semplicemente lasciato il commento, invece di scrivere la mia risposta.
Ismael Miguel,

16

Befunge-98, 7 byte

6y2%!.@

Provalo online!

Funziona interrogando il separatore del percorso di sistema, che si trova \su Windows e /su altri sistemi operativi.

6y            System information query: #6 returns the path separator.
  2%          Test the low bit - this will be 1 for '/' and 0 for '\'.
    !         Not the value, so it becomes 0 for '/' and 1 for '\'.   
     .@       Output the result and exit.

15

Mathematica, 28 byte

$OperatingSystem=="Windows"&

Qual è il punto nel renderlo una funzione? È possibile rimuovere la e commerciale salvando un byte e il codice valuterà direttamente se viene eseguito su un sistema Windows.
Ruslan,

@Ruslan Tutte le risposte devono essere programmi completi che stampano il risultato o funzioni richiamabili. Se questa viene dichiarata una risposta del blocco note di Mathematica, allora potresti cavartela chiamando un programma completo, ma se invoco l'oggetto dalla riga di comando senza il &, non stamperà nulla (e quindi non è nemmeno una funzione richiamabile , ma semplicemente uno snippet / espressione).
Martin Ender,

@MartinEnder Davvero nessun output? Ne ottengo un Out[1]= Falseoutput:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan l'

@Ruslan Credo che inizi anche un ambiente per notebook (solo basato sulla riga di comando). Quello che voglio dire eseguendo un programma dalla riga di comando è usare la modalità script.
Martin Ender,

13

Java 8, 33 byte

Un ringraziamento speciale a Olivier Grégoire per aver suggerito separatorChare Kritixi Lithos per -1 byte!

Questa è un'espressione lambda che restituisce un valore booleano. Questo può essere assegnato Supplier<Boolean> f = ...;e chiamato con f.get().

()->java.io.File.separatorChar>90

Provalo online! - il server non è Windows, quindi questo stampafalse. Tuttavia, nel mio computer Windows, viene stampato lo stesso codicetrue.

Ciò che fa questo codice è ottenere il separatore di file del sistema e verificare se il suo punto di codice è più grande del carattere [. Questo è vero per Windows, in quanto utilizza \come separatore, ma ogni altro sistema operativo utilizza /, che ha un codice inferiore nella tabella ASCII.


Questa interruzione non avverrà su altri sistemi operativi che iniziano con W?
Downgoat,

()->java.io.File.separatorChar=='\\'è solo 36 byte.
Olivier Grégoire,

1
@ OlivierGrégoire bello - e posso giocare a golf a 34 usando ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, Whonix. Probabilmente anche di più.
Olivier Grégoire l'

3
@Titus Aspetta, che mi dici di WAITS ?
NoOneIsHere

11

J, 7 byte

6=9!:12

Questo è un verbo (simile a una funzione) che utilizza la congiunzione esterna incorporata 9!:12per acquisire il tipo di sistema in cui 5 è Unix e 6 è Windows32.


J La documentazione ufficiale mostra che restituisce questo valore per Windows precedente. "6 Windows32 (95/98/2000 / NT)" È necessario aggiornare la documentazione? Cosa succede quando è Windows a 64 bit? jsoftware.com/help/dictionary/dx009.htm
Keeta,

Testato su Windows 7 a 64 bit e restituisce un 6. La documentazione sembra essere piuttosto vecchia.
Keeta,

@Keeta Sì, penso che sia vecchio ma ha comunque restituito un 6 per me su Windows 10 a 64 bit.
miglia

11

R, 15 byte

.Platform$O>"v"

Grazie a plannapus per il suggerimento di utilizzare una corrispondenza parziale per l'estrazione dell'elemento elenco.

.Platform è un elenco con alcuni dettagli della piattaforma sotto la quale R è stato costruito. C'è un elemento OS.type(l'unico elemento con nome che inizia con "O") che è una stringa di caratteri, che fornisce il sistema operativo (famiglia) del computer. Uno di "unix"o "windows".

Quindi "unix"è meno allora "v", ma "windows"è maggiore allora "v". Altre risposte valide di 15 byte sono

.Platform$O>"V"
.Platform$O>"w"
.Platform$O>"W"

R è stato sviluppato per le famiglie di sistemi operativi Unix-like, Windows e Mac . Altre famiglie di sistemi operativi non sono supportate.


1
ci sono piattaforme diverse da Unix che non sono finestre che conosci ...
Blue

2
@muddyfish: .Platform [[1]] è definito come "unix" o "windows" nella documentazione R. github.com/wch/r-source/blob/…
liori

Scusa, va bene allora. La risposta dovrebbe probabilmente essere modificata per includere questo fatto per fermare la richiesta di nuovo
Blue

10

Perl, 11 byte

print$^O=~MS

^O dovrebbe essere sostituito da un Control-O letterale.

Output 1su Windows, niente su un altro sistema operativo.

Nota che non sto usando sayin quanto aggiunge una nuova riga finale, il che è vero in Perl.

-2 byte grazie a primo. (e risolti potenziali problemi)
-1 byte grazie a ais523.


AFAIR questo non funzionerà in Cygwin Perl.
Igor Skochinsky,

Questo non funzionerà neanche in Perl. Perl tratta entrambi entrambi come sistemi operativi distinti da Windows, sebbene (poiché generalmente obbediscono a UNIX anziché alle convenzioni di Windows) e non è chiaro se debbano essere considerati ai fini della domanda. In altre notizie, è possibile salvare un byte qui utilizzando un carattere letterale control-O anziché ^O.

@ ais523 L'ho modificato, grazie. Per quanto riguarda Cygwin e Mingw, eliminerò il post se devono essere considerati come Windows, ma come dici tu, avrebbe più senso considerarli come un sistema operativo separato (o almeno, come un sistema operativo non Windows).
Dada,

I delimitatori Regex non dovrebbero essere necessari $^O=~W, anche se probabilmente mi piacerebbe confrontarmi con MS. In alternativa, puoi anche abbinare $^X=~':'.
primo

@primo, grazie. Non conosco nessun altro sistema operativo con a Win esso quindi ho pensato di cercare Wper a bene .. qualche motivo per cui suggerisci MSinvece?
Dada,

9

julia, 10 byte

is_windows

Una funzione che restituisce true per Windows


9

codice macchina x86, 9 byte

40 39 04 24 75 02 CD 80 C3

Compilato da:

inc eax        ; set eax to 1
cmp [esp], eax ; check if [esp] == 1 (linux)
jne windows    ; jump over "int 0x80" if on windows
int 0x80       ; exit with exit code 0 (ebx)
windows:
ret            ; exit with exit code 1 (eax)

3
pure binary (COM) non funzionerà su Windows o Linux, quindi non sono sicuro che sia valido
Igor Skochinsky,

@IgorSkochinsky Deve essere presente un interprete per l'assemblaggio.
Shmuel H.

Puoi rendere il codice ancora più breve lasciando solo inc eaxe int 0x80, penso che dovrebbe fallire su Windows e terminare il processo.
Shmuel H.

2
@IgorSkochinsky Esistono programmi che eseguono anche binari non elaborati. Vedi il link nel mio commento precedente.
Shmuel H.

1
Bochs e QEMU simulano l'ambiente bare metal e non eseguono il codice binario sotto il sistema operativo host. Quindi non funzioneranno IMO. Ma tutto ciò potrebbe essere una discussione per il meta.
Igor Skochinsky,

8

JavaScript, 42 30 26 25 byte

console.log((
//Begin
_=>navigator.oscpu[0]>'V'
//End
)())

Testato con Firefox. (Chrome non ha la oscpuproprietà.) Poiché le lettere minuscole hanno un codice carattere più alto rispetto alle lettere maiuscole, questo dipende dal fatto che la prima lettera navigator.oscpusia maiuscola e non sia W , X , Y o Z su qualsiasi piattaforma supportata da Firefox (diverso da Windows, ovviamente). Secondo questo post , questo è il caso.

Le modifiche

  1. Risparmiato 12 byte grazie a Neil .
  2. Salvati altri quattro byte
  3. Ho salvato un altro byte grazie a Blender .

oscpuè probabilmente la navigatorproprietà più breve che puoi usare. Inoltre, testare una regexp probabilmente funzionerà più breve, ma non l'ho misurato.
Neil,

È possibile rimuovere !=-1e aggiungere ~subito dopo la freccia grossa, salvando 3 byte.
Luca

Devi creare una funzione? Non puoi semplicemente fare console.logil test regex? navigator.oscpu[0]=='W'

2
Hmm, per qualche ragione il mio Chrome non ha oscpu.
Muzer,

2
navigator.oscpu>'V'potrebbe funzionare anche
Blender l'

8

C #, 61 48 byte

()=>(int)System.Environment.OSVersion.Platform<4

Risparmiato 13 byte grazie a TheLethalCoder

O un programma completo a 83 byte:

class P{static int Main(){return(int)System.Environment.OSVersion.Platform<4?1:0;}}

Varie varianti di Windows utilizzano i valori enum da 0 a 3 nell'implementazione di Microsoft .NET . 4 è Unix, 5 è Xbox [360] (che non considererò "Windows"), 6 è MacOSX. Mono usa gli stessi valori , aggiungendo 128 per Unix / Linux nelle versioni precedenti.

Pertanto, qualsiasi cosa <4 è Windows e tutto il resto non è Windows.


2
Non sono sicuro che mi manchi qualcosa, ma perché stai lanciando il valore su un int?
auhmaan,

@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- fondamentalmente, le regole di battitura di C # dicono che non posso confrontare a PlatformIDe intdirettamente, e non c'è cast implicito da PlatformIDa int. Ma v'è un esplicito cast tutte le enumerazioni ai loro valori, che ho approfittare di qui ...
Bob

1
@ MustafaAKTAŞ Inoltre, devo sottolineare che si tratta di C # /. NET Framework / .NET Core. Su Xbox One è possibile eseguire solo app UWP, che utilizzano un'API diversa non inclusa System.Environment.OSVersionaffatto . Se hai intenzione di metterti in discussione, dovresti anche eliminare ogni altra risposta non UWP. Si scopre anche che non puoi (attualmente) eseguire app UWP su piattaforme non Windows, quindi puoi anche eliminare tutte quelle. Che ti lascia con 0 risposte e una domanda senza risposta.
Bob

1
Puoi compilare in un Action<bool>nel primo esempio per 48 byte (non l'ho testato ma credo che funzionerà) _=>(int)System.Environment.OSVersion.Platform<4;Potrebbe essere necessario essere ()=>...per 49 byte
TheLethalCoder

1
La compilazione di funzioni anonime come la Funcs e la Actions sono usate tutto il tempo qui. Credo che sia nella pagina dei suggerimenti sul golf e li uso quasi sempre. Anche le funzioni anonime sono molto usate in altre lingue, quindi penso che sia sicuro usarle qui
TheLethalCoder

7

Lotto, 50 byte

@if %OS%==Windows_NT if not exist Z:\bin\sh echo 1

Modifica: risolto per ignorare DOS invece di affermare che si tratta di Windows.

L' unico altro modo che conosco di esecuzione batch di fuori di Windows è quello di utilizzare vino che per impostazione predefinita, mappa Z:a /. Pertanto, se Z:\bin\shesiste, è probabile che lo sia /bin/sh, quindi non MS Windows.

Non so a cosa WINE imposti% OS%, ma se non lo fosse Windows_NTpotrei risparmiare 23 byte.


1
Un altro modo è DOS, che non è Windows.
Ruslan,

Questo non solo fallisce in DOS, ma anche su un computer in cui Z: è mappato e contiene un tale percorso.
Adám,

1
Almeno sto cercando di rilevare WINE. Nessuna delle altre risposte darà il risultato corretto se eseguita anche con WINE.
Neil

3
@ Adám Certo e se si compila la risposta C con -DWIN32 = 1, allora fallisce anche. Il tuo punto?
Neil,

1
sì, set di viniOS=Windows_NT
Jasen

7

QBasic, 31 byte

?INSTR(ENVIRON$("COMSPEC"),"W")

Stampa diverso da zero in Windows, 0 in tutto il resto.

COMSPECè una variabile di ambiente univoca per i sistemi operativi Microsoft. Indica l'interprete dei comandi, in genere command.como cmd.exe. Sotto Windows, l'interprete dei comandi si trova da qualche parte nella directory di Windows; sotto MS-DOS, si trova nella directory DOS o nella radice del disco e sotto qualsiasi altro sistema operativo, non esiste.

Controllando per vedere se il valore di COMSPECcontiene una "W", possiamo dire la differenza tra Windows e non Windows.


COMSPECnon è riservato per significare qualcosa in particolare sotto Linux (il che significa che è sotto il controllo dell'utente per impostazione predefinita), quindi non è possibile che l'utente lo imposti su un valore che sta usando per i propri scopi (e capita che contenga un W)? Certo, questo è un po 'un caso limite.

1
@ ais523: Inoltre, la directory di Windows non deve contenere un W. In entrambi i casi è fragile.
Joey,

7

Node.js, 27 16 15 13 byte

Grazie a @Patrick , che ha eliminato 12 byte dalla mia soluzione usando REPL di Node:

_=>os.EOL>`
`

Soluzione originale:

_=>require('path').sep!='/'

Se lo cambi in Node.js REPL, puoi salvare 16 byte semplicemente usando_=>path.sep!='/'
Patrick Roberts il

Sono nuovo di Codegolf. Mi è permesso farlo?
GilZ,

Sì, altrimenti non l'avrei suggerito. REPL significa leggere, eseguire, stampare loop, il programma che viene eseguito quando si accede nodealla console. Da lì, tutti i moduli del nodo di sistema sono disponibili senza necessità require().
Patrick Roberts,

Oh si scusa. Intendevo 11. Puoi salvare un altro byte cambiando !=in >poiché l'indice ASCII per \ è 92 ed /è 47.
Patrick Roberts

7

Excel VBA, 41 40 30 29 26 24 byte

Immediata funzione di Windows che restituisce truese il codice del sistema operativo del sistema inizia è più lungo di lunghezza 3, perché l'informazione è limitato a uscita o altro maco pcdosrestituisce truesolo su PC Windows

?[Len(Info("SYSTEM"))>3]

Versione precedente

''# Ignore the second `"` that follows every `\` - its only there for highlighting 

?Left(Environ("OS"),1)="W"                 # 24 Bytes

?InStr(ThisWorkbook.Path,"\"")             # 29 Bytes

?Mid(ThisWorkbook.Path,3,1)="\""           # 30 Bytes, Restricted to local Files

?Application.PathSeparator="\""            # 30 Bytes

?Left(Application.OperatingSystem,1)="W"   # 40 Bytes

I cambiamenti

-1 Grazie a Neil per aver usato Left(...,1)overMid(...,1,1)

-10 Grazie a ChrisH per aver sottolineato il trucco del separatore di percorso di @ Mego

-1 Per la verifica di WorkbookPathper "\" anziché utilizzareApplication.Path Separator

-4 Per passare a Environ()

-2 Per passare a [Len(Info(...

Nuova soluzione, 51 byte

Una nuova subroutine che genera, alla VBE, una finestra immediata, una 1 (truthy)sotto windows e una 0 (falsey)sotto mac con il metodo di compilazione condizionale.

Sub a
i=1
#If Mac Then
i=0
#End If
Debug.?i
End Sub

1
leftti salva un byte.
Neil

L'hai provato su Office365 online? Supporta anche VBA? Solo curioso.
Chris H,

@ChrisH Per quanto ne so, office.com non supporta lo scripting VBA online (anche se se qualcun altro lo sa meglio, per favore, dimmelo, mi renderebbe la vita significativamente più semplice); Tuttavia, con O365 hai i diritti per scaricare una copia di Office 2016 (o di qualsiasi altra cosa sia corrente) sul tuo desktop e questo supporta gli script VBA.
Taylor Scott,

Finora sono riuscito a evitarlo; dato il tuo commento che sembra destinato a continuare (le uniche macchine Windows che uso hanno una copia desktop di Office, le macchine personali sono tutte Linux)
Chris H

1
@ Trucco separatore percorso di Mego ( ?Application.PathSeparator)="\"sarebbe 32 in quanto è un singolo carattere)
Chris H

6

Perl 6 ,  19  18 byte

put $*DISTRO.is-win
put ?($*CWD~~/\\/)

Sia in uscita True␤che a False␤seconda del sistema su cui viene eseguito.


il secondo si basa sui valori non Windows di CWD che non contengono alcun `` - non c'è garanzia di ciò,
Jasen

5

APL (Dyalog) , 21 byte

'W'∊∊#⎕WG'APLVersion'

Provalo online!

#⎕WG'APLVersion' Root ( # ) W indow G et property Versione APL

 arruolarsi (appiattire)

'W'∊W  è un membro? (nessun valore di ritorno diverso da Windows contiene una W maiuscola)


4

tcl, 38 byte

 expr [lsearch $tcl_platform windows]>0

4

PHP 17 byte

Di seguito verrà visualizzato 1 se Windows e niente se non altro. Ignorando gli avvisi di conversione di stringhe.

<?=PHP_OS==WINNT;

Prova i test online online per Linux perché il sandbox è Linux per PoC.


Sicuro che sia abbastanza? Chiedere perché valori possibili per: PHP_OS .
arte

1
'<? = PHP_OS [0] == W; `è più breve di 1 byte e rileva tutti gli altri valori di Windows nella domanda collegata da manatwork. >Vpotrebbe funzionare anche.
user59178

manatwork dipende da quale versione di Windows è stato compilato PHP, poiché Windows Visa \ 7, la versione di Windows è stata rappresentata con WINNT a causa del kernel di autorità NT. prima di Windows XP e precedenti era WIN32 e Windows Server 2003 era Windows.
DrWhat

4

Java 8, 49 byte

()->System.getenv().get("OS").contains("Windows")

Più lungo dell'altra risposta Java , ma adotta un approccio diverso.

Questo lambda si inserisce in a Supplier<Boolean>e può essere testato con il seguente programma:

public class DetectMSWindows {

  public static void main(String[] args) {
    System.out.println(f(() -> System.getenv().get("OS").contains("Windows")));
  }

  private static boolean f(java.util.function.Supplier<Boolean> s) {
    return s.get();
  }

}

È molto, molto simile alla risposta iniziale che colleghi (prima delle modifiche).
Olivier Grégoire,

Perché non solo .contains("W")?
Cyoce,

@Cyoce in realtà, il sistema operativo variabile sembra essere specifico di Windows.


4

bash + coreutils, 5 byte

rm $0

Funziona anche con la maggior parte delle shell POSIXy. (Notare che esistono porte di Windows bashed rmesistono; anche se sono normalmente utilizzate solo con sistemi operativi POSIXy più pesanti, questa non è una voce completamente vacua.) Output tramite il codice di uscita (0 = false, 1 = true). Può essere conteggiato come 4 byte se ti è permesso assumere un nome file (ad es rm a.). Si noti che ciò può potenzialmente fallire nel caso di nomi di file molto strani (che rminterpreteranno come argomenti a causa della mancanza di virgolette, e possibilmente eliminare i file che ti interessano, quindi sconsiglio di eseguire questo programma da un file con un nome strano ).

Nota: elimina il programma dal disco come effetto collaterale, o almeno ci prova. Nel caso in cui siamo in esecuzione su Windows, il sistema operativo non riuscirà a eliminare il file in esecuzione (un'operazione che Windows non consente né per impostazione predefinita o per intero), e quindi si rmverificherà un errore. bashrileva l'errore e lo converte in un codice di uscita (quindi il programma nel suo insieme termina normalmente). La maggior parte delle altre voci qui utilizza 0 per falso e 1 per verità nei codici di uscita, quindi fa lo stesso; si noti che bashla ifdichiarazione non accetta affatto numeri interi (piuttosto, accetta comandi e rami in base al fatto che vengano eseguiti correttamente e i test aritmetici vengono eseguiti tramite programmi cometestche riporta intenzionalmente un "arresto anomalo" in caso di confronto non riuscito), quindi questo è su un terreno più instabile in termini di legalità rispetto ai programmi che emettono tramite il codice di uscita nelle lingue in cui 0 è valido in un iftest di istruzione e invia il programma al elseramo.


4

8 , 11 byte

 
os 1- not .
 

Stampa truesu Windows, falsesu Linux e macOS. Altre piattaforme supportate dall'ottavo sono Android, iOS e Raspberry Pi, ma non sono in grado di testarle.

Versione non golfata (con commenti)

 
G:os  \ Return a number n indicating the operating system 
      \ 0 for Linux
      \ 1 for Windows 
      \ 2 for macOS
      \ 3 for Android 
      \ 4 for iOS 
      \ 5 for Raspberry Pi
n:1-  \ Subtract 1
G:not \ If Windows --> true, otherwise --> false
.     \ Print result
 

4

Python 3 (13 byte)

import winreg

Restituisce con il codice di uscita zero (generalmente vero nelle shell) se su Windows e altrimenti con un codice di uscita diverso da zero.

Se si preferisce il contrario, c'è una soluzione 12 byte: import posix.


Penso che questo non funzionerà se c'è un file chiamato winreg.pynella stessa directory.
Zacharý,

1
Inoltre, secondo le regole: "Il codice che non può essere eseguito / compilato su una piattaforma non viene conteggiato come valore di falso".
Zacharý,

4

TrumpScript , 17 byte

America is great.

Provalo online!


Questo programma, se eseguito su Windows, stamperà:

The big problem this country has is being PC

Questo è considerato un valore veritiero.


L'output vuoto e il valore seguente sono errati:

Boycott all Apple products  until such time as Apple gives cellphone info to authorities regarding radical Islamic terrorist couple from Cal

L'output vuoto si verificherà su qualsiasi sistema Linux (per questo programma), la risposta Apple lunga ovviamente si verifica su Mac (per qualsiasi programma). Su TIO, il backend (presumo) è un sistema operativo Unix, quindi puoi ottenere solo il valore di falsy; sul mio computer ricevo il messaggio PC.


Non sono sicuro al 100% se questo conta come un messaggio di errore (che invaliderebbe la risposta), ma se non lo sapevi, probabilmente vale la pena ridere.


Cosa è
successo

@avaragecoder RENDI GRANDE PYTHON DI NUOVO!
Magic Octopus Urn,
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.