Yetersiz rekabet: İS savaşı [kapalı]


29

Hangisinin en iyi işletim sistemi olduğu konusundaki tartışmanın birçok alev savaşına neden olduğunu hepimiz biliyoruz. Amacınız şimdi, en sevdiğiniz işletim sisteminin daha iyi olduğuna dair kesin bir “kanıt” sağlamaktır… ah, hayır, çok daha iyi, başka bir işletim sisteminin kötü olduğuna dair kesin bir “kanıt” sunmak.

Görev: Bazı hesaplamaları yapan bir program yazın ve en az bir işletim sisteminde doğru çalışıyor ve en az bir diğerinde yanlış çalışıyor.

  • Program en azından bazı hesaplamaları yapmalıdır, bu nedenle basit bir girdi okumak zorundadır (tercihen standart girişte veya eğer isterseniz dosyalardan geliyorsa, ancak küçük endian / big endian'ı kötüye kullanmak sadece ucuz değil, aynı zamanda açıktır) . ve girişe bağlı olarak bazı çıktılar sağlar. Hesaplamalar anlamlı ve haklı olmalıdır, örneğin gerçek bir yaşam veya matematik problemini çözme.
  • Her iki işletim sistemini de, hangisinin doğru çalışacağını ve hangisinin çalışmayacağını belirterek belirtmelisiniz. Her iki işletim sistemi de iyi bilinmeli ve kabaca aynı zamanda (yani modern bir işletim sistemine karşı DOS 1.0 yok). Spoiler etiketlerinde (özellikle birçok insanın fark etmeyeceğinden şüpheleniyorsanız) farkın nedeni hakkında kısa bir açıklama yapmanız önerilir.

bunun gibi

  • farkın nedeni ince olmalı, yani hayır #ifdef _WIN32ya da benzer, lütfen! Unutmayın, amacınız bu özel sistemin kötü olduğunu "kanıtlamak", bu yüzden insanlar hilenizi tespit etmemelidir!

  • Kodunuzda çok garip veya çok sıradışı bir parça varsa, neden orada bulunduğunu yorumlarda haklı göstermelisiniz. Tabii ki, bu "gerekçe" büyük bir yalan olabilir / olacaktır.

puanlama:

Bu bir golf değil! Kod iyi organize edilmeli ve basit tutulmalıdır. Unutmayın, amacınız bir hatayı gizlemek, böylece insanlar şüphelenmeyecekler. Kod ne kadar basitse, o kadar az şüphelidir.

Kazanan oy ile karar verilecek. İlk geçerli gönderimden yaklaşık 10 gün sonra en fazla oy kazanır. Genel olarak, kodun okunmasının ve anlaşılmasının kolay olduğu cevaplar, ancak böcek iyi gizlenmiştir ve keşfedilse bile, kötülükten ziyade bir hataya atfedilebilir. Benzer şekilde, sadece programın çökmesine veya herhangi bir şey yapmamasına değil, hatanın yanlış sonuç vermesine neden olması daha değerli olacaktır.

Her zaman olduğu gibi, herhangi bir öznel kriterde en fazla oy alanın% 10 veya 1 puanından az değilse, kazanan olarak bir cevap seçme hakkını saklı tutarım.


5
İlginç bir make (1)şekilde temel olarak her unix kutusunda ve bazı pencerelerde uygun olmayan şekilde çalışır. İşletim sistemleri nedeniyle değil, dosya sistemleri nedeniyle. Dosya değişiklik tarihlerini düşük hassasiyette tutan herhangi bir dosya sistemi, makehızlı bir makinede düzgün şekilde başarısız olabilir .
dmckee

1
@dmckee: bu yüzden her şeyi açık bırakmadığım için mutluyum, ve bazı girişleri okumak ve basit hesaplamalar yapmak zorundasınız.
vsz

10
Ben sadece şimdi anladım, bu kötü kod arayışı 6666 Id
vsz 19:12

3
İşte Windows'ta ve Mac'te değil, <Windows'ta ve <Linux Dağıtımını Ekle> çalışan bir cevap ümidi.
Casey Kuball

1
Bu soruyu konu dışı olarak kapatmak için oy veriyorum, çünkü bu konudaki aşikar zorluklar artık konu dışı. meta.codegolf.stackexchange.com/a/8326/20469
kedi

Yanıtlar:


15

Unix kabuk + standart yardımcı programları

En fazla CPU zamanını kullanan işlemi (herhangi bir kullanıcının sahibi olduğu) bulan ve tüm işlemleri aynı adla öldüren bir kabuk betiği yazalım. Sanırım veri okuma (sistemden) ve bir hesaplama yapmak sayılıyor. (Bu davranış, çatal bombaları ve Google Chromium gibi birçok işlemi gerçekleştiren işlemler için yararlı olabilir.)

Aşağıdakiler, işlem zamanını en yüksek CPU zamanı ile elde etmenin taşınabilir bir yolu olmalıdır (bariz Linuxizmlerden kaçınmaya çalıştım ancak Solaris'te test etmedim):

ps -A -o time= -o comm= | sort | tail -n 1 | cut -d ' ' -f 2

Yani senaryomuz basit.

killall `ps -A -o time= -o comm= | sort | tail -n 1 | cut -d ' ' -f 2`

En iyi sonuçlar için root olarak çalıştırın, böylece diğer kullanıcılardan gelen işlemleri öldürebilir.

Linux ve BSD

Bu Linux üzerinde çalışır ve BSD'ler üzerinde çalışmalıdır, çünkü killall argadlandırılmış işlemleri öldürür arg.

Solaris

Bununla birlikte, Solaris'te, bir kullanıcı 9sonsuz bir döngüde adlandırılmış bir program çalıştırıyorsa , komut dosyası sistemi indirir . Bunun nedeni ise:

Solaris'te tüm süreçleri sinyal ile öldürmekkillall arg demektir . Böylece komut satırı olur . Solaris'teki SIGKILL'in numarası gibi , bu tüm süreçleri öldürecek ve böylece sistemi çökertecektir .argkillall 99

NB

Bu kabuk enjeksiyon sorunu Linux'ta geçerli değildir, çünkü kötü niyetli kullanıcı -KILLbir işlem adı gibi bazı özel argümanlar sunsa bile killall -KILL, zararsız bir şekilde bir kullanım mesajı yazacaktır.


3
killallolduğu olmayan bir örneği değildir. Aynı ada sahip sadece iki farklı program. Her sürüm düzgün çalışıyor.
dmckee

7
Evet, ancak kabuk betiği düzgün çalışmıyor.
Mekanik salyangoz

12
Chromium ve çatal bombaların karşılaştırılabilir olduğunu fark ettiniz mi? ;)
kaoD

7
@kaoD: Önemli fark çatal bombalarının daha az hafıza kullanmasıdır.
Mekanik salyangoz

1
Sadece "Google Chromium" diye bir şey olmadığını belirterek: Google Chrome tarayıcısı olan açık kaynak dayalı Krom tarayıcısı, fakat sadece eski Google'a özel kodu içeren ve Google'ın adı ekli sahiptir.
Anko

18

piton

Bu program komut satırında belirtilen görüntüyü açar ve görüntüler.

import Image
import sys

with open(sys.argv[1]) as f:
    im = Image.open(f)
    im.show()

Linux üzerinde çalışır, pencerelerde çalışmaz.

Bunun nedeni pencerelerin dosyaları açma şeklidir. Tüm işletim sistemlerinde düzgün çalışması için ikili mod belirtilmelidir.


4
Program bazı hesaplamalar yapmalı ve sonuçları göstermelidir. Belirli bir işletim sisteminde ayrıca bazı sonuçları göstermelidir, ancak yanlış olanları da. Evet, zekice bir kelime oyunu ile programınızın tam olarak ne yaptığını iddia edebilirsiniz, ancak bence kuralların kasıtlı olarak yanlış yorumlanmasıdır. Ancak, nihayetinde seçmenler karar veriyor.
vsz

5

Küçük Endian (Intel x86) vs. Büyük Endian (IBM Power7)

Ana bilgisayar olmayan düzende çok baytlık ikili miktarların olduğu herhangi bir dosya formatı yanlış yorumlanma riskini taşır. İşte bir ham ses alan, örneğin bir Microsoft küçük endian dosya biçimi olan bir WAV dosyasından çıkarılan, genliği yarıya indiren ve zayıflatılmış sesi veren bir işlev.

#include <stdio.h>

int main()
{
    short audio;
    while (fread(&audio, sizeof(short), 1, stdin))
    {
        audio >>= 1;
        fwrite(&audio, sizeof(short), 1, stdout);
    }
    return 0;
}

Küçük endian makinelerinde bu harika çalışıyor, ancak büyük endian makinelerinde bu bir felaket. Örneğin

01001101 11001110 -> CE4D (little endian format)

Küçük endian'da sağa kaydırın:

00100110 01100111 -> 8726 (correct)

Büyük endian'da sağa kayın:

00100110 11100111 -> E726 (not correct)

Bazı nybbles'ların doğru olduğuna dikkat edin! Aslında, ses örneğinin en az anlamlı bitinin 0 veya 1 olmasına bağlı olarak, çıkışın doğru olması 50:50 şansı!

Bu yüzden, bu sesi dinlerken, yarım genlik gibidir ancak bir miktar yüksek sesle kaplanan yüksek sesle gürültülüdür. Hazır değilsen, oldukça şaşırtıcı!


5

GTB

:"-→_[_+_→_]

Bilgisayarda çalışıyor, ancak TI-84 hesap makinemde çalışmıyor. Niye ya?

Hesap makinesinde RAM taşar ve potansiyel olarak temizlenir, Windows için emülatörde, sınırlı tahsis nedeniyle RAM emülatör tarafından taşılamaz.


Bu ne işe yarıyor?
Ilmari Karonen

Soruda gizli metni görmek için farenizi kullanabileceğiniz bir spoiler (sarı kutu) var.
Timtech

4
Evet, ama RAM taşmadığı ne yapar ? Aslında “bazı hesaplamaları yapın”, sorduğu gibi soru ve eğer öyleyse ne?
Ilmari Karonen

@IlmariKaronen Sadece dizeleri birleştirir. (Tabii ki belirleyebilirsiniz)
Timtech

4

C

Problem 100'e bu çözüm (Collatz dizisi hakkında) UVa Online Judge tarafından kabul edilmiştir.

Ancak, bu kod yalnızca * nix platformunda düzgün çalışır, çünkü longtür 64 bit işaretli tamsayı olarak uygulanır. Üzerinde , Windows için, kod çağıran, davranış tanımlanmamış longtürü 32 bitlik işaretli tamsayı olarak uygulanan bir ara madde değer bir süre cyc()fonksiyon ihtiyaçlarını, en az bir 32-bit temsil etmek.

#include <stdio.h>

#define swap(a, b, t) t __tmp__ = a; a = b; b = __tmp__;
#define M 1000000

short l[M] = {0, 1};

int cyc(long n) { // HERE
    if (n < M && l[n]) return l[n];
    n = n & 0x1 ? 3 * n + 1 : n >> 1;
    return n < M ? (l[n] = cyc(n)) + 1 : cyc(n) + 1;
}

int max(int a, int b) { return a > b ? a : b; }

int main() {
    #ifndef ONLINE_JUDGE
    // freopen("input.txt", "r", stdin);
    #endif
    int i, j, m;
    while (scanf("%d %d", &i, &j) == 2) {
          printf("%d %d ", i, j);
          if (i > j) { swap(i, j, int); }
          for (m = 0; i <= j; i++)
              m = max(m, cyc(i));
          printf("%d\n", m);
    }

    return 0;
}

Bunu daha fazla uyumsuz kılmanın başka bir yolu, diziyi liçine koymak main()ve cyc()işleve karşılık gelen değişiklikleri yapmaktır . Yürütülebilir dosya Windows'ta varsayılan olarak 2 MB yığın istemek üzere ayarlandığından, program hemen çöküyor.


2

piton

Ben bu rastladı StackOverflow'daki giriş zaman aşımları ararken.

 import signal 
 TIMEOUT = 5

 def interrupted(signum, frame): 
     print 'interrupted!' 
 signal.signal(signal.SIGALRM, interrupted) 

 def input(): 
     try: 
         print 'You have 5 seconds to type in your stuff...' 
         foo = raw_input() 
         return foo 
     except: 
         return

 signal.alarm(TIMEOUT) 
 s = input()
 signal.alarm(0) 
 print 'You typed', s 

Bu, Windows için çalışmıyor.


Bu neden Windows'da çalışmıyor? Windows POSIX SIG'leri desteklemediği için doğru mu tahmin ediyorum? Öyleyse, Python'un her iki işletim sistemine de işlevsellik sağlayan standart kütüphanelerinden ibaret. Mücadelenin ruhunu takip ettiğini sanmıyorum (örneğin, Python'un çatalı açık nedenlerden dolayı işe yaramaz) ama bu, Python'un hatası (artı yorumlanması gerçeğidir), Windows' değil. Örn: dahil conio.holmak üzere aynı etkiye sahip olur, fakat C bile derlenmez.
kaoD

@kaoD: Dürüst olmak gerekirse, neden Windows'da da çalışmadığını bilmiyorum. Belki Linux'un içinde Windows'un bulunmadığı bazı özellikler vardır, bu yüzden bu Windows'a değil Linux'a da uygulanabilir.
beary605

Öyleyse tahmin ettiğim şey: Python'un maruz kaldığı POSIX işlevselliğini kullanıyorsunuz. IMHO bu daha önce belirtilen sebeplerden dolayı bir cevap olarak uymuyor, ama hey, ben sadece kolonideki başka bir karıncayım;) Gördüğünüz şey Windows değil Python'un "hatası". Şuna
kaoD

Windows API, iş parçacığı içinden bir boruda iptal edilebilir okuma sağlamaz.
Joshua

0

Linux + bash + GNU çekirdeği

rm --no-preserve-root -R -dir /

Bu, Windows için bash kursanız bile, kök klasörü ve Windows'ta bulunmayan her şeyi silecektir :)


Windows üzerinde bu çalışmalar artık Windows Linux alt sistemi inşa ettiğini (Sanırım, denemek olmaz).
Pavel

@Pavel Açılmadığını cmd.exeve rmçalışmadığını görmek için yazın .
MD XF
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.