100 karakter içinde en kullanışlı programı yapın [kapalı]


13

Bu görevde, 100 karakter içinde yazabileceğiniz her şeyi yapmak için yararlı bir program yapmanıza izin verilir. Daha az karakter kullanmanıza izin verilir, ancak daha fazla karakter kullanamazsınız.

Kurallar, artık komik olmayan standart boşluklardan korumak için:

  1. Gerçekten gerekmedikçe programınız internete erişemez. Örneğin, bu web sitesinde en çok oylanan soruyu gösteren program, bu soruyu kontrol etmek için İnternet'i kullanabilir. Ancak, gerçek kaynağını bulmak ve çalıştırmak için internette gezinmek yasaktır.

  2. Programınız yazıldığı dil için bir tercüman olamaz. Ancak, Brainfuck olmayan bir dilde Brainfuck tercümanı iyi olur.

  3. Programınız, tam olarak programınızın yaptığı şeyi yapan harici programlar yürütemez. Örneğin, çalışamaz vimve programınızın vimuygulandığını iddia edemezsiniz .

  4. Programınız çalıştırıldığı bilgisayar ve diğer bilgisayarlar için tehlikeli olamaz. Aşağıdaki gibi bir program yazmanıza izin verilmiyor rmdir /(buradaki örnek kasıtlı olarak çalışmıyor, düzeltmeyin) ve bilgisayardaki tüm dosyaları kaldırmak için yararlı bir program olduğunu iddia edersiniz .

  5. Programınız istediğiniz kadar yavaş olabilir ve istediğiniz kadar kaynak kullandığınız sürece, istediğiniz kadar kaynak kullanabilir.

  6. Bu görev için özel olarak dil oluşturmanıza izin verilmiyor. Ancak, icat ettiğiniz dil için başka bir programlama dilinde tercüman yapmanıza izin verilir.


Bu yarışma için birden fazla cevap gönderebilir miyim?
TrungDQ

@TrungDQ: Elbette.
Konrad Borowski

1
Bu, bugüne kadarki en iyi sorulardan biri olmalı;)
Timtech

13
Bu, böyle bir site için bile, popülerlik yarışması için bile çok açık uçlu. Kelimenin tam anlamıyla herhangi bir cevap geçerlidir, bunları karşılaştırmak için hiçbir referans çerçevesi yoktur.
Aaronaught

3
Bu soru yamyamlık-golf. İlginç 100 karakter fikri, harika kod altın sorularına dönüştürülebilmelidir. Cevaplayanları cevaplarını yeni sorulara dönüştürmek için birkaç dakika daha harcamaları konusunda teşvik ederim.
gnibbler

Yanıtlar:


26

C - 47 bayt

Aşağıdaki program, insanlık tarihinde yazılan her belgenin yanı sıra, hiç yazılmayacak her belgeyi ve hiç kimsenin gelmeyeceği ilginç metinleri (aralarında "biraz" çöple birlikte) çıkarır. Sadece biraz zaman ver. Dahası, her çalıştırdığınızda, önce farklı metinler çıkarır! Eğer işte kullanışlı değil! (Ve bunların hepsi karakter sınırının yarısında!)

main(){srand(time(0));while(1)putchar(rand());}

Her seferinde başka bir şey çıktısını umursamıyorsanız, sadece 41 bayta ihtiyacınız var !

main(){srand(0);while(1)putchar(rand());}

Tam olarak C99 uyumlu değil, ancak sorunsuz bir şekilde derleniyor gcc.exe (GCC) 4.7.0 20111220.

Kurallar durumu

Programınız istediğiniz kadar yavaş olabilir ve istediğiniz kadar kaynak kullandığınız sürece, istediğiniz kadar kaynak kullanabilir.

Sorun değil.

Bazı şeyler, bu program çıktı olacak:

  • her Milenyum Problemine bir çözüm
  • yarının gazete makaleleri
  • Shakespeare'in tüm çalışmaları (tabii ki)
  • en karanlık sırrın
  • bu sorunun diğer tüm cevapları

Gerçekten değil, çünkü (yorumda doğru olarak zikredildiği gibi), rand () sadece bir noktada sarsılacak - muhtemelen bir çok anlamlı metin üretmek için çok erken - sahte bir jeneratör. Ancak gerçek bir (donanım) rasgele sayı üretecinden veri almanın 100 karakter içinde uzaktan mümkün olduğundan şüpheliyim. Yine de, eğlenmek için burada bırakacağım.

Dennis'in belirttiği gibi, algoritmanın rastgele olması, rand()^rand()>>16yerine ( karakter sınırı dahilinde) bir şekilde geliştirilebilir rand().


10
Şart değil. rand()sadece takma addır - çevrilmeden önce yararlı bir metin üretmeyebilir.
user12205 23:14

1
@ Neyse ki hala bu sorunun kuralları dahilinde! :)
Martin Ender

1
@ m.buettner: ile GlibC en rand () bir dizi olarak çıkış görüntüleme: sizin programın çıkış bayt arasındaki basit bir cebirsel ilişki vardır x, sahip x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256, c[i]olasılık 0.25 ile olasılık 0.75 ve 1 0 'dır. Bu, bahsettiğiniz şeyleri üretemeyeceği anlamına gelir.
Dennis

1
@ m.buettner: PRNG'yi daha iyi yapmaz, ancak rand()^rand()>>16düz yerine doğrusallığı kaldırabilirsiniz rand(). Baytlara kaydetmenin yollarını arıyorsanız, intve öğelerini kaldırın %256.
Dennis


18

BBC BASIC, 84 karakter

MODE 6:INPUT T,A,B,A$,B$:FOR X=0 TO 1279:A=A+EVAL(A$):B=B+EVAL(B$):DRAW X,A+500:NEXT

Birinci ve ikinci mertebeden diferansiyel denklemlerin çözümlerini çizer.

Kullanıcı girişi olarak alır:

Title (does nothing)
Start value for A (plotted value)
Start value for B (not plotted)
Expression for dA/dX
Expression for dB/dX

Kimya mühendisi olarak çalışırken kullandığım Polymath adlı diferansiyel denklem çözme yazılımından esinlenildi. Reaktanlar ve ürünler için farklı denklemler girer ve tüm reaksiyon sisteminin zaman içinde nasıl değiştiğini görürdük. Çok basit bir yazılım (bundan daha karmaşık değil), ancak bu amaç için Excel'den çok daha uygun. Ne yazık ki 100 karakterde tam bir Polymath klonu yapamıyorum.

resim açıklamasını buraya girin


10

Mathematica 76

Bu program, 240 ülkeden herhangi biri için çeşitli mülklerle ilgili bilgileri gösteren bir uygulama oluşturur. Afganistan'ın yetişkin nüfusu hakkında bilgi ile açılıyor. Kullanıcı, açılır listelerden ülke ve mülk ayarlarını değiştirebilir.

Mathematica, WolframAlpha ile sorunsuz bir şekilde birlikte çalışır.
Bu nedenle, başvurunun zorluğun 1. gereksinimini karşıladığına inanıyorum: "Programınız gerçekten gerekmedikçe internete erişemez ".

Bu oldukça mütevazı uygulama, Mathematica dilinde mevcut işlevselliği kullanır. Kısa bir video , uygulama hakkında bazı ek bilgiler sağlar.

d = CountryData; Manipulate[WolframAlpha[p <> " " <> c], {p, d["Properties"]}, {c, d[]}]

alfa


Aşağıda, ülkelerle ilgili ilk 20 (223) mülkün listesi bulunmaktadır. Ek bir programlama ile ülkeler hakkında ek bilgi edinebilir ve bu bilgiyi Mathematica'da analiz edebilirsiniz.

CountryData["Properties"][[;; 20]]

{"AdultPopulation", "AgriculturalProducts", "AgriculturalValue Added", "Airports", "AlternateNames", "AlternateStandardNames", "AMRadioStations", "AnnualBirths", "AnnualDeaths", "AnnualHIVAIDSDeaths", "ArableLandArea", "ArableLandFraction" Alan "," BirthRateFraction "," BorderingCountries "," BordersLengths "," BoundaryLength "," CallingCode "," CapitalCity "," CapitalLocation "}


Programınızın internete nasıl "erişmesi gerektiğini" görmüyorum. Sunduğunuz veriler, dışarıdaki bir kaynağa güvenmeniz gerektiği sıklıkta değişmez.
shiona

1
Kaynağın içinde mi yoksa dışında mı olduğu tartışmaya açıktır. Kod doğrudan bir Wolfram veri sunucusuna danışıyor ve bir tarayıcı kullanımını gerektirmiyor olsa da, (gerekli olan) "internete erişim" örneği olmak için WolframAlpha (bu kodun yaptığı) hakkında bilgi talebi düşünüyordum FireFox gibi. Bir ağ veya WIFI bağlantısı olmasını gerektirir
DavidC

1
-1 yapabilseydim - bu sadece önceden var olan bir hizmetten bir veri yapısını mühimmat eder.
l0b0

@ l0b0 Sanırım bu şekilde görebiliyordunuz. Veya dilin işlevselliğinden faydalandığını söyleyebilirsiniz. Sonuçta, WolframAlpha sıfırdan Mathematica ile birlikte çalışmak üzere tasarlandı.
DavidC

1
" WolframAlpha'daki bilgiler Mathematica ve Wolfram Dilinin ayrılmaz bir parçasıdır " oldukça endişe verici bir durumdur. Bu, onu var olan en az kararlı programlama dili yapmalıdır.
Peter Taylor

9

bash, 100 bayt

head -c${1--1} /dev/zero |
openssl enc -aes-128-ctr -pass file:/dev/random 2>/dev/null |
tail -c+17

Bu komut dosyası, şifreli olarak güvenli bir bayt akışı yazdırır. Yazdırması gereken bayt sayısını belirten isteğe bağlı bir bağımsız değişken alır. Varsayılan olarak, çıktı sonsuz olacaktır.

Okumanın /dev/urandomçok yavaş olduğu durumlarda kullanışlıdır.

Karşılaştırma

$ time head -c 1G /dev/urandom > /dev/null
Real    59.75
User    0.03
Sys     59.68
$ time random 1G > /dev/null
Real    0.68
User    0.64
Sys     0.86

Bu komut dosyası, i7-3770'imde saniyede 1,5 GiB'ye kadar üretiyor.

Buna karşılık, okuma, dakikada/dev/urandom zar zor 1 GiB üretmeyi başarır .

Nasıl çalışır

  • head -c${1--1} /dev/zerobelirtilen miktarda sıfır bayt verir. Herhangi bir miktar belirtilmezse, ${1--1}-1'e eşittir ve kafa sonsuz miktarda verir.

  • openssl enc -aes-128-ctr -pass file:/dev/randomsıfır baytını şifrelemek ve sayaç şifresini okumak için sayaç modunda AES-128 kullanır /dev/random.

  • tail -c+17 çıktının 16 baytlık başlığından kurtulur.


Bu akışın ilk 2 ^ 68 çıkış baytına bakarak bir "gerçek" rasgele akıştan ayırt edilebileceğini unutmayın (gerçek bir rasgele akışın orada yinelenen bloklar olması gerekir, bu olmaz).
Paŭlo Ebermann

@ PaŭloEbermann: Kesinlikle haklısın. Sonra tekrar, makinemde bu kadar çok bayt üretmek 6.000 yıldan fazla sürecek ...
Dennis

7

JavaScript

Herhangi bir denklemi çözün (hepsi değil, ortak işlevlerle çalışmalıdır ...)

r=s=>{for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

ES6 olmadan (105 karakter):

function r(s){for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

Sadece denklemin sol tarafını sağ tarafın sıfır olduğu varsayılarak verin.

Misal :

  • r("x*x-9") İadeler 3
  • r("Math.sin(x)-1")dönüş 1.5707963394347828(pi / 2)
  • r("Math.pow(2,x)-512") İadeler 9

Uyarı: bazı işlevlerde (veya çözüm yoksa) sapabilir ve tarayıcı sekmenizi dondurur veya NaN döndürür.


6

C - 99 karakter

i;main(int c,char**a){for(a+=2;1+(c=getchar());)putchar(c+(**(a-1)-69?1:-1)**(*a+i++%strlen(*a)));}

Bu program her türlü verinin şifrelenmesine ve şifresinin çözülmesine izin verir.

kullanım

İlk olarak ... derleyin!

gcc crypto.c crypto

İçeriğini mypreciousdata.txtanahtarla şifrelemek mysecretkeyve sonucu şurada saklamak istiyorsanız myprotecteddata.txt:

cat mypreciousdata.txt | ./crypto E mysecretkey > myprotecteddata.txt

Şimdi, kodu çözülen içeriği almak istiyorsanız myprotecteddata.txt:

cat myprotecteddata.txt | ./crypto D mysecretkey > mypreciousdata.txt

Anahtar ne kadar uzunsa, o kadar güvenli!

açıklama

Lütfen genişletilmiş ve yorumlanmış kodu aşağıda bulabilirsiniz:

int main(int argc, char** argv)
{   
    // retrieve the first argument passed to the program (action)
    char action = argv[1][0];

    // retrieve the second argument passed to the program (key)
    char* key = argv[2];

    // initialize character position in the key
    int i = 0;

    // initialize the current input character
    char c = 0;

    // loop until we reach the end of input
    while (c != -1){
        // get a character from stdin
        c = getchar();
        if (action == 'E'){
            // encode the current character
            putchar(c + key[i]);
        } else{
            // decode the current character
            putchar(c - key[i]);
        }
        // increment the position in the key, without overflow
        i = (i + 1) % strlen(key);
    }
}

Bu, türünüzün büyüklüğünde (genellikle 256) bir alfabe için uyarlanmış Vigenère şifresinin bir çeşididir char.
Paŭlo Ebermann

5

GolfScript

Bunu tam olarak 100 karaktere sıkıştırmayı başardım!

{{}/]{97-}%}:b~:|;"etaoinshrdlcumwfgypbvkjxqz"b:f,:&,{:x[|{&x-+&%f?}%{+}*\]}%$0=1=:x|{&x-+&%97+}%''+

ROT-n şifreli metnin girişini alır ve kodu çözülen metni çıkarır. ( Buradan alınmıştır .) Örneğin, girdi verildiğinde pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivomçıktı verilir 8hellopeopleofprogrammingpuzzlescodegolfstackexchange.


5

JavaScript

Javascript'te benzersiz bir kimlik oluşturmak için
Math.random().toString(30).slice(2);

Şuna benzer bir şey üretir: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

30-32 alfa-sayısal karakter dizeleri

Math.random().toString(36).slice(2)

Şuna benzer bir şey üretir: 'uq2sze67hsacq5mi'

Uzunluk dizeleri 14-16.



3

Fortran - 85 bayt

l=0;read(*,*)n;do while(n>0);i=mod(n,10);l=l+i;n=n/10;enddo;print*,"digit sum=",l;end

Bir sayı okur ve rakamların toplamını yazdırır . Project Euler sorunları için kullanışlıdır .


Bu proje Euler problemlerine nasıl yardımcı olur?
Paŭlo Ebermann

@ PaŭloEbermann: Belki de Project Euler'den önce "biraz" eklemeliydim. 16, 20 ve 119 numaralı problemlerin basamak toplamlarını kullandığını biliyorum, diğerleri hakkında emin değilim, ama problemlerinin çoğunun buna ihtiyacı yok .
Kyle Kanos
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.