MS Windows'u algıla


78

Meydan okuma

Microsoft Windows'ta çalıştırıldığında bir truthy değeri (basitlik için Windows 7, 8.1 ve 10 ile yapışacağız) ve başka bir işletim sisteminde (OSX, FreeBSD, Linux) çalıştırıldığında falsey değeri veren bir program oluşturun.

kurallar

  • Bir platformda çalıştırılamayan / derlenmeyen kod, falsey değeri olarak sayılmaz.

Kazanan kriterler

Bunu olarak etiketliyorum , bu yüzden en düşük puan kazanıyor, ama aynı zamanda bu soruna yaratıcı çözümler görmekle de ilgileniyorum.


7
Programlar çıkış koduyla verilebilir mi? ( normalde izin verilir )
FlipTack

13
Hangi işletim sistemleri üzerinde çalışmak istediğine dair kesin bir liste verebilir misiniz?
FlipTack

2
Sonuç Windows RT'de ne olmalı?
Ad

6
Desteklenmesi gereken Windows'a özgü olmayan birkaç sistem belirtmek isteyebilirsiniz. DOS ve OS2 gibi şeyler hakkında yorumlarda bazı tartışmalar var.
jpmc26

2
Çıkış kodları için neyin doğru ve yanlış olduğunu sayanlar hakkında muhtemelen bir fikir birliğine ihtiyacımız var; normal kongre doğru için 0, yanlış için başka bir şeydir, ancak birçok cevap onu tam tersi olarak kabul ediyor ve "if ifadesi" tanımı açıkça uygulanmıyor.

Yanıtlar:


75

Vim, 2 bayt

<C-a>1

Windows'ta, <C-a>(ctrl + a) varsayılan olarak olarak eşleştirilir Select All. 1Windows'da seçme modunda a yazarsanız , seçiminizi yazdığınızla (1) arabellekte 1 bırakarak değiştirir.

Diğer işletim sistemlerinde, <C-a>varsayılan olarak eşleştirilir Increment number. Artış için bir sayı olmadığı için, bu bir işlem dışıdır ve sonra 1 sayımı arttırır, ancak arabellek açısından işlem dışıdır.

1, Vim'de truthy'dir ve boş bir dize sahtedir


3 tuş vuruşuna benziyor. Ctrl + a + 1
Pavel

12
Bence bu meta yazıya göre meta.codegolf.stackexchange.com/questions/8995/… Vim cevapları genellikle değiştiriciler olmadan puanlanır (özellikle gönderimdeki ilk cevabın 1 bayt için bir örnek olarak <ctrl + a> kullandığı düşünülür)
nmjcman101

4
Öyle @Pavel Ctrl + a, 1. Öyle olsaydı Ctrl + a + 1o 1 tuş olarak sayılabilir olurdu.
Kaptan Adam,

7
Güzel, bu cevabı seviyorum!
DJMcMayhem

Bu oldukça zarif, hoşuma gitti.
Dan

108

MATLAB, 4 bayt

ispc

Gönderen belgeler :

tf = ispcMATLAB® yazılımının sürümü Microsoft® Windows® platformundaysa mantıksal 1 (doğru) değerini döndürür. Aksi takdirde, mantıksal 0 (yanlış) döndürür.

Ayrıca fonksiyonlar ismacve vardır isunix. Bu fonksiyonların ne yaptığını anlamak için onu okuyucuya bırakacağım. Mego nazikçe açıklayan diyagramlar istedi ismacve isunixbu yüzden onu burada göstermeye çalıştım:

görüntü tanımını buraya girin

Bunun bir diyagramı istenmedi ispc, ancak yerine OSXve Unixile davranışın oldukça benzer olduğunu ortaya çıkarabilirim Windows.


İkinci yaklaşım:

Aşağıda getenv, başka bir işletim sistemi yoksa, kurşun geçirmez olması gereken 23 bayt kullanan ikinci bir yaklaşım verilmiştir W:

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

getenv 'name'Giriş karakteri vektörünün bulunduğu formun metnini temel işletim sistemi ortam listesinde arar . Bulunduğunda, MATLAB® karakter vektör değerini döndürür. Belirtilen ad bulunamazsa, boş bir matris döndürülür.name=valuename


4
Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Dennis

54

Python 2.7.10 , 24 bayt

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

3 byte için FlipTack sayesinde

Bu program, Windows'un \yol ayırıcı olarak kullanılacak tek işletim sistemi olması gerçeğinden yararlanır . Normalde bu sinir bozucu ve kötü, ama bir zamanlar aslında bir avantaj. Windows'ta '['>os.sepyanlıştır ve bu nedenle 0/0hesaplanır ZeroDivisionErrorve a'ya sıfır olmayan bir çıkış koduyla çıkılır. Windows olmayan platformlarda, hiçbir şey yapmaz '['>os.sepifadesini yapmak doğrudur 0/1ve program 0 çıkış koduyla çıkar.


DOS ayrıca yol ayırıcı olarak ters eğik çizgi kullanır ve en az bir Python 2 uygulaması vardır.
isanae

5
@isanae Python 2.7'yi belirtmek için başlığı değiştirdim - DOS'taki yalnızca Python 2 uygulaması arkaik, adamcağız bir 2.4.2
Mego

OS / 2 ayrıca bir ters eğik çizgi kullanıyor ve Python 2.7 uygulamasına sahip;)
isanae

9
@ Isanae Orada 2.7.10 belirledim. Bir liman bulmakta iyi şanslar.
Mego

2
görünüşe göre, sadece son 3 Windows sürümünde doğru sonuçlar vermesi gerekiyor ve muhtemelen benzer şekilde listelenen diğer üç sistemin versiyonları, OS2 ve DOS önemli değil,
Jasen

45

x86 Meclisi, 7 bayt ( Runemoro'nun cevabından ilham alındı )

31 DB 89 D8 40 CD 80

Veya

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

Açıklama

Her şeyden önce, biz belirleriz eaxiçin 1(sistem çağrısı için numara exit(int val)için Linux, FreeBSDve OSX). Sonra, kesme kapısı diyeceğiz 0x80için sistem çağrı kapısı Linux, FreeBSDve OSX. Yani durumuyla çıkmak için programı neden olacak ebxhangi 0( false).

Windows'ta int 0x80geçersiz bir geçit ( 2eSistem çağrısı geçidi olarak kullanıyor ) ve programın çökmesine neden olarak pozitif bir çıkış koduyla ( true) bitmesine neden olur .

Düzenleme:OSX 32 bit (yığında) argüman geçirme farklı bir kongre olduğundan, üzerinde çalışmaz .

Kaynaklar ve daha fazla okuma


3
Bu harika!
z0rberg

Çarpma olayları neden gerçek bir değer yaratıyor? EAX (genellikle dönüş değeri) 1 olduğundan mı? Ayrıca, EAX'in program başlangıcında 0 olması garanti ediliyor mu? Yoksa xor eax, eaxoraya mı ihtiyacınız var?
Cole Johnson,

3
@ColeJohnson: İşletim sistemi tarafından algılanan çökmeler (genellikle x86 ile kullanılan işletim sistemlerinde) hiçbir zaman 0 çıkış kodu bırakmaz, çünkü başarılı bir şekilde sonlandırılması için ayrılmıştır. (Normalde çıkış kodu, işletim sisteminin bu durum için özel olarak ayırdığı bazı önemli bir değerdir.) Ancak, normal kuralın normal olması şartıyla, program çıkış kodlarında 0'ın falsey, 1'in truthy olarak sayılmasının anlamlı olacağından emin değilim. tam tersi (0 sadece tekdüze değer olan, örneğin standart UNIX / Linux / POSIX programı falsekod 1 trueile çıkar, kod 0 ile çıkar).

1
Bu cevap örtük kayıtları varsayar eaxve ebxedilir, (olmayan Windows üzerinde) başlatmak programa sıfıra temizlenir değil yanlış hatırlamıyorsam garanti. Ayrıca Linux için sistem çağrısı argüman geçişi konvansiyonunun FreeBSD ve OSX ile eşleştiğini ve bunun gerçekten şaşırtıcı olacağını açık bir şekilde varsayıyor.
zwol

1
@ Sebastian-LaurenţiuPlesciuc Güzel bir soru. mov eax, 1çevrilmiş olacağını \xB8\x01\x00\x00\x00sadece kayıt ve arama hareketli artık çok olan, inc.
Shmuel H.

29

C, 44 43 38 36 bayt

Bir bayt için @Downgoat'a teşekkürler! 44 çarpı hala normal 44 44
İki bayt için @Neil'e teşekkürler!

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

Başlangıçta seni taşıyarak bayt bir demet kaydedebilirsiniz önermek için gidiyordu 0durumlar o ifdefve değişen 1için !, ama sanırım _WIN32+0daha iyi hala çalışır.
Neil

C99 sorun yoksa ana kadar f değiştirebilir ve sopa return 1;ifdef içinde ve geri dönmelidir c99 içinde dönüş olmadan ana beri, başka kaldırmak 0.
Simon

11
Bu bir derleyici yönergesidir. Eğer bir Windows sisteminde derlenmişse ve bir Linux sisteminde çalışıyorsa, örneğin, yine de 1'e döner.
Micheal Johnson

4
@MichealJohnson no. Linux üzerinde derleyebiliyorum (mingw32gcc msvc kullanarak). Windows tarafından barındırılan bir linux derleyicisi hakkında hiçbir şey bilmiyorum. "şarap" gibi emülasyon katmanlarını tartışmak istiyorsanız diğer tüm cevaplar muhtemelen aynı problemi
yaşamaktadır

1
WIN32'nin yalnızca tanımlanmış, ancak sıfır olmayan olarak tanımlanmış olduğundan emin değil. Eğer daha sonraki dava ise, sadece söyleyebilirsin #if WIN32. Windows olmayanlarda, WIN32 tanımlanmadığından, önişlemcinin onu 0 olarak ele alması gerekir.
Shahbaz

27

PHP, 22 bayt

`<?=PATH_SEPARATOR>":";`  

1yol ayırıcı noktalı virgül ise (kolon ve DOS ve OS / 2 hariç diğer tüm işletim sistemleri için boş) ise başka bir şey yoksa yazdırır .

Ayrıca 22 bayt , ancak bu güvenli değil:

<?=strpos(__FILE__,92);

dosya yolu ters eğik çizgi içeriyorsa pozitif bir tam sayı yazdırır; başka bir şey yok. 27 bayt
ile güvenli bir alternatif : yazdırır ya da hiçbir şey.<?=DIRECTORY_SEPARATOR>"/";1

Garip bir keşif : <?=__FILE__[1]==":";( 20 bayt ) güvenli olmalı ya da tamam olmalı. Ancak __FILE__bir dize gibi görünmesine rağmen (denedim var_dumpve çalıştım gettype), dizine ekleme, bir başka yere kopyalamadığınız sürece (birleştirme de çalışır) ya da bir işlev parametresi olarak kullanmadığınız sürece, bir hata verir.

Düzenleme:
<?=(__FILE__)[1]==":";(ayrıca 22 bayt ) PHP 7'de çalışır; fakat parantezler sabitin değerini geçici değişkene kopyalar.

27 bayt : <?=stripos(PHP_OS,win)===0;
önceden tanımlanmış PHP_OSsabitin başlaması durumunda test eder win(büyük / küçük harfe duyarsız; Windows, WIN32, WINNT, ancak CYGWIN veya Darwin değil); 1Windows için yazdırır , başka bir şey yok.

17/18 bayt :

<?=strlen("
")-1;

1Windows satır sonu (DOS, OS / 2 ve Atari TOS'ta da saklandıysa) yazdırır , ancak birinin TOS için PHP'yi derlemiş olduğundan şüpheliyim 0.

Ayrıca sabiti de kontrol edebilirsiniz PHP_EOL.

Daha fazla seçenek:

PHP_SHLIB_SUFFIXolduğunu dllama ille sadece orada, Windows üzerinde.
php_uname()işletim sistemi ve daha fazlası hakkında bilgi verir; WindowsWindows ile başlar . Windows'ta bir tarayıcıda çağrıldığında
$_SERVER['HTTP_USER_AGENT']içerecektir Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 bayt) PHP'de çalışıyor> = 5.3

Sonuç

Gerçekten Windows olup olmadığını söylemenin tek güvenli yolu, buna benzeyen bir şey değil, işletim sisteminin adını kontrol etmek gibi görünüyor. PHP için: php_os()güvenlik nedeniyle devre dışı bırakılabilir; ama PHP_OSmuhtemelen her zaman istenen bilgiyi içerecektir.


4
* Nix üzerindeki dosya adları ters eğik çizgi içerebilir, bu nedenle bu gerçekten kusursuz değildir. Kurallar kusursuz olmasına rağmen,, \ _ (ツ) _ / ¯
Jordan

@ Jordan: Haklısın. Bu bilgiyi açıklamaya ekledim. Teşekkürler.
Titus

4
Alternatif: <?=class_exists(COM);. Sınıf COMbildiğim kadarıyla sadece Windows altında kullanılabilir. Bu size bir bayt kurtarmalı.
Ismael Miguel

@IsmaelMiguel Bu şekilde göndermeniz için farklı bir cevap yeterli. (Ancak, buna
değmeyebilir

1
@ wizzwizz4 Buna değmez. Cevap unutulmayacaktı. Bu yüzden kendi cevabımı yazmak yerine yorumdan ayrıldım.
Ismael Miguel

16

Befunge-98, 7 bayt

6y2%!.@

Çevrimiçi deneyin!

Bu \, Windows'ta ve /diğer işletim sistemlerinde bulunan sistem yolu ayırıcısını sorgulayarak çalışır .

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 bayt

$OperatingSystem=="Windows"&

Bir işlev yapmanın amacı nedir? Bir ve bayt tasarrufu ve işareti kaldırabilirsiniz; ancak kodun Windows-ish sisteminde çalıştırılıp çalıştırılmadığını doğrudan değerlendirir.
Ruslan

@Ruslan Tüm cevaplar sonucu yazdıran tam programlar veya çağrılabilir işlevler olmalıdır. Eğer bu bir Mathematica dizüstü cevap ilan edilir, o zaman tam bir programdır olarak nitelendirdi paçayı olabilir, ama olmadan komut satırından şeyi çağırmak durumunda &, hiçbir şey yazdırmaz (ve aynı zamanda daha sonra çağrılabilir işlev değil , ancak yalnızca bir pasaj / ifade).
Martin Ender,

@MartinEnder Gerçekten çıktı yok mu? Bundan Out[1]= Falseçıktı alıyorum :~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan

@Ruslan Bunun bir notebook ortamı da (sadece komut satırı tabanlı) başlattığına inanıyorum. Komut satırından bir program çalıştırarak demek istediğim komut dosyası modunu kullanmak.
Martin Ender

13

Java 8, 33 bayt

separatorCharÖnerdiğiniz için Olivier Grégoire'e ve -1 bayt için Kritixi Lithos'a özel teşekkürler !

Bu bir boole döndüren bir lambda ifadesidir. Bu atanabilir Supplier<Boolean> f = ...;ve ile çağrılabilir f.get().

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

Çevrimiçi deneyin! - sunucu windows değil, bu yüzden yazdırıyorfalse. Ancak, Windows makinemde aynı kod yazdırılıyortrue.

Bu kod, sistemin dosya ayırıcısını almak ve kod noktasının karakterden büyük olup olmadığını kontrol etmektir [. Bu, Windows için, \ayırıcı olarak kullandığı için geçerlidir - fakat diğer tüm işletim sistemlerinde /, ASCII tablosunda daha düşük bir kodu olan kullanılır.


W ile başlayan diğer işletim sistemlerinde bu kırılma olmaz mı?
Downgoat

()->java.io.File.separatorChar=='\\'sadece 36 bayttır.
Olivier Grégoire

1
@ OlivierGrégoire güzel bir tane - ve onu kullanarak 34'e golf yapabilirim ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, Whonix. Muhtemelen daha da fazlası.
Olivier Grégoire

3
@Titus Bekle, ya WAITS ?
NoOneIsHere

11

J, 7 bayt

6=9!:12

Bu, 9!:125'in Unix ve 6'nın Windows32 olduğu sistem türünü elde etmek için yerleşik yabancı bağlantıyı kullanan bir fiildir (bir fonksiyona benzer) .


J Resmi belgeler, eski Windows için bu değeri döndürdüğünü gösterir. "6 Windows32 (95/98/2000 / NT)" Dokümantasyonun güncellenmesi gerekiyor mu? 64 bit Windows olduğunda ne olur? jsoftware.com/help/dictionary/dx009.htm
Keeta

64 bit Windows 7'de test edilmiştir ve 6 döndürür. Dokümantasyon oldukça eski görünüyor.
Keeta

@Keeta Evet, eski olduğunu düşünüyorum ama yine de Windows 10 64 bit için 6 aldı.
miller

11

R, 15 bayt

.Platform$O>"v"

Liste öğesi çıkarımı için kısmi eşleştirmeyi kullanmak için öneri için plannapus sayesinde .

.Platform , R'nin inşa edildiği platformun bazı ayrıntılarını içeren bir listedir. Bir öğe vardır OS.typebilgisayarın İşletim Sistemi (aile) vererek, karakter dizesi olan (isim "O" ile başlayan tek unsur). Biri "unix"veya "windows".

Yani "unix"o zaman daha az "v", ama "windows"o zaman daha büyük "v". Diğer geçerli 15 baytlık cevaplar

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

R işletim sistemleri Unix benzeri, Windows ve Mac aileleri için geliştirilmektedir . Diğer işletim sistemi aileleri desteklenmemektedir.


1
bildiğiniz pencereler olmayan unix dışındaki platformlar var ...
Blue

2
@muddyfish: .Platform [[1]] R belgelerinde "unix" veya "windows" olarak tanımlanmıştır. github.com/wch/r-source/blob/…
liori

Üzgünüm, o zaman sorun değil. Cevap muhtemelen tekrar sorulmayı durduracak olan bu gerçeği içerecek şekilde değiştirilmelidir
Blue

10

Perl, 11 bayt

print$^O=~MS

^O değişmez bir Control-O ile değiştirilmelidir.

Çıkışlar 1pencerelerde, başka OS üzerinde hiçbir şey.

Not sayPerl’de kaba olan yeni bir satır eklerken kullanmıyorum.

Primo sayesinde -2 bayt. (ve olası sabit sorunlar)
ais523 sayesinde -1 bayt.


AFAIR bu Cygwin Perl'de çalışmaz.
Igor Skochinsky

Bu da Perl'i karıştırmayacak. Perl, her ikisine de Windows'tan ayrı işletim sistemleri gibi davranıyor (Windows sözleşmelerinden ziyade genellikle UNIX'e uydukları için) ve sorunun amacına dikkat etmeleri gerekip gerekmediği açık değil. Diğer yandan, burada bir bayt kontrolü yerine gerçek bir kontrol-O karakteri kullanarak tasarruf edebilirsiniz ^O.

@ ais523 Düzenledim, teşekkürler. Cygwin ve Mingw'a gelince, Windows olarak kabul edilmeleri gerekiyorsa postayı sileceğim, ancak dediğiniz gibi, ayrı bir işletim sistemi (veya en azından Windows işletim sistemi gibi değil) gibi düşünmeleri daha mantıklı olacaktır.
Dada

Regex sınırlayıcıları gerekli olmamalı $^O=~W, buna rağmen muhtemelen karşı koyacağım MS. Alternatif olarak, aynı zamanda eşleştirebilirsiniz $^X=~':'.
primo

@primo sağ, teşekkürler. Wİçinde başka bir işletim sistemi tanımıyorum , bu yüzden Wpara cezası kontrolü yaptığımı varsaydım .. MSbunun yerine önerme nedenleriniz ?
Dada

9

julia, 10 bayt

is_windows

Windows için doğru döndüren bir işlev


9

x86 makine kodu, 9 bayt

40 39 04 24 75 02 CD 80 C3

Şundan derlendi:

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
saf ikili (COM) Windows veya Linux'ta çalışmaz, bu yüzden bunun geçerli olup olmadığından emin değil
Igor Skochinsky

@IgorSkochinsky Montaj için bir tercüman olmalı.
Shmuel H.

Kodu yalnızca bırakarak daha da kısaltabilirsiniz inc eaxve int 0x80sanırım pencerelerde başarısız olması ve işlemi sonlandırması gerekir.
Shmuel H.

2
@IgorSkochinsky Çok ham ikili çalışan programlar da var. Önceki yorumumdaki bağlantıya bakın.
Shmuel H.

1
Bochs ve QEMU çıplak metal ortamını simüle eder ve ikili kodu ana bilgisayar işletim sistemi altında çalıştırmaz. Yani IMO'yu çalıştırmayacaklar. Ancak bunların hepsi meta için bir tartışma olabilir.
Igor Skochinsky,

8

JavaScript, 42 30 26 25 bayt

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

Firefox ile test edildi. (Chrome'un oscpuözelliği yoktur.) Küçük harfler büyük harflerden daha büyük bir karakter koduna sahip olduğundan, bu , Firefox'un desteklediği herhangi bir platformda W , X , Y veya Znavigator.oscpu harflerinin ilk harfleri olmasından ve W harflerinin olmamasından , Tabii ki, Windows). Bu yayına göre , durum bu.

Düzenlemeler

  1. Neil sayesinde 12 bayt kurtarıldı .
  2. Başka bir dört bayt kaydedildi
  3. Blender sayesinde başka bir bayt kaydedildi .

oscpuMuhtemelen kullanabileceğiniz en kısa navigatorözellik. Ayrıca, bir regexp'i test etmek muhtemelen daha kısa sürede sonuçlanacak, ancak ölçmedim.
Neil

Sen kaldırabilir !=-1ve bir ekleme ~3 bayt tasarruf şişman ok sonra sağa.
Luke

Bir işlev oluşturmak zorunda mısın? Sadece console.logregex testi yapamaz mısın ? Ayrıca navigator.oscpu[0]=='W'işe ya da W ile başlayan başka bir işletim sistemi var mı

2
Hmm, bir sebepten dolayı Chrome'umda oscpu yok.
Muzer

2
navigator.oscpu>'V'de işe yarayabilir
Blender

8

C #, 61 48 bayt

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

TheLethalCoder sayesinde 13 bayt kaydedildi

Veya 83 byte'ta tam bir program:

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

Çeşitli Windows varyantları, Microsoft .NET uygulamasında 0 ila 3 enum değerlerini kullanır . 4, Unix, 5, Xbox [360] ("Windows" düşünmeyeceğim), 6 ise MacOSX. Mono aynı değerleri kullanır ve önceki sürümlerde Unix / Linux için 128 ekler.

Bu nedenle, <4 olan herhangi bir şey Windows'tur ve her şey Windows değildir.


2
Bir şey eksik olup olmadığından emin değilim, ama neden değerini bir değere çeviriyorsunuz int?
Auhmaan

@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- temelde, C # 'ın yazarak kuralları Ben karşılaştırmak olamaz diyor PlatformIDve intdoğrudan ve örtülü hiçbir dökme gelen var PlatformIDetmek int. Ama olan bir açık Burada yararlanmak kendi değerlerine, tüm çeteleler gelen dökme ...
Bob

1
@ MustafaAKTAŞ Ayrıca, bunun C # /. NET Framework / .NET Core'u hedef aldığını belirtmek zorundayım. Xbox One'da farklı bir API kullanmak UWP uygulamaları çalıştırmak için sadece mümkün hariç System.Environment.OSVersionhiç . Bununla ilgili sorun yaşayacaksanız, UWP dışındaki diğer yanıtları da silmelisiniz. Ayrıca (şu anda) UWP uygulamalarını Windows dışı platformlarda çalıştıramayacağınız, böylece bunları silebilirsiniz. Bu sizi 0 cevap ve cevaplanamayan bir soru ile bırakıyor.
Bob

1
Action<bool>İlk örnekte 48 byte için derleyebilirsiniz (test etmedim ama çalışacağına inanıyorum) _=>(int)System.Environment.OSVersion.Platform<4;Yine de ()=>...49 byte olması gerekebilir
TheLethalCoder

1
Burada Funcs ve Actions gibi anonim işlevler derlenirken her zaman kullanılır. Golf ipuçları sayfasında olduğuna inanıyorum ve neredeyse her zaman kullanıyorum. Ayrıca anonim işlevler diğer dillerde de çok fazla kullanılıyor, bu yüzden onları burada kullanmanın güvenli olduğunu düşünüyorum
TheLethalCoder

7

Toplu, 50 bayt

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

Düzenleme: DOS olduğunu Windows olduğunu iddia etmek yerine yoksaymak düzeltildi.

Sadece Windows'un dışında Toplu çalışan biliyoruz başka yolu varsayılan olarak eşler ŞARAP kullanmaktır Z:için /. Bu nedenle, Z:\bin\shvarsa, şans, bu yüzden /bin/sh, MS Windows değil.

WINE% OS% 'ye neyi ayarladı bilmiyorum, ancak değilse o Windows_NTzaman 23 bayt kaydedebilirim.


1
Başka bir yol da Windows olmayan DOS.
Ruslan

Bu yalnızca DOS altında değil, Z: 'in eşlendiği ve böyle bir yol içerdiği bir bilgisayarda da başarısız olmaz.
Ad

1
En azından WINE'ı tespit etmeye çalışıyorum . WINE altında çalıştırıldığında diğer cevapların hiçbiri doğru sonucu vermeyecektir.
Neil

3
@ Adám Tabii ve C cevabını -DWIN32 = 1 ile derlerseniz başarısız olur. Puanınız?
Neil

1
evet, şarap setleriOS=Windows_NT
Jasen

7

QBasic, 31 bayt

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

Windows altında sıfır olmayan, her şeyin altında 0 yazdırır.

COMSPECMicrosoft işletim sistemlerine özgü bir ortam değişkenidir. Komut yorumlayıcısına işaret eder, tipik olarak command.comveya cmd.exe. Windows altında, komut yorumlayıcısı Windows dizininde bir yere oturur; MS-DOS altında, DOS dizininde veya diskin kökünde oturur ve başka bir işletim sistemi altında yok.

Değerinin COMSPEC"W" olup olmadığını kontrol ederek Windows ile Windows arasındaki farkı söyleyebiliriz.


COMSPECözellikle Linux altında herhangi bir şey ifade etme hakkına sahip değildir (yani, varsayılan olarak kullanıcı kontrolü altındadır), bu nedenle kullanıcının kendi amaçları için kullandıkları bir değere ayarlaması mümkün değildir (ve W)? Kuşkusuz, bu biraz zor bir durum.

1
@ ais523: Ayrıca, Windows dizininin bir W içermesi gerekmiyor. Her iki durumda da kırılgan.
Joey

7

Node.js, 27 16 15 13 bayt

Düğüm REPL'i kullanarak çözümümden 12 bayt geçen @Patrick sayesinde :

_=>os.EOL>`
`

Orijinal çözüm:

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

Bunu değiştirirseniz Node.js REPL, 16 bayt'ı sadece kullanarak_=>path.sep!='/'
Patrick Roberts

Ben kodgolf için yeniyim. Bunu yapmama izin var mı?
GilZ

Evet, aksi halde öneremezdim. REPL node, konsola girdiğinizde çalışan programı okuma, yürütme, yazdırma döngüsü anlamına gelir . Oradan, tüm sistem düğümü modülleri, require()onlara gerek kalmadan kullanılabilir .
Patrick Roberts

Ah evet, üzgünüm. Ben Sen değiştirerek başka byte kaydedebilirsiniz 11. demekti !=için >ASCII endeksi beri \ 92 ve /47. olan
Patrick Roberts

7

Excel VBA, 41 40 30 29 26 24 Bayt

Döndüren Acil pencereler fonksiyon truebilgisi çıkışı ya başka sınırlıdır çünkü sistemin işletim sistemi kod başlarsa, uzunluk 3 daha uzun macveya pcdosbu döndüren truepencereler adet sadece

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

Önceki sürümler

''# 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

değişiklikler

Kullanmak için Neil -1 sayesinde Left(...,1)üzerindeMid(...,1,1)

-10 Mego'nun Yol Ayırıcı Numarasını @ işaret ettiği için ChrisH'e teşekkürler

-1 Kullanmak yerine kontrol etmek WorkbookPathiçin"\"Application.Path Separator

-4 Geçiş için Environ()

-2 geçmek için [Len(Info(...

Yeni Çözüm, 51 bayt

VBE'ye çıkan yeni subyordam , koşullu derleme yöntemiyle 1 (truthy)pencereleri , pencerelerin altını ve 0 (falsey)mac altını hemen açar .

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

1
leftsize bir bayt kazandırır.
Neil

Office365'te çevrimiçi denediniz mi? Bu bile VBA destekliyor mu? Sadece merak.
Chris H,

@ChrisH Bilgime göre office.com çevrimiçi VBA komut dosyalarını desteklemiyor (başka biri daha iyi bilirse lütfen bana söyleyin, bu benim hayatımı önemli ölçüde kolaylaştırır); Bununla birlikte, O365 ile Office 2016'nın bir kopyasını (veya güncel olanı) masaüstünüze indirme hakkınız vardır ve bu VBA komut dosyasını desteklemektedir.
Taylor Scott

Şimdiye kadar ondan kaçmayı başardım; devam etmeye hazır göründüğünü söyleyen yorumunuz dikkate alındığında (kullandığım tek pencereli makinelerde ofisin bir kopyası var, kişisel makinelerin hepsi Linux'tur)
Chris H

1
@ Mego'nun yol ayırıcı numarası ( ?Application.PathSeparator)="\"tek bir karakter olarak 32 olur)
Chris H,


5

APL (Dyalog) , 21 bayt

'W'∊∊#⎕WG'APLVersion'

Çevrimiçi deneyin!

#⎕WG'APLVersion' Kök ( # ) W indow G özellik APL Sürümü

 enlist (düzleştirmek)

'W'∊ olduğu W üyesi? (Windows olmayan döndürülen değerlerin hiçbiri büyük W içermez)


4

tcl, 38 bayt

 expr [lsearch $tcl_platform windows]>0

4

PHP 17 Bayt

Aşağıdakiler, eğer pencereler varsa 1, başka bir şey değilse hiçbir şey çıkmaz. Dize dönüştürme bildirimlerini dikkate almamak.

<?=PHP_OS==WINNT;

Çevrimiçi deneyin Linux için testler yapın çünkü sanal alan PoC için linux'dur.


Bunun yeterli olduğuna emin misin? Çünkü Olası Değerler: PHP_OS .
Manat çalışması

1
'<? = PHP_OS [0] == W; `hem 1 bayt daha kısa hem de manatwork ile bağlantılı sorudaki diğer tüm pencere değerlerini yakalar. >Vde işe yarayabilir.
user59178

yapay çalışma PHP'nin hangi pencere sürümünün derlendiğine bağlıdır, çünkü Windows Visa \ 7, Windows sürümü NT Authority Çekirdeği nedeniyle WINNT ile temsil edilmiştir. Windows XP ve altındaki Windows WIN32, Windows Server 2003 ise Windows idi.
DrWhat

4

Java 8, 49 bayt

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

Diğer Java cevaplarından daha uzun , ancak farklı bir yaklaşım izliyor.

Bu lambda a'ya uyar Supplier<Boolean>ve aşağıdaki programla test edilebilir:

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();
  }

}

Bağladığınız ilk cevaba çok (çok, çok benzer) (düzenlemelerden önce).
Olivier Grégoire

Neden sadece değil .contains("W")?
Cyoce

@Cyoce aslında, işletim sistemi değişkeni Windows'a özgü görünüyor.


4

bash + coreutils, 5 bayt

rm $0

Ayrıca diğer çoğu POSIXy mermisinde de çalışır. (Windows bağlantı noktalarının bulunduğunu bashve rmvar olduklarını unutmayın ; yalnızca normalde daha yoğun POSIXy işletim sistemlerinde kullanılsalar bile, bu tamamen boş bir giriş değildir.) Çıkış koduyla çıkış yapar (0 = false, 1 = true). Bir dosya adı üstlenmenize izin verilirse 4 bayt olarak sayılabilir (örn. rm a). Bunun çok tuhaf dosya rmisimleri durumunda ( muhtemelen alıntı yapmama nedeniyle argümanlar olarak yorumlanacak ve muhtemelen önemsediğiniz dosyaları silecek olması durumunda başarısızlıkla sonuçlanabileceğini unutmayın) bu yüzden bu programı tuhaf bir isimle bir dosyadan çalıştırmamanızı tavsiye ederim. ).

Not: Programı diskten bir yan etki olarak siler veya en azından dener. Windows'da çalıştığımız durumda, işletim sistemi çalışan dosyayı (Windows varsayılan ya da tam durduğunda devre dışı bırakan bir işlem) silmez ve bu nedenle rmhata verir. bashhatayı yakalar ve bir çıkış koduna dönüştürür (bu nedenle program bir bütün olarak normal şekilde sonlanır). Buradaki diğer girişlerin çoğu, falsey için 0, çıkış kodlarında ise truthy için 1 kullanıyor, bu aynı şekilde; bash'nin ififadesinin tamsayıları kabul etmediğine dikkat edin (aksine, başarılı bir şekilde çalışıp çalışmadıklarına bağlı olarak komutları ve dalları kabul eder ve aritmetik testler gibi programlar aracılığıyla yapılır.testbu, kasten başarısız bir karşılaştırmada bir "çökme" bildirmiştir), bu nedenle bu, bir ififade testinde 0'ın geçerli olduğu ve programı elseşubeye gönderdiği dillerde çıkış kodu aracılığıyla çıkarılan programlardan ziyade yasallık açısından zordur .


4

8 , 11 bayt

 
os 1- not .
 

trueWindows'ta, falseLinux ve macOS'ta yazdırır . Sekizinci tarafından desteklenen diğer platformlar Android, iOS ve Raspberry Pi, ancak bunları test edemiyorum.

Ungolfed versiyonu (yorumlarla)

 
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 bayt)

import winreg

Pencerelerde ise çıkış kodunu sıfır (genellikle kabuklarda geçerlidir), aksi halde sıfır olmayan bir çıkış koduyla döndürür.

Eğer da başka biçimde tercih ederseniz, bir 12 bayt çözümü var: import posix.


winreg.pyAynı dizinde adı verilen bir dosya varsa, bunun işe yaramayacağını düşünüyorum .
Zacharý

1
Ayrıca, kurallara göre: "Bir platformda çalıştırılamayan / derlenmeyen kod, bir falsey değeri olarak sayılmaz."
Zacharý

4

TrumpScript , 17 bayt

America is great.

Çevrimiçi deneyin!


Bu program, eğer Windows'ta çalışıyorsa, aşağıdakileri basacaktır:

The big problem this country has is being PC

Bu bir truthy değeri olarak kabul edilir.


Boş çıktı ve aşağıdaki değer yanlış:

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

Boş çıktı herhangi bir linux sistemde (bu program için) gerçekleşir, uzun elma tepkisi açıkça Mac'te (herhangi bir program için) gerçekleşir. TIO'da, arka uç (sanırım) bir Unix işletim sistemidir, bu nedenle yalnızca sahte değeri alabilirsiniz; Bilgisayarımda PC mesajı alıyorum.


Bu bir hata mesajı olarak kabul edilip edilmeyeceğinden% 100 emin değil (ki cevabı geçersiz kılar), ama eğer bunu bilmiyorsanız muhtemelen sizin için gülmeye değdi.


Dünya ne oldu ...
ooransoy

@avaragecoder PYTHON BÜYÜK BİR BAKIŞ YAPIN!
Magic Octopus Urn,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.