Dillerin Vitrini


507

notlar

  • Bu konu yalnızca topluluk bir istisna yapmaya karar verdiği için açık ve kilitsiz . Lütfen yok burada benzer sorular sorabilir delil olarak bu soruyu kullanın. Lütfen yok ek oluşturmak soruları.

  • Bu artık bir , ne kadar snippet uzunlukları da oy kullanışlarıyla sınırlandırılmıyor. Bu konuyu daha önce biliyorsanız, lütfen değişikliklerden haberdar olduğunuzdan emin olun.

Bu konu, en sevdiğiniz programlama dillerinin sunduğu ilginç, kullanışlı, belirsiz ve / veya benzersiz özellikleri göstermeye kendini adamıştır. Bu ne bir mücadele ne de bir rekabet değil, mümkün olduğu kadar çok programlama dili göstermek için bir işbirliği çabasıdır.

Bu nasıl çalışır

  • Tüm cevaplar, yazının en üstündeki a ile işaretlenmiş programlama dilinin adını içermelidir #.

  • Cevaplar bir (ve sadece bir) factoid, yani dili tanımlayan kodsuz birkaç cümle içerebilir.

  • Fiiliğin yanı sıra, cevaplar, programlar veya işlevler olabilen (ancak olması gerekmeyen) kod parçacıklarından oluşmalıdır.

  • Snippet'lerin ilişkili olması gerekmez. Aslında, çok fazla ilişkili olan snippet'ler gereksiz olabilir.

  • Bu bir yarışma olmadığından, ne zaman yaratıldıklarında tüm programlama dilleri açıktır.

  • Bir avuç kod parçacığından fazlasını içeren yanıtlar , factoid ve snippet'lerden biri dışındaki her şeyi daraltmak için bir Stack Snippet kullanmalıdır .

  • Mümkün olduğunda, programlama dili başına sadece bir cevap olmalıdır. Bu bir topluluk wiki, bu yüzden kendin oluşturmamış olsan bile, herhangi bir cevabın pasajlarını eklemekten çekinme. 30,000 karakter sınırının etkisini azaltmak için direkleri sıkıştırmak için bir Yığın Parçacığı vardır .

Bu kuralları belirten cevaplar düzenlenmelidir. Lütfen bunları gerektiği şekilde güncellemeye yardımcı olun.

Güncel cevaplar, alfabetik olarak dil adına göre sıralanır

$.ajax({type:"GET",url:"https://api.stackexchange.com/2.2/questions/44680/answers?site=codegolf&filter=withbody",success:function(data){for(var i=0;i<data.items.length;i++){var temp=document.createElement('p');temp.innerHTML = data.items[i].body.split("\n")[0];$('#list').append('<li><a href="/a/' + data.items[i].answer_id + '">' + temp.innerText || temp.textContent + '</a>');}}})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><base href="http://codegolf.stackexchange.com"><ul id="list"></ul>

Yanıtlar:


414

Mathematica

Bu aşağıdan yukarıya okumak isteyebilirsiniz, çünkü yazdığı sıra budur ve bazı açıklamalar önceki snippet'lere atıfta bulunacaktır veya daha aşağıdan açıklamalar alacaktır.

Liste oldukça uzuyor. Daha az ilginç snippet'leri kaldırmaya başladım ve şimdi snippet'leri atlamaya başlayacağım. 41'e kadar olan snippet'lerin tam listesi için revizyon geçmişine bakın. Bazı gerçek taşlar için 81 , 64 , 44 , 23 , 19 , 12 ve 8 snippet'lerine bakın .

Uzunluk 143 ve 144 snippet'leri

Sonunda ... Bir süredir bunu bekliyorum (ve uzun süredir golf oynuyorum, bu yüzden daha fazla beklemek zorunda kalmıyorum). Daha önce sayısal olarak da denklem yapabileceğinizi ve diferansiyel denklemleri çözebileceğinizi de söyledim. Bunun önemsiz bir örneğini göstermek istedim.

Bir çubuk üzerinde çift sarkaç (bir başkasına tutturulmuş sarkaç) düşünün. Her çubuğun birim uzunluğu vardır ve iki sarkaç ağırlığının her biri birim kütleye sahiptir. Ayrıca denklemi kısaltmak için birim yerçekimi kullandım. Aşağıdaki 143 karakter parçacığı , böyle bir sistem için (sarkaçların açıları ve açısal momentum açısından) Lagrangian hareket denklemlerini çözer . Bu PDF'de bir türev bulunabilir , ancak Lagrangian mekaniğine aşina olsanız bile oldukça yalındır bir egzersiz.

Oldukça okunamıyor, çünkü çok fazla golf oynamak zorunda kaldım:

d@t@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]

Düzgün olan şey, Mathematica'nın, çözümlerin kabaca nasıl göründüğüne dair minyatür bir grafiği göstermesidir:

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

Tamam, ama bu biraz topal. Sarkacın hareketinin gerçekte neye benzediğini bilmek istiyoruz. İşte burada, alt sarkacın yörüngesini çizerken pendulayı canlandıran 144 karakterlik bir snippet:

Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}

Sonuçta ortaya çıkan animasyon şöyle görünür:

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

Biraz aldatmak zorunda kaldım: eğer arsa yaparsanız t = 30, ParametricPlotvarsayılan olarak çok az arsa noktası kullanır ve çizgi oldukça pürüzlü hale gelir. Ancak ilginç dinamiklerin çoğu o zamandan sonra gerçekleşiyor, bu yüzden PlotPoints -> 200animasyonun ikinci yarısının daha yumuşak görünmesini sağlamak için bu seçeneği kullandım . Önemli ölçüde farklı bir şey değil ve ilk yarı zaten ayırt edilemez görünüyordu.

Gerçekten akıllara durgunluk veren bir şey bulamazsam, bu benim son snippet'im olacak. Umarım bundan hoşlanmışsınızdır!

Uzunluk 100 pasajı

GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]

Geo100 snippet için bazı güzel fonksiyonlar hakkında düşünüyordum , ama nihayet çalmak zorunda olduğum Tweet-a-Programında gerçekten çok güzel bir şey buldum . Yukarıdakiler, bir yarımkürenin yarı opak şeklini kabartma bir haritanın üzerine bindirerek, günümüz ve gündüz için Dünya'nın çok güzel görünümlü bir güneş haritasını oluşturur.

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

Uzunluğu 81 snippet

CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]

Söz veriyorum, son hücresel otomat. Fakat bu hak 81 karakterde Wireworld . Bu kez kuralı tek bir kodda kodlamadım, a) çünkü saçma sapan derecede büyük olacağını düşünüyorum (bunu çözmekten zahmet etmedim) ve b) size başka bir kullanım şeklini göstermek için CellularAutomaton. Bu kez, kural basitçe bir hücre mahallesi alan ve hücrenin yeni değerini döndüren saf bir işlev olarak tanımlanır. Bu, 2'den fazla renk / durum içeren hücresel otomatlar için çok daha uygun bir yaklaşımdır.

Her neyse, Wikipedia'dan i(sinyal üreten iki saat ve bir XOR geçidi) örneği hazırladım ve yaklaşık 50 adım boyunca çalışmasına izin verdim :

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

Eğer ilgileniyorsanız, gerçek komplo ve animasyon pasajı 77 olabilirdi:

ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]

Uzunluk 69 pasajı

DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]

Yararlı bir şeye dönüş. Normal denklem sistemlerinden ayrı olarak, Mathematica, diferansiyel denklem sistemlerini de çözebilir. Yukarıdaki teknik olarak sınır şartları olan tek bir diferansiyel denklemdir, ancak bunu üç denklemli bir sistem olarak da sağlayabilirsiniz. Entegrasyon işlevlerine benzer şekilde, DSolvekesin çözümler içindir, oysa NDSolvesistemi sayısal olarak çözecektir. Yukarıdakiler tek bir çözüm sunar

{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}

şimdi kolayca başka hesaplamalar için kullanılabilir veya çizilebilir.

Uzunluk 64 snippet

CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]

Sana daha fazla CellularAutomatonbüyü için söz verdim ! Bu pasaj , Conways'in Yaşam Oyununu adımlar iiçin başlangıç ​​koşulu ile hesaplar nve tüm ara zaman çizelgeleri için size sonuç verir.

Parametreler hakkında birkaç kelime: 2hücre durumlarının sayısıdır. {{2,2,2},{2,1,2},{2,2,2}}3x3 mahallesindeki 9 hücreye ağırlık verir. Hücrenin kendisinin 8 komşunun toplamından ayırt edilebilir olmasını sağlar. {1,1}CA kuralının her iki yönde de bir adım ötedeki hücrelere bağlı olduğunu söylüyor. Son olarak, 224tek bir sayıyla kodlanmış gerçek güncelleme kuralıdır. Bu sayıyı bulmak biraz zor olabilir, ancak belgelerde oldukça faydalı bir öğretici var . Daha karmaşık otomatlar için, tek bir sayı kesmeyecektir (çünkü sayı çok büyük olacaktır). Belki yarın oraya geliriz! ;)

Her neyse, içine ive 200'e rastgele bir ızgara beslersem ve nsonucu bir canlandırmayla gönderirsem, ArrayPlotgerçekten çalıştığını görebiliriz:

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

Uzunluk 59 snippet

SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]

26 numaralı snippet'teki kutupsal grafiği hatırla Aynı şeyi 3B olarak da yapabiliriz! (Aslında, iki işlev vardır: RevolutionPlot3Dsilindirik kutuplar ve SphericalPlot3Dküresel kutuplar için.) Graphics3DMathematica'da üç boyutlu çizimlerin hepsi otomatik olarak döndürülebilir, bu nedenle ön tarafta iyi bir kamera açısı için endişelenmenize gerek yok. Yukarıdakiler küresel bir harmonik gibi bir şey çizer (tam olarak değil) ve şöyle görünür:

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

Uzunluk 52 pasajı

Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]

Bu oldukça hoş. herhangi bir ifadeyi Manipulatealır , bir çok değişkenle parametreler ve sonra parametreleri değiştirebileceğiniz ve ifadenin nasıl değiştiğini canlı olarak görebileceğiniz bir pencere öğesi verir. Bir ifade olarak, genellikle bir çeşit arsa olacaktır. Bu, özellikle çözüm ailelerinin parametreleri değiştirmeye nasıl cevap verdiğini göstermek için derslerde Mathematica kullanıyorsanız kullanışlıdır. Yukarıdakiler ve katsayılarının bir parabolü nasıl ölçeklendirdiğini ve değiştirdiğini gösterir :ab

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

Uzunluk 48 pasajı

Import["http://www.google.com/doodles","Images"]

Importoldukça güçlü bir komuttur. Hem diskten hem de web'den dosya yüklemek için kullanılır. Oldukça farklı dosya formatları biliyor ve bazıları için (HTML sayfaları gibi) aslında verileri hemen çıkarabiliyor. Yukarıdakiler Google'ın doodle sayfasındaki tüm resimleri indirir.

Uzunluk 45 snippet'i

EdgeDetect@ExampleData@{"TestImage","Splash"}

Bazı görüntü işleme zamanı. Mathematica, görüntüler (Lena gibi), dokular, 3B modeller ve ses parçacıkları dahil olmak üzere çok sayıda örnek veriyle birlikte gelir. İlk önce şunlardan birini yüklüyoruz:

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

Kenarları tespit etmek ister misiniz? Tek bir fonksiyon çağrısı:

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

Uzunluk 44 snippet

ArrayPlot@CellularAutomaton[110,{{1},0},100]

Sonunda, kullanmak CellularAutomatonve sonucu işlemek için yeterli karakter var . :) Bildiğim kadarıyla CellularAutomaton, Mathematica'daki CA'larla ilgili tek fonksiyon. Fakat Stephen Wolfram, hücresel otomatlara gelince kendini bir numaralı adam olarak görüyor gibi görünüyor, bu yüzden bu fonksiyon inanılmaz derecede güçlü. Yukarıdakiler hemen hemen en basit kullanımını gösterir. Bu, 100 adım için 1D'lik bir hücresel otomatiği simüle eder - ve o adımların her birinde otomatların durumunu geri döndürür, bu nedenle sonuç iki boyutludur. Kural, ya listelerde ayrıntılı olarak belirtilebilen ya da sadece tek bir sayıyla kodlanabilen ilk parametredir. Bu örnek için oldukça ünlü, Turing tamamlandı, Kural 110'u seçtim . {{1},0}başlangıç ​​koşulunu tanımlar: tek1sıfırın arka planının önünde. Belki daha CellularAutomatonfazla karakterim olduğunda gelecekte daha fazla özellik göstereceğim : daha büyük mahalleler kullanarak ve ikiden fazla eyalete sahip CA'ları daha yüksek boyutlarda simüle edebilir.

ArrayPlotbir 2B listesini sadece değerlerini gösteren düz renk ızgarası olarak gösteren bir başka güzel çizim aracıdır. En basit durumda, 0beyaz ve 1siyah için mappend olduğunu . Metin parçacığının sonucu:

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

Uzunluk 43 snippet

HighlightGraph[graph,FindVertexCover@graph]

Uzun zamandır grafiklerden bahsetmiştim. Güzel görselleştirme araçlarının yanı sıra Mathematica'da yerleşik birçok ortak grafik teorik problemi var. Yukarıdakiler, verilenler graphiçin grafiğin minimal bir tepe kapağını bulacak ve daha sonra grafiği bu köşeler vurgulanmış olarak oluşturacaktır. Eğer Ör grapholduğunu PetersenGraph[7,2]geri pasajı 18 den elde ederiz:

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

Uzunluk 42 snippet

Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]

Mathematica'daki şeyleri hareketlendirmek oldukça basittir (ve hatta görüntü olmaları gerekmez). Sadece her kare için değerlendirilecek ifadeyi ve çerçeveler üzerinde değişmesi gereken bir sürü parametre verirsiniz. Yukarıdaki basitçe hareketli bir sinüs dalgasının grafiğini harekete geçirir. Animasyon aşağıdaki GIF’e benzeyecek:

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

Uzunluk 40 pasajı

SortBy[PlanetData[#, "EscapeVelocity"]&]

SortBybeklediğiniz şeyi yapar: verilen bir işlevi her liste öğesine eşleyerek elde edilen değerleri temel alarak bir liste düzenler. Ancak bekleyin, yukarıdaki çağrı hiç bir liste içermiyor. Mathematica 10'dan bu yana, bazı işlevler için körleme veya kısmi uygulama için destek var . Bu, daha saf işlevsel dillerde olduğu gibi bir dil özelliği değildir, ancak bunun genellikle yararlı olduğu tüm işlevler için el ile uygulanır. Bu, yukarıdaki snippet'in yalnızca bir liste alan ve verilen işleve göre sıralanan yeni bir işlev döndürdüğü anlamına gelir . Bu sıralama düzeni, kodunuz boyunca daha sık kullanacağınız bir şeyse, bu çok yararlı olabilir.

Ve evet, başka bir güzel *Datafonksiyon daha var - yukarıdaki gezegen isimlerini gezegenlerin kaçış hızlarına göre sıralayacak .

Uzunluk 39 snippet

f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]

Fibonacci işlevini daha verimli hale getireceğine söz verdim. Bu pasaj, Mathematica'da ne kadar önemsiz bir hatıra olduğunu gösteriyor. Değişenlerin f[n]=üçüncü satırda ilave olduğunu unutmayın . Böylece fyeni bir değer çağrıldığında (diyelim f[3]), o f[3]=f[3-1]+f[3-2]zaman değerlendirilecektir. Bu hesaplar f[2]+f[1], daha sonra f[3](ile =, with ile :=) atar ve sonuçta ilk çağrımızın değerini döndürür. Bu nedenle bu işlevi çağırmak, genel kuraldan açıkça daha belirgin olan bu değer için yeni bir tanım ekler - ve bu nedenle fbu değerle yapılacak tüm çağrılar için kullanılacaktır .

Diğer Fibonacci işlevinin 30 değer için 4 saniye sürdüğünü unutmayın. Bunun için 300.000 değer için 3 saniye gerekir.

Uzunluk 37 snippet

l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}

Son snippet'te kalıplardan bahsettim. Bunlar en çok (başka şeylerin yanı sıra) belirli bir düzenle eşleşen yapıları değiştirmek için kullanılabilecek kurallarda kullanılır. Öyleyse bu pasaja bakalım.

{a___,x_,b___,x_,c___}:>{a,x,b,c}bir kuraldır. x_Tek bir alt çizgi ile tek bir rasgele değere atıfta bulunan bir kalıp (kendisi de bir liste veya benzeri olabilir). 0 veya daha fazla değerden oluşan bir diziyi ifade a___eden bir dizi düzenidir (ayrıca parçacık 15'e bakınız). x_İki kez kullandığımı unutmayın; bu, listenin bu iki bölümünün aynı değerde olması gerektiği anlamına gelir. Yani bu model, iki kez değer içeren herhangi bir liste eşleştiğini eleman çağırır xve bu iki unsur etrafında üç dizileri çağırır a, bve c. Bu değiştirilir {a,x,b,c}- bu ikinci xdüşürülür.

Şimdi //., kalıp artık eşleşmeyene kadar bir kural uygulayacaktır. Böylece yukarıdaki kod parçası, tüm kopyaları bir listeden kaldırır l. Ancak, bundan biraz daha güçlü: //.kuralı her seviyede uygular. Dolayısıyla, eğer llistelerde (herhangi bir derinlikte) varsa , bu alt listelerden kopyalar da kaldırılacaktır.

Uzunluk 36 pasajı

f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]

Yeni dil özellikleri için zaman! Mathematica'nın fonksiyonları tanımlamakla ilgili güzel şeyleri vardır. Bir başlangıç ​​için, aynı isim için, farklı sayılar veya argüman tipleri için çoklu fonksiyon tanımları sağlayabilirsiniz. Bir tanımlamanın hangi argümanlara uygulandığını tanımlamak için kalıpları kullanabilirsiniz . Ayrıca, tek değerler için tanımlar bile ekleyebilirsiniz. Mathematica daha sonra herhangi bir işlev çağrısı için en spesifik tanımı seçecek ve tanımsız çağrıları değerlenmemiş olarak bırakacaktır. Bu, (diğer şeylerin yanı sıra) özyinelemeli işlevleri Iftemel durum için bir anahtar kullanmaktan çok daha doğal bir şekilde yazmasına izin verir .

Yukarıdaki pasajı hakkında Unutulmaması gereken başka bir şey hem kullanıyorum olduğunu =ve :=. Aradaki fark, =tanımın sağ tarafının yalnızca bir kez, tanım sırasında :=değerlendirilirken, sol tarafın her bir kullanımında tekrar değerlendirilir. Aslında :=değişkenleri atarken bile çalışır, ki bu daha sonra dinamik bir değere sahip olacaktır.

Yani yukarıdaki, elbette, sadece bir Fibonacci işlevidir. Ve bunda çok verimsiz olanı. İlk 30 sayının hesaplanması makinemde 4 saniye sürüyor. Özyinelemeli tanımdan kurtulmadan bile performansı nasıl artırabileceğimizi kısaca göreceğiz.

Uzunluk 35 snippet

StreamPlot[{x^2,y},{x,0,3},{y,0,3}]

2B vektör alanının düzeneğini veren çok temiz bir grafik. Bu normal bir vektör grafiğine benzer, çünkü her ok vektör alanına teğet olur. Bununla birlikte, oklar sabit bir ızgaraya yerleştirilmemiştir, fakat çizgiler (birleştirilmiş çizgiler) ile birleştirilmiştir. Bu çizgilerin önemi, eğer vektör alanı bir hız alanıysa, bir parçacığın yörüngesini (bir akışkan içinde, örneğin) belirtmeleridir. Yukarıdaki giriş şuna benziyor:

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

Uzunluk 34 pasajı

Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]

Mathematica ayrıca denklemleri (veya denklem sistemlerini de çözebilir, ancak şu anda yalnızca çok fazla karakterimiz var). Sonuç, her zamanki gibi sembolik olacaktır.

{
  {x -> 0}, 
  {x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)}
}

Çözümlerin kurallar olarak verildiğine dikkat edin , ki gelecekte bazı pasajlarda daha ayrıntılı olarak göstereceğim.

Uzunluk 33 pasajı

Dynamic@EdgeDetect@CurrentImage[]

Bu fikir için benwaffle'a teşekkürler. CurrentImage[]web kameranızın geçerli görüntüsünü yükler. EdgeDetectgörüntüyü kenarların beyaz, geri kalan kısmının siyah olduğu siyah beyaz bir görüntüye dönüştürür (örnek için pasaja bakınız). Asıl eğlence Dynamic, ifadenin kendisini güncellemesini sağlayan beraberinde geliyor . Bu nedenle, bunun sonucu olarak web kameranızdan resimler akışını sağlar ve üzerlerinde canlı kenar algılaması yapar.

Uzunluk 32 pasajı

NumberLinePlot[x^2<2^x,{x,-2,5}]

Oldukça sıradışı bir komplo türü. Sayı çizgisi boyunca, noktalar ve aralıklar gibi bir sürü farklı şeyi çizebilir. Ayrıca şartı verebilirsiniz ve bu şartın doğru olduğu bölgeyi size gösterir:

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

Ok, bölgenin sonsuzluğa devam ettiğini gösterir. Beyaz daireler, bunların açık aralıklar olduğunu gösterir (bitiş noktaları aralığın bir parçası değildir). Kapalı uçlar için daireler doldurulur.

Uzunluk 28 pasajı

Graphics3D@{Sphere[],Cone[]}

Bazı 3D grafikler için zaman. Yukarıdakiler, kristal küre gibi görünen varsayılan parametrelere sahip, süper empoze edilmiş bir küre ve koni vermektedir:

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

Mathematica'da, döndürmek için gerçekte bu küçük widget'ı tıklayıp sürükleyebilirsiniz.

Uzunluk 27 pasajı

CountryData["ITA", "Shape"]

Daha fazla *Data! CountryDataoldukça çılgın. Bir ülkenin şeklini almak buzdağının görünen kısmı bile değil. Ülkeler hakkında çok fazla veri var, bu fonksiyon hakkında muhtemelen bütün bir kitabı yazabilirsiniz. Mesela ... var FemaleLiteracyFraction. Bu verileri zaman içindeki farklı noktalar için de sorgulayabilirsiniz. Tam liste için referansa bakın.

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

Uzunluk 26 pasajı

PolarPlot[Sin[5θ],{θ,0,π}]

Daha ilginç bir arsa zamanı. PolarPlotsadece kutupsal koordinatlarda bir komplo. Belirli bir x için y belirtmek yerine, belirli bir açı θ için bir yarıçap r belirtirsiniz:

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

Uzunluk 25 pasajı

{{1,5},{2,3},{7,4}}.{8,9}

Sonunda bazı vektör matematik için yeterli karakter var. Yukarıdaki 2x3 matrisin ve satır 2-vektörünün matris çarpımını hesaplar:

{53, 43, 92}

Uzunluk 23 snippet'i

Rotate[Rectangle, Pi/2]

Heh. Hehe. Bunun ne yaptığını bildiğini sanıyorsun. Ama sen yapmazsın. Rectanglekendi başına sadece adlandırılmış bir işlevdir. Aslında bir dikdörtgeni temsil eden bir nesneyi elde etmek için, bu işlevi bazı parametrelerle çağırmanız gerekir. Sence döndürmeye çalıştığın zaman ne olacak sence Rectangle? Bu:

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

Uzunluk 22 pasajı

30~ElementData~"Color"

Yerleşik *Dataişlevlerden bir diğeri . Evet, kimyasal elementler için atom numarası, erime noktası ve adı gibi şeyleri almazsınız ... aslında renklerini oda sıcaklığında elde edebilirsiniz. Yukarıdaki Çinko rengini verir:

SlateGray

Uzunluk 21 pasajı

Integrate[E^(-x^2),x]

Bir süre önce farklılaşma yaşadık. Entegrasyon zamanı. Mathematica hem kesin hem de belirsiz integralleri idare edebilir. Özellikle, Integratesize kesin bir çözüm sunacaktır ve bir ton standart integral ve entegrasyon tekniği ile başa çıkabilir (sayısal sonuçlar için NIntegrate). Eğer hesabınızı biliyorsanız, yukarıdaki Gaussian integralinin aslında kapalı bir formun olmadığını fark etmişsinizdir, hata fonksiyonunun kapalı formunu düşünmediğiniz sürece , yani. Mathematica döner:

1/2 Sqrt[π] Erf[x]

Uzunluk 20 pasajı

"Sun"~StarData~"Age"

Yerleşik verilere geri dönün . *DataMuhtemelen aklınıza gelebilecek her şey için en az iki düzine işlev olmalıdır . Her biri, verilerini istediğiniz şey için bir tanımlayıcı ve almak için bir özellik (veya özellik listesi) alır. Yukarıda sadece ile alabilirsiniz en kısa biridir Sun, Starve Ageben bu özelliği göstermek için sabırsızlanıyordu çünkü hepsi, oldukça kısa olması.

Evet ve Mathematica'nın (9'dan beri) birimleri içeren miktarları desteklediğinden bahsettim mi? (Daha sonraları.)

Quantity[4.57*10^9, "Years"]

olarak gösterilir

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

Uzunluk 19 pasajı

MandelbrotSetPlot[]

Evet ... çok faydalı işlevi ... bunu kullanmak her zaman. (Bazen, muhtemelen hesaplanabilir bir şeyi destekleme arzusu biraz uzayabilir ...)

Mathematica grafikleri

Savunmaları sırasında, işlev bundan biraz daha kullanışlıdır: ona çizdirmek istediğiniz grafiğin belirli bir bölümünü verebilirsiniz.

Uzunluk 18 snippet

PetersenGraph[7,2]

Mathematica 8'den beri, grafiğin ne olduğunu anlıyor, bu yüzden her türlü grafik teorisi ile ilgili fonksiyonlarla geliyor. Ve bir ton yerleşik yapmazsa, Mathematica değildi. Yukarıdaki genelleştirilmiş bir Petersen grafiğinin grafik verisini oluşturur . İşlenebilecek gerçek veri yapısını üretiyor, ancak Mathematica derhal grafik verilerini gösteriyor ... grafiksel olarak:

Mathematica grafikleri

Uzunluk 17 snippet

Plot[x^x,{x,0,2}]

Sonunda bazı komplo yapmak için yeterli karakter. Yukarıdakiler gerçekten tek boyutlu bir komplo için en basit örnektir. Sonradan daha serin araziler göstereceğime söz veriyorum

Mathematica grafikleri

Uzunluk 15 pasajı

{##4,#,#2,#3}&

Bu, daha güçlü özelliklerden ikisini (ve golf oynamak için de faydalı olanları) gösterir. Her şey Python'da s ya da Ruby'de Procs ile karşılaştırılabilen isimlendirilmemiş bir saf işlevdirlambda . Saf fonksiyon sadece a ile sonlandırılır &. Bu operatör çok düşük önceliğe sahip olduğundan, genellikle ondan kalan her şeyi içerir. Saf işlevin argümanlarına #bazen başka şeyler tarafından takip edilir. İlk argüman #veya #1ikincisi, #2vb.

Diğer özellik Sequences. Bunlar temelde diğer dillerdeki uyarılar gibidir. Bir dizi, etrafındaki liste olmadan liste gibidir - kelimenin tam anlamıyla, sadece listelerde, işlev argümanlarında vb ##. ##2ikinciden başlayan tüm argümanların bir dizisidir. Öyleyse yukarıdaki işlevi isimlendirip, fbuna benzer

f[1,2,3,4,5]

Alırdık

{4,5,1,2,3}

Böylece fonksiyon giriş argümanlarını 3 element sola döndürür. Not ##4anılacaktır 4,5listeye düzleşmiş edildiği.

Uzunluk 12 pasajı

D[x^y^x,x,y]

Kısmi farklılaşma. Dilk ifadeyi diğer argümanlarına göre art arda farklılaştıracak, size sonuç olarak sembolik bir ifade verecektir. Bu nedenle üzerinde d² (x ^ y ^ x) / dxdy ( d Mathematica için rapor s kısmi olan),

x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) + 
  x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])

Uzunluk 9 pasajı

Exp[I*Pi]

Henüz herhangi bir karmaşık aritmetik yapmadık! Gördüğünüz gibi π, aslında sadece bir takma addı Pi. Neyse, yukarıdaki aslında tamsayıyı doğru döndürecektir -1.

Uzunluk 8 pasajı

Sunset[]

Evet. Çılgın yapıları hakkında konuş. Aslında bulunduğunuz yerde bir sonraki gün batımının tarih saat nesnesi veren parametreler olmadan. Aynı zamanda diğer tarihler, diğer yerler vb. İçin parametreleri alır. İşte şu an benim için nasıl göründüğü:

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

Uzunluk 7 pasajı

9!/43!!

Bu pasajı birkaç güzel şey gösterir.

Mathematica sadece yerleşik bir faktoring operatörüne sahip değil !, aynı zamanda çift faktörü de var !!(her sayıyı naşağıdan çarparak 1). Ayrıca, isteğe bağlı tam sayıları destekler. Bu 43!!, son haneye kadar tam olarak değerlendirilecektir. Ayrıca, rasyonel sayılar da tam olarak değerlendirilecektir. Böylece, hem pay hem de paydaş tam sayıları olduğundan, Mathematica kesirleri mümkün olduğu kadar azaltacak ve sonra size sunacaktır.

128/198893132162463319205625

Elbette, istediğiniz zaman float kullanabilirsiniz, ancak genel olarak, girişiniz float içermiyorsa, sonuçlarınız tam olacaktır.

Uzunluk 4 pasajı

Here

Mathematica'nın zengin çılgın yapılı varlıklarla başlamanın vakti geldi. Yukarıdakiler teneke ne diyor ve (benim için) değerlendirir GeoPosition[{51.51, -0.09}].

Uzunluk 3 pasajı

x-x

Sadece orijinal Factoid'i göstermek için : yukarıda xhenüz tanımlanmamış olsa bile çalışır ve 0bu durumda gerçekten sonuçlanır .

Uzunluk 2 pasajı

3x

Yan yana yerleştirme ile çarpma! Bir tanımlayıcının bittiği ve bir başkasının başladığı *açıksa, bunları çoğaltmak için bir boşluk veya hatta boşluk gerekmez . Bu, henüz değeri olmayan dizeler ve değişkenler dahil, hemen hemen her şeyle çalışır. Golf oynamak için çok uygun. ;)

Uzunluk 1 pasajı

π

Bil bakalım ne oldu, ben Pi. Ve aslında, yaklaşık kayan noktaların temsili değildir, Pi'dir - yani, kullanıldığı her türlü karmaşık ve trigonometrik fonksiyonlar biliniyorsa kesin sonuçlar verecektir.

Uydurma

Mathematica sembolik manipülasyon yapabilir, böylece değişkenler onlarla çalışmak için değerlere ihtiyaç duymaz.


19
Snippet 23 oldukça meraklı. Öyle Translate[Scale[Rectangle, 80], {0, 0, 100}]olsaydı, büyük kelime Rectanglemonitörünüzün önünde kayan belirir mi?
Calvin'in Hobileri

53
@ Calvin's Hobbies Denedim ... talihsiz bir zofset seçti ... tam karşısında beni ezdi .
Martin Ender

45
Resmi Mathematica web sitesi kesinlikle buna bağlanmalıdır.
Caridorc

7
@ durron597 Sembol olarak saklayarak ve tüm trigonometrik ve karmaşık fonksiyonlarınızı π ile ne yapacağının farkında olarak yaparak.
Martin Ender

16
Efsanevi Martin Büttner'in bir Mathematica cevabı gönderdiğini gördüğümde, popülerlik yarışması kazanma şansım olmadığını biliyordum. Siz efendim gerçek bir sihirbazsınız.
Alex A.

187

Infamous Shakespeare Programlama Dili

Olarak Shakespeare Programlama Dili, iki İsveçli öğrenciler Karl Hasselström ve Jon Åslund tarafından 2001 yılında oluşturulan ve birleştirir edildi yazarlar ilan ,

BASIC'in assembly diline ait kullanıcı dostu olması ile ifade edilmesi.

Cevaplar yukarıdan aşağıya doğru gider. Ayrıca, daha eski veya önceki snippet'lere başvurduğumu görmek de yaygındır.

( kendim için link: edit )

Uydurma:

Shakespeare'in kodu, beklendiği gibi, değişkenlerin oyundaki karakterleri olduğu ve değerlerinin "hakaret" veya övgüyle "değiştirildiği bir Shakespeare oyununa benzer.

Uzunluk 1 pasajı:

I

Shakespeare'in kodu Yasalara bölünmüştür ve hareketler "atlamaya geçme" nedenleri için Sahnelere bölünmüştür. Bir Yasa olarak tanımlanması Act I, örneğin çalıştırılacak kodun ilk parçası olacağı anlamına gelir - yalnızca değil.

Uzunluk 2 pasajı:

as

İki "karakter" arasında karşılaştırmalı kullanılır.

Uzunluk 3 pasajı:

day

Şimdilik, SPL'nin çok ayrıntılı olduğu hissine kapılıyor olabilirsiniz. Ve garip. Ve daha hiçbir şey görmedin. day, SPL'de 1'dir. Tüm "pozitif" ve "nötr" isimler 1olduğu gibi tüm "negatif" isimler olarak kabul edilir -1.

Uzunluk 4 pasajı:

rich

Nedir rich? Bir sıfat. SPL'de sıfatlar, eklendikleri ismin değerini iki ile çarpmaktadır. Snippet 14'deki uygulamaya bakın.

Uzunluk 5 pasajı:

Act I

İlk pasajın uygulanması. Act I: Hamlet must die!Romen rakamından sonra gelen her şey çözümleyici tarafından göz ardı edildiğinden tüm eylemlere bir başlık verilebilir .

Uzunluk 6 pasajı:

better

Her dilin bir şartı vardır ve SPL istisna değildir. Bunun dışında, uzun bir sözdizimine sahip bir dil olduğu için (ve tuhaf olduğunu söylemiş miydim?), Koşullu ifadeleri uzun olacaktır. Ophelia Juliet sormak Having Am I better than you?olması gibi if (Ophelia > Juliet)pek çok "normal" dillerde. Ve elbette, bunun tersini sorabilirsiniz: Am I not better than you?eşdeğerdir if (Ophelia < Juliet). Ve zaten SPL'ye nasıl =çevrildiğini tahmin edebilirsiniz : as good as- Kod pasajı 2 kullanımı.

Ancak, good/betterbu shakesperian dilde karşılaştırma yapmanın tek yolu değil, herhangi bir sıfat kullanabilirsiniz. Aynı snippet 3 ilkesi, burada >"negatif" olanların değerine sahip olan "pozitif" sıfatlarla da geçerlidir <.

Uzunluk 7 pasajı:

Juliet:

Bu bir değişkenin çağrılmasıdır; Bundan sonra, onun talimatları / beyanları / ne olursa olsun takip edecek.

SPL'nin bir sınırlılığı, sınırlı sayıda değişkene sahip olmasıdır: Romeo, Juliet, Hamlet, Ophelia, MacBeth ve diğerleri, Shakesperian programında görünecek birkaç "karakter" örneğidir.

Uzunluk 8 pasajı:

[Exeunt]

[Exeunt]Tüm "karakterler" "aşama" dan ayrıldığında yerleştirilir. Umarım, karakterler arasındaki etkileşimle ilgili biraz daha ayrıntılı çalışabilirim. Genel olarak, herhangi bir SPL programının son talimatı olmasına rağmen [Exeunt], özellikle dilin terminal karakteri olmamasına rağmen . Başka bir örnek için, snippet 27'ye bakın.

Uzunluk 9 pasajı:

as bad as

Yalnızca bir =parçacığını kullanan dokuz karakteri temsil etmek için 2. SPL'nin tuhaf olduğunu söylemiş miydim? Örnekler için pasaja 30 bakın. (ve evet, çıktı almanın birden fazla yolu var)

Uzunluk 10 pasajı:

difference

Göstermenin süslü bir yolu -, bir çıkarma. SPL'de matematiksel işlemler yapabilirsiniz, muhtemelen doğru bir şekilde yapmak için tam bir güne ihtiyacınız olsa bile.

Factoid (bir şekilde on kod parçacığına ulaşmayı başardığımdan, biraz ara verelim ve SPL hakkında başka bir factoid yapalım)

Shakesperian kodunuzu tüm ihtişamıyla çalıştırmak istiyorsanız, bu site var - hala test ediyorum, çünkü 5 dakika önce bile bulamadım. Bir tercüman kullanarak onu C'ye çevirmenin bir yolu var .

SPL kodunu çalıştırmak için başka bir site, SPL kodunu dahili olarak başka bir ezoterik dile çevirerek çalışan bu sitedir : Oracle PL / SQL.

Uzunluk 11 pasajı:

[Exit Romeo]

Evet! Sonunda karakterler arasındaki etkileşimi konuşabilirim! Değerinin değişmesi veya başkaları ile etkileşime geçmesi için sahneye girerken bir "karakter" bulunmalıdır [Enter Romeo]. Bir karakter adreslenmiş ancak bulunmuyorsa, çalışma zamanı hatası vardır ve program durur. Çünkü, SPL'de değişkenlerin değeri, övgüde bulundukları adların sayısına göre - veya sahnede diğer karakterlerle hakaret - olarak belirlenmiştir. Topal açıklamamın yaratabileceği karışıklığı gidermek için bir örnek vermem gerektiğini düşünüyorum, ancak birkaç parçacığı geciktirmek belki de en iyisidir.

Uzunluk 12 pasajı:

Remember me.

SPL oldukça "basit", tamam - ama yığınları var! Örneğin, Romeo, Juliet'e "onu hatırlamasını" söylediğinde, aslında Romeo'ya değerini yığına sokması için sevilenine söyler. Değerini haşhaş ile yapılır Recall your happy childhood!, ya da Recall your love for me, ya da temelde başlayan tüm cümle Recall- kalanı pasajı 22 gibi sadece sanatsal bir saçmalık.

Uzunluk 13 pasajı

Let us return

Shakesperian tarzı bir goto. Ve burası, Elçilerin ve Sahnelerin kullanışlı olduğu yerdir. Romeo, Juliet'e söylerse we shall return to Act II(evet, yine, yazmanın birden fazla yolu vardır), program kodun o belirli bölümüne atlayacaktır. Ayrıca şartlı ifadelerin yanında da görülür.

Uzunluk 14 pasajı

my little pony

Evet, 80'lerde bir dizi oldu. İşte bu 2*1. Neden? Çünkü a pony(biraz) olumlu bir isim ve littlebir sıfattır. Yani, 3 ve 4 snippet'lerini hatırlayarak, biz little = "2 *"ve pony = "1".

Uzunluk 15 pasajı

Speak thy mind!

Bir SPL programında, bunu (veya Speak your mind!aynı olanı) çok göreceksiniz . Bu, temel olarak, bilgisayarınızın kullandığı karakter setine bağlı olarak, her bir "karakter" in değerini rakam, harf veya herhangi bir şekilde verir. Orada da var Open your mind.o yalnızca sayısal formda çıkışı olsa hemen hemen aynı şeyi yapar.

Uzunluk 16 pasajı

You are nothing!

Biri size bunu gerçek hayatta anlattığında, kendinizi depresyonda hissedeceksiniz. Ophelia, Shakespearian'ın programlamasında Hamlet'e bunu söylediğinde, Hamlet kendini değersiz hisseder. Ne anlama geliyor? Yani Hamlet = 0.

Uzunluk 17 snippet

Ophelia, a wench.

Bir senaryoda, gerçek oyun başlamadan önce karakterlerin sunulması gerekir. Çoğu programlama dilinde, değişkenlerin kullanımdan önce de bildirilmesi gerekir. SPL'nin senaryoya benzeyen bir programlama dili olduğunu görünce, programda görünenlerin hangileri olduğunu belirterek değişkenlerini nasıl açıkladığınızı görebilirsiniz.

Peki "wench" ne anlama geliyor? Özel bir (ve harika) veri türü adı olduğu anlamına mı geliyor? Şey ... Seni hayal kırıklığına uğratmaktan nefret ediyorum ama bu hiçbir şey ifade etmiyor: virgülten sonraki her şey ayrıştırıcı tarafından göz ardı ediliyor, yani oraya aklınıza gelebilecek en çirkin saçmalık koyabileceğiniz anlamına geliyor.

Uzunluk 18 snippet

lying sorry coward

-4tüm dünyasal yaratıklar için. Neden? Çünkü 2*2*(-1) = -4.

Uzunluk 19 pasajı

Romeo:
 Remember me.

Sonunda!!! Sonunda tam bir doğru sözdizimi talimatı verebilirim (kısa da olsa)! Parçacık 12'yi bu şekilde kullanırsınız: ilk önce kimin konuştuğunu bildirirsiniz, sonra bir sonraki satıra "diyalog" yazarsınız. Normalde, ayrıştırıcının üzülüp kafasını karıştırmamak için yalnızca iki "karakter" sahnededir. Başka bir "karaktere" ihtiyacınız olduğunda, sahneden birini alın ve onu yenisiyle değiştirin.

Uzunluk 20 pasajı

cube of thy codpiece

Bunun için biraz daha detaylandırmak istedim, ama gerçeği söylemek gerekirse, ortaya çıktıklarım hala bu snippet uzunluğu için çok kısa. Ve böylece, size bunu getiriyorum, ki sonuç şu ki -1- çünkü (-1) 3 = -1 (ve codpiecerahatsız olduklarından ve hepsinden ötürü "negatif" bir isimdir). SPL, bazı üstel ve karekökler olarak birkaç daha ayrıntılı aritmetik işlemi anlar .

Factoid (bir tane daha, bir başka dönüm noktasına ulaştığımızdan beri)

Shakesperian'daki "Merhaba Dünya Programı", burada görüldüğü gibi , 89 satır ve 2400 karakterden daha uzun bir süreye sahip .

Uzunluk 21 pasajı

Listen to your heart.

Snippet 15'te bir şey çıktı; burada programa bir sayı girersiniz. Bir karakter girmek istiyorsanız, Open your mind.onun yerine kullanacaksınız . Söylemeye gerek yok, bu değer konuşulan "karakter" de saklanacaktır.

Uzunluk 22 pasajı

Recall your childhood!

Bir yığından bir tamsayı fırlatmak, bununla birlikte, snippet 12'de açıklandığı gibi yapılır. Örneğin, Ophelia Hamlet'e yukarıda belirtilen cümleyi söylerse, Hamlet'in yığından bir tamsayı almasına ve bu değeri almasına neden olur.

Elbette, kelime recallcümleyi başlattığı sürece , gerisini yaratıcı Shakesperian zihninizin istediği hemen hemen her şeyle doldurabilirsiniz.

Uzunluk 23 snippet'i

Are you better than me?

Snippet'in Uygulanması 6. Bir "karakter" başka bir soruya böyle bir soru yaptığında, yaptığı şey if (x > y)daha yaygın programlama dillerinde eşdeğerdir . Daha fazla karakter olana kadar bu talimatın izlenmesi gecikmeli olmalı.

Uzunluk 24 snippet'i

[Enter Romeo and Juliet]

Evet, "karakterler" çiftler halinde girebilir. Bir diğer karakter tarafından takip edilen sahneye giren bir "karakter" olması gerekmez.

Uzunluk 25 pasajı

remainder of the quotient

Sadece yazmak için 25 karakter %. Bir bölümün kalanına sahip olmak için 25 karakter. Ve kullanmak için? Eh, bu daha da büyük - pasajı 75 bakın.

Uzunluk 26 pasajı

Let us return to scene II.

İşte gotobir programlama dilinde beklediğiniz gibi çalışan bir SPL'dir. Bir şey: aynı eylemdeki sahneler arasında ve eylemler arasında atlayabilirsiniz; ancak farklı davranışlardaki sahneler arasında geçiş yapamazsınız.

Uzunluk 27 pasajı

[Exeunt Ophelia and Hamlet]

Birden fazla "karakter" sahneden ayrıldığında, ExitSPL'nin teatral doğası ile geleneği sürdürmek yerine , Latince "Exeunt" kelimesi kullanılır. Bazen sadece pasaj 8 ile değiştirilebilir.

Uzunluk 28 pasajı

Scene I: Ophelia's flattery.

Bir Sahne Bildirmek. Zaten benimle başa çıkıp yaşamayacağınızı bekleyebileceğiniz gibi, asıl önemli Scene Iolan gerisi sanatsal kabartmak.

Yasa / Sahnenin numaralandırılmasından sonra metne atıf yapan bazı derleyiciler ( SPL'den C'ye, Python'da yazılmış olan gibi ) yapılmıştır. Daha mantıklı olmakla birlikte (her şeyden önce, bir oyun sırasında, "Harekete Geri Dönelim" gibi satırların söylenmesi saçma görünebilir), orijinal yola yapıyorum.

Uzunluk 29 snippet

You pretty little warm thing!

Evet, yine başka bir sabit ( aritmetik işlem yapmak için daha fazla karaktere ihtiyacımız olduğu için). Bu 8, çünkü eşittir 2*2*2*1 = 8.

Uzunluk 30 pasajı

You are as cowardly as Hamlet!

Bunu söylemek, mesela Romeo demek ki Romeo = Hamlet. 9 parçacığı gibi.

Factoid (evet, başka bir dönüm noktası oldu!)

Bu dil bir Sözdizimi Analizi kursunda bir ödev için yaratılmıştır - bu nedenle yazarlar tarafından SPL derleyicisi oluşturulmamıştır. Devamı: Görünüşe göre SPL'nin yazarları yarattıkları ile bağlarını kopardılar, çünkü dilde 2001'den bu yana hiçbir şey değişmedi ...

Uzunluk 31 pasajı

Am I as horrid as a flirt-gill?

Evet, biliyorum, bu biraz yinelenen pasajı 23, ancak burada, "flört-solunguğu" ile konuşan "karakteri" karşılaştırıyoruz (eğer istersen if (Ophelia == -1)). Şey ...

Uzunluk 32 pasajı

If so, let us return to scene I.

... şimdi thenSPL'yi ve koşullu atlayışı ve Shakesperian'lerin döngüleri uygulama şeklini tanıtabilirim . Mesela, Romeo'nun değeri üstlenmesini sağlayabilir, 0başka bir görev yaparken değerini artırabilir ve daha sonra programa devam ederek 10'a ulaştığında durabilirsiniz.

Uzunluk 33 pasajı

If not, let us return to scene I.

Sadece bir hatırlatma, bunun yerine, test ettiğimiz koşul yanlışsa başka bir sahneye geçebileceğimizi söyleyebiliriz .

Uzunluk 34 pasajı

Open your mind! Remember yourself.

Üst üste iki talimat, yippie! Birincisi bir karakter okur, ikincisi onu diğer karakterin hafıza yığınına iter.

Uzunluk 35 snippet

Act I: Death!

Scene I: Oh, shit.

Kanun ve Sahnenin ilan edilmesinin uygun yolu. Zevkle sanatsal mantar ekleyin.

Uzunluk 36 pasajı

Thou art as sweet as a summer's day!

Konuşulması gereken "karakter" in değerini almanın bir başka yolu 1- çünkü yaz günleri güzel ve hoş.

Uzunluk 37 snippet

Art thou more cunning than the Ghost?

Bu soruyu Hamlet'e sormak, bunu daha az okunabilir bir programlama diline çevirmek anlamına geliyor if (Hamlet > the Ghost). Tekrar tekrar 23 parçacığı var, evet - ama "karakterlere" birbirlerinden daha iyi olup olmadıklarını sormanın gerekmediğini göstermeye devam ediyor: başka bir soru da işe yarayacak.

Uzunluk 38 pasajı

[Enter the Ghost, Romeo and the Ghost]

Evet, iki kez "karakter" olarak adlandırıyorum - çünkü programın bana bir hata yapmasını istedim. Halihazırda sahnede olan bir "karakter" olarak adlandırılması veya çıkamayan birisinin söylenmesi ayrıştırıcı / derleyiciye büyük bir üzüntü verecektir.

Uzunluk 39 snippet

the sum of a fat lazy pig and yourself!

Tüm talimatlar buna bakmakla daha iyidir, size bunu vereceğim, ama ... işte ilk aritmetik işlemimiz! Aslında bunların anlamı ne? Şey, pigkirli bir hayvan (lezzetli olsa da), yani eşdeğer -1, iki sıfat var, yani fat lazy pigeşit 2*2*(-1) = -4. Peki ya yourself? Yansımalı bir zamir, isim ya da sıfat değil. Öyleyse, SPL'nin "karakterler" arasındaki diyaloglara dayandığını unutmayın; Bu nedenle, yourselfsahnede diğer "karakter" anlamına gelir. Böylece, sonuna varıyoruz ve “şişman tembel bir domuzun ve kendinin toplamının” aslında olduğunu keşfediyoruz -4 + x.

Uzunluk 40 pasajı

the sum of a squirrel and a white horse.

Evet, başka bir toplam, ama bu paragraf 39'dan daha basittir. Bu sadece 1 + 2- 3eğer matematiğim doğru ise.

Factoid (Hala kırk sanatsal kabartmadan sonra benimle birlikte misiniz? Bir ödülü hakediyorsunuz.)

SPL, 1.2.1 sürümünde buradan indirilebilir .

Uzunluk 41 snippet

Juliet:
 Speak thy mind!

[Exit Romeo]

Bazen "karakterler" yalnızca sahnede değerlerinin değişmesi için denir - bu da gerçek bir oyunda oldukça tuhaf bir şey olurdu. Her neyse, burada, Juliet, sevgili Romeo'yu depolanan değerini yazdırarak sahneden çıkar.

Uzunluk 42 snippet

Speak YOUR mind! You are as bad as Hamlet!

Yine bir satırdaki iki komut (birden fazla olabilir, ancak pasaj uzunluğu henüz buna izin vermiyor); Burada, bir başkasına değerini çıkarmasını ve Hamlet'in sahip olduğu değeri varsaymasını söyleyen bir "karakterimiz" var. Kafa karıştırıcı? Mayhap.

Uzunluk 43 snippet

Am I as horrid as a half-witted flirt-gill?

Juliet bunu sormak, onun saygınlığının düşük olduğu anlamına gelmez (gerçek hayatta da olsa); if23 ve 37 numaralı snippet'ler gibi başka bir şey. Ah, neredeyse unutuyordum: bu çevirir if (Juliet == -2).

Uzunluk 44 snippet

You are as evil as the square root of Romeo!

Evet, kare kökler kötüdür, bilmiyor muydunuz? Her neyse, bu talimat ne yaptığını anlayacak kadar basittir: Konuşulan "karakter" i Romeo'da depolanan değerin karekökünün değerine bağlar.

Uzunluk 45 snippet'i

Hamlet:
 Art thou more cunning than the Ghost?

Snippet 37, hattı konuşan karakter ile doğru bir şekilde yazılmıştır.

Uzunluk 46 snippet

the product of a rural town and my rich purse.

Tamam ... neyse, SPL, şehirleri cüzdanlarla çarpmana izin veren dünyadaki tek dil olabilir. Bu (2*1)*(2*1), eğer çok yanılmıyorsam, eşittir anlamına gelir 4.

Uzunluk 47 pasajı

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

Size şunu vereceğim: tarihin en tuhaf diyaloglarından biri olabilir. Ancak, sergilemek için tuhaf bir dil seçtiğinizde elde ettiğiniz şey budur. Romeo ve Juliet birbirlerine kısaca değerlerini vermelerini söylüyor.

Uzunluk 48 pasajı

You lying fatherless useless half-witted coward!

Doğrudan çevirmek 2*2*2*2*(-1),. -16, sağ?

Uzunluk 49 snippet'i

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

SPL'de bir programın nasıl sonlandırılacağına bir örnek. Özel olarak bir sahne açıklayabilirsin (zorunlu olmasa da), daha sonra Hamlet değerlerini çıkarmaları için başka bir "karakter" sorar, sonra hepsi sahneden çıkar. Ve evet, hepsinin sahneden çıkması gerekiyor.

Uzunluk 50 pasajı

Othello, a young squire.
Lady Macbeth, an old fart.

Uygun talimatlardan önce "karakter" sunumu. Her zaman olduğu gibi, derleyici için önemli olan tek şey Othellove Lady Macbethbu yüzden çizginin geri kalanı kapmak için ...

Bir şey daha: "karakterler" bir SPL programında görünmek için birbirleriyle ilişkili olmak zorunda değil - böylece aynı oyunda Romeo, Othello ve Hamlet olabilir.

Factoid (bu şeylerin yarım yüzyıllık? Phew! Bundan sonra William Shakespeare'den nefret edeceğim sanırım ...)

SPL'den C'ye tercüman, bir süre önce bahsetti ve SPL yaratıcıları tarafından geliştirildi, Flex ve Bison'a dayanıyordu .

Uzunluk 51 pasajı

Othello:
 Recall your great dreams. Speak your mind!

(Romeo, Juliet ve Hamlet'ten bıktıktan sonra ... değişiklik yapmak için Othello'yu getirelim!)

RecallTahmin edebileceğiniz gibi, burada anahtar. Othello, "karakter" ibaresinden istifinden bir değer alacak, bu değerin üstesinden gelecek ve daha sonra, bunun çıktısını alacaktır.

Uzunluk 52 pasajı

Thou art as pretty as the sum of thyself and my dog!

Başka bir miktar. Esneyin. Bunun Hamlet'e yönelik olduğunu varsayarsak, bunun anlamı Hamlet = Hamlet + 1. Veya Hamlet += 1. Veya Hamlet++.

Uzunluk 53 pasajı

Romeo:
 You are as vile as the sum of me and yourself!

Ah, evet, daha önce bahsetmeyi unuttuğum bir şey: konuşan "karakterler" kendi satırlarında kendilerinden bahsedebilir.

Uzunluk 54 snippet'i

Juliet:
 Is the sum of Romeo and me as good as nothing?

Bir koşulda yer alan önceki snippet'in başka bir örneği. Yani burada sahip olduğumuz şey if (Romeo + Juliet == 0).

Uzunluk 55 pasajı

Juliet:
 You are as lovely as the sweetest reddest rose.

Böylece, burada, Juliet, konuştuğu "karakteri" övüyor (Shakespeare'in hatırı için Romeo olduğunu varsayalım), 4 olduğunu ilan etti. Evet, başka bir değer ataması.

Uzunluk 56 snippet'i

Othello:
 You lying fatherless useless half-witted coward!

Snippet 48 düzgün bir şekilde "karakter" ile yapıldı. Yukarı kaydırmayacak kadar tembelseniz (benim gibi), bu, hakaret edilenin -16 değerini aldığı anlamına gelir.

Uzunluk 57 pasajı

Romeo:
 If not, let us return to Act I. Recall thy riches!

SPL'de koşulların genel olarak nasıl çalıştığını zaten açıkladım; ancak, daha fazla satır içi analiz gereklidir. Burada biz yokuz else: örneğin, bu örnekte, koşul başarısız olursa, program Yasası I'e dönecekti; ama eğer doğru olsaydı, bir sonraki komutuna devam ederdi, ki bu Recall- yığıntan bir pop, yani.

Uzunluk 58 pasajı

Romeo:
 You are as disgusting as the square root of Juliet!

Pasaj parçasını 44 kapmak ve talimatın nasıl sunulması gerektiğini göstermek. Bu Romeo ve Othello arasında bir diyalog olsaydı, o zaman bunu Java'ya çevirebilirdik Othello = Math.sqrt(Juliet).

Uzunluk 59 snippet

Othello:
 You are as vile as the sum of yourself and a toad!

Tamam, eğer Othello Romeo'yla konuşuyorsa, buna eşdeğer olur Romeo+(-1); Romeo--, kısaca. Oldukça basit değil mi? Bu senin için SPL.

Uzunluk 60 pasajı

Is the quotient between the Ghost and me as good as nothing?

Kısacası, if (The Ghost/Hamlet == 0)"ben" varsayımı Hamlet'e ait.

Uzunluk 61 snippet

Thou art as handsome as the sum of yourself and my chihuahua!

Kelime ve hakaretlerin katmanlarını ve katmanlarını soyduktan sonra, SPL'nin harika işlevler ve şeyler olmadan temel bir şey olduğunu fark edersiniz. Böylece programın gövdesinde çok fazla aritmetik fonksiyon yükümüz var. Öyleyse, eğer bu Juliet'e hitap edilmişse, buna eşdeğer olur Juliet++.

Uzunluk 62 snippet

twice the difference between a mistletoe and a oozing blister!

Evet, evet, daha fazla aritmetik işlem. Kabaca, bu 62 bayt SPL'ye çevrilebilir 2*(1-2*(-1)). Bu harika bir golf dili olurdu, değil mi? Sağ.

Uzunluk 63 pasajı

You lying stupid fatherless rotten stinking half-witted coward!

Snippet 48, -16 ile çıktı, bu da -64: e eşit 2*2*2*2*2*2*(-1).

Uzunluk 64 snippet

your coward sorry little stuffed misused dusty oozing rotten sky

SPL'yi anladığım kadarıyla, bu tamamen yasal. "Olumlu" bir isim gösteren bir çok hakaret sıfatına sahipsin. Sıfatların olumsuz olup olmadıklarına dair özel bir ayrım olmadığından (tek değerleri, sağdaki sayıyı iki ile çarpmaktır), bunun gibi tamamen saçma cümleler kurabiliriz. Hangi 256'ya eşittir. Çünkü 2*2*2*2*2*2*2*2*1=256.

Uzunluk 65 snippet

You are nothing! You are as vile as the sum of thyself and a pig.

Hmm, çok fazla nefret, değil mi? Yani, burada sahip olduğumuz eşdeğer y=0; y=y+(-1);Muhtemelen, "golf" olabilirdi You are a pig!ama heh.

Uzunluk 66 snippet'i

You are as beautiful as the difference between Juliet and thyself.

Demek Juliet'i kendinden çıkar. Bu çözülmesi oldukça basittir: Romeo=Juliet-Romeo;söylenen Romeo olduğunu varsayarak.

Uzunluk 67 pasajı

Juliet:
 Am I better than you?

Romeo:
 If so, let us proceed to Act V.

SPL'de koşulların çoğu nasıl çalışır? İfadeyi test edersiniz ve doğruysa (ya da değil: pasajı 33'e bakın), programın başka bir bölümüne atlayın; Aksi takdirde, bir sonraki cümleyle devam edersiniz.

Uzunluk 68 pasajı

The Ghost:
 You are as small as the sum of yourself and a stone wall!

Evet, evet, biraz monoton hale geliyorum. Ancak SPL böyledir. Biraz önce belirttiğim gibi, ifadeleri aritmetik işlemlerin bir karışımıdır. Böylece, bu başka bir artıştır - çünkü stone wallnötr bir "isim".

Uzunluk 69 pasajı

Thou art as disgusting as the difference between Othello and thyself!

Bir miktar yerine, Othello ve kiminle konuşulduğu iki karakter arasındaki çıkarmaya sahibiz.

Uzunluk 70 pasajı

You are as handsome as the sum of Romeo and his black lazy squirrel!

İlavelere geri dönüyoruz, evet - beni formül olarak adlandır, he. Bunu çeviririz Romeo + 2*2*1.

Uzunluk 71 pasajı

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

Bir sahne bu kadar küçük olabilir. Julietsahneye girer, Othello ona depolanan değerini vermesini söyler, sonra tekrar sahneden çıkar.

Uzunluk 72 pasajı

twice the difference between a mistletoe and an oozing infected blister!

Bir aritmetik işlem daha var - çünkü SPL onlarla biliniyor. Bunu çevirebiliriz 2*(1-2*2*(-1)).

Uzunluk 73 snippet

You are nothing! Remember me. Recall your unhappy story! Speak your mind!

Üst üste dört talimat ?! Aslında kendimle gurur duyuyorum. Her neyse, bunun Romeo ve Juliet arasındaki bir diyalog olduğunu varsayalım (ve konuşuyor): bu, Juliet'in değerinin 0'da başladığı anlamına gelir; sonra Juliet, Romeo'nun değerini hafıza yığınına sokacak, açacak ve girilen biçiminde çıkacaktır. Basit değil mi?

Uzunluk 74 snippet'i

You are as sweet as the sum of the sum of Romeo and his horse and his cat!

Evet, sıkıcı bir örnek biliyorum. Ama bu X = (Romeo + 1) + 1.

Uzunluk 75 pasajı

Is the remainder of the quotient between Othello and me as good as nothing?

Eh, bu oldukça basit. Kod çözme becerileriniz arızalanıyorsa, buna karşılık gelir if (Othello % X == 0).

Uzunluk 76 snippet'i

Thou art as rich as the sum of thyself and my dog! Let us return to scene I.

Önceden bir ifadeyle pasaj 26'dan atlama. Bir gotoSPL'de her zaman bir koşulun yanında bulunmaz, bu böyle olabilir - ve elbette, bu tür bir gotoeylem her zaman bir Yasanın veya Sahnenin sonunda bulunur, çünkü talimatlar asla derlenip / yapılmayacağından. İlk talimat oldukça basittir: x=x+1.

Uzunluk 77 pasajı

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

Öyleyse sahnede Juliet ve Hamlet var; ama Romeo'nun değerine ihtiyacımız var. Böylece, derleyiciyi çok kötü bir baş ağrısından kurtarmak için, öncelikle Hamlet'i sahneden kaldırırız (gitmesi gereken Juliet olsa da), Romeo'ya sahneye çıkmasını söyleriz, Juliet ona çıkış yapması için bir talimat verir. sayı (bkz. snippet 21'in açıklaması), sonra Romeo sahne dışına çıkar ve Hamlet geri döner. Oldukça basit ve basit.

Uzunluk 78 pasajı

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

Öyleyse, The Ghost (Hamlet'in vefat eden babası) Lady Macbeth'e değerinin çıkmasını söylerken, The Ghost'a bir sayı okuyup istifine itmesini emreder.


32
Bu inanılmaz derecede ilginç ve profil resminiz mükemmel bir uyum, tam olarak bir SPL programcısının neye benzeyeceğini düşündüğüm gibi görünüyor.
overactor,

3
@overactor Bir Gumby'ye benzetilmek için hakaret edilip edilmeyeceğini veya gururlanacağını bilmiyorum. ^ _ ^
Rodolfo Dias

9
Garip bir şekilde, buradaki örneği okumak için en belirsiz olanı değil ... ve "en az pratik" olanlara bağlı gibi görünüyor.
HRRambler

6
ROFL işte size +1 işte size yardımcı olacak - İhlali Rodolfo'ya bir kez daha!
HRRambler

3
@ RodolfoDias Başlayabilirsiniz. Onları görmeyi bekliyorum. 120 oy hakkın var.
ghosts_in_the_code

176

Piet

Uydurma

Piet, kaynak kodun resimlerden oluştuğu bir programlama dilidir. Program akışı, sol üst pikselle başlar ve görüntü sona erene kadar pikseller ve piksel grupları arasında hareket eder.

Okunabilirlik için, Piet programları genellikle genişletilmiş bir sürümde görüntülenir. Böyle bir durumda, terim codelkaynak görüntüdeki tek bir piksele karşılık gelen aynı renkli piksellerin bir grubunu tarif etmek için kullanılır.

Bu zorluk için, Piet karakter kullanmadığından, örnek programlar için oy başına bir tane kodel kullanılacaktır.

1 Codel

1 Codel

Bu geçerli bir programdır, hiçbir şey yapmaz ve sona erer. Kontrol akışı sol üst (yalnızca) pikselde başlar ve programı sonlandıran hiçbir çıkış yolu yoktur.

Piksel bu durumda aynı etki için herhangi bir renk olabilir.

2 kodel

2 kodel

Bu, karakterleri sürekli olarak stdin'den okuyacak ve toplamın unicode değerlerinin toplamını koruyacaktır (bu toplamla hiçbir şey yapılmadı ve görüntülenmedi).

Progam akışı 2 kodlayıcı arasında ileri ve geri hareket eder, çünkü her birinin diğerinden tek çıkış yolu diğerinedir. Piet içindeki komutlar, 2 bölgenin renk tonu ve açıklığındaki farka bağlı olarak, bir kodul veya bölgeden diğerine hareket ile gerçekleştirilir. inputSoldan sağa hareket komutu ve ardından addsağ sola olduğunu. İlk addkomutta, yığında yalnızca bir değer olduğundan hiçbir şey olmayacak ve belirtimde yeterli değer bulunmayan komutların yok sayılacağı belirtiliyor.

Bu program hiçbir zaman sona ermeyecek bir döngüdür, çünkü çoğu piet programı son derece küçük boyutlarda olacaktır, çünkü program akışını düzgün bir şekilde "yakalamak" ve en sonunda bir kaç kodlayıcı gerekir.

3 kodel

3 kodel

Bu basit bir eko tipi programdır, stdin'den bir karakter okur ve stdout'a yazdırır.

Yine bu sonsuz bir döngüdür. Program soldan sağa hareket ederek başlar, inputo zaman yapar output. Program, mümkün olduğunda aynı yönde akmaya devam edecektir. Açık yeşil renkte tek çıkış diğer yoldan geriye doğru hareket etmeye başlamaktır. Sağdan sola geri giderken, gerçekleştirmeye subtractve addkomut vermeye çalışır , ancak yığın boştur, bu sayede işlem yapılmaz.

4 kodel

4 kodel

Süresiz olarak 2'den stdout'a yazdırır.

İşlevsel olarak özellikle ilginç bir program değil, fakat şimdi sonunda bir kompozit sayıya sahip olduğumuz için soldan sağa biraz daha gelişmiş akış gösterebiliyoruz. Program akışı bir girişten çıkmaya çalıştığında, ilk önce geçerli yönü dener. Bu mümkün değilse (bu durumda görüntünün kenarı nedeniyle) saat yönünde 90 derece döner ve tekrar çıkmaya çalışır. Bu durumda, program bir seferde saat yönünde 1 kod etrafında döner, 1'i istifin pushüzerine iki kez sokarak, bunları birlikte istifleyerek add, ardından outputsonucu verir.

5 kodel

5 kodel

Bir defada stdin'den bir karakter okur ve unicode değerlerinin toplamını izler.

Bu aslında 2-codel sürümüyle aynı işlevselliktir, ancak bu zorluk dilin gösterilmesi ile ilgilidir ve piet hakkındaki en güzel şeylerden biri de aynı şeyi yapan farklı görünümlü resimlere sahip olmanızdır.

Burada ilk kez, program akışının talimatlar uygulamadan program boyunca akmasına izin veren beyaz koderi görüyoruz. Eflatun ve mavi kodeller burada tüm işleri yapıyor. Maviden kırmızıya gitmek hiçbir şey yapmaz, çünkü ortadaki beyaz koya geçiyor. 2 kırmızı olanlar pushistifin üzerine sadece 1 sayısı ve popsoldan sağa, sonra sağdan sola doğru ilerlerken geri döner ve sonra beyaz koza doğru ilerler, böylece hiçbir komut yürütülmez.

6 kodel

6 kodel

Yine, daha önceki işlevselliği farklı bir görünümle tekrarlamak. Bu, stdin'den stdout'a bir anda bir karakter okuyan başka bir yankı programıdır.

İşte ilk siyah kodonumuzu görüyoruz. Program akışı siyah bir girdaba giremez, bu nedenle sağ üstteki açık kırmızı renkli çubuktan program, görüntü kenarı nedeniyle sağdan çıkamaz, siyah renkli çubuk nedeniyle aşağı inemez ve kırmızı renkli kabinin içine geri dönemez. . Mavi ve yeşil kodeller tamamen dekoratif, program hiçbir zaman bunlara girmeyecek.

7 kodel

7 kodel

Yine farklı bir görünüme sahip başka bir yankı programı.

Burada ilk büyük bloklarımızı 1 büyüklüğünden daha büyük görüyoruz. Piet'te aynı renkteki herhangi bir bitişik kodel bloğu tek bir blok olarak değerlendirilir. pushKomutun boyutu, talimatın yürütülmesi dışında önemli değildir , bu nedenle bu program, farklı renkler hariç, tam olarak 3 kodlu versiyon gibi değerlendirilir.

8 Kodel

8 Kodel

Stdin'den bir sayı okur ve kareyi tekrar stdout'a çıkar.

Kontrol akışı, 4-codel programındaki gibi temel bir saat yönünde düzendir. Üst soldan itibaren sırayla işlemlerdir input, duplicate(yığına yığınının üst değer ek bir kopyasını iter) multiply, output. Sonra pushyığının üzerine 1 değeri gelir, beyaz boyunca kayar, böylece hiçbir komut yürütülmez ve ardından popsol alttan sol üst kola hareket ederken 1 yığından çıkar. Bu, boş bir yığınla programın başlangıcına döndürür ve tekrarlar.

9 Kodel

9 Kodel

1 + 2 = 3 ekler ve sonra sona erer.

Artık her iki boyutta 2'den fazla kodele sahip bir programımız olduğuna göre, sonunda programı sıkıştıracak ve sonsuza dek döngü yapmak yerine sonlandıracak bir bölge ayarlayabiliriz. İlk önce kırmızı kodelden koyu kırmızı bölgeye hareket eden bir işlem push1'dir, daha sonra program döner ve ortadaki açık kırmızı kodluya akar ve pushbu değer 2 olur. Açık kırmızıdan açık sarıya doğru akar. bir addişlem. Alttaki açık sarı çubuk, programın bitmesine neden olur çünkü tüm köşeler kapalı olduğundan dışarı akması için bir yol yoktur.


1- ve 2 yüksek programlar hızlıca çirkin ve ilgi çekici hale geliyor, bu nedenle bu noktadan sonra her yönde en az birkaç kodele izin veren sayılara odaklanacağım.

12 Kodel

12 Kodel

Sonunda faydalı olabilecek bir şey yapan bir program (yine de biraz gergin olsa da). Stdin'den 2 sayıyı sırasıyla okur ve sonra toplamlarını verir ve bunu tekrar tekrar yapar.

Program, 2 komutu veren 4 renkli çubuk boyunca soldan sağa doğru akar ve inputsardından bir addkomut verilir. Daha sonra sağ alt kıskacın içine hareket eder ve bir gerçekleştirir outputve ardından beyaz bölge boyunca sola, geriye doğru başlar.

Bu, 8 kodelde yapılabilirdi, ancak fazladan alana sahip olduğumuz için eski bir sinyalsiz TV ekranından biraz ilham alan bir şey yapabiliriz.

15 kodel

15 kodel

Stdin'den bir sayı okur ve karesini çıkarır.

Bu, aslında bir şeyler yapan bir programa biraz simetrik bir görünüm kazandırmak için birkaç püf noktası kullanır. En soldaki kırmızı çubuk, (en azından benim için) bu 2 kırmızı tonun çok benzer görünmesi gerçeğinden yararlanarak, alt kabindeki diğer renklerden farklı bir renktir. program, açık kırmızı bölgeden sağ açık mavi koya doğru ilerler ve ardından programın tam ortasından sağ tarafındaki açık yeşil alana doğru kısılır. O gerçekleştirir input, duplicate, multiply, ve outputoperasyonlar.

Koyu kırmızı kodlu çubuk, orta sütunun üstündeki ve altındaki ortadaki yeşil kodeller ile birlikte dekoratiftir ve program bunlara asla erişemez.

20 kodel

20 kodel

Stdin'den 0 okunana kadar sayıları okur, bu noktada girilen tüm sayıların toplamını verir ve çıkar.

Sonunda pointeroperasyon şeklinde kontrol akışını yapmak için yeterli odamız var . Üst kısmında 4 codels yerine input, duplicateve notişlemleri, ve daha sonra başka notişlem altında sarı 2-CODEL üst-sağ macenta hareket. notİşlem yığınının kapalı üst değer çıkar ve üst değer, bir 0 ise bir 1 iter, ve aksi takdirde 1. Bu nedenle notsıfır olmayan herhangi bir değeri 1 ile çift değiştirir. Sarı çubuktan koyu maviye geçiş pointer, üst değeri yığının dışına çıkartan ve yön işaretçisini saat yönünde saat yönünde hareket ettiren bir işlem gerçekleştirir .

En yüksek değer 1 ise (yani sıfır girmediysek), yön gösterici sola doğru işaret eder, bir addişlem için macenta kodellerine hareket eder (yığında yalnızca bir değer nedeniyle ilk kez yoksayılır) ve sonra beyazdan programın başlangıcına kadar.

İşaretçi işleminde yığının en üst değeri sıfır ise, yön işaretçisi değişmez ve program aşağı doğru devam eder. Daha açık mavi bantta hareket popetmek istiften girilen 0 olacaktır ve sadece biriken sayıların toplamını bırakacaktır. Alttaki camgöbeği çubuğuna taşınması outputbu toplamı sağlayacak ve daha sonra program akışı tutulduğundan beri sona erecektir.

25 Kodel

25 Kodel

Geri sayım! Stdin'den bir sayı okur ve ardından bir defada bir sayıdan 1'e kadar geri sayım yazdırır. Örneğin, 5 okunursa, 54321 yazdıracaktır.

Camgöbeğinden sarıya ilk işlem input. Ardından sarı program "loop" programının başladığı yerdir. Sarı> Eflatun> Mavi bir olduğunu duplicatedaha sonra output, bu yüzden yığın üst değerini yazdırır ama bir kopyasını saklar. Sağ tarafı aşağı hareketle, pushyığına değeri 1 daha sonra yerine subtractionyanındadır 1 ile bizim girilen değeri azalan duplicate, notve bir başka notyanında, koyu sarı alt-sağ açık magenta hareket. Bu, önceki program ile aynı sıfır / sıfır olmayan kontroldür. Açık mavi kodluya pointersola hareket etmek, işlemi tamamladıktan sonra programı sonlandırmak için koyu mavi göbeğe sola hareket edecek şekilde bir işlem gerçekleştirir veya ilk giriş olmadan döngüsümüzü yeniden başlatmak için sarıya kadar gider ancak orijinal değer azalır. 1 ile.

Kırmızı kodellerin 3'ü dekoratif olup herhangi bir renkte olabilir.

30 Codels

30 Codels

Fibonacci üreteci. Fibonacci dizisinin terimlerini stdout'a yazdırır ve durmaz.

Bu, rolloperatörün ilk tanıtımıdır ve aynı zamanda pushoperatörden istif üzerinde belirli bir değer elde etmek için 1'den büyük bir bölge büyüklüğünün ilk kez kullanılmasıyla birlikte kullanılır .

Her zaman olduğu gibi sol üstte sağa hareket ediyor. İlk 2 pushistif üzerine a 1 ve sonra outputFibonacci dizisi iki 1 ile başladığından beri çalışır, ancak ana program döngüsü sadece 1 kez basacaktır. Daha sonra pushana program döngüsünü başlatmak için sağ üstteki koyu kırmızıya dönüşecek şekilde yığının üzerine 2 saniye daha esler.

Sağ tarafa ilerleyerek biz duplicateve outputdizinin bir sonraki terimini basarız, sonra duplicatetekrar geçerli sıra değerinin bir kopyasını almak için. Alttan sola hareket etmek 2 pushişlem gerçekleştirir. Sağ alt kısımdaki açık kırmızı bölgenin boyutu 3 kodel olduğundan, ilki push1 yerine 1 yerine 3 atar .

Açık mavi renkte hareket etmek bir rollişlemdir. Bu, yığındaki ilk 2 değeri çıkarır ve atılan ikinci değere eşit bir derinliğe, atılan birinci değere eşit sayıda rulo gerçekleştirir. Bu durumda, 1 derinliği 1 olan bir rulo gerçekleştirir. Derinlikli bir rulo n, yığının en üst değerini alır (kopyalanmış akım değerimiz) ve nderinlere gömür . Yığımız şu anda sadece 3 derin, bu yüzden en üstteki değeri altına gömecek.

Bir kez daha yukarı çıkmak add, geçerli sıra değerini önceki sıra değeriyle bir araya getiren bir işlem gerçekleştirir . Yığımız şimdi üstte bir sonraki (yeni akım) sıra değerine ve altındaki son değere sahip. Program şimdi tekrar döngüyü başlatmak için beyazın üstüne koyu kırmızı macentaya doğru hareket eder.

Ortadaki sarı desen asla kullanılmaz.

54 Kodel

54 Kodel

"Merhaba!" stdout'a

Özellikle uzun bir mesaj değil, ancak piet'e basmak şaşırtıcı bir yer tutar. Unicode değerleri kullanılarak baskı yapılır ve tam sayılar çıkılmakta olan bölgenin büyüklüğü kullanılarak istifin üzerine itilir. Bu zorluk için çok sınırlı sayıda kod çözücümüz olduğu için, istediğimiz basılabilir menzile ulaşmak için biraz matematik kullanıyoruz.

Program pushsoldaki camgöbeği bölgesinden 5 ile başlar . Buradan duplicate, yığının 5'li bir grupla doldurulması için 6 işlemle tam tepeden akıyor . Sonraki bir push, 1 subtractistifin üstünde bir 4 koymak için, daha sonra 2 multiplyişlemleri yığın üzerine 4 * 5 * 5 = 100 koymak. Sonra duplicate2 100s için.

Şimdi program siyahtan zıplıyor ve alt kısım boyunca sola doğru çalışmaya başlıyor. Push3 ve 2'nin ardından rolla'nın 2 push100'ü bir 5'in altına gömmek için yaptığı operasyonlar. Sırada 1, çıkar ve "h" unicode olan yığının üstüne 100 + 5-1 = 104 almak için ekle. Sonraki 2 işlem push1 ve pointerköşeyi dönüp tam ortada hareket etmeye başlamak ve ardından output"h" yi yazdırmak.

Daha addsonra yığının üstüne 100 + 5 = 105 ve output"i" yazdırabilirsiniz. Yığın şimdi iki 5 içerir. Push1, add, multiply(1 + 5) * 5 = 30 verir. Sonunda push3 ve add33 ve outputsondaki "!" Ardından program sağdaki yeşilde sona ermesi için kalan beyaz alanın içinden geçer.


5
Hah evet, bunu bekliyordum :)
Sp3000

2D karakter dilden farkı nedir? Bu sadece hücre değerlerini iletme şeklin.
JDługosz

25
@jdlugosz Pek çok ezoterik programlama dili, aşağı indiğinizde, komutları kodlamanın benzersiz bir yolu olan birkaç basit yığın manipülasyon komutudur. Ben şahsen onları bir görüntüde kodlamanın iyi bir fikir olduğunu düşünüyorum.
Spencer

13
Eğer işlevsel denklikten bahsediyorsak, "Turing makinesinden ne farkı var?" Diye sorabilirsiniz. ama o zaman aynı soruyu bir kedide, Jüpiter gezegeninde veya diğer dillerden
birinde

3
9 codel örneği mini-pokeball gibi gözüküyor. Güzel.
The_Basset_Hound

155

> <> (Balık)

(Not: Bazı snippet'ler önceki snippet'lere dayanır, bu nedenle çoğu yanıttan farklı olarak onları en eskiden en yeniye vermeye karar verdim.)

Uydurma:

Befunge gibi,> <> yığın tabanlı bir 2D dilidir. Bu, talimatların çoğu geleneksel dilde olduğu gibi doğrusal olarak yürütülmediği anlamına gelir; program akışı yukarı, aşağı, sola veya sağa olabilir!

Uzunluk 1 pasajı:

X

X> <> içinde geçersiz bir komuttur, bu nedenle hata mesajı something smells fishy...yazdırılır. Aslında,> <> 'daki tek hata mesajıdır, sebebi sıfıra bölmek ya da boş bir yığın açmaya çalışmak.

Uzunluk 2 pasajı:

1n

> <> Öğesindeki program akışı sol üst kısımdan başlar ve başlangıçta sağ taraftır. 1yığına 1 nbasar , sonra sayı olarak basılır (ASCII karakterinin aksine). Fakat> <> programlar toroidaldir, yani komut göstericisi bir satırın sonuna geldiğinde etrafına sarılır. Böylece nbaştan başa sardıktan sonra, bir 1 bastırın, yazdırın, başa sarın, bir 1 bastırın, yazdırın ... ve 1sonsuza dek yazdırırız !

Uzunluk 3 pasajı:

"o;

İşte "string ayrıştırma, obir ASCII karakteri olarak çıktı ;ve programı sonlandırır. Fakat program aslında bir bütün olarak ne yapıyor?

İlk önce ipi ayrıştırmaya başlıyoruz, gördüğümüz her karakteri bir kapanış bulana kadar yığının üzerine itiyoruz ". A o, ardından a ;... tuşlarına basar ve komut göstergesini başa döndürür. Ama şimdi başlıyoruz, bu "yüzden string ayrıştırmayı durduruyoruz ve son olarak yığının ( ) üst kısmını basıp sonlandırmak için ove ;normal olarak çalıştırıyoruz ;.

Evet, bir dizgeyi başlatmak ve bitirmek için aynı alıntı karakterini kullandık!

Uzunluk 4 pasajı:

42n;

Şimdiye kadar gördüklerimize dayanarak, bunun bir sayı olarak 42'yi basmasını ve ardından sonlandırmasını bekleyebilirsiniz. Ancak,> <> bölümündeki tüm talimatlar tek karakterlerdir, bu nedenle bu aslında 4 ve 2'yi zorlar , ardından yığının tepesini bir sayı olarak (yalnızca 2) çıkarır ve sonlandırır.

Uzunluk 5 pasajı:

<v
;>

Unutmayın,> <> 2B bir dildir. Bu, program akışının yönünü değiştirmenin bir yolu olması gerektiği anlamına gelir!

Befunge gibi, bunu yapmanın bir yolu da oklar >^v<. Nasıl çalıştıklarını göstermek için yukarıdaki programa bakalım:

  • Program akışı başlangıçta doğru
  • < programın akışını sola doğru yapar - sola doğru gideriz ve v
  • v programın aşağı akışını sağlar - aşağı ineriz >
  • > programın akışını sağa doğru çevirir - sağdan aşağı doğru gideriz ve ;
  • Sonunda, sonlandırıyoruz.

Uzunluk 6 pasajı:

";"00p

> <> 'Nın bir diğer harika özelliği de refleks olmasıdır - program anında kendi kaynak kodunu değiştirebilir!

Burada bir a ;ve ardından iki sıfır atarız. psonra üst üç elemanı çıkar y, x, v( yyığının üst olmak üzere) ve yerleri vkonumunda x,y. Başka bir deyişle, pbu programda 0,0kodu içine çevirerek, konuma bir noktalı virgül koyar ;;"00p. Bu daha sonra programın sonlandırılmasına izin verir, çünkü komut göstericisi şimdi etrafına sarılır ve yeni yerleştirilenleri çalıştırır ;.

Uzunluk 7 pasajı:

\7*n;
6

Un Befunge gibi,> <> da aynalar (sahiptir \/|_#program akış yönünü yansıtan). Yani burada biz:

  • Sağa başla, ama \bizi aşağıya doğru yansıtıyor
  • Bir 6 itin ve kaydırın
  • Arka tarafına basın ve \sağa doğru yansıtın
  • 7'ye bas
  • Yığının ilk ikisini çarpın
  • Çıktı ve sonlandırma

Bir _ayna boyunca yatay olarak veya bir ayna boyunca dikey |olarak hareket etmek bir işlem değildir.

Uzunluk 8 pasajı:

"r00g>o<

Bir hatanın atılmasına izin veriliyorsa, muhtemelen en basit> <> quine. Buradaki iki yeni talimat:

  • r: Yığını ters çevir
  • g: - pop al y, xve karakteri itme x,yyığına (muadili için p)

Önceden dize sarma hilesi kullanarak, program başlangıçta iter ve r00g>o<sonra tekrar ilk alıntıya çarpar. Yığın daha sonra ters çevrilerek verilir <o>g00r. Bundan sonra biz de kömürü itmek 0,0, "vermek, <o>g00r". Sonunda, oiki ok arasında bir tuzak kurarız, hiçbir şey kalmayıncaya kadar yığının tepesini çıkarıp hata alırız.

Uzunluk 9 pasajı:

x0\>
\1n>

x(küçük harf) komut göstergesini rastgele bir yöne hareket ettirir ve program sonsuza kadar rastgele bit basarak bu işlevi gösterir. Bunun nasıl çalıştığını anlamak için okları ve aynaları izlemeyi deneyin! (Yukarı ve sol da dahil olmak üzere dört yönü de kontrol etmeyi unutmayın)

Uzunluk 10 pasajı:

;a comment

> <> 'Da yorum sözdizimi yok - birisine gerek yok. İstediğiniz yere herhangi bir yere yazın ve kod olarak çalıştırılmadığından emin olun!

Uzunluk 11 pasajı:

1!X2!X+!Xn;

!talimatların üzerinden atlayan bir trambolin. İle birlikte kullanıldığında özellikle yararlıdır ?bir, koşullu attı elemanının sıfır ise bir sonraki komutu istifinin üst çıkar ve çalıştırır trambolinin. Bunun daha sonra nasıl çalıştığını göreceğiz.

Yukarıdaki kod, Xs'yi atlayarak 3'ü basar , sadece çalıştırır 1! 2! +! n;.

Uzunluk 12 pasajı:

01v
ao>:@+:n

Fibonacci numaralarını 1, her satırda bir saniyeden başlayarak sonsuza kadar yazdırır . Yeni komutlar:

  • a: Newline için ihtiyacımız olan 10'a basın. a-fsırasıyla 10 ila 15 düğmesine basın.
  • :: Yığının üst kısmını yinele
  • @: İstifin üst üç elemanını döndürün, örn [5 4 3 2 1] -> [5 4 1 3 2].

İlk birkaç yinelemenin izini sürün:

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

Uzunluk 13 pasajı:

i:d=?v
l?!;o>

Giriş satırında okuyan ve tersine çeviren bir "tac" programı. Snippet için @tomsmeding teşekkürler.

=En üstteki iki öğeyi açar ve eşitse 1'e, aksi takdirde 0'a basar. İlk satır, ASCII char 13 (satır başı) bulununcaya kadar girişte okumaya devam eder, bu noktada ikinci satıra geçer.

l?!;oDöngü yığının tamamını verir> <> önemli bir kavramdır. Aksine >o<, herhangi bir hataya neden olmaz. Bu nasıl çalışır:

  • l yığının uzunluğunu iter
  • Uzunluğu şu şekilde kontrol ederiz ?:
    • Uzunluk sıfır değilse, bir sonraki komut !atlanıp;
    • Uzunluk Eğer idi sıfır, o zaman biz yürütmek yok !ve bağlı sonlandırmak;

Satırbaşı dönüşüne ulaşana kadar çıktı olmadığına dikkat edin.

Uzunluk 14 pasajı:

32.

   X67*n;

Program akış yönünü değiştirmenin yanı sıra, komut göstergesini istediğiniz yere taşıyabilirsiniz!

.çıkar y, xve kullanım işaretçi ışınlar x,yyönünde muhafaza. Bununla birlikte, gitmek istediğiniz yere gitmeden önce bir kareye gitmeniz gerektiğini unutmayın; bir sonraki komut çalıştırılmadan önce komut göstericisi güncellenir. Bu yüzden burada komut göstericisi geçersiz sayılır X, ancak gösterici 6devam etmeden önce hareket ettiğinden her şey yolundadır.

.programların çoğunu>>> tek bir linere dönüştürmeyi mümkün kılar, ancak neden 2D'nin eğlencesini kaybetmek istersiniz? :)

Uzunluk 15 pasajı:

01+:aa*=?;:nao!

Numaralarını yazdırır 0için 99, her satırda bir tane. Bu program !, ilk 0'ın yalnızca bir kez basılmasını sağlamak için trambolinin düzgün bir şekilde kullanıldığını gösterir .

Uzunluk 16 pasajı:

"r00g!;oooooooo|

Düzgün quine vermez üzerinde Quine'ın esinlenerek hataları atmak, esolang sayfa .

Bir önceki sorguyu nasıl değiştireceğinizi merak ettiyseniz (pasaj # 8) bir hataya yol açmayacak ve "neden bir otalimatlar ekleyemiyorum ?" Diye düşündüğünüzde , her oeklediğiniz için bunu fark edebilirsiniz. , başka bir çıktıya ihtiyacınız var o! Bu quine |, her birinin iki kezo kullanılmasına izin veren bir ayna koyarak sorunu düzgünce çözer .

Biz (string ayrıştırma için de vardır) tek tırnak geçerseniz, kullanmaz sonra alternatif quine golduğunu

'r3d*!;oooooooo|

Uzunluk 17 pasajı:

b2,63,.

   17,n;

Ayrıca +toplama ( ), çıkarma ( -), çarpma ( *), modulo ( %) ... olur, peki ya bölme? O orada, ancak /zaten bir ayna olduğundan, bölmenin ,yerine sembol atandı . İlginçtir ki, bölünme tam sayıdaki bölünme değil, değişken bölmedir !

Yukarıdaki program, tanımlanamayan davranışları atlamaya çalışarak incelemektedir 11/2, 6/3. Python intepreter (yanlış noktaya atlar rağmen) koordinat ilk bir tamsayı değilse tamam görünüyor, ama ikinci değilse şoklar.

Uzunluk 18 pasajı:

123456${{$}nnnnnn;

rHangisinin yığını tersine çevirdiğini ve @hangisinin ilk üç elementi döndürdüğünü gördük . Yığındaki öğeleri taşıyan birkaç komut daha:

  • $: İlk iki elemanı değiştir
  • {: Tüm yığını sola kaydır
  • }: Tüm yığını sağa kaydır

Bunun nasıl çalıştığını göstermek için, işte program izlemesi:

123456 ------> 123465 ------> 234651 ------> 346512 ------> 346521 ------> 134652
       $ Swap        { L shift      { L shift       $ Swap        } R shift

Sonra çıkarıp verdik 256431.

Uzunluk 19 snippet'i:

"reward"4[roooo]oo;

Şimdiye kadar "yığın", "yığın" demiştim ...

Çoğu program yalnızca bir yığın kullanmasına rağmen,> <> aslında birden çok yığına sahip olabilir! İlgili talimatlar:

  • [: xÜstteki xöğeleri açar ve yeni bir yığına taşır
  • ]: Geçerli yığını kaldırır ve değerlerini alttaki yığına taşır.

İşte yukarıdaki program için iz:

       [r e w a r d]       Push "reward"
4[     [r e] [w a r d]     Move four elements to a new stack
r      [r e] [d r a w]     Reverse the current stack
oooo   [r e] []            Output "ward"
]      [r e]               Remove the current stack, no values to move
oo     []                  Output "er", giving "warder" altogether

rewardNotların basitçe itilip tekrar çıkarılmasının , yığınların “ilk giren, son çıkan” niteliği nedeniyle ooooooyazdırılacağını unutmayın drawer.

Uzunluk 20 pasajı:

aa*5+\
7a*2+\
oo;  \

>>> Az bilinen bir özellik, Python gibi ters eğik çizgilerin çoğu durumda çizginin devamı için kullanılabilmesidir. *

Yukarıdaki kod işlevsel olarak aynıdır

aa*5+7a*2+oo;

* Feragatname: Bunun işe yaramasının ya da tamamen farklı bir nedenle olmasının sebebi

Uzunluk 22 pasajı:

1&fv ;n&<
&1->:0=?^:&*

> <>, Yığınlara ek olarak, değerleri saklamak için kullanılabilecek kayıtlara (her yığın için bir tane) sahiptir. &İlk kez çağırmak , yığının en üst değerini kayıt cihazına &taşır ve tekrar yürütme değeri geri döndürür. Bu, bir değer biriktirirken, örneğin toplamlar ve faktörler gibi çok faydalı olabilir.

Program, yukarıda faktoriyelini hesaplar fBurada 1307674368000. baskı, (15) için iz var file değiştirilir 4:

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

Uzunluk 24 snippet'i:

"Hello, World!"rl?!;of0.

Herkesin favori programı için yeterli karakterimiz var! Burada .aktarıcıyı çıkış döngüsü için kullanıyoruz.

Uzunluk 25 pasajı:

0i:0(?v$a*$"0"-+!
   ;n~<

Ne yazık ki> <>, her seferinde STDIN'den bir karakter okumaya izin veriyor, bu sayede rakamları biraz zorlaştırıyor. 0-9 rakamlarından oluşan giriş için, bu program esasen atoi'dir ve STDIN'den bir rakam hanesini istif üzerinde bir sayıya dönüştürür (daha sonra basılır).

Diğer bir not, EOF'de, iyığına -1 bastırmasıdır. Bu, 0 kullanarak (ya da "daha az" kullanarak EOF'yi kontrol etmeyi kolaylaştırır .

Bu pasaj aynı zamanda ~yığının üst öğesini açan ve atan bir de kullanır .

Uzunluk 33 pasajı:

i>:nao:1=?;\
 ^  ,2v?%2:/
 ^+1*3<

Şimdiye kadar, çoğu snippet'ler ya nispeten doğrusaldı, ya da sadece <> 'nin işlevselliğini gösteren basit örneklerdendi. Şimdi iyi hazırlanmış bir programla>>> program akışını görselleştirmenin ne kadar kolay olduğunu vurgulayan bir örnek verebilirim.

Program tek bir ASCII karakterinde okur ve 3x+1algoritmayı kod noktasında çalıştırır (In> <> karakterleri temelde tamsayıdır). Algoritmanın her adımı 1'e basılana kadar yazdırılır.

İşte girişli ilk birkaç tekrarlama için bir iz: a(kod noktası 97):

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

Uzunluk 44 snippet'i:

a&>i:0(?v"+"$\
/&^?=0l< "a*"/
\:1+&2p/\0
n
;

pKomutanlığı adalet yaptım sanmıyorum , # 6 nolu parçayı sadece bir kez kullanmış gibi, bu yüzden burada farklı bir atoi işlevi var. Bunun nesi harika? Program , sayıyı okur olarak okumak için gereken ifadeyi yazar !

Öyleyse gibi girişler için 573, tüm karakterler okunduktan sonra, üçüncü satırın sonu 573'e benzeyecek gibi gözükecektir \0a*5+a*7+a*3+!

Bir kez daha, girişin yalnızca rakam olması beklenir. Burada GIF'i izleyin .

Uzunluk 74 pasajı:

>i:'A'(?v:'N'(?v:'['(?v\
  :'a'(?v:'n'(?v:'{'(?v\
^      o<    +d<  -d-d<o

Buraya gelmeyi başardıysan, bunun çok okunaklı bir ROT13 programı olduğunu söylediğimde benimle aynı fikirde olabilirsin. Bir karakter verilmişse c1, ilk karakterin c2içinde bulduk AN[an{, öyle ki c1 < c2, uygun ofseti toplayarak / çıkararak d(13) uygulayın. Not [ve {hemen sonra karakter vardır Zve zsırasıyla.

Konsolda deneyin ve yazarken harflerin dönüşümünü izleyin!

(Girdiyi de girebilirsiniz, ancak EOF'yi kaçırdığım için, :0(?;-1 olarak char olarak basmaya çalıştığında bir hata ile duracağını kontrol edin )


13 snippet için bir fikir: i:d=?v NEWLINE o;!?l<- giriş satırını geriye doğru yazdırıyor
15'te

12
Keşke daha fazla oy
verebilseydim

6
En baştan başlamak ve aşağı inmek için +1 (ve aynı zamanda sadece okumak eğlenceli olduğu için).
mbomb007 19.01.2015

5
@ mbomb007 bu bir utanç olsa da, siparişin sola / sağa
gidememesi

Bir something smells fishy...sonraki satıra yazdıysanız , uzunluk 8 snippet'iniz gerçek bir kuyruk olurdu .
wizzwizz4

148

C - düzenle

Oylar için teşekkürler! Diğer dillerle ve sınırlı baytlarla yapabilecekleri ile karşılaştırıldığında, C eski, telaşlı ve geliştiriciye çok bağımlı görünüyor. Pek çok yönden: otomatik bellek yönetimine sahip komut dosyası olan ve daha yüksek seviyedeki diller, C'nin olacağından çok daha anlamlı ve daha üretkendir.

Peki neden C özelliği?

Tüm bu betik dillerinin arkasındaki gizli sır, tercümanların büyük olasılıkla C (veya daha yakın zamanda C ++ veya Java) yazılmış olmasıdır. İlk C ++ derleyicileri aslında C kodunu derledi. Aslında, doğrudan bir derleyici için bir pazar bulunana kadar, C oluşturmak için bir derleyici yazmak ve sonra onu derlemek genellikle daha maliyetlidir.

Çok küçük platformlarda çalışıyorsanız, belki de işletim sistemi mevcut olmasa bile, muhtemelen C'de çalışıyorsunuzdur. Bu günlerde hemen hemen her cihazın içine gömülü bir mikrodenetleyici vardır, C'ye programlanmış olduğundan şüphesiz. Küçük ve hızlı, C gitmek için yoludur. (Ayrıca Mazoşistler için FORTH.)

C'yi bilmek, montaja girmeden gidebileceğiniz en yakın metale götürür ve diğer dillerde size yardımcı olur. Bir C ++ sanal fonksiyonunun nasıl çalıştığı hakkında iyi bir fikrin var. PHP'deki bu özyinelemeli özyinelemeli işlevleri yazdığınızda, dahili olarak çok fazla bellek ayırma ve kopyalama işlemi yaptığını biliyorsunuz, bu nedenle içgüdüsel olarak referans referansını deniyorsunuz. Geri aramalar ve referanslar C geliştiricilerini korkutmaz, belki Haskell de öyle.

Kernighan ve Ritchie'nin klasik C Programlama Dili , 2. basımının başlarında belirtildiği gibi , C büyük bir dil değildir ve büyük bir kitap tarafından iyi bir şekilde sunulmamaktadır. Bu tavsiyeye uymaya çalışıyorum: örnekler mümkünse iki, üç veya daha fazla görev yapar.

Tüm snippet'ler en azından kendi başlarına derlenebilir. Bağlanabilir ve çalıştırılabilir olanlar olduğu gibi belirtilmiştir. Bunun bir gereklilik olmadığını biliyorum, ancak kod snippet'lerinin çalışması için gereken çerçeveyi açıklamaya çalışmaktan daha kolay hale getiriyor.

Ayrıca her kod pasajının olabildiğince kısa olduğundan emin olmaya çalıştım, böylece sadece belirli bir uzunluğa kadar doldurmak için fazladan boşluk bırakmayacağım. Kod girintili olduğunda, girintiler uzunluğa dahil edilmez, her yeni satır için sadece bir karakter.

Uydurma

C kayalar

Uzunluk 0 snippet

Dünyanın en kısa kendi kendini çoğaltma programı http://www.ioccc.org/1994/smr.hint

Uzunluk 1 pasajı

;

C derleme ve bağlama arasında bir ayrım yapar. C'deki birçok varlık daha sonra derlenir ve bağlanır - bir örnek olarak statik ve dinamik kütüphaneler bulunur.

Diğer varlıklar henüz dahil edilmiştir ve kendi başlarına hiçbir kod üretmezler.

Yukarıdaki yarı-kolon kesinlikle nesne kodunu derler ve hiçbir şey yapmaz!

Uzunluk 2 pasajı

x;

Daha eski bir programlama dili olan C, birkaç yinelemeden geçti. Yaygın kullanımdaki en erken Kernighan ve Ritchie tarafından geliştirilmiştir ve K&R kısaltılmıştır. K&R C, kodunuzu açıkça vermezseniz kodunuzla ilgili birçok varsayımda bulunmak için dikkate değerdir.

Özellikle, K & RC'de, yukarıdaki kodun x0'a başlatılan global bir tamsayı olduğu varsayılır . K & R modunda derlenmesi, kullanım için bu değişkene bağlanan herhangi bir programı sağlayan bir nesne dosyası üretecektir.

Uzunluk 3 pasajı

??/

C o kadar yaygın ki, kullandığı tüm karakterleri içermeyen sistemler için uyumluluk özellikleri sağlaması gerekiyor. Yukarıdakiler, C'de bir çizgi devam karakteri olarak kullanılan ters eğik çizgi için bir trigrafidir. Yukarıdakiler, muhtemelen bir satırın gelmediğine dair bir uyarı ile derlenecek.

C'deki ortak bir kültür, derleme uyarılarını görmezden gelmektir ve birçok büyük kod üssünün inşa edildiklerinde sürekli olarak birkaç veya daha fazla uyarı vardır.

Uzunluk 4 pasajı

f();

Yine K&R ile, yukarıdaki "doldurulmuş" derleme ile " fdaha sonra sağlanacak, sabit ancak tanımlanmamış sayıda argüman alan ve bir tamsayı döndüren bir işlev var" derlemesiyle ilgilidir .

Bu ve arasındaki temel farkları not edin f;.

Uzunluk 5 pasajı

s="";

K & R C, gerçekten affedici olduğu için dikkate değer. Derleme üzerine, bu kod sboş bir dizenin başlangıç ​​adresine başlatılan global bağlantı için bir tamsayı sağlayacaktır (sanırım). K&R, bir tamsayı adresi tutacak kadar büyük değilse, kesme de dahil olmak üzere tüm zorlamaları sessizce işler.

Bulunması zor böcekler ortaya çıkaran ve IOCCC yarışmalarında çok fazla ilham veren bunlara benzer yapılardır.

Uzunluk 6 pasajı

o=042;

Eski zamanlayıcılardan daha eski bir durum olan ve değişmez sayıdaki baştaki 0, izlenen sayıların sekizlik tabanda olduğu anlamına gelir. Yukarıdaki kod, derlendikten sonra, oondalık basamağa başlayan global bağlantı için bir tamsayı sağlayacaktır .

C'nin bu özelliği pek çok geliştiricinin, güzel ve hatta sıraya girmelerini sağlamak için numaralarını doldurma çabasıyla ısırdı!

Uzunluk 7 pasajı

f(){f;}

Yukarıdaki kod gövdeli bir fonksiyondur. Ama ne işe yarıyor? Fonksiyonun adresini alır ve onunla hiçbir şey yapmaz! Genelde fonksiyonun ne döndüreceği tanımlanmamıştır. Bunun gibi saçma sapan kodlar genellikle uyarı vermeden derlenebilir.

Uzunluk 8 pasajı

main(){}

Bu, C'deki en kısa derlenebilir ve bağlanabilir kodu temsil eder. C'nin modern versiyonlarında, fonksiyonlar genellikle dolaylı olarak tanımlanamaz, bu sebeple bu sınırlama rahatlatılır main.

0'dan başka bir şey yapmayan bir programın harikası ihmal edilemez büyüklükte derlenir ve çeşitli C çalışma zamanı yordamlarında bağlantı oluşturur. Kaputun altında neler olup bittiğini görmek için tam olarak ayarlanmış ayrıntılarla derleme yapabilir ve bağlantı kurabilirsiniz.

Uzunluk 9 pasajı

#define Z

C başlık dosyalarının dayanak noktası #defineönişlemci yönergesidir. C programları çeşitli aşamalarda derlenir ve bu aşamalardan birinde bu tanımlar gerçek değerleriyle ikame edilir.

Bir argüman eksik olduğunda, Cı-ima edecek 1, bu nedenle yukarıdaki yerine olur 1yerde Zkaynak kodu kullanılır.

Yukarıdakiler tipik olarak bir başlık dosyasına konulur ve istenirse #included.

Uzunluk 10 pasajı

enum{P,Q};

enumAnahtar kelime sabitleri bir dizi tanımlamak için bir bazen türü için güvenli bir yol sağlar. Tanımlar gibi, genellikle başlık dosyalarında kullanılırlar. Eklendiğinde yukarıdaki kod P, 0 ve Q1 olan bir tam sayı olarak tanımlanır .

Uzunluk 11 pasajı

volatile v;

volatileAnahtar kelime derleyici değişken diğer ajanlar tarafından değiştirilebilir ve erişimler arasında sabit kalır varsayımlarda bulunmak için değil bildirmek etmektir.

Uzunluk 12 pasajı

#pragma once

#pragma once Geçerli kaynak dosyanın tek bir derlemeye yalnızca bir kez dahil edildiğini belirten, standart olmayan ancak yaygın olarak desteklenen bir önişlemci yönergesidir.

Geleneksel ve tam olarak desteklenen teknik, #includeilave kodun dezavantajları ve olası ad çatışmaları olan korumaları kullanmaktır .

Uzunluk 13 pasajı

w(){for(;;);}

C'de çok sayıda kural vardır ve bunlardan biri sonsuz döngüleri nasıl temsil edeceğidir. Bu durumda, for(;;)başlatma olmadığını, varsayılan olarak 1 anlamına gelen çıkış kontrolünün doğru olmadığını, yani kırılmadığını ve döngü kodu olmadığını gösterir.

Bazen içindeki her şeyi yapmak mümkündür ()ve döngünün kendisinin vücuda ihtiyacı yoktur. Bu durumda kukla bir noktalı virgül sonuna eklenir.

Yukarıdaki kodda, derlendiğinde, yazılım tasarımında no-no'lardan biri olan sıkı bir meşgul döngüye girecek ve asla geri dönmeyecek bir işlev sağlayacaktır.

Uzunluk 14 pasajı

int a[]={1,2};

C'deki dizilerin belirtilen uzunluklara ihtiyacı yoktur. Boş köşeli parantezler []derleyiciye "kendin çözmesini" söyler. Bununla birlikte, C'de, diğer dillerden farklı olarak, bu sınırların dışındaki bir diziye erişmeyi önlemenin yerleşik bir yolu yoktur ve C'nin bilindiği "kendini ayakla vur" metaforuna yol açar.

Derlendiğinde yukarıdaki kod, a1 ve 2 ile ilklendirilen iki tamsayının değişken değişken bir dizisini sağlayacaktır .

Uzunluk 15 pasajı

const long k=7;

constSpecifer C ++ ödünç C'ye daha sonra yapılmıştır. Yaygın görüşme sorusu "Bir değişkeni tanımlamak mantıklı mı volatile const?" constile birlikte enumve tür güvenliği ile ilgili sorunları olan inlinegüven azaltmak için tasarlanmıştır #define.

Uzunluk 16 pasajı

extern void **q;

externbaşka bir değişkenin ilan edildiğini belirtmek için kullanılır. void *Tipi açıkça atama tablolara ila döküm veya döküm gerekmez anlamına gelen C standart jenerik türüdür. **Operatör dizisi genellikle başlayanlar kafasında darbeler bir işaretçi, işaretçiyi anlamına gelir, ama tamamen geçerli ve sık kullanılan C olan

Uzunluk 17 snippet

double d=4/3-1/3;

Yukarıdakileri basacak olsaydınız, sonuç bir olur ve süper olacağını düşünürdünüz! Değiştir double d=4/3-2/3;ve cevabı ne? Hala bir tane var! C 4/3 → 1 ve 2/3 → 0 ve 1 - 0 → 1'i hesaplamak için tamsayı aritmetik kullanıyor!

Uzunluk 18 snippet

main(){puts("!");}

Sonunda gerçekten bir şeyler yapan bir koda ulaştık! putsC golfçülerin favorisidir, çünkü kullanmak için bir başlık dosyası gerektirmez.

putsayrıca çıktıya bir satır besleme ekleyecektir. Buna karşılık, karşılığı gets, satır beslemelerini sıyırır. getsÇok kontrollü durumlar dışında hiç kimse kullanmamalıdır - tampon taşmalarına karşı koruması yoktur ve birçok istismarın kök nedenidir.

Uzunluk 19 pasajı

#include <stdlib.h>

Başlık dosyalarının eklenmesi çoğu zaman geliştiricilerin kişisel imzasıdır. Birçok içerir libve ioihtiyaç duyulan bakılmaksızın eğer. Bazıları üstbilgi dosyalarını sipariş eder, böylece uzunluklar artar veya azalır. En çok <>önce koydu "". Şahsen bu imzayı TA günlerimde öğrenciler arasında hile yapmayı kontrol etmek için kullandım: aynı başlık imzası? daha yakından bak!

Uzunluk 20 pasajı

char*p=(char*)0x300;

C çok düşük seviyeli ilkel platformlarda kullanılmak üzere tasarlanmıştır. Bazı durumlarda, özel bellek eşlemeli bağlantı noktalarına doğrudan erişmeniz gerekebilir.

Bir portun adresi Yukarıdaki kod onaltılık 300. olarak tanımlanır You kullanarak port değerini erişmek istiyorum *polarak, *p=0xff;tüm bitleri bırakmayı veya v=*p;akım değerini almak için.

Uzunluk 21 pasajı

int w=sizeof(double);

sizeofOperatör bir tür bayt boyutu sağlar. Değişken isimlerinde parantez gerekli değildir double d;int w=sizeof d;;

Uzunluk 22 pasajı

asm("xorl %ecx,%ecx");

Nasıl asmkullanılacağı derleyici tarafından tanımlanır. Yukarıdakiler, Intel platformundaki Linux gcc çevrimiçi koduna bir örnektir.

Orijinal Unix, assembler kodunun küçük ama ihmal edilemez bir oranına sahipti. Bugün bile, hız birincil endişe verici ve taşınabilirlik kesinlikle değilse, kullanıldığını göreceksiniz.

Uyumlu sistemlerde, yukarıdaki kod derlenecek ve kelimenin tam anlamıyla, geleneksel erişim araçlarına sahip olmayan yalıtılmış bir montaj talimatı olacak! BTW xor R,Rhızlı bir şekilde bir sicil temizliği için ortak bir montaj dili deyimidir.

Uzunluk 23 snippet'i

union u{char c;int i;};

A unionen büyük eleman için en az yeterli alan sağlayacaktır. void *Bazı kütüphanelerde ortak bir "opak" tür sağlamak için birlikte kullanıldığını görebilirsiniz . Bu durumda, sendika, genellikle yapının sendika tipini tanımlayacak bir alana sahip olmasıyla, daha büyük bir yapının parçası olacaktır.

Uzunluk 24 snippet'i

/*INTS*/int i,j,k;//INTS

Orijinal C yorumu, olarak /* comment */ayrıldı ve // comment to end of lineformatı C ++ 'dan ödünç aldı.

Uzunluk 25 pasajı

int main(void){return 1;}

Bu, yukarıdaki 8 snippet uzunluğunun daha uyumlu versiyonudur. Dönüş tipi ve işlev tipleri belirtilmiştir ve açıkça döndürülen bir değere sahiptir.

C'deki sözleşme, 0başarı için ve 1başarısızlık için bir geri dönüş değeri kullanmak , ya da tam olarak uyumlu EXIT_SUCCESSve EXIT_FAILUREtanımlandığı gibi olmak istiyorsanız stdlib.h.

Uzunluk 26 pasajı

typedef struct{int x,y;}P;

typedefözellikle, son derece yararlıdır typedef struct. Modern terimlerle buna "nesne yönelimi-ışığı" diyebilirsiniz.

Yukarıdakileri ekledikten sonra, kod Ptam tip kontrolüyle bildirimlerde ve işlevlerde normal bir tür olarak kullanılabilir . C ++ 'ın aksine, +, * veya << gibi operatörleri tanımlayamazsınız, bu nedenle "nesne yönelimi-ışığı".

Uzunluk 27 pasajı

#define C(x,y)(((x)+1)*(y))

C uygun bir makro #definesözdizimine sahiptir.

Yaygın bir acemi hatası, bulunması zor operatör önceliği hatalarına neden olan iç ve / veya dış braketleri atlamaktır.

Uzunluk 28 pasajı

struct f{int s:1,e:8,m:23;};

C, herhangi bir tamsayı gibi atanıp okunup işlenebilen bit alanlarını açıkça tanımlayabilir.

Yukarıdaki, bir IEEE tek genişlikli kayan nokta veri yapısının bir yaklaşımıdır.

Uzunluk 36 pasajı

f(unsigned x){return!!x&!(x&(x-1));}

Birçok dilde, sayıların nasıl temsil edildiğine dikkat etmeniz gerekmez. C'de iç temsillerinin yakından farkında olmanız gerekir.

Bunun düşünebileceğim en iyi örneği, bir tamsayının iki gücün olup olmadığını belirlemektir {1, 2, 4, 8, ...}. C'ye aşina olmayanlar, döngüler ve kaymalar yapacaklar ve O (log (n)) çalışma zamanı için her türlü malzemeyi fena değil, ama yukarıda O (1) çalışma zamanında aynı yapacak bir fonksiyondur. Okuyucunun çalıştığını doğrulaması için alıştırma olarak bırakacağım, ama gerçekten de ...

!!Kongre genellikle, sırasıyla 1 ve 0 sıfır olmayan ve sıfırdan bir tamsayıyı zorlamak için kullanılır. Pek çok C geliştiricisi bu tür püf noktalarını kullanmayı sever (genellikle kod netliğine değer verenlerin şansı vardır).

Süper keskin C geliştiricileri, yukarıdakilerin tamamlayıcı ve imzalı donanımlar üzerinde çalışacağını onaylayabilir. Merak edenler için, şu anda iki komponentli donanım üzerinde çalıştığınız neredeyse kesin. Sadece gerçekten şanslı (veya bakış açınıza göre şanssız) bunun için endişelenmenize gerek var!

Uzunluk 48 pasajı

#include<complex.h>
double complex c=3.0+I*4.0;

C99, karmaşık sayılar için destek içerir. Koddan görebileceğiniz gibi, gerçek bir tür için değiştirici biçimini alır. Ayrıca kullanabilirsiniz int complex c=3+I*4;ancak dahili olarak bir kayan nokta tipine zorlar. Yukarıdaki kod gcc kullanılarak derlenecektir gcc -std=c99 -c length-48.c.

Daha fazla dahili görmek istiyorsanız, -E anahtarı ile derlemeyi deneyin. Benim gcc versiyonum için yukarıdaki bildirim geçerli olur double _Complex c=3.0+(__extension__ 1.0iF)*4.0;. Karmaşık tipin sadece birkaç ucuz makroya değil, dile önemli bir katkı olduğunu unutmayın.

Bu sadece bir teaser, 125'ten fazla karaktere ulaştığımızda, karmaşık sayılarla biraz eğlenmeye başlayabiliriz!

Uzunluk 51 pasajı

#include <math.h>
main(){double d=sqrt(sin(3.2));}

Çeşitli nedenlerden dolayı, C, sin, cos, tan, sqrt, vb . 'sqrt' veya başka bir hata.

Gcc'de yukarıdaki kod derlenecek ve kullanarak bağlanacaktır gcc length-51.c -lm.

Not sin(3.2), karekökünün gerçek alanda yasal olmadığı negatif bir sayı döndürür. C NaNde, programın yoksayması serbest olan bu hatayı belirtmek için özel bir değer döndürülür!

C99'da, neredeyse hiç kimsenin kullanmadığı bu tür matematik hatalarının çok güvenli ve hassas bir şekilde kontrol edilmesini sağlayan birçok yeni istisna işleme işlevi vardır!

Uzunluk 63 pasajı

static int w;static int X(int x){static int s=0;s^=x;return s;}

Veya daha akıllıca biçimlendirilmiş:

static int w;
static int X(int x)
{
    static int s=7;
    s^=x;
    return s;
}

Tahmin edebileceğiniz gibi, hepsi staticC’de birden fazla anlamı olan anahtar kelimeyle ilgili .

İlk iki durumda, staticderleyiciye, tamsayı wve işlevin Xbu dosyanın veya derleme biriminin dışında görünmediğini, yani dahili olduklarını söylemesi .

Bu işlevlerin harici olarak adlandırılması amaçlanmamıştır, bu nedenle geçerliliği için argümanları kontrol etmeyebilir ve diğer köşeleri kesebilirler. Dahili kapsama sahip olduklarından, yeniden tanımlayabilirsiniz wve Xdiğer dosyalarda tanımlayabilirsiniz ve genellikle ayrı olurlar.

Son durumda, statictamsayının sişlev çağrıları arasındaki değerini koruduğunu gösterir . İlk kez Xçağrılır, silk değeri 7olur, özel ORED xolduğunda, yeni değer korunur.

Dahili olarak, uygulamaya bağlı olmasına rağmen, her zamanki hafıza organizasyonu, sargüman xyığında yer alırken, öbek üzerinde bulunan, özel olarak başlatılan hafızadır . Örneğin, özyinelemeli algoritmalar uygulamak istiyorsanız değişkenlerin bulunduğu yer önemlidir.

C'deki bir getcha küresel değişkenlere sahip çatışmalardır. Kadar wve Xaslında olarak tanımlanır staticdaha sonra, küresel bir yerde tanımlanırsa, wve Xbunun yerine küresel kuruluşlara sevk edecektir.

Burada qve waynı değere başlatılamayabilir, çünkü wayarlamak için bir global kullanılıyor q:

static int q = w;
static int w;

Eğer bir global wmevcut değilse, derleme başarısız olmalıdır.

İşte qve waynı değere başlatılacak:

static int w;
static int q = w;

Genellikle, tasarımcılar, genel değişkenlerine ve işlevlerine farklı bir önek veya sonek ekleyerek ad çakışmalarını azaltır.

C99'da, staticbaşka bir kullanım kazanmıştır , bu, örneğin en az 10 tam sayı dizisini alan bir int Y(int a[static 10]);fonksiyon Yolduğu anlamına gelir .

Uzunluk 74 snippet'i

void f(register int*p,register int*q,register int l){while(l--)*p++=*q++;}

Ya da güzel bir şekilde ortaya kondu:

void f(register int *p, register int *q, register int l)
{
    while (l--)
        *p++ = *q++;
}

Anahtar kelime register, derleyiciye, donanım kayıtlarını kullanmanın burada faydalı olacağına dair bir ipucu sağlar. Yukarıdaki fonksiyon kopyalar lgelen tamsayılar qiçin pmümkünse donanım kayıt birimleri kullanılarak,.

Bazen hızlanmalar önemli olabilir. Örneğin, 68K mikroişlemci ailesinde, eğer *p++ = *q++kullanmadıysanız , satır MOVE.W (Ap)+,(Aq)+altı ya da sekiz gibi tek bir eğitime çevrilebilir register. O kullanarak kod özelleştirirsiniz, platformu bilseydi 68K mikroişlemci, açık son-artırma ve ön eksiltme modları, bu yüzden anlayışlı geliştirici vardı x++ve --yvs. ++xve y--.

Bu günlerde derleyiciler register, adreslerin kendilerinden alınmasına izin vermemek dışında çoğunlukla dikkate almazlar (örneğin yukarıda belirtilenler &lderleyici hatasına neden olur).

Uzunluk 88 pasajı

#include<stdio.h>
int f(int x){return(x>1)?x*f(x-1):1;}int main(){printf("%d\n",f(12));}

Veya daha sağlıklı bir düzende:

#include <stdio.h>

int f(int x)
{
    return (x > 1)? x * f(x - 1): 1;
}

int main()
{
    printf("%d\n", f(12));
}

Ah, özyineleme! Snippet, derlemek, bağlamak ve çalıştırmak için eksiksiz bir programdır. İşlev , özyinelemeci faktörünü özyinelemeli f (x) = x * f (x - 1) formülünü kullanarak fhesaplar x. Faktörler çok hızlı bir şekilde büyür, bu nedenle örneğin f(12), 32 bit bir tamsayıda alabileceğiniz en büyük değerdir.

Gerçekten özyinelemeli kodun bir örneği için Ackermann işlevinin naif uygulamalarına bakın .

Akıllı derleyiciler, ipucunu kullanarak işlevi en iyi duruma getirebilir inlineve sabitler bağımsız değişkenler olarak verildiğinde işlevi " açabilir ":

f(12)

Oluyor:

12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

Herhangi bir işlev çağrısı olmadan gerekli!

Diğer derleyiciler işlevi yeniden düzenleyebilir:

int f(int x)
{
    return (x < 2)? 1: f(x - 1);
}

Ve kuyruk özyineleme adı verilen bir şey uygulayın. Bu, son işlev çağrısının basit bir sonuçla değiştirilmesini sağlar ve bu işlevin geri dönüşle baş etmesini sağlar. Bunun faydası, daha az istifleme, daha hızlı ve daha küçük koddur.

Assembly dilinde, bu tür optimizasyon fırsatlarının tespit edilmesi gerçekten kolaydır ve temelde küçük kalıpları arayan ve bunları daha hızlı ve / veya daha küçük bir şeyle değiştiren "anahtar deliği iyileştiricisi" olarak adlandırılan bir şey tarafından uygulanabilir.

Uzunluk 117 snippet

#include<stdio.h>
int main(int c,char**v){int a,b;sscanf(v[1],"%d%*[\t ,]%d",&a,&b);printf("%d\t%d\n",a,b);return 0;}

Veya:

#include <stdio.h>

int main(int c, char **v)
{
    int a, b;

    sscanf(v[1], "%d%*[\t ,]%d", &a, &b);
    printf("%d\t%d\n", a, b);

    return 0;
}

O zamanın çağdaş dillerinden ödünç alınan C, konsol, delikli kart, teyp, disk veya yazıcı gibi herhangi bir cihaza tutarlı bir şekilde uygulanabilecek evrensel bir G / Ç kavramı, geliştiricinin oluşturmasına izin verdi. çok özlü ama güçlü ifadeler.

Yukarıdaki kod parçasında, komut satırı girdisini alır, boşluklarla, sekmelerle veya virgüllerle ayrılmış iki tamsayıyı ayrıştırır ve çıktılar. Bu bir yeni yararlanır scanfşartname %*[\t ,]: edecek [\t ,]tüm sekmeler, boşluk ve virgül çekin ve: *onları görmezden.

Ben geliştirici "saf" C ++ yolu ile gelen her türlü çabayı nerede bazı C ++ kodu revize hatırlamak <<ve benzeri yöntemlerin bir cephanelik findve substr. En azından bir düzine satırdı ve hala sınırlayıcı olarak virgülle baş edemedi. Tüm bu tuhaf kodu sscanfyukarıdaki gibi tek bir satırla değiştirdim !

Uzunluk 132 snippet

#include<stdio.h>
int main(int c,char**v){while(--c){++v;printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n",*v,*v,*v,*v,*v);}return 0;}

Veya:

#include <stdio.h>

int main(int c, char **v)
{
    while (--c)
    {
        ++v;
        printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n", *v, *v, *v, *v, *v);
    }

    return 0;
}

Fonksiyonları printf, sprintf, fprintfvb kullanımı biçim belirteçleri çıkışının genişliği ve doldurma tanımlamak için kullanılır.

Çeşitli çıktıları görmek için komut satırı argümanlarını kullanarak yukarıdakileri derleyin ve çalıştırın:

> main xyz 123456
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                              
|xyz  |                                                                                                                                              
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                 
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|12345|                                                                                                                                              
|12345| 

.5Belirtici için çıktının en fazla beş karakterle sınırlandığını unutmayın; oysa öncü 5, çıkışın en az beş karakter olmasını ve -solun hizalandığını gösterir. Bunları birleştirmek çıktıyı tam olarak beş karaktere ayarlar.


4
Her oy için yeni bir factoid ekleme zorunluluğu olduğunu sanmıyorum :)
Doktor

28
C de ortak bir kültür derleme uyarılarını görmezden gelmektir , bunun gerçeğe yakın bir yerde olduğunu sanmıyorum!
Shahbaz

4
Büyük bir projeniz varsa ve birden fazla derleyiciyi göz önünde bulundurursanız, tüm uyarıları ortadan kaldırmaya çalışmak oldukça boşuna olabilir.
feersum,

5
Bu mükemmel
Kik

4
Ben bir C programcısıyım ve Haskell'den korkmuyorum.
Shahbaz

138

x86 Makine Kodu

Uydurma:

x86 Makine Kodu, işlemcinin gerçekte çalıştığı x86 Düzeneğinin birleştirilmiş sürümüdür. Bellek ve depolama alanı pahalı olduğunda geri geliştirilmiştir ve Intel 8008'e kadar geriye dönük olarak uyumlu olacak şekilde tasarlanmıştır. Yürütülebilir kodu küçük tutmak hedeflerden biriydi ve değişken uzunluk talimatlarını ve yardımcı olmak için CISC mimarisini kullanıyor Bunu başarmak (modern işlemcilerin performansını geliştirmek için onu daha karmaşık hale getirme dezavantajı var). Bu, genel olarak montaj ve makine kodunun çıplak kemikleri ile birlikte, x86 programlarına aşırı kompakt olma yeteneği verir.

Uzunluk 1:

Şimdi ilk program için:

0xC3

Bir onaltılı editör açın, bu baytı girin ve test.com olarak kaydedin.

Artık hiçbir şey yapmadan hemen dönen geçerli bir MS-DOS programınız var, çünkü 0xC3 'RET' talimatı. Ancak bu, x86: .com dosya formatı ile golf oynamak için başka ilginç bir özellik gösteriyor. Bu çalıştırılabilir formatın kesinlikle başlığı yok - dosya 0x100 adresinden başlayarak belleğe yüklenir ve ardından yürütme 0x100'de başlatılır. Bu, meta veride boşa harcanan bayt olmadığı anlamına gelir!

Uzunluk 2:

Bir sonraki programımız:

0x4D 0x5A

veya ASCII'de 'MZ'.

Tamam, biraz aldattım, bu gerçekten faydalı bir program değil, çünkü talimatlara uyuyordu.

DEC     BP
POP     DX

Bu aslında bir .com programı başlatmak için kullanışlı değildir. Aslında, bu iki değerin amacı budur - makul bir .com dosyası onlarla başlamalı! .com dosyaları 65280 bayt boyutunda (64KiB - 0x100) ile sınırlıydı, bu yüzden daha büyük programlara ihtiyaç duyulduğunda, yeni bir format geliştirilmesi gerekiyordu. Bu, bir başlığı olan .exe dosya biçimiydi. Ancak, MS-DOS'un geriye doğru uyumluluk için belirli bileşenlerde .com uzantısını tutması gerekiyordu, bu yüzden bir .com dosyasının gerçekten bir .exe olup olmadığını algılamanın bir yoluna ihtiyacı vardı. Bu sihirli sayı olarak sting 'MZ'yi seçtiler ve bu güne, bir hex editöründe bir Windows .exe (veya .dll) dosyası açarsanız, bu iki byte ile başladığını göreceksiniz. En modern Windows programının bile 70'lerin uyumluluk kısıtlamasıyla başlaması beni şaşırtıyor.

Uzunluk 3:

Şimdi sonsuz bir döngü için:

41 E2 FD

Hangi çevirir

start:
inc cx
loop start 

Bu program CX değerini arttırır (başlangıçta> 0 olacaktır), sonra döngü komutunu uygular. Döngü, CISC komutunun mükemmel bir örneğidir, çünkü 3 basit işlemi bir özel amaçlı işlemde birleştirir: CX'in değerini azaltır, 0 olup olmadığını kontrol eder ve hedef etikete atlar. CX 0 olduğunda sona erdirmenin yanı sıra diğer bayrakları da kontrol eden ilmek biçimleri de vardır. 2 bayt sonsuz döngü için sadece 'atlama başlangıcı' yapabilirdik, ama bu daha ilginçti.

Uzunluk 4:

Asgari derecede kullanışlı bir program:

40 CD 10 C3

Derlemeye çevrildi:

inc ax    ; 1 byte
int 10h   ; 2 bytes
ret       ; 1 byte

Bu program konsolu 40x25 karaktere ayarlar, ekranı temizler ve komut satırına geri döner. AX istediğimiz video moduna ayarlanmış (1), daha sonra BIOS kesilmesi 10h aslında video modunu ayarlamak ve geri dönmeden önce pencereyi temizlemek için çağrılıyor. Gelecekte bu BIOS kesintilerinin daha fazlasını görmeyi bekleyin.

Uzunluk 5:

Artık bir duraklama programı uygulayabiliriz:

B4 01 CD 21 C3

Derlemeye çevrildi:

mov ah,1  ; 2 bytes
int 21h   ; 2 bytes
ret       ; 1 byte

Bu program, BIOS'a bir tuşa basılmasını beklemesini ve geri dönmeden önce ekrana yansıtmasını söyler. Bu aynı zamanda x86'da bazı kayıtların kısmen okunabileceğini veya yazılabileceğini gösterir. Bu durumda, AX'in üst baytını (AH) 1 olarak ayarladık. 32 bit işlemcilerde, en düşük 16 bit üzerinde, ilk 16 bit etkilenmeden de çalışabilirsiniz. Kısmi kayıtları değiştirme yeteneği, montaj programcıları için kullanışlı olabilir, ancak hatalı veri bağımlılıkları getirebileceklerinden, sıra dışı yürütmeyi gerçekleştirmeye çalışan modern işlemciler için dezavantajları vardır .

Uzunluk 9:

Şimdi çıktıyı görüntülemek için:

68 00 B7 07 AB 40 79 FC C3

Derlemeye çevrildi:

; These two instructions set up ES, the 'extra segment'
push 0xb700 ; 3 bytes
pop  es     ; 1 byte
label:
stosw       ; 1 byte, Store Word - Copy AX to [ES:DI] then add 2 to DI
inc  ax     ; 1 byte
jns  label  ; 2 bytes, Jump Not Signed - Jump unless the sign flag is set (when inc AX yields 0x8000
ret         ; 1 byte

Çıktı, farklı renklerde tekrarlanan varsayılan karakter setidir. AX'in düşük baytı karakter kodudur ve yüksek bayt kullanılacak renkleri belirtir. Farklı renklerde tekrarlanan varsayılan karakter seti

16 bit programlar yalnızca 64KiB'ye kadar doğrudan adres verebilir. Bunu aşmak için, x86 'segment'leri kullandı - 16 ile çarpılacak ve 20 bit adreslenebilir bellek vermek için tüm bellek erişimlerine eklenecek olan özel kayıtlar. Bir program, daha fazla belleğe veya özel bellek alanlarına erişmek için bu bölüm kayıtlarının değerlerini değiştirebilir: bu program video belleğine yazmak için ekstra bölümü değiştirir. Farklı bellek erişim tipleri, kod, veri ve yığının aynı anda farklı bellek parçalarında erişilebilir olmasını sağlayan farklı bölüm kayıtları kullandı. Varsayılan bölüm, birçok talimat için de geçersiz kılınabilir.

Uzunluk 20:

Tanınabilir bir şey yapalım - Sierpinski üçgenlerini çizmek için 'Kural 90'ı kullanacağız.

B0 13 CD 10 68 0F A0 1F AC 31 C2 88 94 3E 01 87 D3 93 EB F4

Montajda:

mov al,13h      ; 2b
int 10h         ; 2b - Set the video mode to 13h

push    0xA00F  ; 3b
pop     ds      ; 1b - Set the data segment to video memory

start:          ; This loop runs 'Rule 90' to draw Sierpinski triangles
lodsb           ; 1b - load al with [ds:si] then increment si

xor     dx,ax   ; 2b - xor the left and right values of the previous row of pixels
mov     [si+318],dl ;4b - store result to memory

xchg    dx,bx   ; 2b - swap register values
xchg    ax,bx   ; 1b - swapping with ax is 1 byte shorter

jmp     start   ; 2b - infinite loop

Örnek çıktı: Sierpinski Üçgenleri

Bu program için, 320x200 çözünürlüğünde 256 renk olan bir grafik modu olan biraz ünlü 'Mode 13'ü kullanıyoruz. Doom gibi birçok popüler DOS oyunu tarafından kullanıldı .

Uzunluk 21

Üzerinde çalıştığımız CPU'yu kimin ürettiğini görelim.

0F A2 66 60 BB EE FF B9 0C 00 8A 17 43 B4 02 CD 21 E2 F7 FF E1

Derlemeye çevrildi:

cpuid         ; 2b  CPU ID - retrieve processor information based on the value in AX. For AX=0,
              ;     the 12 bytes in EBX, ECX, and EDX are loaded with a vendor identification string
pushad        ; 2b  Push all registers on the stack (32 bit version)
mov  bx,0xffee; 3b  Start of the vendor identification string on the stack
mov  cx,12    ; 3b  12 characters to print
print:    
mov  dl,[bx]  ; 2b  Character to print
inc  bx       ; 1b  Advance string position
mov  ah,2     ; 2b  Set AH to the 'Print character to STDOUT' value
int  21h      ; 2b  Call the bios interrupt to print
loop print    ; 2b  Decrement CX and jump if it is not zero
jmp  cx       ; 2b  Instead of restoring the stack, just jump right to the exit point

Örnek çıktı:

c:\misc>cpuid.com
GenuineIntel

Bu program, üzerinde çalıştığı işlemci, özellikle satıcı kimlik dizesi hakkında bilgi almak için CPUID komutunu kullanır. Çoğu kişi, nadir bir CPU üreticisi olmadıkça veya belirli sanal makinelerde çalışmadıkça, 'GenuineIntel' veya 'AuthenticAMD' i görür.

Uzunluk 26

Şimdi ilginç animasyonlar yapabiliriz

B0 13 CD 10 C4 07 BB 40 01 59 99 89 F8 F7 F3 31 D0 AA E2 F6 26 FE 05 47 EB FA

Mecliste

mov al,13h     ;2b
int 10h        ;2b Enter Video Mode 13h

les ax,[bx]    ;2b Set ES to (roughtly) video memory
mov     bx,320 ;3b Set up  BX asdivisor
pop     cx     ;1b Zeroize CX

start:
cwd            ;1b Sign extend AX to DX, AX will never have the sign bit set so this zeroizes DX in 1 byte
mov     ax,di  ;2b Copy video memory pointer
div     bx     ;2b Divide by width to get AX = Y pos, DX = X pos
xor     ax,dx  ;2b X pos ^ Y pos
stosb          ;1b Store and increment video pointer
loop    start  ;2b CX starts at 0, so this will loop until it wraps around

cycle:
inc     byte [es:di];3b Increment value in video memory to animate
inc     di     ;1b Increment video memory pointer
jmp     cycle  ;2b Infinite loop 

Ve çıktı şöyle görünecek:

XOR Yürüyüşü

X pos ^ Y pos işlevi özellikle canlandırıldığında ilginç bir fraktal oluşturur

Uzunluk 27

Küçük bir x86 .com programında yalnızca metin ve grafik üretemez, ses ve müzik de üretebilirsiniz:

BA 31 03 B0 3F EE BA 30 03 B0 93 EE B4 01 CD 21 3C 1B EE 3C 1B B0 7F EE 75 EC C3

Montajda:

    mov dx,0x331            ; value for the midi control port
    mov al,0x3F             ; command value to set midi mode to UART
    out dx,al               ; output the command to the midi control port
play_loop:
    mov dx,0x330            ; value for the midi data port
    mov al,0x93             ; midi instrument value (piano)
    out dx,al               ; output to midi data port
    mov ah,1
    int 0x21                ; read character from stdin, with echo
    cmp al,27               ; test if it is escape
    out dx,al               ; output the ascii value as the midi note to play
    mov al,0x7F             ; note duration
    out dx,al               ; output note duration
    jne play_loop           ; loop if escape was not pressed
    ret  

Bu program, klavyeyi bir piyanoya dönüştürmek için midi kartını kullanır. Bunu yapmak için, midi kartı UART moduna ayarlanmıştır ve bunlar midi notları alındığı anda çalar. Daha sonra, program basılacak bir karakteri bekler ve ASCII değerini midi kartına not olarak verir. Kaçış basılana kadar program çalışır.

Uzunluk 29

Ejderha Eğrisi fraktalını oluşturmak için yinelenmiş bir fonksiyon sistemi kullanalım :

B0 13 CD 10 89 D0 01 CA 29 C1 D1 FA D1 F9 73 03 83 E9 7A B4 01 CD 16 B8 02 0C 74 E6 C3

Derlemeye çevrildi:

mov  al,13h
start:
int  0x10    ; This does double duty, setting the video mode to 13h at program start,
             ; and calling the 'draw pixel at coordinates' interrupt when looping
mov  ax,dx   ; The next couple instructions are our IFS, the algorithm is aproximately
add  dx,cx   ; f(y) = 0.5x + 0.5y
sub  cx,ax   ; f(x) = 0.5x - 0.5y OR f(x) = 0.5x - 0.5y - 1
sar  dx,1    ;
sar  cx,1    ;
jnc  skip    ; This jump handles pseudo-randomly switching between the two functions for x,
             ; based on if the previous value of x was odd or not.
sub  cx,122  ; Magic number, chosen since it provides sufficent 'randomness' for a filled in
             ; fractal and a good scale to the fractal. 102 and 130 also work.
skip:
mov  ah,1
int  0x16    ; Get keyboard state, zero flag will be set if no key has been pressed
mov  ax,0xC02; Set up AH for the draw pixel function when int 0x10 is executed,
             ; AL = color, CX = column, DX = row
jz   start   ; Loop if a key hasn't been pressed
ret  

Çıktı:

Ejderha Eğrisi

Kontrolsüz bir tuşa basmak programın çıkmasına neden olur. Bu, Pouet.net'teki Desire tarafından yapılan Fire Coral'a dayanıyor.

Uzunluk 52

Bu program çift özellikli bir parça, x87 kayan nokta eş işlemcinin bir parçasını ve kendi kendini değiştiren kodu gösteriyor.

B3 07 D9 E8 B1 11 DE 0E 32 01 E2 FA BE 0A 24 56 B1 09 DF 34 AC D4 10 
86 E0 05 30 30 50 E2 F5 44 B4 2E 50 89 E2 B4 09 CD 21 FE 06 03 01 4B
75 D2 CD 20 0A 00

Çalıştırıldığında, program birkaç matematiksel sabit verir:

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

Bunlar Bir, Log2 (10), Log2 (e), Pi, Log10 (2), Log e (2) ve Sıfır'dır.

Montajda:

org 100 saat

mov     bl,7         ;Counter for the total number of constants to print
start:
fld1                 ;Floating point constant to load on the FP stack,
                     ;start with 1 since it's op-code is the lowest

mov     cl,17        ;Multiply the constant by 10, 17 times to get the
mult:                ;printing part as an integer
fimul   word[ten]
loop    mult

mov     si,10+'$'*256;ASCII new line (10) and the end-of-string ($)
                     ;characters. These are used both as
push    si           ;a constant memory location, and stored to the
                     ;stack to format and printing

mov     cl,9         ;print 18 digits (9 pairs)
fbstp   [si]         ;store the integer part of the floating point
                     ;number on top of the FP stack as a packed
                     ;binary-coded decimal number (1 digit/nibble),
                     ;and then pop the number off the FP stack

convert:
lodsb                ;load a pair of packed digits

db 0xd4,16 ; AAM 16  ;ASCII Adjust For Multiply instruction using
                     ;non-standard base 16. This puts AL/16 in AH,
                     ;and AL%16 in AL, unpacking the digit pair.

xchg    ah,al        ;Swap the digit order
add     ax,'00'      ;Convert the digits to ASCII values
push    ax           ;Store digits on the stack
loop    convert

inc     sp           ;AX now holds the 1st 2 digits to print,
mov     ah,'.'       ;so to insert a decimal point, the 2nd digit
push    ax           ;is replaced with a '.', the stack pointer
                     ;is adjusted to overwrite 1 byte, and then
                     ;AX is pushed on the stack

mov     dx,sp        ;Load DX with the start of the print string
mov     ah,9         ;Load AH with the 'Print String' constant
int     21h          ;Call the 'Print String' interrupt to display
                     ;the constant

inc     byte[start+1];Self-modifying code - increment the load
                     ;floating point constant op-code to iterate
                     ;through all of them

dec     bx
jnz     start        ;Exit when all 7 constants have been printed
int     20h


ten: dw  10

X86 sistemlerinde kayan nokta matematiği, ilk olarak isteğe bağlı x87 yardımcı işlemcisi tarafından gerçekleştirildi, 486 aynı yongaya taşınmasına kadar değildi. Ayrıca, x87, 8 80bit yazmaç ile oldukça farklı bir mimariye sahipti. Ayrıca, çeşitli yuvarlama modları, hassasiyeti ve ayarlanabilecek maskelenebilir istisnaları da vardı.

Bu program işlemcilere hazırlanan yedi sabit için değerleri yazdırır. Öğretim alanının 0 ve 1 gibi basit sabitler üzerinde boşa harcanması garip görünebilir, ancak komut setinin bellek küçükken oluşturulduğunu ve bu komutların genellikle eşdeğer işlemlerden 2 bayt daha küçük olduğunu unutmayın. Program ayrıca, FBSTP -'Store BCD Tamsayı ve Pop 'gibi gizli bir talimat kullanıyor. X86 geliştirildiğinde, BCD sayılarıyla ilgili işlemler daha yaygındı ve x86 / x87, programda da kullanılan AAM 'ASCII Çoklu için Ayarla' talimatı gibi BCD matematiğini basitleştirmek için çeşitli talimatlar içeriyordu.

Erken x86 programları tarafından kullanılan korumasız bellek modelinde, veri ve kod arasında bir ayrım yoktur. Bu nedenle, sıralı olarak kodlanmış 'Yük Sabiti' talimatlarında sadece uygun değeri artırarak yineleme yapmak kolaydır.

Uzunluk 64

Mandelbrot Challenge için girişimi çapraz gönderme , sadece 64 byte bir 320x200 renkli Mandelbrot fraktal görüntüleyen bir program yazılabilir.

B0 13 CD 10 C4 07 99 89 F8 B9 40 01 F7 F1 83 E8 64 FE CE 31 DB 31 F6 
89 F5 0F AF F3 01 F6 0F AF DB 70 19 0F AF ED 70 14 01 EB 70 10 29 EB
29 EB C1 FB 06 01 D3 C1 FE 06 01 C6 E2 DB 91 AA EB C6

Montajda:

mov al,13h ; set up graphics mode 13
int 10h

les ax,[bx]; trick to set video memory

FillLoop:
cwd
mov ax,di  ; di is the current position on screen
mov cx,320 ; convert di int x,y screen coordinates
div cx     ; CX is the iteration counter, exit the loop if it hits
           ; zero before the value escapes.
sub ax,100 ; center the fractal vertically
dec dh     ; center the fractal horizontally

xor bx,bx
xor si,si

MandelLoop: ; Fairly standard Mandelbrot routine,
mov bp,si   ; exits if the values overflow
imul si,bx
add si,si
imul bx,bx
jo MandelBreak
imul bp,bp
jo MandelBreak
add bx,bp
jo MandelBreak
sub bx,bp
sub bx,bp

sar bx,6   ; We use fixed point math with the lowest 6
add bx,dx  ; bits being the fractional portion, so this
sar si,6   ; rescales the values after multiplication
add si,ax

loop MandelLoop

MandelBreak:
xchg ax,cx ; Write the escape itteraction as the color
stosb
jmp FillLoop

Sonuçta bu görüntü:

Mandelbrot Fraktal

Bu program, daha az bayt aldığı için fraktal oluşturmak için sabit noktalı matematik kullanır. 16 bit yazmaçtaki en düşük 6 bit, sayının kesirli kısmı olarak kabul edilir ve değerler çarpıldıktan sonra yeniden hesaplanır.


7
PPCG'de görülecek bütün dillerin arasında bunu beklemiyordum.
Alex A. 0

23
Vay. Ayrıca bu yorumu yapmak için diğer karakterleri kullanın. Ama ciddice. Vay.
krs013

2
@Michael Edenfield DOSBox bunun için!
Sir_Lagsalot

1
20 byte Sierpinski çok etkileyici.
qwr

1
Kendimi iyi bir programcı olarak görüyorum, ancak buna baktığımda yenilgiyi kabul etmeliyim.
Stephan Bijzitter

121

Haskell

Aşağıdan yukarıya okumak isteyebilirsiniz. Bazen daha düşük parçacıklara tekrar atıfta bulunurum, ama asla daha yükseklerine değil, bu yüzden anlamanıza yardımcı olabilir.

Haskell'ı tanımayan okuyucular: Açık mıyım? Ne zaman belli değilim? Söyleyemem.

Uzunluk 86 snippet

Ağaç veri yapımız için katlanabilir bir örnek (snippet 23). Katlanabilir, bir tür sınıfıdır - olduğu gibi, türlerin bir sınıfı (/ grubu). Bunlar, Java'daki arayüzlere paraleldir. Esasen ortak özellikleri olan türleri birleştiren türler üzerinde geneller; örneğin, birlikte eklenebilirler ( Monoid), container ( Functor), metin olarak basılabilir ( işlevde Showzaten tanıştığımız show), vb. Bu, liste halinde yinelenebilecekleri veya listeye düzlenebilecekleri veri türlerini birleştirir.

Bu kod parçasında, örneği foldr, esasen sağdan sola veri türü üzerinde yinelenen tanımlayarak tanımlarız . Şimdi, bir grup önceden yazılmış kod kullanabiliriz. Önce bir yardımcı fonksiyon tüm yığılmayı önlemek için, bir tekil ağacı almak için tanımlar: s a = N E a E. Şimdi:

sum (N (s 3) 7 (N E 5 (s 8))     === 23
product (N (s 3) 7 (N E 5 (s 8)) === 840
toList (N (s 3) 7 (N E 5 (s 8))  === [3,7,5,8]

ve bunun gibi.

İşte ağacımızın bir resmi:

7
| \
3  5
    \
     8

Uzunluk 70 pasajı

primes=sieve[2..] where
 sieve(p:xs)=p:sieve(filter(\x->x`mod`p/=0)xs)

Bu bir ana elek!

(not: diğer dillerde /=ne !=var)

Bu sieve, listeyi filtreleyen bir işlev tanımlayarak çalışır ve yalnızca önceki bir asal tarafından bölünmeyen sayıları tutar. Yinelemeli tanımlanır - için sievebir birinci elemana listesini bölünmüş olarak tanımlanır pbölünebilir herhangi bir sayıda kuyruk ve bir kuyruk, filtre p, sievegeri kalan az miktardaki, takmak pbu başlangıcına ve geri döner.

Yine, burada sonsuz listelerle çalışıyoruz - ancak hesaplamak için sonsuz miktarda prime ihtiyaç duymadığınız sürece hesaplama durur.

take 4 primes === [2,3,5,7]

Uzunluk 68 pasajı

Sonunda, bir sırt!

main=do putStr s;print s where s="main=do putStr s;print s where s="

Bunu ilk okuduğunuzda, bu quine çıktısının tırnak işaretlerinin eksik olacağını düşünebilirsiniz ve neden bir kez putStrve bir kez yazsın print? Aynı geliyor.

Haskell'de, putStrsadece stdout'a aldığı dizgenin içeriğini basan bir fonksiyondur; print, ancak, stdout şeyler yazdırır. Yani, print 4eşittir putStr "4\n", ama putStr 4saçma 4değil - bir dize değil! Bu nedenle, printbir değer elde edildiğinde , önce onu bir dizgeye dönüştürür ve sonra o dizeyi yazdırır. Genelde bir şeyleri dizgelere dönüştürmenin yolu, onu kodda yazmanın yolunu bulmaktır. Yani, yolu dize yazardı abcHaskell kodu olan bir dizede "abc", bu yüzden print "abc"aslında baskılar "abc"değil abc.

Ne kadar şanslıyım ki şimdi yeterince oy kullandım, böyle şeyleri golf oynamak zorunda kalmayacağım.

Uzunluk 33 pasajı:

main=go 0
go n=do print n;go(n+1)

Dikkat edilmesi gereken en önemli şey, bir döngü kullanmadığımızdır. Haskell döngü yapmaz. Haskell özyinelendi. Haskell'de döngüler yok. Bundan daha derin: Haskell bile Kontrol akışına sahip değil . Nasıl sorabilirsin? Şey, buna ihtiyacı yok.

Detayları ile açık. Bu program 0'dan başlayarak sonsuz artan bir tam sayı dizisi yazdırır. Girdiden başlayarak gobunları yazdırır, sonra mainçağırır 0.

doHaskell'in özel bir sözdizimsel gücüdür. Bu senaryoda, tıpkı G / Ç eylemlerini birleştirir, tıpkı olduğu gibi >>(bkz. Snippet 22).

Uzunluk 26 snippet'i:

map f=foldr(\x y->f x:y)[]

Bu map, muhtemelen herkese aşina olan işlevi kullanarak işlevi tanımlar foldr. Biz beyan etmedi rağmen dikkat edin map'ın türü, bilgisayar nasılsa edilir türünü bilir (a -> b) -> [a] -> [b], yani bir işlevi verilen aetmek bve bir listesini as, listesini döndürür bs.

Nasıl bildin? ;-)

Uzunluk 25 pasajı:

main=putStr"Hello World"

Standart Merhaba Dünyası. Türleri not edin: maintürüne IO ()ve putStrtürüne sahiptir String -> IO ()(dizgilerden G / Ç işlemlerine hiçbir şey döndürmeyen bir işlev).

Uzunluk 23 pasajı:

data T a=E|N(T a)a(T a)

Bu bir Ağacın standart bir tanımıdır. Java, C veya başka bir ağaçta ağaç tanımlamak için gereken tüm bu satırlardan daha kolay.

(bkz. snippet 10)

Şimdi onu parçalayalım:

data- bu beyan veri tipini beyan eder. T a- tür unsurları içeren bir ağaç a. Tanımladığımız tür budur. =- her değer, T abir boru ile ayrılmış, aşağıdakilerden herhangi biri olacaktır |. E- olası değerlerden biri T s- boş ağaç. N (T a) a (T a)- bir ağacın diğer olası değeri - bir düğüm. Her düğüm, sol çocuk ( (T a)) öğesinden ( a) ve sağ çocuktan ( (T a)) oluşur.

Uzunluk 22 pasajı:

main=putStrLn"y">>main

Bir Haskell yesişlevi. >>İki G / Ç eylemini birleştiren ve sıralayan bir işlecidir. Bir tür vardır >> :: IO a -> IO b -> IO b.

mainilk önce basılan "y"ve sonra ne yaparsa onu yapan G / Ç eylemi olarak özyinelemeli olarak tanımlanır main.

Uzunluk 18 pasajı:

fix f=r where r=f r

İçin daha iyi bir tanım fix. (Bkz. Snippet 14.) İlk tanımdaki sorun fix f = f(fix f), her zaman fix f fixhatırlamaya çağırdığımızda fix f, hatırlayan fix fve aynı hesaplamanın sonsuz kopyalarını oluşturan olmasıdır. Bu sürüm r, sonuç olarak tanımlayarak (sonucu) düzeltir ; Gibi f r = r,. Öyleyse tanımlayalım r = f r. Şimdi geri dönüyoruz r.

Uzunluk 17 pasajı:

f n=product[1..n]

Faktoringi tanımlamanın işlevsel yolu budur.

Uzunluk 16 pasajı:

f n=(\x->x+x+x)n

(\x -> x + x + x)bir lambda (birisi \mektubu andırıyor sanıyordu .).

(\x -> x + x + x) nuygulanan lambdadır n(bu tam olarak aynıdır n + n + n).

fÜç ile çarpma işlevi (ayrıca f = (*3))

Uzunluk 15 pasajı:

sum=foldl (+) 0

Bu, sumbir katlama kullanarak işlevi tanımlar . Kat, temel olarak bir akümülatör içeren bir listedeki elemanların üzerinden geçen bir halkadır. akümülatör ve bir liste için bir
foldlfonksiyon fve bir başlangıç ​​değeri olarak argümanlar olarak kullanılır . İşlev , önceki akümülatör değerini ve listenin o anki değerini girdi olarak almalı ve bir sonraki akümülatörü döndürür. Ardından katlama , önceki akümülatöre uygulayarak liste değerlerinde yinelenir ve ardından son akümülatörü döndürür.xxsf
f

Kıvrımlar hakkında düşünmenin bir başka yolu f, liste değerleri arasında ve ilk akümülatör ile yanlardan birinin içindeki 'uçlar' gibidir . Örneğin, foldl (*) 1 [4,2,5]değerlendirir 1 * 4 * 2 * 5.

Uzunluk 14 pasajı:

fix f=f(fix f)

Birleştirici y. Genellikle adlandırılır fixçünkü denklemin sabit noktasını bulur f x = x. x = infinite loopBunun bazen bir çözüm olabileceğini de unutmayın , bu nedenle fix (\x -> x^2 + 5*x + 7)denklemi çözmez, x^2 + 4*x + 7 = 0bunun yerine sonsuz bir döngü döndürür.

x = infinite loopHaskell'in tembelliğinden dolayı her zaman bir çözüm olmadığını da not edebilirsiniz .

Bu sürüm zaman ve mekan sızıntısıdır; daha uzun bir snippet'te yeniden tanımlayacağız.

Uzunluk 13 pasajı:

f=sum.map(^2)

Bu, bir liste verilen fonksiyonu f karelerinin toplamını döndürür. Bu bir fonksiyonu bileşimi fonksiyonu sum ve fonksiyonumap(^2) da olduğu, fonksiyon map uygulanan fonksiyon (^2) ( kare fonksiyonu da bir bölümüdür), fonksiyon ^ pasajı 3 de (Bölüm pasajı 2 de katılmış ve bileşimin ).

Gördüğünüz gibi, işlevleri bir oldukça önemlidir fonksiyonel Haskell gibi dilin. Aslında, Haskell çoğu standart kütüphane ile dil olduğu söylenmiştir fonksiyonlar elde fonksiyonları girişler veya dönüş olarak fonksiyonları bu yaygın olarak bilinen bir (çıkış olarak daha yüksek dereceden fonksiyonu .

Bu arada, teknik olarak, her iki ya da daha fazla argüman işlevi , işlevi çıktı olarak döndüren bir işlevdir (buna currying denir).

Uzunluk 10 pasajı:

data B=T|F

Bu, farklı adlara sahip Haskell booleanlarının tanımıdır. Boolean türü adlandırılır B.
Bu tanım iki yapıcı sunar: true ( T) ve false ( F).
Bu kod parçacığı temel olarak derleyiciye her boolean ( B) öğesinin true ( T) veya false ( F) veya başka bir deyişle olduğunu belirtir B=T|F.

Aslında, tüm veri tipleri Haskell'de tanımlanabilir, diğer dillerde ise sayı, referanslar ve dizi veri tipleri derleyiciden özel destek almalıdır. Uygulamada Haskell'de aksi takdirde çok sakıncalı olacağı için özel destek var, ancak örneğin Boolveri türü tamamen dilde tanımlanmıştır.

Uzunluk 9 pasajı:

main=main

Bu saçma program mainana olarak tanımlanacaktır . Haskell tembel olduğu için, gerçek değerlerini kullanmazsak değerlendirmek için sonsuz bir döngü gerektiren değerler serbestçe kullanılabilir. Bizim gibi sonsuz döngüler içeren bu türlere main"dip" denir.

İşin eğlenceli yanı, GHC Haskell derleyicisinin bu tür sonsuz döngüleri tespit edebilmesi ve çalıştırıldığında yakalanabilir (!) Bir istisna atabilmesidir.

Uzunluk 8 pasajı:

f(x:_)=x

Bu, fboş olmayan bir liste verildiğinde başını döndürecek işlevi tanımlar .

Haskell'deki desenler Python'un paketten çıkarılması sırasına benzer, ancak her tür için genelleştirilmiştir. Desenler bir değeri reddedebilir veya eşleyebilir ve eşleşirse değişkenleri değerlere bağlayabilir.

Bu snippet'teki desenler şunlardır:

  • _: bir şeye uyan ve değişken içermeyen desen.
  • x: bir şeyi bağlayan ve onu değişkene bağlayan desen x.
  • :: Bu kalıp alt kalıplara, yani biri kafa, diğeri kuyruk için. Liste boş değilse, onları baş ve kuyrukla eşleştirir.

Desen eşleştirme oldukça genelleştirilmiştir. Aslında, sadece yeni veri türlerini tanımlamak, onlarla çalışmak için otomatik olarak kalıplar ortaya koyacaktır.

Uzunluk 5 pasajı:

x=2:x

Bunu açıklamak için çok şey var.

Her şeyden önce Haskell tembel. Bu, alt ifadelerin yalnızca kesinlikle gerekli olduğunda değerlendirileceği anlamına gelir.

Not: Bu kod pasajı atamayı göstermiyor, ancak tanımı gösteriyor. Haskell'in görevi yok.

Bu kod pasajı tanımlandı x, tamamen oluşan sonsuz bir liste 2. Genellikle başka dillerde xde değerlendirilmeli 2:x, daha önce değerlendirilebilsin, ancak Haskell'de bunu yapabiliriz.

Haskell sonsuz listeleri bir tür yineleyici ve düzenli bağlı listelerden oluşur: her ikisi gibi davranırlar (bir aralıktaki yineleme, örneğin sabit bellek kullanır).

Uzunluk 4 pasajı:

2:[]

Bu kod parçası, yalnızca singleton listesini kodlar [2]. :olduğu Eksileri Haskell operatörü. Aslında, düzenli liste sözdizimi, eksiler operatörü ve boş liste anlamıyla ilgili sadece sözdizimsel bir şekerdir. Bu, Haskell'in Desen eşleştirme ve Veri türleri (özellikle yapıcı kavramı) ile ilgilenme biçimiyle sıkı bir şekilde bağlantılıdır.

Uzunluk 3 pasajı:

f.g

Haskell'de .fonksiyon kompozisyonu anlamına gelir. Haskell, fonksiyon argümanlarının isimlendirilmemesi ve bunun yerine .veri akışını manipüle etmek için işlecin kullanılmasıyla karakterize edilen, "noktasız" bir tarzda yazılabilir .

Uzunluk 2 pasajı:

1-

Bu kod parantez içine alındığında (sözdizimsel nedenlerden dolayı) "bölüm" olarak adlandırılır. O zaman verilen sayı, boş noktayı "doldurur" ve bir sayı eksi döndüren bir fonksiyondur. Bu nosyon bazen Haskell gibi işlevsel bir dilde faydalı olabilir, aksi takdirde bir lambda gerekebilir.

Uzunluk 1 pasajı:

1

Haskell'de 1her ikisi de olabilir Int, Float, Double, Wordve benzeri. Aslında, 1herhangi bir türde bir sürümü tanımlamak için kod yazabilir ve özgürce kullanabilirsiniz.
Bu da JavaScript, Python ve benzerlerinde yapılır, ancak bunlardan farklı olarak tam güvenlik ile yapılır.

uydurma:

Aslen, Haskell komitesi Haskell B.'nin adından sonra "Curry" dilini çağırmayı amaçladı, ancak bazı pankartlar ortaya çıkabileceği için adı Haskell olarak değiştirmeye karar verdi. Ancak daha sonra Haskell'in "Pascal" ve "Hassle" ile olan benzerliğini fark ettiler!


Factoid'i, Haskell'in standart kütüphanesinde, diğer fonksiyonlardan fonksiyonlar üreten (ve teknik olarak her iki veya daha fazla parametre fonksiyonunun böyle olduğu) en fazla fonksiyon / operatöre sahip olduğu gerçeğiyle değiştirmem gerekip gerekmediğini bilmiyorum. yapmalımıyım?
gururlu haskeller

Bir pasajda gösterip açıklamaya ekleyin.
Martin Ender

f=0:1:zipWith(+)f(tail f) -- 25 charsFibonacci sayılarının tembel olarak hesaplanmış bir listesini döndüren bir işlev.
chamini2

ugh bir snippet ekledim ve sonra bilgisayarım kapandı
Gururlu haskeller,

@ proudhaskeller Tasarruf op. Bunu kişisel olarak hiç yapmadım, ancak bir kerede yapılacak büyük bir düzenlemeniz varsa, düzenlemeyi kaydetme ile harici bir belgede gerçekleştirebilir ve işlemi tamamlandığında içine yapıştırabilirsiniz.
mbomb007

99

C #

C #, Java, C, Haskell, SQL ve diğer birçok dilde sunulan özelliklerin eğlenceli ve çılgın bir karışımıdır ve birçok hoş özellik ve API sunar. Buralarda ayrıca oldukça ayrıntılı olduğu biliniyor, ancak ne yapabileceğimizi göreceğiz!

Her zamanki gerekli kazan plakasını görmezden geleceğim:

class Program { public static void Main(string[] args) { ... } }

Uzunluk 1:

;

Komutlar C #! 'Daki ​​noktalı virgüllerle sonlandırılır. Boş bir satır tamamen geçerli bir sözdizimidir.

Uzunluk 5:

x=5f;

C # dilinde değişmez sayıları belirttiğinizde, derleyici, onların ints veya double olduğunu varsayar (ondalık basamağa sahip olmalarına bağlı olarak). Değişmez bir float kullanmak istiyorsanız, sayıya 'f' ekleyerek belirtmelisiniz, yoksa çalışma zamanında atılır, bu da küçük bir maliyete neden olur.

Uzunluk 7 (bayt):

s=@"
";

Bir dize değişmezine @ işareti eklerseniz, bu bir "verbatim" dize değişmezi olur. Normal dize değişmezleri '\ n' gibi kaçış dizilerini özel karakterlere ayırır, ancak gerçek ifadeler, ters eğik çizgi karakterinden kaçmadan kullanmanıza izin vermez. Ayrıca gösterildiği gibi satır dönüşleri de içerebilirler. Bu sizi golfde birkaç bayttan kurtarabilir veya çok satırlı dizginizin değişmezlerini daha okunaklı hale getirebilir. Sadece dizede bulunan girintilere dikkat edin.

Uzunluk 8:

()=>x=y;

Bu ifade anonim bir işlevdir. ActionEtrafa geçirilebilen ve aynı zamanda bir işlev olarak da adlandırılabilen bir tür nesnesi döndürür . Anonim işlevler, bildirildikleri kapsamı devralır ve bu kapsamdaki yerel değişkenleri, gittikleri her yere yanlarında getirir.

Uzunluk 9:

(a)=>a.p;

İşte parametre ve dönüş değeri kullanan başka bir isimsiz fonksiyon. İfade bir tür nesnesi döndürür Func(Func, kendisi türünü döndürür a.p. FuncLinq ile arabirim oluşturmak için çok kullanırsınız.

Uzunluk 10:

enm.Any();

Bu Linq'e ilk girişimiz! Linq, numaralandırılabilir (IEnumerable arabirimini uygulayan) benzeri Arrayve herhangi bir nesnede çağrılabilen bir uzantı yöntemleri kümesidir List. IEnumerable tembel değerlendirme kullanıyor: koleksiyonun tamamını bir bütün olarak bilmeden, her seferinde bir eşyadan geçiyor - hatta sonsuz bile olabilir!

Buraya Anygelir - trueNumaralandırılabilir en az 1 öğe içeriyorsa döndürür . Tüm uzunluğu hesaplamaktan çok daha iyi.

Uzunluk 11:

var a=1.5f;

varAnahtar kelime otomatik türünü belirlemek için derleyici bildirir a. abu durumda olarak yazılacaktır Single. Kod kodları için çok kullanışlıdır, çünkü çoğu kod yapım kodunda kullanmaktan pek hoşlanmaz;

Uzunluk 15:

yield return 0;

İşte daha az aşina olabileceğiniz çılgın bir ifade. Nesnelerin IEnumerable'ı miras alarak numaralandırılabileceğini biliyorsunuz, ancak işlevlerin numaralandırılabileceğini biliyor muydunuz ? Bir dönüş türü ile bir işlev bildirin IEnumerableve yield returnistediğiniz kadar olmasını sağlayın. İşleve bir Numaralandırıcı aldığınızda GetNext, programın tüm kodu bir sonraki kadar çalıştırması yield return, bu değeri döndürmesi ve ardından yeniden ilerletmesi için duraklatılması gerekir. yield breakYinelemeyi sonlandırmak için kullanırsın .

Uzunluk 16:

[Obsolete]int a;

Bu pasaj bir nitelik gösteriyor. Bir özellik, kodunuzdaki herhangi bir bildirime yapabileceğiniz bir etiket türüdür. Bazıları derleyiciye, bazı şeyleri yapmasını söyler, bunun gibi eski bir uyarı verir a. Genişleterek kendiniz oluşturabilir Attributeve bunları Yansıma kullanarak sorgulayabilirsiniz (daha sonra belki de). Meta gidebilir ve bir özniteliğin ne tür bir bildirimde kullanılabileceğini kısıtlayabilirsiniz AttributeUsage.

Uzunluk 17

c.Count(t=>t==3);

İşte kullanışlı bir golf yöntemi. Bir Verilen Funcenumerable unsurunu eşleştiren ciçin bool, bu elemanların sayısını döndürür co kendisi için Funcdöner true. Bir döngü yazmaktan çok daha güzel.

Uzunluk 18:

foreach(T t in c);

Bu her bir döngü içindir. Tüm bu numaralandırılabilir şeyler konuşmasıyla, bu çok ihtiyaç duyulan bir yapı. foreachbir Numaralandırıcı oluşturacak c(numaralandırılabilir olması gereken) ve ther seferinde bir element boyunca yinelenecek olan sözdizimsel şekerdir . Her bir öğeyi değiştirebilir veya inceleyebilirsiniz, ancak koleksiyonun kendisini değiştirmek, numaralandırıcıyı geçersiz kılar.

Uzunluk 19

c.Select(t=>t.a/2);

Bu, işlevsel programlama fanları için 'harita' işlevinizdir. Select, Funcbir numaralandırılabilir öğenin her bir öğesi üzerinde bir rastgele dönüşüm (bir geçiş tarafından tanımlanır) gerçekleştirmek için iyi ve özlü bir yoldur . Yinelediğinizde "dönüştürülen" öğelerin dışına çıkacak bir IEnumerable döndürür.

Uzunluk 21

Console.Write("Hi!");

Bu satır stdout'a bazı metinler yazıyor ve muhtemelen C #'nın golf oynamak için kullanılmamasının ana nedenlerinden biri!

Uzunluk 23

typeof(T).GetMethods();

C # Yansıma denilen çok güçlü bir özelliği destekler. Yansıma, çalışma zamanında kodunuzun yapısını incelemenizi sağlar. Örneğin, bu çağrı belirtilen türdeki tüm yöntemlerden oluşan bir Dizi döndürür. Bu yöntemleri inceleyebilir, onları arayabilir veya hatta alanların ve özelliklerin değerlerini değiştirebilirsiniz. Öznitelikler (bkz. Uzunluk 16), kodunuzun bölümlerini Reflection ile kullanmak için etiketlemenin iyi bir yoludur.

Uzunluk 25

from t in c select t.a/2;

Bu SQL mi? C # kodunda mı? Oldukça yakın. Bu ifade, Uzunluk 19’daki ile aynı şeyi yapar.

Uzunluk 27

for(var l;;l=new object());

C #, çöp toplanan bir dildir; bu, ayırdığınız herhangi bir belleğin ( newanahtar sözcüğü kullanarak ), hiçbir başvuru olmadığı sürece otomatik olarak serbest bırakılabileceği anlamına gelir . Oluşturulan belleği hiçbir zaman açıkça serbest bırakmamama rağmen, bu kod sonsuza dek mutlu bir şekilde çalışacaktır. Çöp toplama işleminin maliyeti vardır - daha fazla bilgi için web’de arama yapın.

Uzunluk 29

var e=Enumerable.Range(0,99);

Enumerable.Rangepotansiyel olarak kullanışlı bir golf işlevidir. Numaralandırılabilen ve sırayla belirtilen aralıktaki her sayıyı verecek bir yapı döndürür. İkinci parametre bir sayıdır, indeks değildir.

Uzunluk 31

public int pr{get;private set;}

Burada basit bir 'özellik', bir OOP özelliği ve bir başka C # işareti gösterebiliriz. Java'yı daha önce kullandıysanız, erişilebilirliklerini ayırmak veya değiştiğinde kod çalıştırmak için bir alan için 'al' ve 'ayarla' yöntemlerini kullandınız. C #, bu kodu alanın en üstünde bildirmenize ve ayrıca alma ve ayarlama için ayrı erişim düzenleyicileri ayarlamanıza olanak sağlar. Bu özel snippet, otomatik olarak varsayılan alıcı ve ayarlayıcı oluşturur, ancak ayarlayıcıyı özel yapar.

Uzunluk 32

public static void m(this T o){}

Bu kod parçası, API tasarımı için iyi olan bir C # özelliği gösterir. thisDeğiştiriciyi statik bir yöntemin ilk parametresine uygulayarak , bu yöntem bir "uzatma" yöntemi olur. Bu bir kez ilan edildiğinde, T.martık T türündeki herhangi bir nesnede aslında bir T yöntemi olduğu anlaşılabilir. Bu, herhangi bir mevcut sınıfa, kaynak kodunu değiştirmeden veya hatta erişmeden yeni işlevsellik eklemek için kullanılabilir.

Uzunluk 38

int f(int a,ref int b,out int c){c=0;}

Bu yöntem, C # ile geçirilebilecek farklı parametre türlerini gösterir. Değiştirilmemiş parametreler değere göre iletilir . Öncelikli parametreler refbaşvuruya göre iletilir: bunlara tamamen yeni bir nesne atayabilirsiniz ve onu yöntemden çıkarırlar. Öncelikli parametreler outek getiri değerleri gibidir: yöntemde onlara bir değer atamanız gerekir ve bunlar ref parametreleri gibi tekrarlanır.

Uzunluk 42

Console.Write("It is \{DateTime.Now()}.");

Yeni C # 6 standardı, dize enterpolasyonu kullanarak birleştirilmiş dizeler çıkarmanız gerektiğinde size bazı karakterleri kaydedebilir. Bu özellik, herhangi bir ifadeyi bir dizgenin içindeki küme parantezleri içine yazmanıza olanak tanır ve dizi, çalışma zamanında bu ifadelerin değerleriyle otomatik olarak birleştirilir.

Uzunluk 48

IEnumerable f(){for(int a=0;;)yield return a++;}

Şimdi gerçek bir amaç için bir şeyler yapmak için yeterli karakter! Bu yöntem yukarıda araştırdığımız fikirlerden bazılarını kullanarak, 0 ile başlayarak, tam olarak tek tek döndüren tam sayıyı döndürecek sonsuz bir Numaralandırılabilir oluşturmak için hatırlayın. C # numaralandırıcılar ile tembel değerlendirme yapar, bu nedenle sonsuz bir dizi mükemmel bir şekilde geçerlidir - İstediğiniz kadar diziyi yineleyin ve istediğiniz zaman patlayın.

Uzunluk 56

int p{get{return mP;}set{mP=Math.Max(value,0);}};int mP;

İşte bir 'özellik' başka örneği (bkz. Pasaj 31). Burada, aslında farklı kod parçacıklarını tanımladıktan getve setoldukça eskisi gibi otomatik olanları kullanmaktan daha. Bu örnek, bir değişkene atanan değeri doğrulamak için bir özelliği nasıl kullanabileceğinizi gösterir - burada, değerin 0'dan küçük olmasına izin verilmez. Özelliklerin diğer iyi kullanımları, bir değer değiştirildiğinde bir olayı bildirmeyi veya önbelleğe alınmış değerleri yeniden oluşturmayı içerir. buna bağlı olabilir.

Uzunluk 65

int v;public static implicit operator int(Program o){return o.v;}

Bu özelliğe örtülü döküm denir. Belirli bir sınıfta çalışan statik kod olması gibi bir uzantı yöntemine benzemektedir (bkz. Snippet 32). Bununla birlikte, örtük cast onu çağırmakla kullanılmaz - sadece bir Programnesneyi bir tamsayı olarak ele almak (örneğin int i=new Program()) ile kullanılır. Bunu yaptığınızda, nesne gizli olarak kullandığınız türe, sessiz olarak kullandığınız türe dönüştürülür. En iyi uygulama, bunu yalnızca dönüşümün bir sonucu olarak hiçbir bilgi kaybedilmediğinde yapar.


1
Bu karakterlerle neler yapabileceğinizi
görelim

9

Kayıt edilmiş. Sanırım bu gece biraz Linq yapacak kadar vaktimiz var!
BMac

genel statik örtülü işleci int (Sınıfım o) {return o.objVal;} // 65. Bu kodla bu satır geçerlidir: MyClass o1 = new MyClass (10); int o2 = o1; // o2 şimdi 10. msdn.microsoft.com/en-us/library/85w54y0a.aspx
Zukki

Daha fazla snippet lütfen
Cyoce

98

Java


Uzunluk 44 snippet

Object a=System.out.append("Hello, World!");

Hello, World!STDOUT'a yazdırır .

Uzunluk 43 snippet

float[][][][][]a=new float[5][3][7][2][10];

aher biri 5 floats içeren 3 dizi içeren 7 dizi içeren 2 dizi içeren 10 dizi içerir .

Uzunluk 42 snippet

interface A{static void main(String[]a){}}

Tam bir program. Bir interfaceiçindeki her şey doğal olduğundan public, kelimeyi publicana yöntemden çıkarabiliriz.

Uzunluk 36 pasajı

class A{class B extends A{B.B.B b;}}

Abir iç sınıfa sahiptir B. Bu, bir tür değişken ilan edebileceğimiz anlamına gelir A.B.

Fakat Bbunun bir alt sınıfıdır A, yani tüm metotlara, alanlara ve iç sınıflarına sahiptir A. Böylece türüne B.Bde değinebiliriz.

Bu kodda, bunu bir adım daha ileri götürüyoruz ve B bir örnek değişkeniniB.B.B .

Ahlaki: SO hakkındaki sıcak soruları takip etmek, anlamsızsa, çok sayıda ilginç yöntem öğretebilir.

Uzunluk 35 snippet

l.stream().map("a"::equals).count()

Eğer l Strings listesidir, bu bizi eşit bunlardan kaç anlatır "a".

Uzunluk 34 pasajı

public static void main(String[]a)

Bir programın ana yönteminin yöntem imzası. Sadece 11 karakter daha ve tam bir program yapabiliriz!

Uzunluk 33 pasajı

enum D {NORTH, EAST, SOUTH, WEST}

NORTH, EAST, SOUTHVe WESTtürdeki tüm sabitlerdirD .

Uzunluk 32 pasajı

Files.readAllBytes("hello.txt");

Tüm dosyayı okur, geri döndürür byte[]İçindekilerden birini .

Uzunluk 31 pasajı

new String(new char[]{'h','i'})

Eşdeğer "hi". Eğer yararlı"Anahtar kullanışlıdır.

Uzunluk 30 pasajı

new JFrame().setVisible(true);

Başka bileşenleri yerleştirebileceğiniz, görülebilir yeni bir çerçeve oluşturur.

Uzunluk 29 snippet

throws ClassNotFoundException

Bunu çağıran her yöntemi bir try-catch blok , ya da hatayı yığına kadar iletmeye zorlar. Denetlenen istisnalar, Java tasarımcılarının en tartışmalı kararlarından biridir.

Uzunluk 28 pasajı

int f(int x){return f(x-1);}

Bu işlev sonsuza kadar çalışmaz; Aslında, tipik bir bilgisayarda bir saniyeden daha az sürer. Teşekkürler, yığın taşması.

Uzunluk 27 pasajı

Object a=new String[]{"a"};

Yeni bir dizi dizisi oluşturur.

Uzunluk 26 pasajı

Object.class.newInstance()

Yeni bir şey yaratır Object.

Uzunluk 25 pasajı

((Supplier)()->-~0).get()

Sabit kodlama sabitlerinden kaçınmak en iyisidir. Bu, değer 1dışında herhangi bir sabit kullanmadan değeri elde etmenin nesne yönelimli bir yoludur 0.

Uzunluk 24 snippet'i

(Function<Long,?>)x->x+1

Halefi işlevi.

Uzunluk 23 snippet'i

l.removeIf(x->x%10==0);

Bir ltam sayı listesi ise, bu, 10'a bölünebilen tüm değerleri kaldırır.

Uzunluk 22 pasajı

int i=(new int[7])[5];

Yeni bir yedi tam sayı dizisi oluşturur ve beşinci öğeyi alır.

Uzunluk 21 pasajı

Arrays.asList(2L,"a")

Bu öğelerle bir ArrayList oluşturur.

Uzunluk 20 pasajı

System.out.print(s);

Yazdırır s.

Uzunluk 19 pasajı

import java.util.*;

Gibi sınıfların özlü kullanımını sağlar List, Map, Scanner, Timer, ve Random.

Uzunluk 18 snippet

Math.addExact(x,y)

İki tamsayı ekler xve y. Taşma meydana gelirse, yöntem yanlış cevap vermek yerine bir istisna atar.

Uzunluk 17 snippet

Double.MIN_NORMAL

Türün en küçük pozitif değeri double, anlamın baştaki biti 0'dır.

Uzunluk 16 pasajı

System.in.read()

Konsoldan tek bir karakter okur.

Uzunluk 15 pasajı

Long.reverse(x)

Bitlerin ikili gösterimlerindeki bitleri ters çevirir x.

Uzunluk 14 pasajı

int x=050+120;

xşimdi 160, çünkü ile başlayan her şey 0sekizlik olarak algılanıyor.

Uzunluk 13 pasajı

private C(){}

Özel bir kurucu, diğer sınıfların onu başlatmasını önler. Bu desen SystemveMath diğerleri sınıflar . Singleton Pattern'i uygulamak için özel bir kurucu da kullanılabilir.

Uzunluk 12 pasajı

static class

Bir için bir çözüm - Bir çevreleyici dış sınıf olmadan iç sınıflar oluşturulması sağlar sorunu karşısında tarafından birçok programcılar .

Uzunluk 11 pasajı

throw null;

Bir atmak için sık sık gerekli NullPointerException, ama aynı zamanda oldukça endişe verici. Bu çok daha basit bir alternatif.

Uzunluk 10 pasajı

int[]a,b[]

İki değişkeni tanımlar: ave b. atürden int[]ve btürden int[][].

Uzunluk 9 pasajı

switch(x)

Değerine bağlı olarak bir yere gider x.

Uzunluk 8 pasajı

break a;

Etiketli bloktan kopar a .

Uzunluk 7 pasajı

goto x;

gotoAnahtar kelime C, C ++ ve Java ayrılmıştır. Eğer xbir etikettir, o zaman bu kod uygun etikete programı gönderiyor - C ve C ++. Fakat bu Java, gizemli bir durumu tetikliyor RuntimeException. Aslında, gotoanahtar kelimeyi Java ile kullanmanın hiçbir yolu yoktur .

Uzunluk 6 pasajı

\u003b

Bir açıklama biter. Java gariptir .

Uzunluk 5 pasajı

a-=-a

Katına aonun olumsuzlamasıydı çıkarılarak.

Uzunluk 4 pasajı

a&=b

Değerini abit yönünde ave ve değerine ayarlar b.

Uzunluk 3 pasajı

...

Bir dizi halinde konsolide edilen herhangi bir sayıda argüman.

Uzunluk 2 pasajı

<>

Derleyicinin muhtemelen ne tür bir terim kastettiğinizi bulmasını sağlar. Java benzeri değil.

Uzunluk 1 pasajı

@

Yöntemler ve sınıflar hakkında ek bilgilerin gösterilmesine izin vermek için bir not belirtir.

Uydurma

Java'da, sonsuz döngüler bazen derleyici hatalarına neden olur. Örneğin, döngü while(true);, yöntemden çıkmadan sonlandırılamaz, bundan sonra gelen herhangi bir kod "erişilemez bir ifade" hatası tetikler. @ Optimizer'ın belirttiği gibi, sadece bazı sonsuz döngüler bu şekilde yakalanacaktır.


5
Java'da sonsuz döngüler derleyici hatasına neden olmaz. Onları algılayan ve bir hata üreten IDE'niz. Java basitçe Erişilemez ifadeler kavramına sahiptir, bu nedenle while(true);kodunuzdaki gibi bir şey varsa , bu satırdan sonra gelen herhangi bir şey Erişilemez ifadesinin derleme hatası verir. Bu tür ifadeleri tespit etmenin ardındaki mantık çok katıdır, bu nedenle tüm sonsuz döngüleri hiçbir şekilde tanımayacaktır
Doktor

4
Az önce oy kullandınız, sanırım bu bir pasajı kaldırmak zorunda kalacaksınız! ;) (Olumsuz olan "Java garip" idi)
Simon Forsberg

1
Görünüşe göre, 36 nolu snippet özyinelemeli ve süresiz uzatılabilir: class A{class B extends A{B.B.B.B.B.B.B b;}}hala derleniyor.
Natix

3
Tam bir program yapmanıza yardımcı olmak için;)
durron597

1
But it Java, [goto] triggers a mysterious RuntimeExceptionYanlış. gotoderleme bile değil.
dorukayhan

93

piton

Şimdi rahatınız için en yeni ile başlayın! İlkinden en erken başlayarak 30 uzunluğu boyunca okumak için, düzeltme geçmişine gidin.

Herhangi birinin önerileri varsa, yorum yapmaktan çekinmeyin.

Uzunluk 52:

i=0
while s[i-n:]:print(' '*n+s)[i:n+i];i+=1;i**7**7

Sahte Seçim Çerçevesi metnine girmemden alındı . sve nönceden bir dize ve tamsayı olarak ayarlanması gerekir. Aslında kullandığım ücretsiz Python 2 yorumlayıcısında işe yaramadı, bu yüzden etrafa parantez ekledim (' '*n+s)[i:n+i]ve burada Python 3 yorumlayıcısında çalıştığını görebilirsiniz .

Uzunluk 43:

#-*-coding:rot13-*-
cevag h"Una fubg svefg"

Python'da kaynağı belirli bir codec ile kodlayabilirsiniz. Bu, kaynağın Rot13'te nasıl yazılabileceğini gösterir. Genel sözdizimi şudur: # -*- coding: <codec-name-goes-here> -*-.

İşte çevrilir:

#-*-coding:rot13-*-
print u"Han shot first"

uDize aşağıdaki belirtir Unicode dizedir. Dizelerinizin Rot13'te olmasını istiyorsanız, bu gereklidir, aksi halde kaynaktaki her dize şifrelemeye rağmen kolayca okunabilir. Alternatif olarak, .encode("Rot13")her dizeden sonra da kullanabilirsiniz (bu konuda Rot13 kullanmayı da unutmayın). Bu makaleye göre , bazı alternatif kodlamalar “base64 ″,“ uuencode ”,“ zlib ”veya“ bz2 ″.

Uzunluk 33:

import cmath
print cmath.sqrt(-1)

Bu Python'un karmaşık (hayali) sayılar için modülüdür . Bu baskılar 1jPython mühendislik standartlarına uygundur ve kullandığından, jtercihim olsa hayali birim olarak idaha yaygın matematik kullanıldığı, ve kullanma jve kek olarak iiçin kuaterniyonlara , ama konuyu dağıtmak. Böcek / değişim sırasını buradan okuyun (değişmeyecek).

Uzunluk 30:

f=lambda n:n*f(n-1)if n else 1

Şimdi özyinelemeyi ve üçüncüyü ifşa kullanarak kendi faktoring fonksiyonumuzu tanımladık! Bildiğim kadarıyla, bu Python'da olduğu gibi golf oynuyor. Aynı zamanda şu şekilde de yazılabilir:, f=lambda n:n and f(n-1)*n or 1bir çift Python'un Boolean operatörünü (ve ayrıca 30 karakterde) lambdagöstererek. Sözdizimi hakkında bilgi için 15 kod parçacığı uzunluğuna bakın .

Uzunluk 29:

import math
math.factorial(7)

Dönen 7'nin faktörünü bulur 5040.

Uzunluk 25:

import math
print math.pi

Python'un matematik modülü birçok yararlı fonksiyon ve sabit sağlar. İşte PI. Döner 3.14159265359. (Yukarıdaki kodda, newline'ı karakter olarak saydım.)

Uzunluk 24:

f=lambda y:lambda x:x**y

Bu bir kapatma örneğidir. Arama cube = f(3)yapmak, daha sonra print cube(24)baskı ile çağrılabilen kübik bir fonksiyon yaratacaktır 13824.

Uzunluk 19:

print"Hello World!"

Son olarak, bazı temel çıktıları basmak için yeterli alan! Burada boşluk gerekli değildir, çünkü tırnak işaretleri ve parantezler de sınırlayıcıdır. Bu sadece Python 2'de çalışacaktır, çünkü Python 3 printdiğer fonksiyonlar gibi çağrılacak fonksiyonu değiştirmiştir. Python 3'te kullanın print("Hello World!"). Yazdırma işlevi ve Python 2 ile 3 arasındaki fark hakkında daha fazla bilgi için, bkz . Python 3.0'daki Yenilikler .

Uzunluk 16:

[x*3 for x in l]

Bir kez daha, lbir liste veya bir dize veya jeneratör gibi herhangi bir diğer yinelenebilir nesne olduğunu varsayalım . Bu ifade bir liste anlama olarak bilinir . Döngü yapısı için standart kullanmaktan çok daha kısadır. Burada, tüm sayıları 3 ile çarpılan bir liste döndürür. Ayrıca, dizeler çarpılabilir! Böylece listedeki herhangi bir dize, bu sayıda eklenecektir (kendi kendine birleştirilmiştir).

Uzunluk 15:

import this #:)

Bu aslında bir uzunluk 11 pasajı, ancak Python'un (harika) paskalya yumurtasını sergilemeyi unuttuğumu fark ettim ! Bu modülün içe aktarılması Python Zenine (Bkz. Factoid.) İlginç bir gerçek: modül this.pydaha sonra kullanacağım umarım rot13'te kodlandı.

Uzunluk 14:

lambda x:x**.5

Bu, bir lambdahazır bilgi işlevi için Python'un sözdizimini kullanan bir kare kök fonksiyonunu tanımlar . Python'daki işlev değişmezleri ifadeleri değil yalnızca ifadeleri içerebilir. Bu lambda, bir değişkene atanabilir, bir fonksiyona geçirilebilir veya (lambda x:x**.5)(9)geri dönen bir satırla yürütülebilir 3.0. Bir karekök için üs kullanmak, sqrtişlevin mathmodüle alınmasına bir alternatiftir .

Uzunluk 13:

1 if x else 0

Bu, eğer işleç ise Python'un üçlüsünün bir örneğidir. Bu, kodlayıcıların Boolean işlemleriyle manuel olarak uygulanmasını engellemek için Python 2.5'e eklenmiştir. Burada, 1eğer dönmek olduğunu xdeğerlendirir için True, aksi 0döndürülür.

Uzunluk 12:

s=input(">")

Bu >bilgi istemi metni için yazdırılacak ve kullanıcının bir değer girmesine izin verecektir. Python 2, girilen değerin ne olduğunu yorumlar, bu nedenle herhangi bir dize tırnak işareti ister. Python 3 bunu değiştirdi, böylece girilen giriş otomatik olarak yorumlanmıyor. Python 2'de yorum yapmadan girişi girmek için, kullanın raw_input(). Python 2'de input()eşittir eval(raw_input()).

Uzunluk 11:

eval("2e3")

2e3şamandıra 2 x 10tation için bilimsel gösterimidir. evalFonksiyon olarak yorumlar ve bir ifade olarak herhangi bir dize değerlendirir. Bu durumda, değişmez 2e3ya da kullanımı ile aynı sonuca sahiptir float("2e3"). Döner 2000.0.

Uzunluk 10:

range(013)

Bu fonksiyon arasındaki tam sayıların listesini döndürür 0sekizlik değerine 013olduğunu 11liste olacak, yani (hariç) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Fonksiyon benzer üç değişken almaktadır slice, daha önce ele fonksiyonu: range(start, stop[, step]). Aradaki fark, sadece bir parametre ile parametre durma değerini gösterir.

Python 3.x'in eşdeğeri olmadığına dikkat edin. O oluyor rangebenzer, ancak aslında Python 2 en aynıdır xrangelistesi yerine bir jeneratör nesnesi döndüren.

Uzunluk 9:

a,b = b,a

Çoklu ödev Bu, aynı anda birden fazla değer atamanıza izin veren basit ama şık bir özelliktir. Sağlanan snippet'te, takas edilir ave b. Peki ya değerlendirme sırası? Ödev operatörünün sağındaki tüm ifadeler, ödevlerden herhangi biri yapılmadan önce değerlendirilir. Bu geçici bir değişkene ara atama gerektiren birçok dili yener.

Uzunluk 8:

#comment

Ne olduğunu biliyorsun ... Bekle, değil mi? Bilirsin, kod satırını tanımlamak için rastgele metinler yazmana izin veren ve anlaşılmasını kolaylaştıran şeyler mi? Hayır? Tamam...

Uzunluk 7:

l[::-1]

Yine lbir liste varsayalım , bu listeyi ters sırada döndürür. Üçüncü argüman adım boyutunu gösterir. Her üç argüman negatif değerler olabileceğinden, negatif adım boyutu ters sırayla yineleme anlamına gelir. Boş birinci ve ikinci argümanlar tüm listeyi yinelediğimizi gösteriyor.

Daha ilginç yapılar kullanarak başlayabileceğimiz bir yere gidiyoruz!

Uzunluk 6:

l[-6:]

Buna dilim işlemi denir . Eğer lbir liste ise, bu listedeki son altı elementi içeren yeni bir liste döndürür l. -6başlangıç ​​indeksini (sondan 6) temsil eder ve iki nokta üst üste gelen endekse kadar devam etmek anlamına gelir (bu nedenle boş bıraktık, yani sonuna kadar.) Listemiz 1 ile 10 arasındaki sayıları içeriyorsa, bu geri dönecektir [5, 6, 7, 8, 9, 10].

Uzunluk 5:

1<x<5

Python'un harika özelliklerinden biri, karşılaştırma operatörleri zincirlemenize izin vermektir. Diğer birçok dilde, bu gibi yazılır 1 < x && x < 5. Birden fazla karşılaştırma yapmayı düşündüğünüzde daha da iyi olur: 1 < x < y < 5tamamen geçerli!

Uzunluk 4:

0256

Başında sıfır olan bir tam sayı, değişmez bir sekizli değerdir. Bu aynı zamanda kod şaşırtmaca için güzel bir hiledir. Bu ondalık değeri döndürür 174. Python 3.x'te, sekizlik değer olarak yazılır 0o256.

Uzunluk 3:

`3`

Geriye repr()dönüşlerde bir ifadeyi çevreleyen , bir nesnenin dize gösterimini döndüren kullanımla aynıdır . İşlev, dizeyi evalişlevine bağımsız değişken olarak iletildiğinde , orijinal nesneyi döndürecek şekilde döndürmeye çalışır. Öyle değil kullanılarak aynı str()sonuçlar bazen aynı olmasına rağmen,. Bu giriş '3'için her iki durumda da iade edilir. Bu kod golf için benim favorim!

Sadece Python 2'de çalışır!

Uzunluk 2:

[]

Boş bir liste.

Uzunluk 1:

_

Alt çizgi karakteri çok kullanılan bir değişken değişken adıdır. Bununla birlikte, bir Python kabuğu (etkileşimli tercüman) kullanıyorsanız, son çalıştırılan ifadenin sonucunu tutar (ve tekrar döndürür.) Ayrıca, bu konuya göre , i18n'deki çeviri araması için de kullanılır.

Factoid : Python, Java ve C'ye benzer bir dildir. Özel bir tasarım felsefesiyle inşa edilmiştir (" PEP 20 - Python'un Zeninden "):

  • Güzel çirkin daha iyidir
  • Açık, örtük olmaktan iyidir
  • Basit karmaşıktan daha iyidir
  • Karmaşık karmaşıktan daha iyidir
  • Okunabilirlik sayar

Bunlar nedeniyle, yarı-sütunların bir ifade sınırlayıcısı olarak kabul edilmelerine rağmen, genellikle okunabilirlik için çoklu satırların kullanılması lehine ihmal edilirler. Ayrıca, satır girintisi çok önemlidir!


İstediğin zaman! Daha fazla parçacığı ekleyemem (9 Uzunluğa dayanamadım!), Çünkü zaten harika bir iş çıkardın. İyi şanslar!
nasser-sh

1
uzunluk 6: geri dönerdi [5, 6, 7, 8, 9, 10](listedeki son 6 sayı)
Vincent

Uzunluk 16: lbir liste olmak zorunda değildir, herhangi bir yinelenebilir nesne olabilir; örneğin bütün işler için tüpler, listeler ve jeneratörler
nasser-sh

@ Sp3000: [Sınırlı kaynak] zorluklarla kullandım.
Robbie Wxyz

4
Yaşlılara aşk yok import antigravitymu?
Cipher

87

JavaScript

Bu en eskiden en yeniye gidiyor. Kendim için Link: [ değiştir ]

Uzunluk 51 pasajı:

console.log(require('fs').readFileSync(__filename))

Bir Node.JS, bu kez kendi kaynak kodunu okumaktan dolayı herhangi bir "katı quine" gereksiniminden mahrum kalmasına rağmen, bu süreyi kısaltıyor.

Uzunluk 50 pasajı:

a=new XMLHttpRequest;a.open('GET','file');a.send()

En sonunda! Bir AJAX isteği ( Vanilla.JS kullanarak ). İsteği başlatıyor, açıyor ve gönderiyoruz, ancak işleyicileri eklemek ve sonuçla ilgili herhangi bir şey yapmak için çalışma alanım bitti .

Uzunluk 49 pasajı:

msg=new SpeechSynthesisUtterance('Hello World!');

Bir vokal "Merhaba Dünya!" Hazırlayın. Konuşmak biraz daha fazla iş olacak. Ses seviyesini, perdeyi, hızı ve aksanı da ayarlayabiliriz. HTML5Rocks'ta Konuşma Sentezi API'sına bakın . Henüz Firefox tarafından desteklenmiyor, kesinlikle IE değil .

Uzunluk 48 pasajı:

function repeat(){setTimeout(repeat,48)}repeat()

setIntervalÖzyinelemeli setTimeouting tarafından benzetin .

Uzunluk 47 pasajı:

module.exports=function MyModule(a) {this.a=a};

DüğümJS yine, ancak ilke JS'de her yerde aynıdır. Bu, bir özelliği ( a) olan bir nesne oluşturan çok temel bir yapıcı işlevdir . Ayar module.exports, require()bying işlevini kullanarak verir.

Uzunluk 46 snippet:

canvas.getContext('2d').fillRect(46,46,46,46);

Bu bir <canvas id="canvas"></canvas>eleman gerektirir . Kimlikli elemanların global değişkenler olarak doldurulması gerçeğinden faydalanır, dolayısıyla elemanın canvasJS'den erişilebilir olması . Daha sonra x = 46, y = 46'da 46x46 kare ile dolduruyoruz.

Uzunluk 45 pasajı:

JSON.parse(require('fs').readFileSync('jsn'))

Düğüme Geri Dön. Burada, jsngeçerli dizinden adlandırılmış bir JSON dosyasını ayrıştırıyoruz .

Uzunluk 44 snippet'i:

(a=document.createElement('a')).href="/url";

39 no'lu binada. Şimdi bir eleman yaratıp bir nitelik atarız. Yine de DOM'da değil.

Uzunluk 43 pasajı:

sq=[1,2,3,4,5].map(function(n){return n*n})

Kullanarak ilk 5 karenin bir dizisini oluşturur map().

Uzunluk 42 pasajı:

six="1+5",nine="8+1";eval(six+' * '+nine);

Bu gibi aynı prensiple çalışır bu ancak JS yoksun #defineve böylece daha çirkin biter. Elbette, hayata, evrene ve her şeye cevap verir .

Uzunluk 41 snippet'i:

c=function(){var i;return function(){}}()

Bir kapanış başlangıcı. cşimdi dahili değişkene erişimi olan bir fonksiyondur (dahili olan) i, fakat hiçbir şey yapmaz.

Uzunluk 40 pasajı:

$('p').click(function(){$(this).hide()})

Bu paragrafları tamamen düşürüyoruz ve jQuery kullanıyoruz.

Uzunluk 39 pasajı:

script=document.createElement('script')

Bu, yeni bir harici komut dosyası eklemenin başlangıcıdır. Boş bir <script>öğe oluşturun ve ona referansta bulunun.

Uzunluk 38 pasajı:

document.getElementsByClassName('abc')

.abcBelgedeki tüm elemanları bulun . Tabii ki, jQuery ile, sadece $('.abc')...

Uzunluk 37 pasajı:

b=JSON.parse(JSON.stringify(a={3:7}))

İki özdeş, ancak ayrıştırılmış nesne oluşturur a, ve b. Yaparsan

a={a:1};
b=a;
b.a=3;

Eğer ile bitirmek istiyorum a=={a:3}çünkü ave bnokta aynı nesneye. Onları ayırmak için JSON kullanıyoruz.

Uzunluk 36 pasajı:

(function f(){return "("+f+")()"})()

Bir kuyruk . Kendi kaynak kodunu yazdırır.

Uzunluk 35 pasajı:

document.body.style.display="none";

32 numaraya bakınız. Bu, belgenin içeriğini değiştirmeden belgeyi gizler.

Uzunluk 34 pasajı:

Object.prototype.toString.call(34)

Çağırma Object.prototype.toStringbir nesnenin türünü söylemenin iyi bir yoludur. Olsa 34..toString()da "34", pasaj [object Number].

Uzunluk 33 snippet'i: (bunun kredisi isimsiz bir kullanıcıya gider )

+0%-0.&(v\u0061r=~void[{}<<!(0)])

Bunun geçerli bir JavaScript olmadığını mı düşünüyorsunuz? Denemek daha iyi ... (Chrome kullanın);)

Uzunluk 32 pasajı:

document.body.innerHTML="hacked"

Halp! Hazxxors! Onbir !! 11!

Uzunluk 31 pasajı:

a=[];for(i=0;i<31;i++)a.push(i)

Şaka yapmıyorum, aslında bir fordöngü kullanabilmek için uzun zamandır bekliyorum ! Bu, 0-30 arasında bir dizi oluşturur.

Uzunluk 30 pasajı:

new Date().getDay()==1?"S":"E"

Üçlü operatör kullanarak ilk kez. Bundan 30 karaktere daha fazla uyuyamadım, bu yüzden sadece bugün Pazar veya başka bir şey olup olmadığını biliyoruz. : P

Uzunluk 29 snippet'i:

Object.keys(window).push('i')

Object.keys(window)Genel değişkenlerin bir dizisini (özellikleri window) alacak . .push()bu diziye bir öğe ekleyecektir. Bunun eşdeğeri olduğunu window.i=undefinedmu düşünüyorsunuz ? Hayır!

Uzunluk 28 pasajı:

setTimeout("a=confirm()",28)

28 milisaniyelik bekleme, yeni bir iş parçacığı oluşturmak dışında pek kullanışlı değildir.

Uzunluk 27 snippet'i:

document.querySelector('a')

DOM adlarının çok uzun olması çok yazık. Burada sadece tek bir link bulabilirim.

Uzunluk 26 snippet'i:

JSON.stringify({twenty:6})

Bakınız # 16. Şimdi asıl JSON'u elde ettik - bir dize.

Uzunluk 25 pasajı:

new Badge("Good Answer");

Badge()Bir argüman alarak bir yapıcı işlevi olduğunu varsayarsak ... İyi bir Cevap rozeti yeni yaratıldı!

Uzunluk 24 snippet'i:

do {alert(24)} while(!1)

Aslında hiç fazla kullanmıyorum do..while, fakat bazıları kullanıyor. Bu sıradan bir whiledöngü olsaydı, hiçbir şeyi tetiklemezdi, çünkü her zaman yanlıştı. do..whileher zaman en az bir kez koşacağız, bu yüzden 24'ü görüyoruz.

Uzunluk 23 pasajı:

window.parent==self.top

Bunların hepsi, genellikle olarak bilinen aynı nesneyi ifade eder window. Normal bir işlevi çağırırsanız, o da var this. Global nesneye ulaşmanın 5 yolu bu!

Uzunluk 22 pasajı:

for(i in self)alert(i)

Tüm global değişkenleri uyarın. Bu olur self==window. (Bir sonraki pasaja bakın.)

Uzunluk 21 pasajı:

"2"+1==21 && 2+1=="3"

Oh bak, yine JS'nin oyun kuralları. Bu ifade doğru, btw.

Uzunluk 20 pasajı:

Math.random()<.5?0:1

0-1 den rastgele bir sayı seçin ve üçlü işleci kullanarak yuvarlayın. Kullanımı daha kolay olsa da Math.round...

Uzunluk 19 snippet'i:

[1,2,3].map(i=>i*i)

Bu yeni. Mesela, gerçekten yeni. 1, 2 ve 3 karelerini hesaplamak için ES6 ok işlevlerini kullanır . Şu anda, yalnızca Firefox tarafından desteklendiği görülmektedir.

Uzunluk 18 pasajı:

location.href="/";

# 15 gibi, ama bu sefer SE, PPCG ana sayfasına gidiyor.

Uzunluk 17 pasajı:

(function(){})()

Bu 14 snippet, ama daha iyi! Şimdi bir IIFE.

Uzunluk 16 pasajı:

obj={not:'json'}

Bu evcil hayvanlarımdan birisini açıklıyor. Bu bir nesne , JSON değil ! JSON , JavaScript nesnelerine dayanan, ancak daha katı bir format alan bir veri değişim biçimidir.

Uzunluk 15 pasajı:

open('//s.tk/')

Hayal et. Http://s.tk/ yönlendirmesini kullanarak SE ana sayfasını açın .

Uzunluk 14 pasajı:

function f(){}

W00t! Fonksiyonlar! Ne yazık ki, hiçbir şey yapacak yer yok.

Uzunluk 13 pasajı:

Math.random()

0'dan 1'e kadar rasgele bir sayı oluşturun. Kendi sınırlarınızı belirlemek ister misiniz? Zor şans. (Gerçekten değil, kolay.)

Uzunluk 12 pasajı:

new Date<=12

Bu ifade JS'de asla geçerli olmamıştır. JS, 1/95/1970 00: 00: 00.012'den uzun bir süre sonra, '95'e kadar (factoid'e bakınız) yaratılmadı.

Uzunluk 11 pasajı:

Math.PI*121

Yarıçapı 11 olan bir dairenin alanı.

Uzunluk 10 pasajı:

if('j')9+1

Fark etmediysen, koddaki kod parçacığı numarasıyla bir şeyler yapmayı seviyorum. Bu, 10 döndürür ve alfabenin onuncu harfi olan j'yi kullanır.

Uzunluk 9 pasajı:

[9].pop()

Bir öğe ile bir dizi yapın. Gelincik 9 popgider .

Uzunluk 8 pasajı:

document

Tüm DOM işlerinin temeli. Fakat hiçbir şey yapamayız, çünkü çok uzun. :( Git jQuery!

Uzunluk 7 pasajı:

alert()

Ah oğlum! Bir işlev çağrısı! Sonunda bir şeyler yapmak mümkün olacak!

Uzunluk 6 pasajı:

var x=6

# 3'e göre. Yine de çok daha iyi, çünkü şimdi küresel açık . : P

Uzunluk 5 pasajı:

[][5]

Bile daha kısa void 0olsun undefined. BTW: ''.adaha kısa; sadece 4 karakter.

Uzunluk 4 pasajı:

+"4"

Bu 4, dizgeden sayıyı yaratacaktır "4". Bu 4 karakterin aynısını tersini yapmak için farklı bir sırayla tekrar kullanabilirsiniz!

Uzunluk 3 pasajı:

x=3

Oh dang, sadece üstü kapalı bir global değişken yaptık ...

Uzunluk 2 pasajı:

{}

Bu ne işe yarıyor? Eğer gerçek bir nesne yaratırsan, yanılıyorsun. Aslında boş bir blok. Bir konsol aç ve dene! Dönüyor undefined, değil {}.

2018'de {}Chrome'un konsolunda aslında boş bir nesne döndürüyor.

Uzunluk 1 pasajı:

1

Bu kadar. Herhangi bir sayı geçerli bir JS ifadesidir.

Factoid : JavaScript aslında LiveScript olarak adlandırıldı. Java'nın popülaritesinden (1995) faydalanmak için JavaScript olarak değiştirildi. Şahsen eski ismini korumuş olmalılardı; JavaScript bu yana bir karışıklık kaynağı olmuştur. Gerçek şu ki, Java ve JavaScript “araba” ve “halı” ile aynıdır .


1
Snippet 33, Firefox'ta çalışmıyor. Gerçekten geçerli bir JS mi?
Oriol

Çok kirli kopyalamak için bir nesneyi dize ve yeniden inceleme buluyorum. ECMAScript 6 tanıtıldı Object.assign, böylece snippet 37 olur b = Object.assign({ }, a = {3 : 7}).
Oriol

@Oriol Evet, şu anda sadece Firefox bunu destekliyor, bu yüzden şimdilik kirli yola devam etmek zorundayız. En azından, daha iyi eval(uneval(a)), değil mi? ;)
Scimonster

38 numara hakkında, her zaman var document.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)"). (Herhangi bir geçerli CSS seçiciyi destekler).
Mateon 1

# 40 snippet'in kendisi o kadar ilginç değil, ancak yorum paha biçilemez.
Scimonster

85

R,

Factoid: R programlama dili, S programlama dilinin GNU uygulaması olarak başladı. Öncelikle istatistikler ve ilgili uygulamalar için kullanılır.

Not: Yarışmanın bir gereği olmasa da, buradaki her kod parçası R'de tek başına çalıştırılabilir.


Uzunluk 32:

`[.data.frame`(swiss,3,2,drop=F)

Bu biraz gizemli görünüyor ... ve gerçekten de olmalı! Bunu yazmanın çok daha iyi bir yolu var:

swiss[3, 2, drop = FALSE]

Bu biraz daha tanıdık gelmeli. İşte bu kod parçalarından birini çalıştırdığımızda olanlar:

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

swissŞimdiye kadar gördüğüm birkaç diğerleri gibi R ile veri çerçevesi gelir. İsviçre'nin 47 Fransızca konuşulan illeri için 1888 yılından bu yana doğurganlık ve sosyoekonomik göstergeler içermektedir. Üçüncü sıra, Franches-Mnt eyaleti içindir ve ikinci sütun, her ilde bir meslek olarak tarımda yer alan erkeklerin yüzdesidir. Böylece, 1888'de İsviçre Franch-Mnt eyaletindeki erkeklerin% 39,7'si tarımda çalıştı.

Daha basit gösterimi kullanarak bir veri çerçevesinden satır veya sütun çıkardığınızda, R aslında [.data.framearka planda kullanılır. Parçacıkta (24) gördüğümüz gibi, hemen hemen her şey, arka keneler çevrili olduğu sürece bir işlev adı olarak tanımlanabilir, bu nedenle pasajımız, teknik olarak benzersiz bir parantez içermesine rağmen, buradaki pasajımız yasaldır.

drop=Bağımsız değişken, mümkünse daha düşük bir boyuta sonucu açılan isteyip R söyler. Gerçekten, eğer söylersek drop=TRUE, şunu anlarız:

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

Daha önce sonucun bir veri çerçevesi olduğu durumlarda, R şimdi bize iki kat verir.


Uzunluk 31:

print(fortune("hadleywickham"))

fortune()Fonksiyon her şeyi bilen dan fortunesakıllıca millet çeşitli akıllı tırnak çeşitli sağlar pakette. Bu kod parçası, konsola yazdırarak Hadley Wickham'dan (23) aşağıdaki mücevherleri sağlayacaktır:

That's a casual model, not a causal model - you can tell the difference by looking
for the word "excel".
    -- Hadley Wickham (commenting on an Excel chart showing student's SAT score
       increases with family income, without considering future covariates)
       http://twitter.com/#!/hadleywickham (February 2012)

Uzunluk 30:

pie(rep(1,12),col=rainbow(12))

İyi bir pasta grafiğini kim sevmez? Bu pie()fonksiyon size bir sayı vektörüne dayanarak taze pişmiş bir pasta grafiği hazırlayacaktır. r'nin ikinci argümanı olduğu rep()ilk elemanı r kez tekrarlayarak bir vektör yaratır . Parametre söyler dilim renklendirmek için nasıl. Büyülü fonksiyon , gökkuşağının "eşit aralıklarla yerleştirilmiş" renkleri için altıgen kodları içeren belirli bir uzunlukta bir vektör üretir.col=pie()rainbow()

Burada sahip olduğunuz temel "Bu Tablodaki Her Rengin Miktarı" çizelgesidir:

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


Uzunluk 29:

summary(lm(mag~depth,quakes))

Burada olan birkaç şey var, hadi bir seferde bir adım atalım.

quakesBu veri kümesindeki sütunlar ikisidir 1964. beri Fiji yakınlarındaki Richter ölçeğine göre büyüklüğü daha büyük 4.0 1000 sismik olaylar hakkında bilgi içerir R. ile birlikte gelen bir veri kümesi olan magdepremin büyüklüğü olan ve depthhangi merkez üssünün derinliği kilometre cinsinden.

lm()Pasajı 28 belirtildiği gibi işlev, doğrusal modeller uyuyor. Bir lmnesneyi veya daha doğrusu sınıfın nesnesini döndürür lm. Öngörüyü (veya bağımsız değişkeni) ve yanıtı (veya bağımlı değişkeni) belirtmenin iki yolu vardır ve formül yöntemini seçtim. Bu biçim alır response ~ predictor. Birden çok öngörücü olarak belirtildi y ~ x1 + x2. Formüldeki nesneler bir sonraki argümanda verilen bağlamda değerlendirilir.

Öyleyse lm(mag ~ depth, quakes), normalin en küçük kareler regresyonu kullanarak doğrusal bir modele uymasıdır ki burada büyüklük yanıt ve derinlik yordayıcıdır. Ne olduğunu magve ne olduğunu biliyor depth, çünkü bizden geldiklerini söyledim quakes.

summary()Öncelikle takılan modellerin sonuçlarını özetlemek için kullanılan genel bir işlevdir. Argüman sınıfına özel bir yöntem çağırır. Bir lmnesneyi geçtiğimizden beri , aslında denilen işlevi çağırıyor summary.lm().

Hepsini bir araya getirerek, depremi deprem derinliğinden açıklamaya çalışan doğrusal modelin özetini alıyoruz. Spesifik olarak, R'nin tükettiği şey budur:

> summary(lm(mag~depth,quakes))

Call:
lm(formula = mag ~ depth, data = quakes)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72012 -0.29642 -0.03694  0.19818  1.70014 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.755e+00  2.179e-02 218.168  < 2e-16 ***
depth       -4.310e-04  5.756e-05  -7.488 1.54e-13 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3921 on 998 degrees of freedom
Multiple R-squared:  0.05319,   Adjusted R-squared:  0.05225 
F-statistic: 56.07 on 1 and 998 DF,  p-value: 1.535e-13

Size ilk söylediği şeyin fonksiyon çağrısı olduğuna dikkat edin. Bunun nedeni, lm()fonksiyonun match.call()tıpkı snippet 28'de yaptığımız gibi kullanılması!


Uzunluk 28:

f<-function(x,y)match.call()

R genellikle ne söylediklerini takip etmeyi sever. Aslında, bazen gönderdiğiniz komut size iade edilen nesnenin bir niteliği olarak geri verilir. ( lm()Doğrusal modeller oluşturan bir örnektir .) Kesin talimatları geri çağırmak match.call(), fonksiyon içinde gerçekleştirilir . Bu yorumlanan işlev çağrısını yakalar veya eşleştirir .

Burada f()iki argüman alan ve daha sonra ne gördüğünü söyleyen bir işlev tanımladık .

> f(1,2)
f(x = 1, y = 2)

Bu, öncelikli olarak, paket geliştirme gibi, genel kullanım için işlevler geliştirirken (yalnızca sizin için değil) kullanışlıdır. match.call()Vahşi doğanın bir örneğini görmek istiyorsanız , lm()göndererek kaynak koduna bakın stats:::lm. Yaptığı ilk şeylerden biri kullanarak işlev çağrısını yakalamak match.call().


Uzunluk 27:

install.packages("ggplot2")

Bu önemsiz görünse de, R'nin bu kadar popüler olmasının nedenlerinden birini gösteriyor: Paketler aracılığıyla çok kolay bir şekilde genişletilebilir. Ve herkes paketlerini geliştirebilir ve özgürce paylaşabilir!

install.packages()tam olarak isminin önerdiği şeyi yapar. Varsayılan CRAN (Kapsamlı R Arşiv Ağı) aynanızı kullanarak paketler için bir av peşindesin, sonra bunları R'nin bulabileceği sisteminize yükler. Ayrıca paketleri yerel kaynak kodundan yüklemesini sağlayabilirsiniz.

ggplot2Paketi kullandığımız pasajı 23'ü hatırlıyor musun ? Bu paket R ile birlikte gelmiyor, ancak sadece 27 karakterde tüm ggplot2hayallerinizi kurarak gerçekleştirebilirsiniz.


Uzunluk 26:

filled.contour(t(volcano))

volcanoR. ile veri kümesi gemileri O Auckland, Yeni Zelanda topografik Maungawhau (veya Mt. Eden) hakkında bilgi yanardağ içeren bir matris. Matrisin sıraları, doğudan batıya uzanan ızgara çizgilerine karşılık gelir ve sütunlar güneyden kuzeye uzanan ızgara çizgilerdir.

Oryantasyon bozukluğu uğruna, yönleri değiştirelim, sütunlar şimdi doğu-batı ve sıralar güney-kuzeydir. Bunu, üzerinden gerçekleştirilmiş bir matris devri kullanarak yapabiliriz t(). Ve biz varken neden kontur haritası yapmıyorsunuz? filled.contour()sadece bunu yapar.

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


Uzunluk 25:

pmatch("s",c("n","size"))

pmatch()Fonksiyon şimdiye kadar gördüğüm tüm kısmi eşleştirme arkasında sihirli sağlar. İlk argüman, ikinci argümanın her bir elemanı, bir vektör ile karşılaştırılan bir dizedir. Benzersiz bir eşleşme varsa, eşleşen öğenin dizini döndürülür, aksi takdirde alırsınız NA.

Buradaki kod parçası, bu işlevin kullanılmasının "gerçek dünya" örneğidir. sample()Fonksiyonu kullandığımız 13. pasajı tekrar düşünün . Bu argümanlar kabul eder n, size, replace, ve prob, ama sadece ilk ikisini gerektirir. 13 s=nolu pasajda kısayol olarak kullandık size=. Aslında arka planda olup bitenler, bu sağladığımız gibi, sağladığımız şeyin beklenenlerle karşılaştırıldığı bir şey. "S", "boyut" ile benzersiz şekilde eşleştiğinden, s=steno olarak kullanmak tamamen yasaldır .


Uzunluk 24:

`(`=function(x)9;2*(3-1)

Yapmamanız gereken şeylerin mükemmel bir örneği! Hiç!

Fonksiyonu tanımlarken arka tiklamaları çevreleyen sürece karakterleri fonksiyon olarak atayabilirsiniz. Burada R'nin (girdiden bağımsız olarak her zaman 9 döndüren bir işlev olduğunu söyledik . Diğer birçok dilde ;olduğu gibi, bir satıra iki komut eklemek için kullanılabilir. Öyleyse R'ye söylediklerimiz fonksiyonu tanımlamak ve (sonra yazdırmak 2*(3-1).

Şimdi, hemen hemen her kişi size 2 * (3-1) 4 olması gerektiğini söyler çünkü 3-1 = 2, sonra 2 * 2 = 4. Fakat R'ye parantez içindeki herhangi bir şeyin 9 olduğunu söyledik. Dolayısıyla 3-1 = 2 iken, şimdi (3-1) = 9 olur. Sonra 2 * (3-1) = 2 * 9 = 18 olur.

Bunun gibi korkunç şeyler mümkün olduğu için, bir ifadede parantez içeren kodları her gönderdiğinizde (örneğin, bir işlev çağrısı değil), R yorumlayıcısı aslında bir işlev olarak (tanımladığınızdan bağımsız olarak çağrılan herhangi bir işlevi aramaya başlar (. Genel olarak, ne kadar çok yazarsanız, R tercüman ne kadar çok çalışırsa.


Uzunluk 23:

qplot(Na,y=RI,data=fgl)

Sonunda (çok) basit bir ggplot2örnek için yeterli oy . ggplot2Paket efsanevi R ilah yarattığı Grafik gramerine ait bir R uygulamasıdır Hadley Wickham . Genel olarak, sözdizimi temel R grafiklerinden çok farklıdır ve alışması biraz zaman alır. Bununla birlikte, qplot()paketin bazı temel özelliklerine basit bir arayüzdür ve plot()temel R'ye benzeyen sözdizimi vardır . Ancak, gösterdiğim örneklerin aksine qplot(), işlev parametre adlarının kısmi eşleşmesini desteklemez.

fglVeri kümesi geliyor MASSpaketin. Adli cam fragmanlarının özelliklerinin ölçümlerini içerir. Burada Naağırlıkça yüzde sodyum (Na) RIve camın kırılma indisi olan değişkenleri kullanıyoruz .

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


Uzunluk 22:

unique(presidential$n)

unique()Burada amaçlanan işlev giriş göründükleri sıra ile, giriş vektörü eşsiz değerleri içeren bir vektör ile döner. presidentialİle veri kümesi gemileri ggplot2paketi (27). (Bunu düzelttiği için Jemus42'ye teşekkürler!)

Her başkanın adı, görev sürelerinin başlangıç ​​ve bitiş tarihi ve 10 ABD başkanının partileri Eisenhower'dan Bush W.'ye kadar.

presidentialveri çerçevesidir ve veri çerçeveleri, listelerde bulunan öğeler gibi sütunlar içerir. Sütunlar kullanılarak adı ile başvurulur $. Bu belirli veri kümesinde, namebaşkanın adını içeren bir sütun vardır . Fakat bekleyin, sadece belirttik n! Aslında, bu bir başka kısmi eşleştirme örneğidir (13, 16), bu yüzden ntamamen okunaklı.

Bunu göndermenin ilginç bir sonucu var:

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

Lyndon B. Johnson'ın adının nasıl yazıldığına dikkat edin.

(Not: Bu yazımdan bir yıl sonra Johnson yazım hatası düzeltildi. RIP mizahı dikkatimi çekti.)


Uzunluk 21:

integrate(dexp,0,Inf)

R, tek değişkenli fonksiyonların sonlu ya da sonsuz bir aralıkta uyarlanabilir kadranı için yerleşik bir işleve sahiptir. R'de, sonsuzluk Inf+ sonsuzluk ve-sonsuzluk -Infiçin belirtilir. dexp()Fonksiyonu üstel dağılım için olasılık dağılım fonksiyonudur. Üstel dağılımın desteği [0, + sonsuz) ve olasılık dağılımları 1'e entegre olduğundan, sonucun 1 olmasını bekleriz. Beklenen bir sonuç!

1 with absolute error < 5.7e-05

Uzunluk 20:

deriv(~cos(x^3),"x")

R sembolik türevleri yapabilir! Bu döner:

expression({
    .expr1 <- x^3
    .value <- cos(.expr1)
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- -(sin(.expr1) * (3 * x^2))
    attr(.value, "gradient") <- .grad
    .value
})

Buna bakarak işlevi nasıl ayrıştırdığını ve zincir kuralını nasıl kullandığını görebilirsiniz. İlk yıl hesabını alan bir işlevi yapabilecek her şey yapabilmelidir! deriv()İşlevin ilk argümanı bu durumda bazı değişkenler açısından bir R ifadesidir (gerçek bir R tipidir) x. İkinci argüman, türevin alındığı noktaya göre değişkenin adıdır "x".

Gerçekten düzgün bir şey görmek ister misiniz? Yukarıdakileri bir değişkene atayın, diyelim dx. Bir değişkeni xsayısal vektör olarak tanımlayın . Öyleyse gönder eval(dx). R, türevini x!


Uzunluk 19:

c(matrix(1,3,3),"a")

R'de, c()"birleştirmek" veya "birleştirmek" için kısa, bağımsız değişkenlerinden bir vektör oluşturur. Vektörlerin elementleri aynı tipte olmalı ve hepsinin uzunluğu 1 olmalıdır. Ancak size bu konuda kızmak yerine, R bir yapıyı, bu durumda bir matrisi düzleştirecek ve her şeyi aynı tipe dökecektir.

c()Yalnızca tek bir tür içerecek argümanlar varsa , hiçbir tür döküm oluşmaz, örneğin tüm argümanlar mantıksalsa ( TRUEve FALSE), vektör tüm mantıksal olacaktır. Mantıksal ve sayılar içeriyorsa, tüm sayılar olacaktır. Karakter ve herhangi bir şey içeriyorsa, hepsi karakter olacaktır. Yani pasajımız bize şunu veriyor:

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

3'e 3 matrisin düzleştirildiğine ve "a" eklenmesinin her şeyi karakterlere dönüştürdüğüne dikkat edin.


Uzunluk 18:

(1-1/3-1/3-1/3)==0

Makine hassasiyetinde bir ders. Bu döner FALSE.


Uzunluk 17:

example(readline)

example()Fonksiyon size bir yerleşik işlevi nasıl kullanılacağına dair bir örnek vereceğim. Nasıl kullanılacağını öğrenmen gerekiyorsa readline(), R'nin sana göre bir cevabı var.

> example(readline)

readln> fun <- function() {
readln+   ANSWER <- readline("Are you a satisfied R user? ")
readln+   ## a better version would check the answer less cursorily, and
readln+   ## perhaps re-prompt
readln+   if (substr(ANSWER, 1, 1) == "n")
readln+     cat("This is impossible.  YOU LIED!\n")
readln+   else
readln+     cat("I knew it.\n")
readln+ }

readln> if(interactive()) fun()
Are you a satisfied R user?

Mütevazı olmanın yolu, R.


Uzunluk 16:

acf(lh,t="part")

acf()İşlevi, bir zaman serisi için otokorelasyon fonksiyonunu döndürür. lhR ile birlikte gelen bir veri kümesidir.

Kan örneklerinde luteinize edici hormonu veren bir zaman serisi, bir insan dişinden 48 dakikalık aralıklarla 10 dakika aralıklarla.

Bu örnekte, kısmi eşleştirme iki kez kullanılıyor : bir kez işlev parametresiyle ve bir kez de parametreye iletilen dize değeriyle. Tam parametre adıdır typeve tanınan değerlerdir "correlation", "covariance"ve "partial". Benzersiz dizgiyi tanımlamak için yalnızca dizgenin yeterli olması yeterlidir, bu nedenle kısmi otomatik korelasyon işlevini (PACF) veren "part"için kullanabiliriz "partial".

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


Uzunluk 15:

p3d(bunny,p=99)

Yine rezil tavşanı görüyoruz (11). onionPaket bize 3D çizim işlevini kullanarak, şimdiye kadar en yararlı veri kümesini görüntülemek için bile güzel bir yol sağlar p3d(). Bu persp(), arka plandaki temel grafik işlevini çağırır; bu, dönel bir argüman alır phi. Parametre adlarının (13) kısmi eşleştirmesini kullanarak, tam p=yerini belirtebiliriz phi=.

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


Uzunluk 14:

stats:::rgamma

R açık kaynaktır ancak kaynak kodunu görüntülemek için sihirbaz olmak zorunda değilsiniz; sadece paket adını ve kodunu görüntülemek istediğiniz işlevi üç virgülle ( :::) ayırarak yazabilirsiniz . Bu, size rgamma()gama dağılımından rasgele sapmalar oluşturan fonksiyonu tanımlayan kodu verir . Bunu göndererek verir:

function (n, shape, rate = 1, scale = 1/rate)
{
    if (!missing(rate) && !missing(scale)) {
        if (abs(rate * scale - 1) < 1e-15)
            warning("specify 'rate' or 'scale' but not both")
        else stop("specify 'rate' or 'scale' but not both")
    }
    .External(C_rgamma, n, shape, scale)
}
<bytecode: 0x00000000098cd168>
<environment: namespace:stats>

Bir işlev kullandığını unutmayın .External(). Bu, diğer dillere, genellikle C ve Fortran, Bulma R. temeli çok ihtiva dillerde yazılmış fonksiyonları çağıran o büyücülük biraz sürer kaynak kodu. Düzenleme: @Vlo, sadece ölümlülerin paketle çağrılan .Internal()ve .Primitive()kullanan C kodunun gerçekten görüntülenebileceğine dikkat çekti pryr. Teşekkürler, @Vlo!


Uzunluk 13:

sample(9,s=4)

Bu pek görünmüyor, ancak R: fonksiyon parametrelerinin kısmi eşleşmesinde güçlü bir konsepti örnekliyor . Adlandırılmış parametreleri sample()fonksiyonu vardır size, replaceve prob, fakat sadece benzersiz bir şekilde tanımlamak için adlandırılmış parametrenin yeterli harfleri sağlamanız gerekir. Böylece sample(), başka bir parametre adı "s" harfi ile başlamadığından, s=bunun yerine kullanabilirsiniz size=. Buradaki kod, 1'den 9'a kadar olan tamsayılardan 4 boyutlu bir rasgele örnek seçer.


Uzunluk 12:

LETTERS[-pi]

LETTERSAdında alfabetik olarak sıralanan tüm büyük İngilizce harfleri içeren yerleşik bir vektör var . Diğer birçok dilden farklı olarak, kayan nokta sayısı kullanarak bir vektörü indeksleyebilirsiniz. Çok heyecan verici bir şey olmaz; R sadece tamsayı kısmını alır. -Bir vektörün dizininden önce kullanmak , o indekli öğeyi vektörden kaldırır. piiçerdiği yerleşik bir sabittir - tahmin edersiniz - irrasyonel sayı π. Bu, eleman 3'ü vektörden kaldırır ve "A" ila "C" atlayan "A" ila "Z" döndürür.


Uzunluk 11:

plot(bunny)

Gelen onionpaket denilen bir veri kümesi var bunny. Çizmek size tüm zamanların en yararlı grafiği olabilecekleri verir:

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


Uzunluk 10:

????sample

sample()İşlev hakkında gerçekten karıştığınızı ve çaresizce yardıma ihtiyacınız olduğunu söyleyin. ?sampleR sayfasını açmak için normalden daha çok, dört soru işareti belirttiniz. R, halini duyar ve yardım etmeye çalışır.

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

Ne yazık ki.


Uzunluk 9:

isTRUE(1)

Bu, ilk bakışta, R baz paketinin kalan kısmındaki konvansiyonu ayırmak isve fonksiyon isminde aşağıdaki sözcüğü a ile işaretlemek gibi görünüyor .. Ancak, bu sadece argümanın belirli bir tipte olup olmadığının mantıklı bir testi için geçerlidir (8). Bu durumda, TRUEbir tür olup olmadığını test ediyoruz . Bu katı bir tanım kullanır TRUE, yani 1, her zamanki anlamıyla "doğru" değildir. isTRUE(1)döner FALSE.


Uzunluk 8:

is.na(8)

Diğer programlama dillerinin aksine ., fonksiyon ve değişken adlarında geçerli bir karakterdir. Herhangi bir yöntem veya heirarşi göstermez; bu sadece adın bir parçası. is.na()İşlevi, argümanı olarak değerlendirir olmadığını kontrol eder NA(eksik) ve geri dönüş TRUEveya FALSE.


Uzunluk 7:

stop(7)

Bu, hata mesajı olarak girişle ilgili bir hata yayınlar. Bir fonksiyonun içinde çağrılırsa, fonksiyonun çalışması durur. Ancak bir fonksiyonun dışında çağırmak senaryoyu durdurmaz. Bu durumda, çıktı Error: 7.


Uzunluk 6:

x < -1

Bu önemsiz gibi görünse de, atama operatörünün büyük bir eleştirisini gösterir <-: yani anlam, boşlukların yerleştirilmesine bağlı olarak değişir. Belirtildiği gibi x <- 1, 1'e atar x. Ayrılması <ve -tek bir boşluk yukarıdaki gibi olup bir mantıksal test etmek değişikliği ile xdaha -1. Bu nedenle çoğu kişi =atamayı tercih ediyor .


Uzunluk 5:

x<<-1

Bunun <-dışında <<-, mevcut kapsamdan bağımsız olarak değişkeni her zaman global kapsama atar.


Uzunluk 4:

x<-1

R <-, geçerli kapsamdaki değişkenleri atamak için kullanır . Bu kod parçacığı değeri 1'e atar x.


Uzunluk 3:

!0i

!Operatör "değil," için R ve 0ikarmaşık sayı olduğu 0+0ikompleks düzlemde AKA 0. Bu ifadeyi göndermek TRUE0 yanlı olduğundan döner .


Uzunluk 2:

NA

Bu NA, eksik bir değeri ifade eden "mevcut değil" anlamına gelen özel R değerini verir.


Uzunluk 1:

T

Bu döner TRUE. R olarak, Tve Fmantıksal değerler için eş olan TRUEve FALSEsırasıyla.


Yay R "!"(T)!
Vlo

@Vlo: olarak "!"(T)değerlendirir FALSE. Ancak, "Yay R" ifadesi hiçbir zaman yanlıştır. ;)
Alex A.

Daha fazla giriş için nasıl daha fazla oy kullanabilirim ???? "Bu kaynak kodunu bulmak biraz sihirbazlık gerektirir" .Internalve .Primitive->pryr::show_c_source(.Primitive("sum"))
Vlo

@Vlo: pryrPaketi duymamıştım . Çok havalı! Gösterdiğin için teşekkürler. Şimdiye kadar yaptığınız girişleri beğenmenize sevindim, desteğiniz için teşekkürler. :)
Alex A.

2
@ Jemus42 Ah, data(bunny)ilk önce yapmanız gereken gibi görünüyor .
Alex A.

75

brainfuck

Factoid: Brainfuck (aynı zamanda brainf * ck olarak da bilinir), Urban Müller tarafından oluşturulan, şu anda türünün en meşhur dili olan, şimdiye kadarki en küçük dil tamamlama dili yorumlayıcısını oluşturmak için deneysel ve ezoterik bir dildi. Sadece sekiz komutu vardır, öğrenmesi kolaydır, fakat kullanımı zordur.

Brainf * ck, 30000 hücreli bir teyp tabanı hafızasına ve hareketli bir imlece sahiptir ve şöyle gösterilebilir:

0 0 0 0 0 0
    ^

^İşaretçiyi temsil eden karakter ve her hücre için değerleri temsil eden 0 ile.

Brainfuck'ın sekiz talimatı var:

Instruction  C Equivalent              Description
+            mem[ptr]++;               Add one to the value under the cell
-            mem[ptr]--;               Subtract one from the value under the cell
>            ptr++;                    Go on cell to the right
<            ptr--;                    Go on cell to the left
,            mem[ptr] = getchar();     Read a ASCII character from input and put the result in the value under the cell
.            putchar(mem[ptr]);        Write a ASCII character to the output using the value under the cell
[            while (mem[ptr]) {        Start a while loop: Continue to matching ']' when value under the cell is 0
]            }                         End a while loop: Go back to matching '[' when value under the cell is NOT 0

Brainfuck to C:

#include <stdlib.h>

int main(void) {
    unsigned char* mem = calloc(30000, sizeof(unsigned char));
    unsigned int ptr = 0;

    // Put your brainfuck code here, converted to the matching expressions under "C equivalent"

    return 0;
}

Uzunluk 1 Parçacığı

Bir karakter okuyun ve mevcut hücreye yerleştirin.

,

(Girişli: Bellek abc)

0 0 97 0 0 0
    ^

Uzunluk 2 Parçacığı

Geçerli hücreye bir tane ekleyin ve işaretçiyi sağa kaydırın.

+>

Hafıza

0 0 1 0 0 0
      ^

Uzunluk 3 Parçacığı

Sıfır olana kadar mevcut hücreden birini kaldırın; Geçerli hücreyi sıfıra ayarla

[-]

Olası hafıza:

Bellek: (Önce)

0 0 100 0 0 0
    ^

Bellek: (Sonra)

0 0 0 0 0 0
    ^

Uzunluk 4 Parçacığı

Yorumlar: Beyin saldırısında, talimat olmayan her şey göz ardı edilir. Bu nedenle aşağıdaki program tamamen geçerli (ama boş) bir beyin fırtınası programıdır:

Hey!

Uzunluk 5 Parçacık

Basit bir kedi programı (Girdiyi çıktıya yaz)

,[.,]

Tomsmede'ye yaptığı yorum için teşekkürler

Uzunluk 6 Parçacığı

Geçerli hücrenin değerini hücreye sağa doğru hareket ettirin (Hücrenin sağa 0 olduğu varsayılırsa, aksi takdirde geçerli hücrenin değeri sağdaki hücrenin değerine eklenir):

[>+<-]

Genelde, insanlar bu kodu bir değişkeni taşımak için kullanırlar.

Bellek: (Önce)

10 0 100 0 0 0
     ^

Bellek: (Sonra)

10 0 0 100 0 0
     ^

Uzunluk 25 Parçacığı

Altı karakter girişini ters çevirin ve yazdırın, ardından her ASCII karakterini (N-1) .. 1 (N ilk giriş karakterinin değeridir) izler.

,>,>,>,>,>,.<.<.<.<.<[.-]

Uzunluk 53 Parçacığı

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

Bu küçültülmüş C programı ayrıca kılık değiştirmiş bir Brainfuck programıdır ve bunun tersi de geçerlidir! Aslında, onlar (neredeyse) aynı şeyi yaparlar. İşte "yorumlar" olmadan Brainfuck kodu (C kodu).

><+-

Brainfuck kodunu (ve C kodunu) açıklayayım. Gördüğünüz gibi, iki hücre kullanıyor ( ive j). İlk hücreyi arttırır ( i1 ile artırma ). Sonra aynı hücreyi azaltır ( i1 ile azalır ).

Bu, iki farklı dil olarak derlenebilen ve (pratik olarak aynı) çalışan bazı kaynak kodların aptalca bir örneğidir.


2
,[.,]- 5 karakter, kedi programı
19:15

13
Bu şimdiye kadar gördüğüm en iyi "Brainfuck 101" olabilir.
HoosierEE

uzunluk 6: toplamı sağ hücreye koyar ve sola sıfır koyar. Hareket etme, değil mi?
Filip Haglund,

Kavramı daha iyi açıklamak için 6 uzunluğuna kukla değişken eklendi. Program aslında # 3 hücreye # 4 hücresini ekleyecek ve # 3 hücreyi 0 yapacak.
YoYoYonnY

58 oy - güncelleme yapabilir misiniz? :)
Conor O'Brien,

65

C ++

Önişlemcisi, şablonlar, lambdalar, tip özellikleri ve hiç kimsenin bütünüyle anlamayı ümit edemediği sayısız karmaşık özelliği ile C ++, standartlarının her yeni nesli tarafından yeniden keşfedildi. Derleme zamanında şeyler yapmak için sayısız yollar istismar ederek, tek derleme zamanında onların sağlamlığını kontrol etmek için fiziksel birimler sayısal veri türleri bağlı olmak sağlayan bir kütüphane gibi sıfır havai soyutlamalar yazabilir (örn sen sonucunu atayamazsınız kg* miçin N)

Uzunluk 1

#

Genellikle bir önişlemci ifadesini tanıtmak #, kendi başına bir çizgide durabilir. Esasen hiçbir şey ifade etmiyor ve gördüğüm sözdizimi vurgulayıcılarının çoğu bilmediği için bilinmeyen görünüyor.

Uzunluk 2

%:

Elbette herkesin bir #anahtarı yok, bu yüzden C ++ (alternatif olarak eski C'den miras kaldı), bu alternatif tokenle (aka digraph ) yazmanıza izin vermek cömerttir.

Uzunluk 3

??=

Bu C ++ ile ilgili tarihi bir kurstur. Bu günler artık geçerli olmamakla birlikte, uygulamalar onları desteklese de trigraphlar. Bu dizi, #onu destekleyen sistemlere çevrilir , ancak ham dizgenin değişmezlerine müdahale etmemesi için bunlara izin verilmez. Uygulamalar tümüyle desteği bırakmayı seçebilir.

Uzunluk 4

auto

Yeni kodlardan biri (C ++ 11'den beri), genel kodla çalışmayı kolaylaştırmak için yapılan icatlardır. Bir ifadenin türünü çıkarmak içindir ve C ++ 14'ten beri lambda parametrelerini ve fonksiyonların dönüş tipini çıkarmak için bile kullanılabilir.

Uzunluk 5

 catch

C ++ 'da mevcut olan birçok dilden de bilinen bir anahtar kelimedir, ancak iyi deyimsel C ++ programcısı neredeyse hiç kullanmaz. Yapıcıları ve yıkıcıları ile idiomatik C ++, RAII (Kaynak Toplama Başlatmadır) olarak adlandırılan bir prensibi ya da bazen daha uygun şekilde nasıl adlandırmayı tercih ettiğimi kullanır: SBRM (Kapsam Sınırlı Kaynak Yönetimi). Akıllı işaretçiler gibi sınıflar nedeniyle, dinamik olarak ayrılan kaynakların ömrü (yalnızca hafıza değil!) Diğer nesnelere bağlanabilir. Bunlar kapsam dışına çıktığında (örneğin atılmış bir istisna dışında), bu nesneler kaynakları otomatik olarak temizler. Bu, istisnai durumlarda güvenli ve kullanımı kolay olmayan bir kod kullanır catch.

Uzunluk 6

[](){}

[]{}()

Yorumlarda belirtildiği gibi stefan []{}, en kısa lambda nesnesi olarak kullanabilirsiniz , bu nedenle bu lambda çağırmak için en kısa şeklidir . Aşağıdaki metin eski sürüm içindir:

Muhtemelen bir lambdanın en kısa şeklidir. C ++ 'daki Lambdalar, oluşturuldukları kapsamın bir kısmını yakalayabilen nesnelerdir (uygulama tanımlanmış türde) ve çağrılabilir (() sözdizimi bunu kontrol eder). Kodları ({} bölümü), bu değişkenlere kendi kapsamları dahilindeymiş gibi erişebiliyor. Onların opsiyonel döndürme türü kesinti ve otomatik parametre indirimi C ++ 14 tanıtılan sayesinde, bunlar (örneğin üçüncü std :: sort parametresi) bir çağrılabilir beklediğiniz tüm standart kütüphane algoritmaları için kullanılacak bir araç.

Uzunluk 7

virtual

Anahtar kelime, nesne yönelimli programlamanın temel bloklarından biri olan C ++ 'da çalışma zamanı polimorfizmini kullanmaya başlayacak. Bu, "kullanmadığınız şeyleri ödemeyin" ilkesini izler, diğer dillerdeki tüm işlevler varsayılan olarak sanaldır. Çok paradigma dili olması nedeniyle, "C ++ nesne yönelimli" olduğunu düşünenlerin, bu anahtar kelimeyi neredeyse hiç kullanmayan programları veya kütüphaneleri görmeleri, örneğin genel programlama ilkesini takip ettikleri için bir sürpriz olabilir.

Uzunluk 8

override

Sanal anahtar sözcükle birlikte çalışmak override, derleyicinin sizin için daha fazla çalışmasını sağlamak için C ++ 'a eklenecek eklemlerden biridir. Bunu kullanarak, temel sınıftaki sanal bir işlevi geçersiz kılma niyetini ifade edersiniz ve bir hata yaptıysanız ve o sınıf belirtilen işleve sahip değilse, derleyici hata verir. Genel olarak, kodunuzun bitleri aşmak yerine niyetini ifade etmesi iyi bir stil olarak kabul edilir.

Uzunluk 9

constexpr

C ++ 'a daha sonra ek olarak constexprprogramlayıcı, derleme zamanında bilinen ve derleme zamanında hesaplanabilmesi için fonksiyonlar veya değişkenler için ifade etmesini sağlar. Bu, bu işlevlerin derleme zamanı ifadeleri gerektiren bağlamlarda kullanılmasını sağlar (örneğin, şablon parametreleri veya dizi boyutları gibi). Birçok standart kütüphane işlevi (eğer mümkünse) zaten karmaşıktır, bu yüzden burada kullanılabilirler.

Uzunluk 10

for(i:c){}

Bir kabın üzerinde tam bir döngü ya da yineleyicileri (C stili dizileri içeren) destekleyen std::beginve std::endelde eden kabı benzeri bir yapıdır . Temel olarak eşdeğerdir for(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }. Bu, genel kodda kolay döngü sağlar.

Uzunluk 11

void f()&&;

Üye işlevlerini ve çağrılabilecek nesneler üzerindeki özellikleri bildirmenin yeni bir yoludur. C ++ 'nın önceki sürümlerinde, sadece void f() const;derleyiciye const nesnelerinde fonksiyonu çağırabildiğini söyleyebildik (dolayısıyla const olmadan bunları const olmayan nesnelerde çağıramazsınız). Aynı şekilde şimdi &&r-değer referansları sözdizimine sahibiz, bu fonksiyonları rvalues ​​üzerinde çağırmak için kullanılıyor.

Uzunluk 12

int main(){}

Bu muhtemelen link derleyip çalıştırabileceğiniz en kısa programdır. Hiçbir şey yapmaz ve 0 döndürür. Bu geri dönüş, C ++ ile karşılaşabileceğiniz birçok özel durumdan biridir. Normalde hiçbir şey döndürmemek tanımsız davranıştır, ancak ana giriş noktası işlevi için hiçbir şey döndürmemek, 0 döndürmek demektir.

Uzunluk 13

auto f()->int

bir işlevin dönüş türünü bildirmek için oldukça yeni bir yoldur. Normalde, türü zaten biliyorsanız, bunu yapmazsınız, ancak genel programlamada, türün şablon parametrelerine ve kullandığınız değişkenlere bağlı olduğu birçok durum vardır. Bu şekilde yapmak, bu parametrelere olduğu gibi bu parametrelere biraz daha kolay erişim sağlar template<class T> auto f( const T& t ) -> decltype(t.foo()).template<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
;Bir alternatif 1-karakter parçacığı olarak kullanmanızı öneririm , çünkü bu bir önişlemci makrosu değil ve C ++ 'da 1 karakterlik bir ifadeye sahip olmanız gerçekten şaşırtıcı görünüyor.
Joe Z.,

1
[](){}Bir lambda'nın en kısa şekli değildir: Parametre listesi boş olduğundan ihmal edilebilir. Dolayısıyla []{}en kısa lambda. Önemsiz olarak, bir lambda'nın []{}()en kısa uygulamasıdır ;-) ideone.com/k8fAvs
stefan

@ stefan: gerçekten, her zaman unutuyorum, çünkü o zamanki gibi fonksiyon görünmüyor;) cevaba ekledim.
PlazmaHH

@PlasmaHH Kesinlikle bundan nefret ediyorum çünkü gerçekten bir işleve benzemiyor .. ;-)
stefan

59

regex

Uzunluk 2 pasajı

[]

JavaScript : Hiçbir şeyle uyuşmayan boş bir karakter sınıfı.

PCRE , Java , Pythonre , Ruby (sürüm 2.0'da test edilmiştir): Sözdizimi hatası.

Uzunluk 1 pasajı

.

.nokta adı hepsi adı verilen, hepsine bakma şansım oldu.

Ne eşleşiyor?

I̧n̵͢ g̨͜e҉̡͞n̵͢e͜͝r̷͝a͘l̢҉, ̡͟ ̕̕ ̴.̸̴̢̛́ ̸̡̢m͞ąt̴̨c͞h̛e͢͡s̶͘ ͘a҉n̛͜͠ỳ̸ ͢c̵̡hár͘͝a̕͢ćt̴̕͢e͏̀͠r̷̀ ̴̕͢ex͝͞͞c҉ep̀t̛ ̕f̴҉o͟͜r̴͢ ͞n͏ę͟w̢̕͜ ͡e̶̶͝

JavaPattern : Varsayılan modda, nokta-tümü bu 5 kod noktası dışında herhangi bir kod noktasıyla eşleşir \r\n\u0085\u2028\u2029. İle UNIX_LINESmoduna (ancak olmadan DOTALL), nokta-hepsi hariç, herhangi bir kod noktasını eşleşir \n. Açık DOTALLmodu ile nokta-all herhangi bir kod noktasıyla eşleşir. Java 5'ten Patternkod noktasında çalışır, böylece astral karakterler nokta-noktalarla eşleştirilir.

Pythonre (2.7.8 ve 3.2.5'te test edilmiştir, 3.3+ üzerinde farklı olabilir): Varsayılan modda, tümü hariç tüm UTF-16 kod birimleriyle (0000 - FFFF dahil) eşleşir \n. re.DOTALListisnayı kaldırır ve .herhangi bir UTF-16 kod birimini eşleştirir. Bu sürümlerde, reUTF-16 kod birimleri üzerinde çalışır, bu yüzden. astral düzlemde yalnızca bir kod karakter birimini eşleştirmeyi başarır.

.NET : Python ile aynı. .NET'te tüm nokta modu denirSingleline .

JavaScript (C ++ 11 <regex>) : Varsayılan modda, dot-all, bu 4 kod noktası dışında herhangi bir UTF-16 kod birimi ile eşleşir \n\r\u2028\u2029. İles bayrağına, nokta-hiç bir UTF-16 kod birimi ile eşleşir. JavaScript ayrıca UTF-16 kod birimlerinde de çalışır.

PCRE : Derleme seçeneğine bağlı olarak, dot-all, 3 CR LF dizisini veya varsayılan modda herhangi bir Unicode newline dizisini hariç tutabilir \r, \nveya tümünü hariç tutabilir \r\n. Varsayılan modda, motor kod ünitesinde çalışır (8, 16 veya 32 bit kod ünitesi olabilir), bu nedenle nokta çizgisi tümü yeni satır dizileri dışında herhangi bir kod birimiyle eşleşir. UTF modunda, motor kod noktasında çalışır, bu yüzden nokta-hepsi yeni satır dizileri dışında herhangi bir kod noktasıyla eşleşir. Bütün nokta modu denir PCRE_DOTALL.

PHP (ideone üzerinde test edilmiştir): PCRE, UTF-8 kütüphanesi olarak derlendi ve \nvarsayılan olarak tek newline dizisidir. Nokta-bütün moda sbayrak ile erişilebilir .

Postgres'ler : Varsayılan modda nokta-all, istisnasız tüm kod noktalarıyla eşleşir.

Yakut (2.0.0 sürümünde test edilmiştir): Varsayılan modda, .dışındaki herhangi bir kod noktasıyla eşleşir \n. Tüm noktalara modu üzerinden erişilebilirm bayrak (!) İle .

s bayrak Ruby'de Windows-31J kodlamasını belirtmek için kullanılır.


Uydurma

Ŗ͞e̡͟҉ǵ͟͢e̴̢͘͡x̡́͞ ̛̀҉҉̢c҉̷̨a̸̛͞n҉̛͠ ̷̸̀p̴͠͡҉̵ą̧͜͢r̸̸̷̢͝s̢̀͡e̷̷̷͘͞ ̨̧̀H̨̧͜͜T̷͞M̷̛͜L͢.̴̡́ Benden sonra tekrarlayın. R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̣̻͓̠͈͕̥̜͚̝̫͚̳̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒̚̚ ̸̦͈̥̬̺͇ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡ Ayrıştırma ͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
Factoid'in referansını bulamayan biri için üzülüyorum.
Robobenklein,

6
@robobenklein Ağrınız için gizli bir ilaç biliyorum: Sadece bizi aydınlatın!
kusur,

24
@flawr Ünlü soruyu bilmeyenler için: stackoverflow.com/questions/1732348/… adresindeki ilk cevap aradığınız şeydir.
Robobenklein,

1
Zalgo metnini okuyabilirsiniz, ancak her iki yönde de çok ciddiye almayın. Zalgo'yu kör bir şekilde takip etmek kesinlikle yanlış, ama Zalgo metni her zaman yanlış değil.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

12
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, tüm bu oyları bize HTML'nin nasıl ayrıştırılacağını göstermek için kullanmayacak mısın?
mbomb007

57

J

Not: Şimdi tryJ.tk ile bağlantılı snippet'ler , tarayıcınızda JavaScript çalıştırırken, J yüklemeden izin vererek

PPS: Siparişi değiştirdim; bu, katılan insanlar ve gelecekteki referanslar için daha anlamlı olur.

PPS: Zaman kısıtlamaları nedeniyle günde 1 snippet ekleyeceğimi düşünüyorum.

uydurma:

J , eksi komik karakter setinin ( aile tarihi için buraya bakınız) soyundan geliyor .

Uzunluk 1 pasajı

_

J, sayı değişmezlerine (fiillerin aksine ) eklendiğinde _hem sonsuzluk hem de negatif gösterge olarak kullanılır- .

Uzunluk 2 pasajı

a.

a.Tüm 1 bayt karakterleri içeren Alfabe denir . Böyle bir J atoi, alfabedeki basit aramalar olduğundan, gibi fonksiyonlar içermediğinden :a. i. 'z' =122

Uzunluk 3 pasajı

i.9

i.tek kelimeyle kullanıldığında Integers içindir (yani, yalnızca bir argüman, doğru olanı, genellikle y denir). İki yönlü olarak kullanıldığında , yukarıdaki örnekte olduğu gibi indeksi olarak işlev görür .

Uzunluk 4 pasajı

!!6x

J rasgele hassas tamsayı ve rasyonel sayıları destekler . Bu, 6 faktörünün faktörünü hesaplar (1747 basamaklı bir sayı).

Uzunluk 5 pasajı

^.^:_ 

Yoğun olanı ... Öncelikle, fiiller (J çağırdığı gibi) temaya göre düzenlenir. Bütün fiiller üstelleşmeye bağlıdır. ^için üs (ve exp, monadik olarak kullanıldığında ^.için logaritma . ^:özel bir, bir güç bir fonksiyonu birkaç kez uygulanır birlikte (daha yüksek dereceden bir fonksiyon), sağ bağımsız değişken sonsuz (olduğunda. _) içeri (sol argüman çalıştırır Örnek ^.) yakınsak olana kadar kendi çıktısındadır.Aslında, herhangi bir argümana uygulandığında ^.^:_fiili bir çözümdür x = ln(x), ancak 1, verimlidir 0.318132j1.33724.

Uzunluk 6 pasajı

^0j1p1

Veya eşdeğer olarak

^o.0j1

Euler Kimlik yukarıda anılan olarak J., ^olduğu exp(). Rasgele kesinlikli tamsayılar ve rasyonellerin yanı sıra, pi ve karmaşık sayıların güçlerini ve bunların değişmezleri olarak da kombinasyonlarını destekler. 0j1p1anlamına gelir (0 + j) * pi ^ 1.

Uzunluk 7 pasajı

+/&.:*:

Herhangi bir vektörün 2 normunu alan bir fiil. Bu 2 şeyi gösterir:

  • takın zarf Ekleme fiilini döner +Terimin her bir öğe arasındaki takarak Sum içine. Dolayısıyla (0+1+2+3) = +/ i.4.

  • Birlikte altında olarak kullanıldığında v &.: u yeşdeğerdir vi u v y, burada vibir ön yüz (genel olarak tersi).

Evet, J işlevsel ters çevrimleri bilir. Bunları birleştirmek fiili snippet'te örneğin Matlab'da %: @: (+/) @: *:veya eşdeğeri yapar sqrt(sum(y.^2)).

Uzunluk 8 pasajı

$#:I.@:,

Bir çatal bağımsız değişkenlere referans vermeden 3 fiilden oluşur. Bu, J'de taktik ( noktasuz ) programlama adı verilen şeyi sağlar . f g hMonadik durumda bir çatal (bu örnekte olduğu gibi) eşittir (f y) g (h y). Çatallar gibi, çok boyutlu diziler J'nin kendine özgü bir parçasıdır "" Endeksler " , bir vektördekilerin endekslerini döndürür, ancak bu şekilde daha yüksek boyutlara uzanmaz. Bu örnek, Şekil , Antibaz'ı ve I.@:,daha yüksek boyutlu diziler için çatal uygulayıcı I. ç çatalını kullanır ; örneğin:

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

Uzunluk 9 pasajı

<"1 i.4 6 

Kutulu diziler, J cinsinden heterojen içeriği (hem tip hem de boyut) tek bir değerde birleştirmeyi sağlayan bir veri türüdür. Monako < kutuları bu tartışıyor . Rank, J'deki merkezi bir konsepttir ve fiilleri otomatik olarak daha yüksek boyutlu dizilere uzatabilir. Hem isim hem de fiillerin bir sırası vardır.

İsim sırası , fiilin $@$size söyleyebileceği herhangi bir ismin boyutlarının sayısıdır . Örneğin i. 2 3 4, 3. rütbe dizisidir.

Fiil sıralaması , bir fiilin kendisine uygulanacağı sıradır. Her fiilin, Temel bağlaç ile sorgulanabilecek içsel bir sırası vardır . v b. 0monadik, dyadik sol ve fiilin dyadik sağ rütbesi için 3 sayı döndürür

Bir fiil, fiil sırasına eşit olan isim hücrelerinde çalışır ve sonuçları isim rank-verb rankçerçevesinde değiştirir. Bir fiil rütbesi, burada yapılan Sıra rütbesi kullanılarak sınırlandırılabilir , yani, rütbe 1 üzerinde çalışmak yerine 1 rütbe boks (sıralar). dizinin tamamını boks. Rütbe hakkında daha fazla bilgiyi burada bulabilirsiniz .

Uzunluk 10 pasajı

<./ .+~^:_

Bu snippet, ağırlıklı digraph üzerindeki en kısa yolu hesaplayan bir fiildir . Minimum ( <./) ve Dot birleşimini tanıtır . Nokta birleşimi, matris ürününün, olarak yazılabilen bir genellemesidir +/ . *. Genellikle u . veşdeğerdir u@(v"(1+lv,_))lv fiil v sol sıra olduğu yerde. Ya deyişle sol argüman hücreleri "ve toto doğru argüman‘’u listelerinde v sonucu uygulanır". (Sıralar için yukarıya bakınız)

Gibi iç fiil , tüm k için en az <./ .+~madde y(i,j)ile değiştirir y(i,k)+y(k,j).

^:_ yakınsamaya kadar bu adımı yineler.

Örnek, orijinal ve en kısa yol mesafelerinin görüntülenmesi:

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

Uzunluk 11 pasajı

<.@o.10x^99

Bu kod parçacığı özel bir kod sunar : Bazı J kodları, belirli bir kullanım durumu için özel olarak yazılmış, ayrıştırma sırasında tanınan ve en iyi duruma getirilmiş kodla desteklenir; daha yüksek doğruluk için (burada olduğu gibi) veya daha yüksek performans (bkz. Özel kombinasyonlar )

Bu cümle 99 rakam pi verir (gerçi 99 ondalık basamağa kaydırılmış olsa da). Özel kod kesin ifadelere bağlıdır, normalde eşdeğer olan pasaj kodu kadar kesin değildir: genişletilmiş hassasiyeti <.o.10x^99 gevşetir .

Uzunluk 12 pasajı

($-.1:)($,)]

Zaman zaman, verilerde yapılan seçimler nedeniyle, yolda çalışan tekil boyutların olduğu durumlarda ortaya çıkarsınız. Matlab'ta sıkma adı verilen bu kullanışlı yardımcı program, tüm tekil boyutlarını sıkar. Çatalın sol dişi, ($-.1:)bütün ölçüleri olanlar olmadan verir, ortadaki ($,) perdeli diziyi tutulan boyutlara yeniden şekillendirir. Doğru çatal ]sadece bunu çatal yapmak için kullanılır ve doğru argümana referans verir.

Uzunluk 13 pasajı

1 :'-u%u d.1'

Newton Metodu , farklılaşabilir bir fonksiyonun kökünün bir yaklaşımını bulur. Bu açık zarf , kökün arandığı fonksiyona uygulanacak ve yinelemeli prosedürün bir basamağını temsil edecektir. uFonksiyonu gösteren argüman, zarfın uygulandığı an yerine konmasıdır. d. bu, sembolik olarak fonksiyon D.üreten bir birleşimdir ve burada aynı şekilde sayısal olarak aynı işlemi yapabilir (ancak daha yüksek dereceli fonksiyonlara uygulandığında farklılık gösterir). Sonuç, çatalı ( türevi ile bölünmüş olarak) argümandan çıkartan bir kancadır .u

Örneğin:

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

Uzunluk 14 pasajı

(%-.-*:)t.i.10

Fibonacci serisinin ilk 10 sayısı Taylor genişlemesi ile x / (1 - x - x^2). Kanca analizini %-.-*:verir (y % (-.-*:) y) = (y % ( (1 - y) - *: y).

Uzunluk 15 pasajı

(#{.+//.)!/~i.9

Başka bir Fibonacci serisi alır. Bu sefer başka bir açıdan; Pascale'nin üçgeninden başlayarak '! /~i.9'.

/ikili olarak kullanıldığında Tablo anlamına gelir , bu, argümanlarının her bir hücresine bağlı fiili uygulayarak, x ve y argümanları arasındaki işlemin bir tablosunu verir. Bu durumda !, iki yönlü olarak bir arada (veya dışında) olarak kullanılır . yani, Refleksif~ fiili yapar . soldaki gibi doğru argümanı kullanın.

Zarf /.gariptir, bir dizinin köşegenleri boyunca fiilini uygular (yani, burada deneyin</.!/~i.5 )

Bu yüzden bu pasaj, Pascal üçgeni üzerindeki ilk 9 anti-diyagonalin toplamını alır, bu da başka bir olay Fibonacci serisi olur.

Uzunluk 16 pasajı

;/@~.,. <"0@#/.~:

Tamam, sadece 16'ya ulaşmak için bir boşluk ekledim :). Bu kod parçacığı, Anahtar : bağımsız değişkenindeki tüm öğeleri ve sıklıklarını listeleyen bir çatal gösterir .

x u/. yX tek, ya da J parçalar y u uygulanır (=x) u@# y, =bir Kendinden sınıflandır göründükleri pozisyonlarda 1 's içeren bir Boole dizi oluşturur, nub ~. Burada refleks olarak uygulanır, bu nedenle y'deki her benzersiz öğe için Tally'i uygulayarak görünüş sayısını sayar.

J'deki fiillerin çoğu nub sırasını koruduğu için ( uniqueargümanını sıralayan Matlab'da olduğu gibi yeni benzersiz öğelerin görünüm sırası ) bu, burada yapılan gibi sıklıklarına öğelerin dikilmesi için kullanılabilir . ;/@~.Tüm öğelerin kutulu bir listesini yapmak için kullanılır.

Dikkat çekici Rank kavramı olduğundan , bu kodun herhangi bir boyutluluk için işe yaradığını unutmayın .

Uzunluk 17 snippet

*./ @:(#&>)@C.@A.

J özellikle permütasyonlar hakkında birkaç ilkel destekler:

  • Anagram A. Monadical olarak Anagram endeksini bulur, ikigene göre, anagram endeksi tarafından sol argümanda belirtilen argümanı sağ argümana uygular.
  • Döngü - Permute C. , permütasyonların direkt ve döngü gösterimi arasında dönüşüm sağlar.

Bu kod parçası, anagram dizinini sola (0 ile 0 arasında !#y) ve sağ argümanını izin vermek için bir dizi olarak alan bir fiildir . Daha sonra, döngü uzunluklarının LCM'sini hesaplar , yani. orijinal diziyi geri aldığınız süre:*./#&>

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

Uzunluk 21

<:@(#/.~)@(i.@#@[,I.)

Bu küçük fiil "istatistik / taban" eklentisinden gelir ve histogram olarak adlandırılır . Tam olarak, bir bin bin başlatması listesi verildiğinde, ]bn-1,bn]bn bin sayısının n başlangıcı olduğu aralık arasındaki tüm veri oluşumlarını toplar.

AralığınıI. bulmak için Aralık Dizini'nden yararlanır :

Y, x öğesinin biçimine sahipse, o zaman x I, y ifadesinin en az negatif olmayan j'dir; öğe yok.

Her aralığın toplamının yapılması , snippet 16'da vurgulandığı gibi anahtar kullanılarak yapılır .

Tryj.tk dosyasına bağlanan snippet, bu histogramı kullanarak merkezi limit teoremini gösterir:

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

Uzunluk 22

=,&(+/)(~:#[)e.&~.~:#]

J'de eğlence Bu, bir beyni motor uygular, sol argüman olarak gizli bir dizi ve sağ olarak bir tahmin alır. Döndürülen değerler beyaz ve siyah mandal sayısıdır. Ayrı alınan:

NB.   ExactMatch: checks where digits correspond:
ExactMatch =: =

NB.   GoodDigitWrongPlace: Copies non-matched numbers from both arguments (left and right
NB.   pairs of parentheses, and checks them for same elements(e.), after eliminating
NB.   doubles in both (&~.)
GoodDigitWrongPlace =: (~: # [) (e.&~.) (~: # ])

NB.   Piecing the conditions together, after summing the booleans:
mm =: ExactMatch ,&(+/) GoodDigitWrongPlace

Gibi kullanılmak için

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

Herhangi bir dizi nerede secretve guessne. Aslında herhangi bir veri türüyle çalışır.


17
Öyleyse, ya okunamaz bir tuhaf sembol yığını ya da okunamayan bir ASCII sembol yığını elde edersiniz. Zehirini al.
John Dvorak

16
@JanDvorak Siz öğreninceye kadar tüm diller okunamıyor. ;-)
Gareth

5
Eskiden, tanımlayıcı isimler yardım kodunun anlaşıldığını düşünürdüm. Sonra edildi aydınlattı .
HoosierEE

@ Gareth Ama siz onları öğrendikten sonra bile hepsi okunamıyor . İsim vermeyeceğim.
kusur

45

RPL (Redstone Programlama Dili) [ve Minecraft]

Bu, bunu gerçek bir programlama dili olarak kabul edip etmeyeceğimize dair büyük bir gerginliktir, ancak yine de deneyeceğiz. Ve, bu iki "dil" pratik olarak aynı olduğundan, onları bir araya getireceğim, bazen "Minecraft" dilinde (redstone vb.) Ve bazen RPL'de snippet göndereceğim. Ayrıca, birçok küçük parça Minecraft'da olacağından, yer kazanmak için resimlerin kendisinden ziyade resimlere bağlantılar göndereceğim. Ek olarak, tüm snippet'ler Minecraft'ta genel redstone (programlama değil, yani redstone kapıları görünmeyecektir) programlama konseptleri olacaktır. Karakterler bayt (RPL) ya da uygun olarak sayılır , bu (Minecraft).

Uydurma:

RPL, Mucidi Tossha'nın, kodu Minecraft redstone ve komut bloklarına dönüştüren bir programlama dilidir . Giriş ve çıkış, döngüler, tamsayılı manipülasyon, trig fonksiyonları, kökleri ve daha fazlasını yapabilir.

Uzunluk 1:

Bir düğme (1 bayt) Minecraft'taki girişin en basit şeklidir. Ayrıca bir "programı" başlatabilir veya durdurabilir. Benzer şekilde, bir kol (ayrıca 1 byte) başka bir giriş şeklidir ve ayrıca programı "açık" ve "kapalı" durumuna sahip olarak başlatmak ve durdurmak için de kullanılabilir. Hatırlanması gereken bir şey, Minecraft'ın kelimenin tam anlamıyla bir 3D programlama dili olduğudur, bu nedenle düğmenin / kolun programdaki yeri büyük bir fark yaratabilir.

Uzunluk 2:

Bir redstone lambasına takılan bir düğme, temel kedi programınızdır. Girdiyi alır (bir düğmeyle veya düğmeyle, 0veya 1( offveya on)) ve lambadan ya 0da 1( offveya on) gibi ışık şeklinde çıkar .

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

Uzunluk 3:

Aşağıda görüldüğü gibi, en kısa kaynak kodu değiştirme programlarından biri (Minecraft ile çalışma zamanında kaynağı değiştirebileceğiniz gibi). Şimdi, bu spesifik olanın gerçekten bir faydası yok, ancak konsept harika programlar oluşturmak için başkalarıyla birleştirilebilir (daha fazla oylama ile gelince). Çalıştırıldığında, bu program giriş kaynağını kaldırır ve yeniden çalıştırılamaz hale getirir. görüntü tanımını buraya girin

Uzunluk 4

Bu "pasaj" aslında iki kavram gösterir: gecikme ve NOT geçidi. Gecikme, redstone-tick gecikmesi olan bazı redstone elemanları kullanılarak yapılır . Bir redstone-tick, saniyenin onda birine eşittir. Farklı redstone bileşenleri farklı gecikmelere sahiptir: bir torç 1rt gecikmeye sahiptir (1 redstone-tick), karşılaştırıcı 1rt gecikmeye sahiptir, tekrarlayıcı nasıl kurulursa bağlı olarak 1, 2, 3 veya 4rt gecikmeye sahip olabilir. Bu örnekte, redstone tekrarlayıcı 4rt gecikmeye ayarlanmıştır.

Sonraki NOT geçididir. NOT geçidi bir girişi alır, onu ters çevirir. Böylece bu kurulumda, giriş kapalıysa çıkış açık olacak ve giriş açıksa çıkış kapalı olacaktır.

Uzunluk 5

OR kapısının Minecraft'ta gerçekleştirilmesi çok kolaydır. Aynı girişe iki giriş bağlanır. Bu kadar. Komik hileci falan yok, oldukça basit.

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

Uzunluk 6

İşte "kodunuzu" sıkıştırmak için bir ipucu. İki girişin sinyal gücünün ilgili çıkışlara müdahale etmeyecek kadar küçük olduğunu biliyorsanız, redstone'u birbirine doğru bağlayabilirsiniz. Aşağıdaki örnekte, her bir haznede yaklaşık 0,5 saniyede öğeleri ileri geri aktaran, 1 sinyal gücü veren karşılaştırıcılara bağlanan basit bir hazne zamanlayıcısı vardır. Bu, iki çıkıntının birbirine karışmayacağı anlamına gelir. Örnekte, lambalar yalnızca tanıtım amaçlıdır ve toplam blok sayımına sayılmaz.

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


7
13 hazir kazandınız, 10 moar program haz yapabilir miyim?
Rɪᴋᴇʀ

4
Programlarınızdan hiçbiri aslında RPL'de yazılmıyor, bu yüzden böyle dağıtmayın. Bu tamamen Minecraft "kod" dir.
mbomb007

2
14 program eksikliğiniz var m8. Aklında ne olduğunu görmek isterim;)
Conor O'Brien

4
21 hazir hazirladin, 15 moar program haz yapabilir miyim?
wizzwizz4

1
Sizce 29 upvotes, 23 moar programlarını haz yapabilir miyim?
bb010g

42

TI-BASIC

[Dil, hangi hesap makinesinde kullanıldığına bağlı olarak değişir, ancak bunlar aksi belirtilmedikçe TI-84'ü kullanır.]

Uzunluk 31 pasajı

Menu("","1",A,"2",B
Lbl A
Lbl B

Bu, menülerin kullanımını gösterir. Yukarıdaki program hiçbir şey yapmadığı için oldukça işe yaramaz, ancak programın farklı bölümlerinde gezinmek için kullanılabilir. İlk argüman menü başlığı ve ardından seçenek çiftleridir (görüntülenen dize, ardından 1 veya 2 harfli etiket). İşte daha sezgisel bir örnek:

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lblile dallanma için de kullanılabilir Goto. Menülerin, onları rahatsız etmelerini sağlayan bazı sınırlamaları vardır, ancak: Yalnızca yedi menü öğesi olabilir ve her başlık en fazla on dört karakter olabilir, bu yüzden her şey bir ekrana sığar.

Uzunluk 29 snippet

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(varsayılan olarak açık) hesap makinesini gerçek sayı moduna getirir, böylece karmaşık sayıları içeren hesaplamalar bir NONREAL ANShata verir. Moda girildiğinde a+bi, hesap makinesi varsa cevapları karmaşık sayılar halinde gösterir, böylece ikinci örnek geri döner4i . re^θimod, dikdörtgen koordinatlar yerine polar kullanır, bu yüzden çıktı verir 4e^(1.570796327i).

Uzunluk 23 snippet'i

If A≥9
Then
1→X
7→Y
End

Bu sadece basit bir şartlı olmasına rağmen, bir Else açıklama olabilir. Thenve Endsadece bir ifade ise gerekli değildir.

Uzunluk 21 pasajı

(-B+√(B²-4AC))/(2A)→X

Herkesin favorisi, ikinci dereceden formül. İlk çözümü Xa, b ve c değerlerinin ax 2 + bx'te olduğu gibi kendi değişkenlerinde depolandığı varsayımıyla ikinci dereceden bir denklemde saklar. + c'deki .

Uzunluk 20 pasajı

Shade(|X/2|-3,5-X²,0

Bu, iki fonksiyonun kesişimini, birkaç isteğe bağlı parametreyle gölgelendirir: minimum ve maksimum x değerleri ve gölgelendirme çizgileri arasındaki mesafe ve mesafe.

Uzunluk 18 snippet

LinReg(ax+b) L1,L2

Burada lineer regresyon denklemini veya bir grupla en iyi eşleşen lineer denklemi L1hesaplar.L2 . Ikinci dereceden, kübik ve üstel dahil olmak üzere birçok regresyon seçeneği vardır.

Uzunluk 17 snippet

dbd(1.2711,1.2115

Bu, iki tarih arasındaki gün sayısını, bu durumda bu sitenin başladığı gün 27 Ocak 2011 ile 21 Ocak 2015 tarihini hesaplar. (Bu tembel için 1455 gündür.) Tarihleri ​​kodlamanın yolu biraz tuhaf: ya DDMM.YY ya da MM.DDYY.

Uzunluk 16 pasajı

For(A,0,5
Disp A

Bu, dilin programlama tarafının iki bölümünü gösterir. Birincisi , diğer dillere forbenzer şekilde tipik döngünüzdür for(var A=0;a<5;a++). (Ayrıca kullanmanız gerekirEnd Döngüyü kesmek komutu .) İkincisi kendini açıklar: Abu durumda döngü nedeniyle 5 kez görüntülenir .

Uzunluk 15 pasajı

Y1=|X³-4|
Y2=3X

Grafik hesap makinelerinin iyi bilinen bir özelliğinin iki örneği : grafik denklemleri. Aynı düzlemde işaretlenmiş 10 farklı denkleminiz olabilir ve kesişme noktalarını, maksima, x değerlerini vb . Bulmak için birçok yararlı komut vardır . Bu denklemler standart bir pencerede işaretlendiğinde şöyle görünür:

grafik

Uzunluk 14 pasajı

[[1,2][34,5]]T

Parantezler, matrisler yapmak için kullanılır Tve matrisi çevreler:

[[1 34]
 [2 5]]

Uzunluk 13 pasajı

dayOfWk(9,1,6

Bu, 6 Ocak 9 MS haftanın gününü bulur. Çıktı, 1'in Pazar, 2'nin Pazartesi vb. Olduğu bir sayıdır. Bu tarih bir Salı günüydü, yani çıktı3 .

Uzunluk 12 pasajı

Circle(1,3,5

Temel çizim araçlarından birincisi, bu grafikte, (1,3) merkezinde ve 5 yarıçapında bir daire çizer.

Uzunluk 11 pasajı

randInt(0,8

Bu, 0 ile 8 arasında bir (sözde) rasgele tamsayı oluşturur. Kaç tane tam sayı üretileceğini söyleyen isteğe bağlı bir üçüncü argüman vardır. Normal ve binom dağılımları için olanları, biri rastgele bir matris için, biri de tekrarı olmayan rasgele sıralı bir liste için de dahil olmak üzere birkaç rastgele fonksiyon vardır. randIntbir sayıyı saklayarak ekilebilir rand:2→rand .

Uzunluk 10 pasajı

4>5 or 2≠7

Burada TI-BASIC'in (in) eşitliği ve mantık operatörleri var. Eşitsizlik ifadeleri önce 0 or 1veor her iki taraf da doğruysa true değerini döndürür, bu nedenle bu görüntülenir 1.

Uzunluk 9 pasajı

.656▶F◀▶D

Bu, ondalık sayıdan kesir biçime dönüştürebilir ve bunun tersi de çok faydalıdır. Sadece bir yöne giden işlevler ▶Fracve ▶Decişlevler de vardır . Baskılar82/125Bu durumda .

Uzunluk 8 pasajı

lcm(14,6

Bu, en az yaygın çokluyı yazdırır , 42 olan 14 ve 6'nın .

Uzunluk 7 pasajı

getDate

Oldukça açıklayıcı, bu durumda sadece geçerli sistem tarihini bir liste halinde yazdırır {2015 1 19}.

Uzunluk 6 pasajı

√({4,9

Diziler (veya listeler) parantez içine alınır ve virgüllerle ayrılır. Bu benzermap listedeki her öğe boyunca yinelendiği ve bunun için parantez dışındaki işlemi uyguladığı, bu durumda kare kökü olduğu birçok dilin işlevine{2 3} . Kapatma parantezlerinin isteğe bağlı olduğunu ve bundan sonra atlanacaklarını unutmayın.

Uzunluk 5 pasajı

4iii6

Burada birkaç harika şey var. İlk olarak, gerçek parçalar, 4 ve 6 çarpılır ve sonra hayali parçalar çarpılır:, i^3veya -i. Bu çarpılmış vermek-24i . Bu, korkak görünümlü yan yana çarpma ve TI-BASIC'in hayali sayıların ele alınmasını göstermektedir.

Uzunluk 4 pasajı

8°5′

Bu 8 derece, 5 arcminute, yani derece dereceye dönüştürülür. 8.0333 ...

Uzunluk 3 pasajı

8→T

Bu rakamların değişken olarak nasıl saklanabileceğini gösterir, bu sayı sıra dışıdır, çünkü sayı önce gelir, ardından mağaza oku, sonra değişken adı. Factoid'de belirtildiği gibi,θ (theta) değişken olarak da kullanılabilir ve değişkenler yalnızca bir büyük harf olabilir.

Uzunluk 2 pasajı

4M

Mathematica'ya benzer şekilde, yan yana koyma ile çarpabilirsiniz, gerek yok *. Tüm değişkenler varsayılan olarak 0'a sıfırlanır, bu nedenle o değişkene başka bir şey kaydetmediyseniz bu 0 değerini verir (bkz. Pasaj 3).

Uzunluk 1 pasajı

e

Bu, olarak görüntülenen Euler sayısı sabitidir 2.718281828.

Uydurma

Değişkenler yalnızca belirli veri türlerini depolayabilir. Örneğin, A- Z(ve θ) sayısal değerleri, str0- str9dizeleri ve [A]- [J]matrisleri (2 boyutlu diziler) kaydeder.


Bu arada, küçük harf n(değil n) değişken olarak da kullanılabilir.
Ypnypn

İlginç. Bu değişkeni hiç kullanmadım.
NinjaBearMonkey 21:15

3
Kişi str01 karakter veya 4 olmak konusunda tartışabilir . TI-BASIC'teki tüm talimatlar 1 karakter uzunluğundadır.
Ismael Miguel,

@IsmaelMiguel Bunun hakkında düşündüm, ancak 1 veya 2 bayt , ve karakterleri normal saymaya karar verdim.
NinjaBearMonkey

1
Kararına saygı duyuyorum. Bu durumda çok yardımcı olur. Yaşlı TI-83'ümde programlama yapmaktan gerçekten zevk aldım. (İçinde bir boya programı bile tasarladım!)
Ismael Miguel

41

GNU Sed

Daha kısıtlayıcı bir gereksinim kendi kendime empoze ediyorum - tüm snippet'ler tamamlanacak sed programlar .

Uydurma

sed olan bir Turing tamamlama dili. İşte bir kanıtı.

Uzunluk 0 Parçacığı

0 uzunluk parçacığının kesinlikle gerekli olduğunu sanmıyorum, ancak gerçekte sed'de bir şey yaptığı için, işte burada:

Sed, "Stream EDitor" dür, yani STDIN'den akışı (satır satır) okur, düzenler, sonra STDOUT'a çıkar. Sıfır uzunluktaki sed programı sadece STDIN'i STDOUT'a kopyalar. Böylece, catyardımcı sed tarafından taklit edilebilir. Aşağıdaki eşdeğerdir:

cat a.txt b.txt > c.txt

ve

sed '' a.txt b.txt > c.txt

Uzunluk 1 Parçacığı

=

Bu sed programı, her satırın satır numarasını STDOUT'a yazdırır. Bu yaklaşık olarak eşdeğerdir:

nl

veya

cat -n

sed sürümü, satır numarasını kendi satırına koymasına rağmen.

Uzunluk 2 Parçacığı

5q

qSTDIN’i STOUT’a kopyalar ve 5. satırdan sonra uyar.

head -n5

Burada bir model görmeye başlıyor olabilirsiniz - sedstandart core-utils araçlarının çoğunu taklit etmek için kullanılabilir.

Uzunluk 3 Parçacığı

iHi

iHer satırdan önce "Hi \ n" yi ekler. Meh.

Uzunluk 4 Parçacığı

/a/d

Sed'in gücünün çoğu regex özelliğindedir. Bu program, regex aile eşleşen tüm satırların dakıştan kaldırılmasına neden olur . Diğer tüm hatlar STDOUT'a gönderilecek. Bu eşdeğerdir:

grep -v "a"

Uzunluk 5 Parçacık

:l;bl

Bu sonsuz bir döngüdür. Hepimiz CPU-hogging sonsuz döngüler seviyorum. Bir etiketi tanımlar l, sonra bona doğru koşar (zıplar). Ebediyen.

Uzunluk 7 Parçacık

s/a/A/g

Sed, varsayılan olarak, sher satırda yalnızca ilk kez görünecek şekilde komutlar uygular . Bir satırdaki her bir eşleşmenin eşleşmesi (ve değiştirilmesi) gerekiyorsa g, sonundaki bayraks komutun bunu yapar.

Uzunluk 8 Parçacığı

y/01/10/

Az kullanılan ykomut trkabuk hizmet programına benzer (esnek olmasa da). Tüm geçiş Bu program 0ile s 1s ve tersi de geçerlidir.

Uzunluk 9 Parçacığı

1!G;$p;h

Bu kod parçacığı aslında 8 bayttır, ancak standart çıktı golf kurallarına göre bunu 9 olarak sayarım. -N parametresini varsayılan çıktıyı bastırmak için sed gerektirir. Bu program akıştaki satırları tersine çevirir. Yani:

sed -n '1!G;$p;h'

tam olarak eşdeğerdir:

tac

Uzunluk 10 Parçacığı

s/[ <TAB>]+$//

Bu (yanlış) uzunluk 6 snippet'inin tekrarıdır. Bu, izleyen boşlukları (boşluklar ve TAB'ler) satırlardan çıkarır.


2
Ayrıca bakınız SED İÇİN FAYDALI BİR HATTI YAZILARI , bu temelde nasıl öğrendimsed
Adam Katz

Daha fazla oyunuz var. Biraz daha alabilir miyiz?
kullanıcı

2
Factoid'in 404'lü.
Wauzl

1
Güzel, ama bu kullanım GNU uzantıları birçok unutmayın ve standart-spesifik uzunluk 3 (standart olacağını değildir i\<newline>Hi<newline>), uzunluk 5 (standart olacağını sed -e :l -e blya :l<newline>bl<newline) ve uzunluğu 10 (ihtiyacı +bir döndü *hiç işe kadar). Uzunluğu 9 pasajı Not -n '1!G;$p;h' olduğu , oysa standart tacolduğu değildir . :)
Wildcard

1
@Wildcard Evet - Bunu GNU sed ile sınırladım.
Dijital Travma

39

piton

( mbomb007 kullanıcısının gönderisinde zaten bir sürü Python pasajı var, ancak biraz daha ilginç gerçekleri bulabilirim diye düşündüm.

Uydurma

Python, okunabilirliğe vurgu yapan dinamik olarak yazılmış bir dildir.

Uzunluk 1 pasajı

1

Python 3'te yukarıdakiler (ve ayrıca ) Trueanlamında da eşdeğerdir . Bunun gerekli olmadığını unutmayın; değerini yeniden tanımlayabileceğiniz Python 2'de geçerlidir .1 == True0 == FalseTrue

Uzunluk 2 pasajı

<>

<>eşdeğer eski bir karşılaştırma işleci !=. Hala Python 2'de çalışıyor (kullanımı yasak olmasına rağmen) ve Python 3'ten tamamen kaldırıldı.

Uzunluk 3 pasajı

...

Python'un yerleşik olmayan bir çok özelliği var ama üçüncü parti kütüphaneleri için var. Bu Ellipsisnesne bunlardan biridir ve genellikle dilimleme için kullanılır. Örneğin, aşağıdaki 3D numpy dizisine sahipsek :

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

sonra a[..., 0](eşdeğerde a[:,:,0]) tüm ilk öğeleri verir:

array([[1, 4], [7, 10]])

Python 3'te ...hazır bilgi dilekçe sözdiziminin dışında kullanılabilir; bu eğlenceli passveya yerine "yapılacaklar" işareti olarak kullanmanızı sağlar NotImplemented:

def f(x):
    ... # TODO

Uzunluk 4 pasajı

(1,)

Python'da bir elemanlı demet.

Python listeleri (örn sahiptir [1, 2, 3, 4]) değişken olan, ve küpe (örneğin (1, 2, 3, 4)) olan im değişken. Tuples için yaygın olarak kullanılan bir kullanım, listelerin zor olmadığından sözlük anahtarlarıdır.

Yaygın bir başlangıç ​​hatası, virgülle (1)çevrili 1 numaralı sayı olan yukarıdaki virgülden çıkmaktır. Tek elemanlı demet, kapanış parenlerinden önce virgül kullanmanız gereken tek zamandır - SyntaxErrorbirini boş karta koymaya çalışırsanız ()en az 2 boy uzunluğundaki dişliler için isteğe bağlıdır.

Uzunluk 5 pasajı

0or x

Bu pasajda bir şeyler oluyor, o yüzden bir bakalım!

or||birçok dilde olduğu gibidir . Python'da A or Bkısa devreler, A(değerlendirmeden B) dönen, eğer Atruthy ise geri döner B. Örneğin, 1 or xher zaman 1olduğu gibi 1her zaman olduğu gibi geri döner ve xtanımlanmamışsa bile çalışır . Öte yandan, 0 or xher iki döner xeğer xtanımlanan veya atar edilir NameErrorDeğilse.

Golf, biz genellikle bir sayı ve arasında boşluk bırakın orgibi 1 or xolma 1or x. Bu mümkündür, çünkü 1orbir rakamla başlar, onu yasadışı bir Python tanımlayıcısı yapar.

Ancak , bir istisna vardır - 0orgizemli bir şekilde atar SyntaxError. Neden? Çünkü Python'daki sekizli değişmezler 0o(eg 0o20 == 16) ile başlıyor ve ayrıştırıcı r!

Not: Python 2'de, sekizli değişmezler ayrıca örneğin sıfır gibi bir baş ile başlayabilir 020.

Uzunluk 6 pasajı

*x,y=L

Bu Lkod parçası Python'da bir liste, parça ya da herhangi bir başka yinelenebilir türün olduğu özel bir atama türü gösterir.

Python'da, perdeleri ve listelerini "paketten" çıkarabilirsiniz:

a,b = [1,2]

Bu, 1 ila a2'yi atar b. Bu sözdizimi, örneğin çoklu görevler için de kullanılır.

a,b = b,a+b

Fibonacci serisini hesaplayan bir program yazarken kullanışlıdır.

Her iki taraftaki uzunluklar uyuşmuyorsa, a ValueErroratılır. Bununla birlikte, Python 3, şöyle bir şey yapmanıza olanak tanıyan yinelenebilir açma (ya da daha fazla konuşma, "yıldızlı atama") şeklinde genişletilmiş yeni bir sözdizimi getirmiştir :

*x,y = [1, 2, 3, 4, 5]

Bu atar yson element, 5'e ve xkarşı listenin geri kalanı yani [1, 2, 3, 4]. Böyle bir şey bile yapabilirsiniz:

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

ki burada 1 atar a2'ye b, [3, 4, 5]için c, 6 dve 7 için e.

Uzunluk 7 pasajı

zip(*x)

zip Bir sürü listeyi alan ve onları tamamlayan bir işlevdir:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

Not: Python 3'te zipbunun yerine bir nesne döndürülür, bu nedenle yukarıdaki gibi bir liste istiyorsanız aramayı paketlemeniz gerekir.list()

İki veya daha fazla ilgili listeniz varsa ve ilgili girişlerini bağlamak istiyorsanız bu oldukça kullanışlı bir işlevdir.

Şimdi istediğini söylüyorsun halletmek bunu nasıl - liste? zipTekrar kullanmaya çalışabiliriz , ancak maalesef bu:

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

Sorun şu ki her şey bir listede, ancak zipbireysel listeleri ayrı fonksiyon argümanları olarak alıyor. Bunu düzeltmek için */ tuple / etc listesini alan uyarlama operatörünü tanıtıyoruz . ve onları işlev argümanları olarak açar:

f(*[1,2]) ==> f(1, 2)

Ve sonuç:

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

Uzunluk 8 pasajı

x='a''b'

Bunu ilk gördüğümde biraz geri alındım - yan yana iki telin olması ne anlama geliyor? Cevap basitti:

>>> x
'ab'

Python sadece iki dizgiyi birleştiriyor! Bu, okunabilirlik için son derece kullanışlıdır, çünkü böyle uzun dizeleri kırmanıza izin verir (çevresindeki parantezleri not edin):

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

Uzunluk 9 pasajı

0!=2 is 2

Python'un karşılaştırma operatörlerinin zincirlenmesine izin verdiğini zaten biliyor olabilirsiniz, bu 5 < x <= 7nedenle yalnızca 5 < xve eğer doğrudur x <= 7. Bunu bilmiyorsan ... o zaman sürpriz!

Her neyse, daha az bilinen, is/ is not/ in/ / not inaynı zamanda karşılaştırma operatörleri oldukları için bunların da zincirlenebileceği gerçeğidir . Diğer bir deyişle, yukarıdaki kodu eşdeğerdir (0 != 2) and (2 is 2)olan True.

Not: 2 is 2Ancak isiki şeyin aynı nesne olup olmadığına bakar , çünkü iki şeyin aynı değer olup olmadığını kontrol eder . Python kadar küçük tamsayılar önbelleğe 1+1 is 2is True, ama 999+1 is 1000olduğunu False!

Uzunluk 10 pasajı

x=[];x+=x,

Bir liste eklerseniz ne olur? Eğer yazdırmayı denersek x, şunu elde ederiz:

[[...]]

Neyse ki, Python's printözyinelemeli listeleri basmaya çalışırken patlamayacak kadar akıllı. Daha sonra, bir sürü eğlenceli şey yapabiliriz:

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

Bu özellik ayrıca sözlüklerle de çalışır ve örneğin bir grafik gibi döngüsel veri yapıları oluşturmanın bir yoludur.

Uzunluk 11 pasajı

help(slice)

helpFonksiyon Python hata ayıklama için çok yararlıdır. REPL'de hiçbir argüman olmadan çağrıldığında, help()fonksiyonlar / veri türleri / etc için dokümantasyon bulabileceğiniz bir yardım oturumu başlatır. Belirli bir argüman ile çağrıldığında help, ilgili madde hakkında bilgi verecektir.

Örneğin help(slice), aşağıdaki bilgileri verir (çok uzun zamandan beri kesiliyor):

Help on class slice in module __builtin__:

class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
 |  
 |  Methods defined here:
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 | ...

Görüldüğü slicegibi sliceindeksleme için nesneler oluşturabiliriz . Örneğin:

>>> L = list(range(10))
>>> L[slice(2, 5)]         # L[2:5]
[2, 3, 4]
>>> L[slice(2, None)]      # L[2:]
[2, 3, 4, 5, 6, 7, 8, 9]

Hata ayıklama için başka bir kullanışlı işlev dir(), argüman olmadan çağrıldığında geçerli kapsamdaki tüm adları ve argüman ile çağrıldığında verilen bir nesnenin tüm niteliklerini döndüren işlevdir .

Uzunluk 12 pasajı

round(5.0/2)

Bu neye değer veriyor? Cevap Python sürümünüze bağlı!

Python 2'de, iki tamsayı arasındaki bölünme, tamsayı bölünmesine (yani 5/2 == 2) neden olurken Python 3'te yüzer bölme (yani 5/2 == 2.5) elde edilir. Ancak, bu bir şamandıra ve her zaman bir şamandıra ile sonuçlanması gereken bir tam sayı arasındaki bölünmedir. Öyleyse neden farklı sonuçlar elde edelim?

Her roundiki Python sürümünün belgelerine bakacak olursak, cevabı bulacağız:

  • Gelen Python 2 , round0 uzak yuvarlama tiebreaks.
  • Gelen Python 3 , roundkarşı yuvarlama tiebreaks yakın çift tam .

Başka bir deyişle, 5.0/2 = 2.5için yuvarlar 3Python 2'de, bunlarla yuvarlar 2garip gelebilir en yakın çift tam doğru Python 3. Yuvarlama içinde, ama aslında denir banker yuvarlama ve önyargı azaltmak için benzer pozitif ve negatif değerleri tedavi etmeye çalışır.

Uzunluk 13 pasajı

class C:__x=1

Nesne yönelimli olan Python'un sınıfları var. Yukarıdaki, 1'e ayarlanmış Ctek bir niteliğe sahip bir sınıftır __x.

Nokta gösterimini kullanarak sınıf özelliklerine erişebiliriz. Örneğin, sınıfımız varsa

class MyClass(): my_attr = 42

sonra baskı MyClass.my_attr, beklendiği gibi 42 ile sonuçlanacaktır.

Ancak, aynısını yapar ve C.__xyukarıda tanımlandığı şekilde erişmeye çalışırsak , şunları elde ederiz:

AttributeError: type object 'C' has no attribute '__x'

Neler oluyor? Caçıkça bir __xözelliği var!

Bunun nedeni, Python'un sahip olmadığı__ "private" değişkenleriyle taklit edilen niteliklerin olmasıdır . Python, baştan başlayarak herhangi bir özniteliğin adını yönetir, böylece sınıf adını ekleme, böylece yeniden kullanım çakışmalarının önlenmesi. Yukarıdaki örnekte, buna gerçekten erişmeye kararlı olsaydık, bunun yerine yapmak zorunda kalırdık.__1

>>> C._C__x
1

Uzunluk 14 pasajı

NotImplemented

Python'un sadece sınıfları yok, operatörün aşırı yüklenmesi de var. Örneğin, bir sınıfınız olabilir

class Tiny():
    def __lt__(self, other):
        return True

__lt__daha az operatör nerede ? Şimdi bir örneğini Tinyyaparsak, bunu yapabiliriz

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

__lt__her zaman geri dönmeyi tanımladığımızdan beri True. Biz de yapabiliriz unutmayın

>>> 42 > t
True

ancak aşağıdaki aralar:

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

Bekle, bu nasıl çalışıyor? Şundan büyük bir davranış belirtmedik Tiny, bu nedenle son davanın kırılması şaşırtıcı değil. Peki o zaman int(42) bunun bizim hedefimizden daha büyük olduğunu nasıl biliyor Tiny?

Python, bir NotImplementedkarşılaştırma özel yöntemi ile döndürülebilen yerleşik bir sabite sahiptir . Hadi deneyelim:

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

Şimdi yeni sınıfımızın bir örneğini yaparsak:

>>> u = Unknown()

Bunu yapabiliriz:

>>> t < u
True
>>> u > t
Called me first!
True

Görebildiğimiz gibi u > t, Python'un Unknownilk önce daha büyük yöntemi çağırmaya çalıştığı, uygulanmadığını ve Tinybunun yerine diğer sınıf ( ) yerine daha küçük yöntemi denediği !

Uzunluk 15 pasajı

x=[],;x[0]+=[1]

Bu biraz eğlenceli. İlk xönce [],, bir demet içindeki boş bir liste olarak atanacağız, yani ([],). Daha sonra x[0]+=[1], ikinci listenin içindeki boş listeyi genişletmeyi deneriz [1].

Şimdi, listeleri kesilebilir ve küpe olduğunu unutmayın im bir değişmez nesnesinin içinde değişken nesneyi değiştirmeye çalıştığınızda ne olur - değişken?

>>> x=[],;x[0]+=[1]
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    x=[],;x[0]+=[1]
TypeError: 'tuple' object does not support item assignment

Oh bu bir hata veriyor, sanırım bu beklendiği gibi. Ama ya yazdırmaya çalışırsak x?

>>> x
([1],)

Ha? Liste değişti!

Burada neler olup bittiğini merak ediyorsanız, bu blog gönderisine göz atın .

Uzunluk 16 pasajı

@lru_cache(None)

Sadece önbellek ekle! Bu Python 3'te mevcut bir dekoratörün basit bir örneğidir .

Farz edelim ki şu saf Fibonacci uygulaması:

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Programlama kurslarına girişin size söyleyebileceği gibi, bu Fibonacci'yi uygulamanın çok kötü bir yoludur, üstel çalışma süresine yol açar, çünkü temel duruma etkin bir şekilde sadece 1s ekliyoruz. f(10)? Bölünmüş bir saniyede çalışır. f(32)? Bir süre bekleyin, ama oraya varıyor. f(100)? Hayır!

Ancak sonuçları önbelleğe alırsak, işler çok daha hızlı gerçekleşir. Önbellek için her zaman bir sözlük kullanabiliriz, ancak bunun yerine başka bir şey deneyelim:

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Gördüğümüz gibi, yaptığım tüm ithalat ise lru_cachegelen functoolsmodül ve katma @lru_cache(None)benim işlevi önce. @Bu durumda, hatıra için bir fonksiyonun etrafını saran bir dekoratörü belirtir. lru_cache'nin ilk argümanı, maxsizeönbelleğin maksimum boyutu - burada Nonemaksimum boyut olmadığını belirtmek için ayarladık .

Şimdi onu kullanmaya çalışırsak:

>>> f(100)
573147844013817084101

Ve bir saniye bile sürmedi!

Not: f(1000)bir tekrarlama derinliği hatasına neden olur, ancak bu başka bir zaman için bir hikaye


Python, isoperatör için hangi küçük tam sayı aralığını "yakalar" ?
mbomb007

@ mbomb007 Bu sorudan , -5 ila 256 gibi görünüyor. Denemek -5-1 is -6ve 255+2 is 257test etmek.
Sp3000,

37

Zerre

Factoid: Jot'u 2 oy ile tanımlayabilir ve Turing'in 8 ile tamamlandığını kanıtlayabilirim (uzunluk 4, 6 veya 7 kullanılmaz).

Uzunluk 1

1

Bu, Jot'taki iki fonksiyonun bir örneğidir. Birincisi, kimlik işlevini değerlendiren boş dizedir. İkincisi, 1Jot'un gruplama operatörüdür. ( lambda matematiği notasyonu) olarak 1değerlendirilir , programın önündeki program buradadır (burada boş dize). Yani, bu program basitleştiren fonksiyondur .λxy.[F](xy)[F]1λxy.(λz.z)(xy)λxy.xy

Uzunluk 2

10

Şimdi diğer sembolü de Jot: ile tanıştırıyoruz 0. Yine, eğer [F]programın bugüne kadarki değerini temsil ediyorsa , birleşme mantığını , nerede ve nerede olduğunu 0değerlendirir . Şimdi tüm dili tanımladım.[F]SKSK

Uzunluk 5

11100

Şimdi birleştirme mantığından Jot'a bir eşleme tanımlayarak Jot'un Turing'in tamamlandığını ispatlayacağım . Bu Jot programı K birleştiricisidir .

Uzunluk 8

11111000

Bu, S birleştiricisidir.

Uzunluk 3

1AB

Burada, Ave BJot'un bir parçası değil, keyfi bir ifade için yer tutucular. Birleştirme ABmantığındaki ifade , bu üç kural tarafından tekrar tekrar dönüştürülmüş ve 1ABJot'ta eşleştirilir . QEDAB

Uzunluk n

1
10
11
100
101
110
[...]

İkilik olarak ifade edilen her doğal sayı geçerli bir Jot programıdır. Sonuç olarak, algoritmik olarak rastgele uzunlukta daha fazla parçacık üretebilirim. Yeterince fazla oy verildiğinde, durma problemini çözebilirim .


2
İki oy verildi. Şimdi dili tanımla.
John Dvorak

@JanDvorak üzerinde çalışıyor ... hepsini unuttum bu şeyi araştırdığımdan bu yana çok zaman geçti :)
Phil Frost

1
Bunun neden daha fazla oy almaya devam etmesi gerektiğini anlamıyorum. Basitçe artan uzunluktaki rasgele ikili sayıları üreteceksin: |
Doktor 15

1
Oy sayısı 4 için öyle demiştin. Ama burada "az önce yarattığın rastgele bir sayıya" bakıyoruz
Doktor

1
Durma problemini nasıl çözebilirsiniz? Sonsuz (sonsuz) program kullanmanın bir ilgisi olduğunu tahmin ediyorum.
Filip Haglund,

37

darbe

Uydurma:

Son derece ciddi ShellShock böceği, 1989'dan beri Bash'de bulunmaktaydı ve çeyrek asırdır keşfedilmedi. Bash yazmanın sevincinin büyük bir kısmı, birçok kendine haslık ve tutarsızlıkla başa çıkmak için geliyor.

Uzunluk 1 pasajı:

[

testBiçimin koduna izin veren yerleşik için bir takma ad if [ a == b ]; then- gerçekte [bağımsız bir komuttur, sözdizimsel bir öğe değildir ve ]tamamen dekoratiftir (zorunlu olarak [, gereksinimi isteğe bağlı ve bunu kullanarak yapabilirsiniz alias [=test).

Uzunluk 2 pasajı:

||

orÇoğu dilde mantıklı , ancak işlemler için gibi. Komutu, ||yalnızca önceki komut sıfır olmayan döndürürse çalıştırır.

Uzunluk 3 pasajı:

x=y

Görev. Güzel ve tahmin edilebilir ... ama diğer dillerin aksine, fazladan alana izin verilmiyor. Bu komik bir şey çünkü bash'daki şeyler arasında başka her yere fazladan boşluk koyabiliyorsunuz =.

Uzunluk 4 pasajı:

$IFS

Dahili Alan Ayırıcı - bu değişken, Bash'in döngüler için yineleme ve dizgilerden dizileri doldurma gibi birçok yerleşik eylem için verileri bölme şeklini etkiler. Doğru kullanıldığında çok güçlü olabilir; ama daha sık olarak, ince ve öngörülemeyen hataların nedeni budur.

Uzunluk 5 pasajı:

${x^}

Dizeyi x ile değiştirin, ancak ilk karakter büyük harfle! Böyle sıkça kullanılan bir özellik, kendine özgü bir dil sözdizimi parçasına sahip olmasıdır.

Uzunluk 6 pasajı:

x=($y)

Bir dizgiyi, bir dizgeden veya bir elemanlar listesinden y, IFS'nin neye ayarlı olduğunu, - varsayılan olarak, boşlukla bölün. Gelişmiş bash programlama için çok kullanışlı bir özellik.

Uzunluk 7 pasajı:

${x[y]}

Diziler! Ama bekleyin, bu nedir ... y bir dizedir, sayısal bir indeks değil midir? Evet, gerçekten, Bash ilişkisel dizileri destekliyor! Birçok insan bunu bilmiyor. Sadece declare -A xilk önce ihtiyacın var .

Uzunluk 8 pasajı:

${x##*,}

X yerine, son ,karaktere kadar her şey (veya belirttiğiniz her şey). Bir csv'nin son alanını elde etmek için kullanışlıdır - bu kolayca yapabileceğiniz bir şey değildir cut, sadece soldaki alanları sayar. % ve %% aynı şeyin sağdan kesilmesine izin verir; % ve #, ABD klavyesindeki konumlarına göre seçildi, bu nedenle sol ve sağ anlamına gelir, ancak bu ABD klavyesini kullanmayan herkes için çok değerli değil :)

Uzunluk 9 pasajı:

[ a = b ]

Diğer birçok dilde, karşılaştırma işlemindeki bir eşittir, bir atama şeklinde istenmeyen davranışlar doğurur. Yine de Bash'de değil. Ne olursa olsun, boşlukların hiçbirini ihmal etmeyin!

Uzunluk 10 pasajı:

if [ a=b ]

Zorunlu alanları unutursanız olan budur. Bir hata atmaz. Her zaman true değerini döndürür - kümelenmemiş değişkenler olsa ave bveya neye ayarlanmış olursa olsun farketmez - her zaman true değerini döndürür. if [ "$password"="$correctpass" ]Bu "özelliğin" eğlenceli potansiyelini görmek gibi bir kod düşünün .

Uzunluk 11 pasajı:

x=${y//a/b}

Regex tarzı alt tabaka değiştirme! X değerini y değerine ayarlayın, ancak her yerine b ile geçin.

Uzunluk 12 pasajı:

[[:upper:]]*

Desen eşleştirme - sadece kabuk içinde * joker kullanarak sınırlı değildir, aşağıdaki gibi herhangi bir POSIX standardı maç kullanabilirsiniz alnum, alpha, digitvb

Uzunluk 13 pasajı:

function x(){

Bir miktar C sözdizimi gizemli bir şekilde içeri girdi! Kıvrımlı kaşlı ayraçlar için tamamen farklı kullanımlardan biri ve Bash'in diğer dillere daha fazla benzemesini sağlayan isteğe bağlı dekoratif unsurların bir örneği - ya burada atlanabilir ( ya ()da functionher ikisinde de yok olabilir). Tutarsız boşluklarla Ayrıca daha eğlenceli - sonra bir boşluk {zorunlu olmakla değil kapanış önce }olduğu gibi,function x { y;}

Uzunluk 14 pasajı:

echo {Z..A..3}

Yine bir başka tamamen ilgisiz kaşlı ayraç kullanımı. Belirtilen adımla bir aralığı genişletir. Bu durumda, Z'den A'ya her 3 harfini üretecektir. Sıra kullanmadan sekans oluşturmak için kullanışlıdır, ancak değişkenlerle kullanılamaz, bu nedenle sınırlı işlevselliğe sahiptir.

Uzunluk 15 pasajı:

echo {a,b,c,d}x

Dizilim oluştururken kıvrık kaşlı ayraçlar için benzer fakat aynı olmayan bir kullanım; yazdırır ax bx cx dxve tek bir komutla bir diziden veya listeden dizelerin bir listesini oluşturmak için kullanışlıdır. Yine de, parantez içindeki değişkenlerle birlikte kullanılamayacağından, kullanımda sınırlılık vardır.


Aslında, ]tamamen dekoratif değildir. [son argümanı değilse işlev reddeder ].
FUZxxl

Evet, ama kozmetikten başka bir amaca hizmet etmiyor; ve eğer [diğer formu ile değiştirirseniz test, ]çağrıdaki herhangi bir şeyi değiştirmeden ihmal edilebilir - bunun sadece gerçek bash sözdizimi olmadığı, sadece görsel şeker olduğu konusuna değiniyorum.
Riot

Doğru değil bash sözdizimi olduğunu iseniz ancak sondaki ]olan [sözdizimi ve sadece bir noktalı virgül ile C bir açıklama sonlandırmak için ne gibi bunu sağlamak zorundayız.
FUZxxl

Zorunlu olduğu doğru, ancak C noktalı virgülle aynı şekilde değil. Bunun gerekliliği tamamen basitçe alias [=testve daha sonra yazıyorsanız görüldüğü gibi tamamen keyfidir if [ 1 = 1; then. Ama konunuzu dikkate almak için ifadelerimi açıklığa kavuşturacağım :)
Riot

1
function x(){Sözdizimi ile ilgili olarak : Dediğiniz gibi parenleri bırakabilirsiniz, ancak functionkısmı da bırakabilirsiniz . Aslında, POSIX kabuğunun işlevleri bu şekilde tanımladığından, bu şekilde daha taşınabilir. Tam bir işlevi 13 karakterde tanımlayabilirsiniz. Örneğin:x(){ startx;}
kojiro

37

APL

Uydurma

APL ( bir P rogramming L anguage) tarafından geliştirilen bir formül gösterim için bir yorumlayıcı olarak başladı Ken Iverson . Dil tasarlandığında, insanlar bilgisayarlarla iletişim kurmak için teletypwriters kullanıyorlardı. Bunların karakter kümesi sınırlıydı, ancak yapımlarından dolayı, karmaşık karakterleri oluşturmak için aynı karaktere birden çok karakter yerleştirilebilir. Bu özellik APL tarafından yoğun olarak kullanılmakta olup, salt okunur bir dil olarak rezil ününe katkıda bulunmaktadır.

Örneklerin çoğunu http://www.tryapl.org adresinde deneyebilirsiniz .

Uzunluk 1

Abajur adı verilen karakter hem şekli hem de varlığından elde ettiğiniz aydınlanma için bir yorum getiriyor. Tarihsel olarak, bir (notu) ve (yukarı ayakkabısını) fazla çizerek yaratılmıştır .

Uzunluk 2

⍳3

Monadiç (bir argüman) işlevi (iota) ilk birkaç doğal sayının bir vektörünü oluşturur. Örneğin, yukarıda belirtilen ⍳3doğuracak1 2 3 ilk üç doğal sayının vektörünü . APL Bazı uygulamalarda, bir doğuracak 0 1 2yerine, bu değerine bağlıdır ⎕IO, i ota O rigin.

Uzunluk 3

5\3

Monadik aksine , dyadiç \(genişleme) işlevi sağdaki argümanı soldaki argüman kadar sık ​​kopyalar; Böylece, 5\3verim 3 3 3 3 3. Ne yaptığını görmek için vektör argümanları (gibi 1 2 3\4 5 6) ile oynamak isteyebilirsiniz .

Uzunluk 4

A←⍳3

Bu atar A değerine⍳3 . (sol ok) ödev operatörüdür. Bir ödev bir ifadede en soldaki şey olmak zorunda değildir; atamalar, işlev çağrıları gibi ayrıştırılır ve daha sonra kullanılmak üzere atanan değeri verir.

Uzunluk 5

∘.×⍨A

Üçe üç çarpım tablosu, yani

1 2 3
2 4 6
3 6 9

Bu biraz karışık, o yüzden açıklamama izin ver. ⍺∘.f⍵(okuyun: omega f alfa zerre nokta) olduğu ile dış ürün içinde ve üzerinde f. Dış ürün uygulanması sonucu bir tablodur felementlerin her bir muhtemel çiftine ve . Bu örnekte, bir çarpım tablosu veren f, ×(çarpma) ' dır . Operatör (yaklaşık işareti iki noktalı) HafiflettiDİYARBAKIR yani, bağımsız değişkenlerini ⍺f⍨⍵eşittir ⍺f⍵ve f⍨⍵sol işlenen eşittir olmadan ⍵f⍵. Gidip operatör olmadan bu snippet olacaktır a∘.×a. Dış ürün operatörü çok yönlüdür; Eğer yerine ne olur kontrol =için ×!

Uzunluk 6

{×/⍳⍵}

Faktoring işlevi. Kıvrımlı parantez çifti bir dfn (dinamik fonksiyon), yani isimsiz bir fonksiyon (cf. lambda ifadeleri) içerir. Bir dfn argümanları değişkenlere bağlıdır ve ya da sadece dfn bir monadiç (denir, dyadiç, iki argüman yerine, tek bir argüman) fonksiyonu olarak adlandırılırsa bağlanır . Biz uygulamak gelen tamsayılar hasıl sağdaki argümanına 1için . /(Çizgi) operatörü, yani azaltır f/⍵uçlar farasında öğeler arasında . Mesela, +/⍳5sadece 1+2+3+4+5. Bu durumda, sadece faktör olan ×kalemlerin çarpımını vererek azaltacağız .⍳⍵

Uzunluk 7

2×3*4+5

Verim 39366. ⍺*⍵(Alfa yıldızı omega) gücüne yükseltilir . APL'nin çok basit bir öncelik kuralı vardır: Her şey sağdan sola değerlendirilir, tüm işlevler sağ ilişkiseldir. Operatörler fonksiyonlardan daha güçlü bağlanır ve soldan sağa değerlendirilir. Bu nedenle, yukarıda açıkça parantez içindeki ifade, normalin 2×(3*(4+5))aksine yazılacaktır (2×(3*4))+5.

Uzunluk 8

¯1+3 3⍴A

Bu pasajın getirileri

0 1 2
3 4 5
6 7 8

ve iki önemli kavramı gösterir: İlk kavram, sağ argümanını sol argümanında belirtilen şekle yeniden şekillendiren (rho) fonksiyonudur . Bir dizinin şekli, dizideki her eksenin uzunluğunun bir vektörüdür. Bir skaler şekli boş vektördür. Böylece, üçe üç matris halinde yeniden şekillenir . İkinci konsept, burada eklemenin nasıl kullanıldığı: ekleriz3 3⍴AA¯1¯ negatif sayıları belirtmek için bir önek -, bir operatör ise) bir diziye . İki işlenen farklı şekillere sahiptir, bu nedenle daha az şekle sahip olan işlenen, diğer işlenene dağıtılır ve üretilen matristeki her maddeden birinden çıkarılır.

Uzunluk 9

+.×⍨3 3⍴A

A, 3'e 3'lük bir matrise yeniden şekillendirildi, kendisiyle çarpıldı. .(Nokta) operatörü iki işlev alır ve bir inşa iç ürün ilk fonksiyonu temsil eder, ilave ve ikinci fonksiyon çarpma. Düz, eski, matris çarpımı, +.×ortak bir varyanttır ≠.∧(burada eşit değildir ve (yukarı karesi) mantıklıdır) ve boole matrisleri için; çok ilginç şeyler yerine belirli operatörleri ile bir iç ürün olarak modellenebilir +ve ×.

Uzunluk 10

(.5×⊢+÷)⍣≡

(okuma: sol parantez nokta beş çarpma sağ-üst artı sağ parantezi yıldız-diæresis aynı bölme) Babylon yöntemini kullanarak bir gerçek karekökünü hesaplayın . Sol argüman karekökünü hesaplamak istediğiniz sayıdır, sağ argüman karekök için ilk tahmindir. Başlangıçta anlamlı bir başlangıç ​​tahminde bulunmak istedim, ancak karakterlerin tükendi ( sayının kendisini ilk tahmin olarak kullanmak için ekle).

Peki bu nasıl çalışıyor? Önce soldan başlayalım (.5×⊢+÷). Bu ifade, J'den kaynaklanan ve daha sonra Dyalog APL'ye geri aktarılan gizli notasyonu kullanır . Tacit notasyonu yeni başlayanlar için biraz zor, bu yüzden lütfen bu bölümü dikkatlice okuyunuz. +/÷≢“Normal” ayrıştırma kurallarının konuşmanın tek bir bölümüne çözemediği izole edilmiş bir sıraya tren adı verilir. İki veya üç işlevden oluşan bir tren bir işlev üretir ve (tekrarlanan çözünürlükte), herhangi bir uzunlukta bir işlev dizisi de bir işlev üretir. Üç fonksiyonların Bir tren fghgibi davranır {(⍺f⍵)g⍺h⍵}yani, fve huygulanır Oluşan fonksiyonu ve bunların sonucunun argümanları uygulanır g. Bir dizinin treni ve iki işlevAfgBunun gibi {Af⍺g⍵}, gsonuçta ortaya çıkan işlevin argümanlarına uygulanır Ave o sonuç da uygulanırf. İki işlevli bir trenin de bir semantik vardır, bu belgelerde açıklanmıştır ancak bu örnekte kullanılmamıştır.

Bu özel trende, yeni bir fonksiyon (sağ vuruş) kullanılır. {⍵}Doğru argümanı ortaya çıkaran gibi davranır . Böylece, tüm ifade eşittir{.5×⍵+⍺÷⍵} , bu sadece Babil formülünün yineleme basamağıdır. Yapışkan gösterimin golfçüye nasıl bir fayda sağladığını görmek kolaydır; Uygulanabildiği durumlarda epeyce değerli karakterleri tıraş etmenize olanak sağlar.

Bulmacanın son parçası (yıldız diæresis), güç operatörü. Sağ değişken bir dizi ise, f⍣A⍵geçerli fiçin toplam Asüreleri. Örneğin f⍣3⍵, eşittir fff⍵. Sayım negatif olabilir; bu durumda APL, ters bir işlevi çıkarmaya çalışır fve bunu uygular. Doğru argüman ise bir fonksiyondur de f⍣g⍵geçerlidir fetmek kadar (fY)gYnerede Ytekrarlanan uygulama sonucudur fiçin . Özellikle, eğer gbir =(eşit) ya da (aynı), f⍣≡bir hesaplar düzeltme noktası arasındaf. Babil usulü için tam da ihtiyacımız olan şey bu! Sonuç bir araya gelinceye kadar tekrar etmek istiyoruz. Son olarak, şeylerin bir çift bir diyadik fonksiyonu olarak çağrılır uygulanan sol argüman bağlıdır fyani solda ⍺f⍣g⍵eşittir (⍺∘f)⍣g⍵nerede A∘fgibi davranır {Af⍵}.


Daha fazla oy aldın! Biraz daha alabilir miyiz?
kullanıcı

@luserdroog Tabii, biraz daha düşüneyim.
FUZxxl,

Bunu düzenleyip uzatabilir miyim?
Adám

@ Adám Evet, lütfen.
FUZxxl

∘.×⍨a bana bir değer hatası veriyor . Doğru kullanıyor muyum?
Cyoce,

37

Matlab

Snippet 26 - matrisler üzerinde yineleme

Bu daha yeni keşfettiğim bir şey. Genellikle döngüler için verilen bir vektör üzerinde yinelenirsiniz. Fakat vektörler yerine, matrisleri de kullanabilirsiniz ( rand(10)0 ile 1 arasında eşit dağılmış sayılarla 10x10'luk bir matris üretir).

for k=rand(10);disp(k);end

Bu daha sonra her yineleme için rastgele matrisin bir sütun vektörünü görüntüler.

Snippet 25 - kolay çizim

Biz çizim Matlab'de kolaydır biliyorum ama bir süper kolay işlevi yoktur ezplot( E-Zbunu elde nihayet aldım kadar yazıldığından gibi oldukça zaman aldı? ZHer zaman olduğu gibi sedyerine c, her neyse ...) Herkes eliptik eğriler sever:

ezplot('y^2-x^3+9*x-10.3')

eliptik eğri

Snippet 24 - entegrasyon

Entegrasyon için kullanılan eski moda kelime (ancak sayısal hesaplamada hala kullanılıyor), 'dörtlü' dır, izleyenin sonucunun ne olduğunu tahmin edebilir misiniz?

quad(@(x)4./(1+x.^2),0,1)

Metin Parçacığı 23 - resimler

Tabii ki Matlab, görüntülerle çalışmak zorunda olan bilim adamları arasında da çok popüler (örneğin tıbbi görüntü analizi), bu yüzden işte çok kullanışlı bir işlev. İlk argüman görüntüdür, ikincisi açı ve burada üçüncü isteğe bağlı argüman, işleve onu orijinal boyutta kırpmasını söyler.

imrotate(rand(99),9,'c')

İşte

Snippet 22 - müzik

load handel;sound(y,Fs)

Bunun hakkında ses çıkacak (youtube bağlantısı)

Snippet 21 - farklılaştırın ve entegre edin

polyint(polyder(p),c)

Bu iki işlevi kullanarak polinomları kolayca ayırt edebilir ve entegre edebilirsiniz. Entegre ederken, sabit olacak ikinci bir argüman geçebilir.

Snippet 20 - polinomlara geri dön

p=poly(r);cp=poly(A)

Kökleri içeride olan polinomu ister rmisiniz? Kolay: p=poly(r). Bir matrisin karakteristik polinomunu ister Amisiniz? Kolay: cp=poly(A). Yani roots(p)tam olarak r(ya da bir permütasyon r).

Snippet 19 - başka bir sihir numarası

fminsearch(fun,x0);

Bu işlevi kesinlikle seven insanlar var. Bu temelde fun, başlangıç x0koşullarında minimum bir değeri (vektör olabilir) üzerinde hiçbir koşul olmadan arar fun. Bu, hata / ceza / amaç işlevini ayırt edemediğiniz (veya çok tembel olduğunuz) küçük modellerin yerleştirilmesi için harikadır. Herhangi bir varsayımda bulunamayacağınız fonksiyonlar için oldukça hızlı olan Nelder-Mead simplex algoritmasını kullanır .

Snippet 18 - polinomlara giriş

p=polyfit(x,y,deg)

Matlab, polinomlarla başa çıkmak için güzel bir çözüme sahiptir. En polyfitküçük kareler degile puanlara yaklaşan derece polinomu elde edersiniz x,y. pPolinomların katsayılarını saklayan bir vektör elde edersiniz , çünkü polinomu temsil etmek için ihtiyacınız olan tek şey budur. Eğer 15. parçacığa geri dönerseniz, aynı şeyi yazarak da yapabilirsiniz c = polyfit(x,y,2). Örneğin [1,-2,3], polinomu temsil ederx^2 - 2*x+3 . Tabii ki, diğer temel veya keyfi işlevleri yerine getirmek için işlevler de vardır.

Metin Parçacığı 17 - açılar ve süreksizlik

unwrap(angle(c))

Eğer 'sürekli' karmaşık sayılar vektörünün argümanını elde etmek istiyorsanız, genellikle süreksizlik gibi görünen değerleri geri alırsınız. Örneğin angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])alırsınız [-2.94,-3.04,3.14,3.04,2.94]çünkü anglesadece arasındaki açıları döndürür -pive pi. Fonksiyon unwrapbununla ilgilenecek! Eğer böyle bir süreksizlik olursa, 2*pibunları kaldırmak için sadece bir kaç tane ekleyecektir : '[-2.94, -3.04, -3.14, -3.24, -3.34]' Bu 2d-matrislerde bile işe yarar! Sadece karmaşık sayılar argümanını negatif bir kısmıyla çizerseniz, ilk grafikleri elde edersiniz, ilk görüntüyü alırsınız, paketini açarak ikincisini alırsınız:

açmadan paketiyle

[x,y] = meshgrid(-1:0.01:0,-0.5:0.01:0.5);
z = x+i*y;
imagesc(angle(z))
imagesc(unwrap(angle(z)))

Snippet 16 - skaler ürün

[1;2;3]'*[4;5;6]

Tabii ki yöntemler (benzeri dot) inşa edilmiştir , ancak matris-dönüşüm operatörü ile 'bu kadar basittir. Satır veya sütun vektörleriniz olup olmadığını bilmiyorsanız, yalnızca her zaman bir sütun vektörünü döndüren a(:)'*b(:)yerleri kullanabilirsiniz a(:).

Parçacığı 15 - doğrusal en küçük kareler, sihirli değnek ile çirkin yöntemi

[x.^2,x,x.^0]\y

xx eksenindeki ydeğerlerle, gürültülü y değerleriyle (sütun) vektörüdür . Yazın c=[x.^2,x,x.^0]\yve 2. derece polinom katsayılarını olsun. Elbette, matlabın milyarlarca yerleşik yerleşik işlevinden birini kullanabilirsiniz (ne kadar sıkıcı) neden sihirli değneği kullanmıyorsunuz? =)

x = (-1:0.1:2)';
y = 3*x.^2-2*x+1+randn(size(x)); %add some gaussian (normal) noise
A = [x.^2,x,x.^0];
c = A\y              %output: c = ]3.0049; -2.3484; 1.1852]
plot(x,y,'x',x,A*c,'-')

linreg

Metin Parçacığı 14 - grafikler

gplot(graph,x)

Bir grafik bu şekilde çizilir. graphkare bitişik bir matris xiçermeli ve her düğümün koordinatlarını içeren bir nx2 matrisi olmalıdır. Hadi rastgele bir grafik graph = triu( rand(8)>.7)yapalım : (ilginç bir grafik için sadece üst üçgeni almak için 0s ve 1s içeren bir Matrix yapın). x = rand(8,2)sonra bazı fantezi stilleri ile arsagplot(graph,x,'k-.d')

grafik (Bunu modern sanat olarak ilan ediyorum.)

Snippet 13 - meshgrid

meshgrid(a,b)

Bu en basit fonksiyonlardan biridir, basit ama kullanışlı. İki değişkene bağlı olarak gerçek bir değerli fonksiyon çizmek istiyorsanız, sadece x ekseni için bir vektör ve y ekseni için bir değer tanımlayabilirsiniz (a ve b). Daha sonra meshgrid ile, len (a) x len (b) boyutunda iki matris oluşturabilirsiniz; burada biri yalnızca vektör aolarak sütun olur, diğeri yalnızca sütun bsatır olarak sadece vektörlere sahiptir . Kullanım örneği: a = -3:0.2:3;[x,y]=meshgrid(a)(her iki vektör de aynıysa, yalnızca birini geçmek yeterlidir.) O zaman sadece yazabilirsiniz z=x.^2+-y.^2ve örn.mesh(x,y,z). Bu, isteğe bağlı sayıda boyut için işe yarar! Yani bu sadece komplo yapmak için değil, aynı zamanda farklı vektörlerin tüm olası kombinasyonlarını elde etmek için de ... (Eğer yeni bir kod golf dili oluşturmak istiyorsanız, bunun içinde olması gerekir, daha kısa bir süre kullandığınızdan emin olun). fonksiyon adı...)

ağ

Snippet 12 - komplo oluşturma

plot(x,x.^2)

Bir vektör al x=-3:0.5:3ve gerisini bırak plot. Bunu çizmek için çok daha fazla fonksiyon var, her zaman kullanabileceğiniz çok basit bir fonksiyon. Yazmak zaten yeterli olacaktı ve içerdiği plot(v)veriler vdizi indekslerine göre çizilecek. Bu ne kadar basit? Grafiğinizi şekillendirmek istiyorsanız, sadece üçüncü bir argüman olarak bir dize ekleyin: örneğin 'r:o', veri noktalarının etrafındaki daireleri olan kırmızı, noktalı bir çizgi yapacaktır. Birden fazla grafik istiyorsanız, sadece daha fazla argüman ekleyin veya vektörler yerine matrisler kullanın. Kusursuz.arsa

Snippet 11 - işlev kolları

f=@(x,y)x+y

Bu, içinde depolanan bir işlev tanıtıcısının bir örneğidir f. Şimdi arayabilir f(1,2)ve alabilirsiniz 3. Matlab'daki işlev tutamaçları matematik işlevleri için çok yararlıdır (örn. Çizim) ve bunları tek bir satırda tanımlayabilirsiniz. Ancak bir dezavantajı şartsız veya parçalara sahip olamayacağınızdır (ve bu nedenle özyineleme yok). Bunu istiyorsanız, functionifadeyi kullanmanız ve yeni bir işlev bildirmeniz gerekir ve bunların her birinin ayrı bir dosyada depolanması gerekir ... (WHYYYYYY ????)

Not: whyKonsola girerseniz başka bir eğlenceli paskalya yumurtası alacaksınız: Şunun gibi rastgele mesajlar üreten dev bir fonksiyon yaptılar:

The tall system manager obeyed some engineer.
The programmer suggested it.
It's your karma.
A tall and good and not excessively rich and bald and very smart and good tall and tall and terrified and rich and not very terrified and smart and tall and young hamster insisted on it.

... konsola soracak kadar çaresizseniz why...

Metin Parçacığı 10 - Matrisim nasıl görünüyor?

spy(eye(9))

Bildiğiniz gibi şimdi eye(9)9x9 kimlik matrisi oluşturur. spysadece matrisin sıfır / sıfır olmayan girişlerini gösteren bir tane oluşturur. Ancak, herhangi bir ikili 2d verisini görüntülemek için de kullanabilirsiniz. Eğer spytartışmasız çağırırsanız hoş bir paskalya yumurtası alırsınız =)

kimlik casusluğu casus easteregg

Metin Parçacığı 9

kron(a,b)

kronİşlev değerlendirir Kronecker'in ürün iki matrisler. Ayrıklaştırılmış çok boyutlu doğrusal operatörler için bu çok kullanışlıdır. Her zaman ve sonra kod golf oynamak için de kullandım. Sen girişlerinin tüm olası ürünler istiyor ave b? kron(a,b), Hadi bakalım.

Metin Parçacığı 8

5*a\b.*b

Tamam burada 3 farklı operatör karıştırdım. Herhangi bir matrisi yalnızca kullanarak bir skalar ile çarpabilirsiniz *. (Ardından matrisin her girişi o skaler ile çarpılır). Ancak *, aynı zamanda matris çarpımı gerçekleştirir. Bir nokta hazırlarsanız, .*operatörü elde edersiniz , bu aynı büyüklükteki iki matrisi çarpar ama giriş bilgedir . (Bu, /ve gibi bölüm operatörleri ile de yapılabilir \.)

Daha sonra, ters eğik çizgi operatörü sol bölme olarak kullanılabilir (aksine kullandığınız /doğru bölme işlemini gerçekleştiren aksine ), ancak aynı zamanda matlabın en güçlü ve karakteristik operatörüdür: 'Matris bölme' gerçekleştirir. Diyelim ki doğrusal denklemler sisteminiz var ve A*x=bçözmek istediğiniz için x, o zaman sadece yazabilirsiniz x=A\b. Ve \(ayrıca kullanabilirsiniz /ancak bu matrisler için daha az yaygındır) ilk önce matrisi hızlı bir şekilde analiz eder ve bu inversiyon çarpımını gerçekleştirmek için en hızlı algoritmayı bulmak için sonuçları kullanır! (Bkz. Örneğin buraya )

Ancak, az veya çok tanımlanmış sistemler için de kullanabilirsiniz (burada ters yok veya matrisin kare olmadığı yerlerde, örneğin en küçük kareler yöntemi için). Bu gerçekten de matlabın sihirli değneği .

Metin Parçacığı 7

[a,b;c]

Tamam, pek bir şeye benzemiyor ama çok uygun bir araç: Matrix birleştirme. İki ifade arasındaki virgül, yatay olarak birleştirilmeleri (aynı yüksekliğe sahip olmaları gerektiği anlamına gelir) anlamına gelir ve bir noktalı virgül önceki 'satırın' sonraki satırın üstünde olacağı anlamına gelir (satır I ile iki noktalı virgül arasındaki her şey anlamına gelir). Sadece basit bir örnek: a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];aynı sonuçlanacaktır dolarak d=[1,2,5; 3,5,6; 7,8,9](alın?).

Kesilmiş 6

eye(7)

Bu fonksiyon tam 7x7 kimlik matrisi üretir. Bu kadar kolay. nan,inf,ones,zeros,rand,randi,randnAynı şekilde çalışan başka fonksiyonlar da var. (İki argüman iletirseniz, sonuçta elde edilen matrisin yüksekliğini / genişliğini ayarlayabilirsiniz.) Daha sonra göstereceğim gibi, kolayca yaratabilir ve (ve çok görsel bir şekilde) çok faydalı olan matrisleri (2d dizileri) birleştirebilir ve kısmi diferansiyel denklemleri sayısal olarak çözmek zorunda kalırsanız kolaydır. (PDE'leri çözdüğünüzde genel yaklaşım türev operatörleri için isteğe bağlı değildir, temel olarak çözülmesi gereken çok büyük bir doğrusal denklem sistemi elde edersiniz. Bu matrisler normalde seyrektir (sadece çok az olmayan elementler) ve bir çeşit Bu yüzden ihtiyacınız olan matrisi 'kolayca oluşturabilirsiniz'.

Metin Parçacığı 5

a(a>0.5)

Umarım dizilere erişmenin tüm yollarından bıkmazsınız. Bu, bazı koşullara uyan bir dizinin tüm öğelerini almanın kolay bir yolunu gösterir. Bu durumda, bütün elemanların bir vektörünü a0.5'ten büyük alırsınız . İfade a>0.5sadece akoşulu sağlayan her öğe için olanlarla aynı olan ve aynı olmayan her öğe için olan ile aynı boyutta bir matris döndürür 0.

Metin Parçacığı 4

a(:)

Bu yine sadece abir sütun vektörünün içeriğini döndürür (nx1 matrisi). Verilerinizi sütun ya da satır vektörü olarak depolayıp saklamadığınızı veya verilerinizin iki boyutlu olup olmadığını bilmiyorsanız (örneğin 2d sonlu farklar yöntemleri için) bu çok iyidir.

Metin Parçacığı 3

1:9

Noktalı virgül operatörüyle kolayca vektörler yapabilirsiniz (bu durumda 1xn matrisler). Bu durumda vektörü alırsınız [1,2,3,4,5,6,7,8,9]. Bu aynı zamanda, örneğin vektörün a(2:4)ikinci, üçüncü ve dördüncü elemanına erişen diğer vektörlerin dilimlerine erişmek için özellikle iyidir a. Ayrıca, 0:0.5:10ya da böyle bir adım boyutu ile kullanabilirsiniz .

Metin Parçacığı 2

i;

Bir noktalı virgül konsolu çıktıyı bastırır. Bunu iyi veya kötü bir şey olarak görebilirsiniz, ancak hata ayıklamak için hoşuma gidiyor. Herhangi bir hesaplama vb. Sonucu çıktıyı noktalı virgülle bastırmadığınız sürece, sonuçları otomatik olarak konsola yazdırır.

Metin Parçacığı 1

i

Karmaşık sayı, temel sayı türüdür. (Çok fazla kişi i, bu durumda geçersiz kılınan döngüler için sayma değişkeni olarak kullanılır .)

giriş

Bilmeyenler için, MatLab, öncelikle nümerik hesaplamalar * ve veri manipülasyonu için amaçlanan bir programlama dilidir (MatLab? Olarak da adlandırılan hoş IDE'ye sahip). ("Octave" olarak adlandırılan açık kaynaklı bir meslektaşı var.) Sadece ** yorumlandığı için çok hızlı değil, ancak gücü matrisleri kolayca değiştirebiliyor olmanız ve birçok algoritmanın oldukça hızlı çalışacak şekilde optimize edilmiş bir şekilde uygulanması matrislere uygulandığında. Aynı zamanda öğrenmesi çok kolay bir dildir, ancak oldukça kötü bir 'programlama' alışkanlığı varsayacağınız için başlangıç ​​dili olarak önermiyorum.

* Tercüme edilmiş bir dil olduğu için pahalı projeler için çok yavaş olabilir, ancak yerleşik paralelleştirme yöntemlerine sahipsiniz ve ayrıca bir programı çalıştırmak için birden fazla bilgisayarı birlikte kullanabilirsiniz. Ama gerçekten hızlı olmak istiyorsan hala C ya da Fortran'a ya da bunun gibi çılgınca şeylere güvendiğini düşünüyorum. Ancak yine de birçok uygulanmış algoritma (matris çarpımı, doğrusal denklem sistemlerinin çözümü vb.) Yoğun şekilde optimize edilmiştir ve oldukça iyi performans göstermektedir. Fakat aynı algoritmaları Matlab'da da programlarsanız, beklemeniz gerekecek =) (Diğer dillerden geldiğinizde çok garip bir şey olması, işlemlerinizi döngüler için kullanmak yerine vektörelleştirmeniz durumunda Matlab'da çok zaman kazanmanız gerektiğidir. .)

** Programlarınızı derleyebilirsiniz, ancak bu genellikle kaynak kodunu okunamayan bir dosyaya dönüştürür (insanlar için), bu çalıştırıldığında daha hızlı değildir.


1
Bu sorunu çok sık görüyorum ... bir işeye ayarlıyorum ve sonra karmaşık ünite olmadığında beklenmeyen davranışlar yaşıyoruz .
feersum,

3
Güzel paskalya yumurtası! Eğer 'edit spy' yazarsanız, obfuscation :-) koduna bir örnek bulacaksınız
Abulafia

1
Bunu oylamaya gittim ve daha önce sahip olduğumu farkettim. Ne yazık ki, bir kez daha oy kullanabilseydim. Gelmelerini sağla, @flawr!
Alex A.

2
Gösterilecek şeylerden ilham alıyorsanız , Mathworks blogunu önerebilirim : MATLAB'ın Sanatı Üzerine Loren Vershure Genellikle karakter sınırı içinde gösterilebilecek en iyi uygulamaları tarif eder. Seyrekler için düşünün Matlab'ı Terk ve belgesiz fonksiyonları ve özellikleri için gidebilirsin Yair Altman tarafından Undocumented Matlab
Dennis Jaheruddin

1
@ flawr - Factoid için, tarihsel olarak, MATLAB'ın New Mexico Üniversitesi Bilgisayar Bilimi öğrencileri için yaratılmış olduğu zamanlar için (Aslen Moler, o sırada başkandı), LINPACK ve EISPACK (... şimdi LAPACK tarafından yerini aldı ) FORTRAN'ı öğrenmek zorunda kalmadan .... ve kullanım kolaylığı nedeniyle, diğer akademik kurumlara çok hızlı bir şekilde yayıldı :)
rayryeng

35

CJam

Aşağıdaki parçacıkları burada deneyin

Uzunluk 20 pasajı:

q~{]__~z\z<=\~*0>*}*

Bir min-mod hesap makinesi . Sorudan bir alıntı:

Minmod fonksiyonu bilinen bir çeşididir dakika kısmi diferansiyel denklemler eğim sınırlayıcı yüksek çözünürlüklü şemalarında görünür. Birkaç eğim verildiğinde, eğimler arasındaki göreceli işaretlere bakarken en düz eğimi seçer.

Fonksiyon isteğe bağlı sayıda parametre alır. Sonra minmod (x 1 , x 2 , ..., x n ) şöyle tanımlanır:

  • dk (x 1 x 2 , ..., x n ) , tüm x eğer ben kesinlikle olumludur
  • max (x 1 x 2 , ..., x n ) , tüm x eğer ben kesinlikle olumsuz
  • Aksi halde 0 .

Uzunluk 18 pasajı:

l'[,65>Dm>_el+_$er

Bir ROT13 kodlayıcı. a-zA-ZSTDIN aracılığıyla yalnızca giriş dizesindeki karakterleri kaydırır

Uzunluk 15 pasajı:

T1{_2$+}ri2-*]p

STDIN aracılığıyla bir giriş olarak sağlanan Nbir Fibonacci serisinden ilk numaraları basmak için eksiksiz bir program N.

Uzunluk 12 pasajı:

{{_@\%}h;}:G

Basit bir GCD işlevi. Bu 2706 410 G, GCD'yi istiflemek için kullanılabilir.

Uzunluk 11 pasajı:

123456 789#

#güç operatörüdür. Bu kod parçası, neredeyse tüm matematiksel işlemler için BigInts'ı destekleyen CJam'ın harika bir özelliğini gösterir. Yani yukarıdaki kodun çıktısı

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

Uzunluk 10 pasajı:

"`%W_"_W%`

Biz zaten quine yaptık, onu tersine çevirelim! Bu CJam'daki en kısa ters quine biridir. Ters quine, kaynak kodunu ters sırada basan bir quinedir.

Uzunluk 9 pasajı:

5,K,+_&S*

Bu snippet, CJam’ın birçok özelliğini sergiliyor.

5, "create an array of numbers 0 to 4"
K, "create an array of numbers 0 to 19"
+  "List concatination"
_  "Duplicate top stack element"
&  "Set distinct operator in this case"
S* "Join array elements with space character"

Uzunluk 8 pasajı:

"`_~"`_~

CJam'daki mümkün olan en küçük sorgulardan biri. Bu, kaynak kodunu hiçbir şekilde okumaması anlamında gerçek bir inattır. (Kaynak kodu okumak CJam'da bile mümkün değil)

Uzunluk 7 pasajı:

"AB"_m*

m*ilk iki yığın elemanının tüm Kartezyen ürünlerini yaratır. Örneğin, yukarıdaki kod koyacaktır ["AA" "AB" "BA" "BB"]kartezyen ürünü olan, yığında "AB"ve "AB".

Uzunluk 6 pasajı:

"_~"_~

Güzel görünümlü tekrarlanan kod. Bunu çalıştırmayın :). Bu kod gösterimi, CJam'daki en basit quine için temel oluşturur. "_~"Dizeye yığının üstüne koyulur , bir kopya ( _) yapılır ve onu değerlendirirsiniz. Sırayla, aynı özyinelemeli istisnaya ulaşana kadar aynı şeyi (ve tekrar ..) yapar.

Uzunluk 5 pasajı:

{A}:F

Temel bir fonksiyon CJam'da böyle çalışır, Yukarıdaki ifade, kod bloğunu {A}değişkene atar F. Şimdi kodunuzda, Fkod bloğunu çalıştırmak için herhangi bir yere koyabilirsiniz (ve 10bu durumda)

Uzunluk 4 pasajı:

"A"~

Herhangi bir kod bloğunu veya dizesini, hatta tek bir karakteri kullanarak değerlendirebilirsiniz ~. Yukarıdaki ifade sonuçlanır10

Uzunluk 3 pasajı:

Kmr

0 ila K20 arasında bir tipik rasgele sayı üreteci .

Uzunluk 2 pasajı:

es

Bu, geçerli zaman damgasını verir (çağdan milisaniye). CJam ayrıca, etyerel saat için geçerli zamanın çeşitli bölümlerinden (gün, saat vb.) Oluşan bir dizi döndüren daha kullanışlı bir biçimde de vardır.

Uzunluk 1 pasajı:

A

CJam, neredeyse tüm büyük harflere önceden tanımlanmış değişkenler olarak sahiptir. A, 10 B11 ve kadar Kolan 20 Polduğunu pi (3.141592653589793), Nyeni hattı ve bir diğerleri . Bunlar değişkenlerde başlangıç ​​değerlerine ihtiyaç duyduğunuzda veya 1 byte'ta iki basamaklı sayıya ihtiyacınız olduğunda bile çok kullanışlı olabilir.

Uydurma

CJam, GolfScript'ten ilham aldı ancak bir şebeke GET çağrısı desteği de dahil olmak üzere bunun üzerine birçok özellik oluşturuyor

Not: Yanıtı her 5 oyunda bir veya her 2 saatte bir (her zamankinden daha erken) güncellemeye çalışacağım


ROT13 örneğinizle ilgili bazı problemler var: p Ama kesinlikten etkilendim, sanırım ödünç alacağım :)
aditsu

@ditsu sorunu nedir?
Doktor,

Nz harfinin durumunu değiştirir. Ayrıca, bir sebepsiz yere @ vardır, yerine D koyabilirsiniz.
aditsu

@aditsu Onun bir a-zA-Z aralığında bir ROT 13 olduğundan ve durum değişikliğinin sebebi olduğundan emin. Okuyamıyor musun? sadece kendi diliniz: P @ var 18 karakter var sanırım: D
Doktor

ROT13 normalde böyle yapmaz. Neden kendi dilimi okuyabiliyorsam sorduğumu anlamıyorum, mesele programın ne yaptığını anlamak değil, bekleneni yapmamasıdır.
aditsu

34

Ortak Lisp

Lisp (LISt Processing'den), günümüzde hala kullanılan en eski dillerden biridir (sadece FORTRAN daha eskidir). Kodun veri olduğu ve verilerin kod olduğu ilk dil olması dikkat çekicidir; Homoconicity denir. Ayrıca çöp toplayan ilk dildi. Aslen John McCarthy tarafından 1958 tarihli bir makalede tamamen teorik bir dil olarak tasarlandı, Steve Russel'in değerlendirme işlevinin bir bilgisayarda uygulanabileceğini fark etmesi gerçek bir dil oldu. Yapay Zekada en yaygın olanıdır ve parantezlerin üstünlüğünden anında tanınır. Common Lisp, birçok eski Lisp lehçesini daha standart bir biçimde birleştirmek için tasarlanmıştır.

Her parçacığın kendi başına çalıştırılabilir olmasına çalışacağım, ancak mutlaka değerli bir şey yapmam. Ek olarak, Common Lisp kullandığım için temel kavramlar ve birçok sözdizimi diğer lehçelerde de geçerlidir, ancak bazı işlevler Scheme'de işe yaramaz.

Uzunluk 1

*

S-İfadeleri ve kodlama listelerinin kullanımına verilen önem nedeniyle, Lisp'te atom denilen parantez içermeyen çok az geçerli ifade vardır. Doğrudan REPL'e (okuma-değerlendirme-baskı döngüsü) yazılan her şey bir değişken olarak değerlendirilir ve bu şekilde değerlendirilir. *REPL tarafından basılan önceki değeri tutar.

Uzunluk 2

()

Bu, Lisp'teki en önemli sembollerden biri olan boş liste. Lisp'teki her uygun liste, C'deki her uygun dizgenin bittiği gibi, boş bir liste ile sonlandırılır \0.

Uzunluk 3

(*)

Bu, parantez içine alınmış bir sembolden oluşan temel bir işlev çağrısıdır. Lisp operatör içermiyor, onlar da sadece fonksiyon. Özellikle çarpma fonksiyonunu seçemediğim için çarpımı seçtim; Lisp'deki çarpım operatörü belirsiz sayıda argüman alır. Herhangi bir argüman verilmezse 1, döndürme için kimlik operatörü.

Uzunluk 4

`(1)

Bu, bir çift element olduğunu söylemenin başka bir yolu olan bir eksenidir. Lisp'te, her liste, birinci elemana (the car) değer olan ve ikinci elemana ( cdr), bir sonraki cons hücreye işaret eden cons hücrelere bağlı cons hücreden oluşur. Bu, Lisp'in bağlantılı listelerine dayanmasının temelini oluşturur. Bu belirli eksileri hücre 1araba gibi ve cdr gibi boş bir liste vardır.

Uzunluk 7

(not t)

Lisp'teki doğruluk değerlerine değinmek istiyorum. Bu geri dönecekti nil. Common Lisp'te tgerçek zamanın sembolüdür nilve ()yanlış temsil eder ve birbirlerine eşittir, ancak bu tanımın tüm Lisp lehçeleri için standart olmadığını unutmayın; Örneğin, şema #fyanlış '()için boş liste arasında ayrım yapar .

Uzunluk 9

(cdr ())

Daha önce de söylediğim gibi, cdr, fonksiyonla birlikte alabileceğiniz bir listenin kuyruk elemanıdır cdr. Aynı şekilde, fonksiyonuyla birlikte baş elemanı, araba alabilirsiniz car. Oldukça basit değil mi? Boş listenin arabası ve cdr ikisi de nil.

Uzunluk 10

(cons 1 2)

Son olarak, listelerle çalışmaya başlamak için yeterli uzunluk. consbirinci parametre ile araba, ikincisi ise cdr ile bir cons hücresi oluşturur. Ancak yazdırmak yerine (1 2)verir (1 . 2). Uzunluk 2 snippet'ine geri dönersek, boş listeyle sona ermesi gereken uygun bir listenin olması gerekir, böylece son eksiler hücresinin cdr'ı boş listeyi göstermelidir. Bu durumda, son eksiler hücresi işaret eder 2, bu yüzden Lisp bize yanlış bir listemiz olduğunu bildirir, ancak hala bir C-string'i nasıl yapabildiğiniz gibi yapmamıza izin verir \0.

Uzunluk 11

(cons 1 ())

Şimdi ilk doğru şekilde oluşturulmuş listemizi oluşturduk. Bir araba 1ve bir cdr ile tek bir eksilerini hücre (). Diğer her liste için, onu bir geri alıntı / kene ile yönlendirdiğimi fark edeceksiniz; Herhangi bir başka uygun liste, ilk argümanını, kalan elemanlarla birlikte bir parametre olarak değerlendirmeye çalışacaktır. Açıkçası, ()olsa bir liste değil; boş listeyi temsil eden a (ve a dan oluşan bir sembol ). Lisp, herhangi bir basılabilir karakteri bir sembol adında kullanmanıza izin verir ve istediğiniz herhangi bir sembolü yeniden tanımlamanıza izin verir.

Uzunluk 12

(cdr `(1 2))

Bu (2), 2bazılarının tahmin edeceği gibi değil , ortaya çıkar. Unutmayın, her cdr'nin başka bir ekseni veya boş listeyi göstermesi gerekir; Açıkçası 2boş liste değil, bu yüzden bir araba 2ve bir cdr başka bir eksilerini hücre olmalıdır ().

Uzunluk 13

'#1=(1 . #1#)

Bu sadece tek değer 1 olan dairesel bir liste oluşturur. Basılırsa, sonsuza dek “(1 1 1 1 ...” yazacaktır, böylece pratikte sonsuz bir liste olarak kabul edilebilir (üzerinde cdrsonsuz zamanlar yapabilirsiniz. her zaman aynı sonucu elde etmek için, kendisi!) TGlobal değişkene atanmadıkça *print-circle*, bu durumda olduğu gibi basılacaktır #1=(1 . #1#).


Bu son düzenleme! Çabuk, birisi Beatles temalı bir esolang yapar: D
fede s.

1
@fedes. John McCarthy, Paul McCartney ... dilin adı CarthyCartney olacak.
kedi

33

GNU Yap

Bu konuda bir uzuv dışarı çıkacağım. Bu makePPCG'de ilk defa öne sürülmüş olabilir.

Uydurma

Make işlevsel bir dil olarak kabul edilebilir.

Uzunluk 0 snippet

0 uzunluk snippet'in gerekli olduğunu sanmıyorum, ama yine de bir tane var. Bu, tüm uzunluk 0 programlarının en faydalı olabileceğini düşünüyorum. Boş bir Makefile (veya hiç makefile olmasa bile), make'in hala bir sürü yerleşik kuralı vardır. Örneğin, bir .c dosyasını bir .o veya binary halinde derlemek için varsayılan yerleşik kurallar vardır. Yani yaparsak:

make hello.o

make, .c kuralını .o kuralını bulur ve merhaba.c'yi merhaba olarak derler.

Benzer şekilde yaparsak:

make goodbye

Geçerli dizinde bir elveda.c dosyası varsa, elveda ikili dosyasına derlenir.

Uzunluk 1 Parçacığı

TAB

Evet, SEKME karakteri. Bu kendi başına fazla bir şey yapmazken, Make’de büyük öneme sahip. Özellikle, bir kuraldaki hedef tanımını izleyen tüm tarif satırları bir TAB ile başlamalıdır. Bu, TAB'ler ve boşluklar karıştığında makefile dosyalarında hata ayıklama yaparken her türlü sıkıntıya neden olur.

Uzunluk 2 Parçacığı

$@

Bu tariflerde kullanmak için otomatik bir değişkendir. Kuralın hedefinin dosya adına genişletilecektir. Orada diğer yararlı otomatik değişkenler .

Uzunluk 3 Parçacığı

a:=

En kısa basitçe genişletilmiş değişken atama. Makefile ilk ayrıştırıldığında a değişkeni derhal "" olarak ayarlanır. Aksi a=halde atama tekrarlı bir şekilde genişletilir, yani değişken aslında referans alınana kadar genişletme ertelenir.

Uzunluk 4 Parçacığı

W:;w

En kısa marjinal fayda sağlayan tam kural şartnamesi. Bu, Wsadece wshell komutunu çalıştıran kuralı olan bir hedefi tanımlar . Böylece

make W

eşittir:

w

Bu, tarifin yeni bir satırla ayrılmış aynı satırdaki hedefi izlemesi için alternatif bir kural sözdizimidir. Daha yaygın olarak, tarif çizgileri hemen ayrı bir hedef çizgiyi izler, TABkarakterleri her tarif çizgisini başlatır.

Uzunluk 5 Parçacık

$(@D)

Başka bir otomatik değişken. Benzer $@, ancak bu, dosya adı ve izleyen / kaldırılan yolun dizin bölümüne genişler.


Belki bazı dize $(basename )ya da gibi fonksiyonlar $(patsubst )? ( örn. )
kullanıcı kullanımı,

32

Marbelous

Uzunluk 14 pasajı

}0}1
Mulx
HxHx

Bu pasaj, bazı daha çok Marbelous kütüphanesini gösterir ve çok hücreli panolar gibi yeni bir konsept sunar. MulxTahta girdi olarak iki bilye alır ve 2 bilye çıkış olarak vermektedir. En solda hücreye girerek Mermerleri Mulxkarşılık gelecektir }0kuruldakilerden cihazların ve en sağdaki hücreye }1. Benzer şekilde, çıktılar da farklı hücrelerden çıkacaktır. Bir tahtanın genişliği, bir MAX(1, highest output device + 1, highest input device + 1)giriş cihazına karşılık gelmeyen hücreler üzerine düşen herhangi bir mermeri çöpe atacak şekilde hesaplanabilir .

Uzunluk 13 pasajı

7E
??
>Y!!
{0

Bu, her bir tene rastgele yazdırılabilir bir ascii karakteri yayacak bir tahtadır. Marbelous'un rasgele değerler üretmenin iki yolu vardır. Orada ??, 0 ve o dahil aldığı giriş mermer arasında rasgele değer döndüren ve ?n: ?0kadar ?Z, sırasıyla. Hangi çok benzer davranır ??. !!Tüm çıktılar doldurulmasa da panoyu sonlandıran da biz var . ?nCihazların Marbelous'taki panolarda nasıl panolar olarak kullanılabileceğini bulabiliyor ??musunuz?

Uzunluk 12 pasajı

}0}1
Fb//
Dp

Burada, Marbelous'un kütüphane fonksiyonlarını çalışırken görüyoruz. Fbn, giriş mermeri olan ns fibonacci sayısını çıkarır. Dpgirdi mermerini STDOUT'a ondalık sayı olarak basar. Bunların her ikisi de Marbelous'ta uygulanmaktadır ve çevrimiçi tercümana kütüphaneleri dahil ettiğinizi kontrol ettiğinizde çağrılabilir , python tercümanı için, her bir dosyayı açıkça eklemeniz gerekir. Bu kurulların inplementation bulunabilir github . Bu özel programın 2 giriş aldığını ve Fibonacci kartını iki kez çağıracağını unutmayın. Çağrılan kurullar, çağrılan kurulun bir onay işareti içinde iade edilir.

Uzunluk 11 pasajı

}0}0
{<{0{>

Bunun bir açıklamaya ihtiyacı var. }0Cihazların aynı sayıda (0) beri bu kurul çağrılan, onlar aynı değeri içerecektir imputs bulunmaktadır. Alt satırdaki üç cihaz çıkışlardır. {<panelin soluna, {0panelin ilk hücresinin altına {>, sağa çıkar. Çıktı, yalnızca tüm farklı çıktı aygıtları doldurulduğunda itilir. Ancak bu durumda, doğru çıkış cihazına asla ulaşılmaz. Kurul, faaliyetin yetersizliğinden dolayı çıkacak ve yine de sahip olduğu iki değeri çıkartacaktır. /\Marbelous kurulu olarak nasıl uygulanabileceğini hayal edebiliyor musunuz?

Uzunluk 10 pasajı

..40
FF
\\

Burada Marbelous'ta önemli bir rol oynayan birkaç şey var. İlk olarak, ek var. Tahtadaki iki mermerin yolunu izlerseniz, aynı hücreye aynı anda varacaklarını fark edeceksiniz. Bu olduğunda, birlikte eklenecekler. (eğlenceli gerçek: bir noktada, bir araya toplanmak yerine, mermerlerin bir yığın oluşturması gerektiği düşünüldü) Ancak, Marbelous 8 bitlik bir dildir, Bu nedenle mermer eklenmesi FFondan 1 çıkarmaya eşdeğerdir.

Uzunluk 9 pasajı

00
\\/\]]

Bu, Marbelous'taki ilkel versiyonunu uygulamanın en kısa yoludur. 00 \ / \ Her saniye kene 00üzerinde ]]cihaza değer mermer koyan bir halkadır . Bu bir STDIN cihazıdır. Bir mermer bu cihaza indiğinde, ilk karakteri STDIN'den okumaya çalışır, eğer varsa, aşağı doğru itilir (ve bu durumda tekrar basılır). Eğer bir tane yoksa, Orijinal amrble sağa doğru itilir. (ve bu durumda çöpe atıldı)

Uzunluk 8 pasajı

}0
~~
{0

Bu pasaj, birkaç özellik gösterir. İlk önce} 0 aracılığıyla girdi alır. Bu durumda bu Ana Karttır ve bu komut satırı girişi ile değiştirilecektir. Ayrıca bu işlevi çağırabilirsiniz, bu durumda, komut satırı girişi yerine argüman alınacaktır. Sonra var, biraz ~~, operatör değil. Ondan sonra ulaşırız }0, Tüm }ncihazlar doluysa, bu değerler fonksiyonların dönüş değerleri olarak döndürülür. (Marbelous, fonksiyon başına birden fazla dönüş değeri destekler)

Uzunluk 7 pasajı

00
\\/\

Bu, Marbelous'ta oluşturabileceğiniz en kompakt sonsuz döngüdür. \\Cihaz, sağa herhangi mermer iter /\kopyalar mermer ve sağa sola ve başka bir kopyasını iter. Tahta sadece iki hücreli geniş olduğundan, sağdaki mermer olsa da çöpe atılır.

Uzunluk 6 pasajı

46MB75

İşte bir özyinelemeye bir örnek, MB(örtük olarak adlandırılan ana kart her onay işaretinde çağrılır, ancak Fuher çağrıda STDOUT'a Yazdırmadan önce değil FuFuFuFuFuFu....

Uzunluk 5 pasajı

2A
++

Bazı aritmetik, Değere sahip olan mermer 2Ailk keneye düşer ve kendini ++hücrede bulur . Bu bir operatör. Bu özel operatör, üzerine inen herhangi bir mermeri artırır ve düşmesini sağlar. Mermer artık değere sahip 2Bve tahtadan düşüyor. Bu +, STDOUT'a yazdırır .

Uzunluk 4 pasajı

:
24

İki tercüman burada aynı fikirde değil, dosyanın ilk panosuna bu örnekte bir isim verdim (İsim boş bir dizedir). Python yorumlayıcısı, bunun Ana kart olduğunu varsayar ve programı çalıştırdıktan sonra bu kartı çağırır (yazdırır $). Javascript tercümanı Ana Kurulu bulamaz ve bu nedenle giriş noktası yoktur. Bu, Marbelous için bir kütüphane dosyası yazarken yararlı olabilir.

Uzunluk 3 pasajı

:Bo

Bu, adlandırılmış bir kuruldur, gövdesi olmayan, bu kurulu Boherhangi bir kurulun hücresinde ( Bokendisi de dahil olmak üzere ) Yazarak arayabiliriz.

Uzunluk 2 pasajı

3A

Bu kod, 1x1 hücrenin gövdesidir (her hücre iki karakter genişliğindedir) kartı, üstü kapalı MB(Ana kart için). 3AMermerin tahtadan düştüğü zamanın onaltılık değerinin ascii değerini yazdırır . Bu programın çıktısı kaynak kodunun böyle olması olur:

Uzunluk 1 pasajı

:

Bununla birlikte #, bu marbelous sadece geçerli 1 karakter programlarından ikisinden biridir. #bir yorumun göstergesidir, bunun için çok ilginç değildir. :mürettebata bir kurul ilan edeceğini söyledi. İki derleyiciden hiçbiri tahtayı isimlendirmemenizi veya tanımlamamanızı önemser. Program hiçbir şey yapmıyor.

uydurma:

Marbelous, bu sitedeki insanlar tarafından geliştirilmiştir, bu dilde çalışan bazı isimler Rube ve sadece Mermerler'dir .


2
beni döv. güzel pasajlar!
Sparr

boyunuzda 12 snippet iki giriş alıyor gibi görünüyor ve iki farklı fibonacci numarası yazdırıyor. Bu kasıtlı mıydı?
Sparr

@Sparr, evet, fonksiyonların biraz da Marbelous'ta nasıl çalıştığını göstermek içindi.
overactor,

belki bunu açıklamaya ekleyebilirsin? yazdıklarından, snippet'in bir girdi almasını ve bir fib numarası vermesini beklerdim.
Sparr

Umarım 40 puana
Sparr

31

ileri

Forth'un sadece iki tipi var, ints and floats (ve floats isteğe bağlıdır!) Ama yine de karakterleri, karakterleri, uzun uzun karakterleri, işaretçileri, fonksiyon işaretleyicilerini, yapılarını ve daha fazlasını elde etmeyi başarıyor; Hepsi onu nasıl kullandığınla ilgili!

Uzunluk 1

.

.Komutu (ya da çağrı olarak "sözcüğü") veri yığının üstüne tam sayı değeri yazdırır; yığın boşsa, çalışma zamanı hatası alırsınız. Aynı zamanda, değeri nasıl koruyabileceğimizi görmek için yığından - oydan çıkar!

Uzunluk 2

.s

.sKelimesinin bunların herhangi çıkarmadan, şu anda yığında değerlerini gösterir. Ayrıca toplam değer sayısını gösterir. Gforth'da, .svarsayılan olarak yalnızca ilk 9 değeri göstermekle sınırlıdır; belki nasıl daha fazlasını göstereceğimizi öğreniriz?

Uzunluk 3

see

Tip seeherhangi Forth kelimesi ardından bu kelimenin kaynak kodunu görmek için. Çoğu Forth kelimesi Forth'un kendisinde tanımlanmıştır ve montajda yalnızca birkaç ilkel tanımlanmıştır.

Uzunluk 4

1 0=

Forth'un postfix operatörleriyle yığına dayalı bir dil olduğunu söylemiş miydim? Yazma , yığına 1 0=iter 1ve daha sonra yığından 0=en yüksek değeri çıkaran sözcüğü çalıştırır ve trueeğer değilse, 0'a eşitse bastırır false. 0=bunun için uygun bir kelimedir 0 =; Orada gibi yaygın değer + kelime kombinasyonları için böyle birkaç stenografi sözleri, 1+ve 0<>. Dahası, falseForth'da 0 iken ve sıfır olmayan herhangi bir değer doğruysa, yerleşik test sözcükleri truegerçek sonuçlar için geri döner ve truetüm yolu gider - bu, tüm bitlerin ayarlandığı değerdir, yani -1!

Uzunluk 5

-1 u.

it -1Yığının üzerine , sonra çıkarın ve işaretsiz bir tamsayı olarak yazdırın. Bu, Forth sürümünüzde işaretsiz bir int için maksimum değeri hızlı bir şekilde görmek için kullanılabilir (ancak yerel olarak desteklediği maksimum integral değerini değil!). Sen "Nasıl bir int ile basılmış gerekirken biliyoruz, soruyor olabilir .ve ne zaman birlikte u.?" Cevap: .imzalandığında, u.imzalanmadığında. “Kastettiğim bu değil” diyorsunuz. "Yığının üstündeki değerin ne zaman imzalandığını ve imzalanmadığını nasıl bilebiliriz?" Cevap: Siz programcısınız - bu sizin işiniz! Yığındaki her tamsayı bir int, imzasız bir int, bir int*, a temsil edip etmediğini bilmek zorundachar*, bir işlev işaretçisi, ya da diğer, ya da başka şeytanları burnunuza sokarsınız. Forth sizin için bunu takip etmeyecek; bu nedir, c?

Uzunluk 6

." Hi"

Yazdırır Hi. ."Giriş kelimesini (tüm Diğer kelimelerde olduğu gibi, boşluk veya EOF ile takip etmesi gerekir) bir sonraki sözcükten giriş akışını okuyan ve "aradaki baytları basan bir kelimedir . Ardından birden fazla boşluk koyarsanız .", hemen sonra boşluk hariç tümü ."basılır. Kaçış dizileri böylece bir bir dize yazdıramazsınız (desteklenmez "ile onun içinde." ), ancak Gforth ekler .\"onlara destek yok diline göre.

Uzunluk 7

: + - ;

Kendi kelimelerinizi Forth'da bir kolon, kelimenin adı, kelimenizin yürütmesini istediğiniz kelimeleri ve noktalı virgül yazarak tanımlarsınız. Bir kelime, boşluk olmayan karakterlerin herhangi bir dizisi olabilir (boşluk, Forth'un bir kelimenin nerede bittiğini ve bir diğerinin nihayetinde başlayacağını nasıl söyleyeceğidir), noktalama işaretleri ve hatta işleçler (sonuçta sadece kelimelerdir). Yukarıdaki kod parçası +demek için yeniden tanımlar- , bu yüzden şimdi ne zaman eklemeye çalıştıysanız, onun yerine çıkarırsınız. Kullanılmakta olan önceden var olan kelimeler +, orijinal tanımına bir referans depoladıklarından etkilenmezler +.

Not: Bazı kelimeler, dışardakilerden farklı olan tanımların içinde farklı şeyler yapar, ancak kontrol yapıları dışında hepsi oldukça ezoteriktir. Çoğu kelime bir tanımın içinde dışardakiyle aynı şeyi yapar, ancak bazen o şey açık değildir -: show-see see see ; düşündüğünüzü yapmaz!

Uzunluk 8

: 42 - ;

Bir kelimenin herhangi bir boşluk karakteri dizisi olabileceğini söylediğimde herhangi bir diziyi kastediyordum . Hayır, Forth'un her bir bireysel sayı için bir sözü yoktur; sayılar sadece biraz özeldir. Forth, boşluk olmayan bir sekansla karşılaştığında, önce bunun bilinen bir kelime olup olmadığını görür; değilse, bir sayı olarak ayrıştırmaya çalışır; Bu başarısız olursa, ancak o zaman bir hata alırsınız. Sayı ile aynı hecelenen bir kelimeyi tanımlamak, kelimeyi almadan doğrudan sayının hecelemesini artık giremeyeceğiniz anlamına gelir, ancak Gforth ve diğer bazı Diğerleri, yine de sayıları hecelemek için birçok yol sunar .

Uzunluk 9

IF 1 THEN

Sonunda tanıdık bir şey! Açıkçası, bu kod, argümanının 1doğru olup olmadığını test eder ve öyleyse, neyin peşindeyse yürütür THEN? Yanlış. Yürütme IFdeğeri ulaştığında, yığının üstündeki değer çıkarılır ve bu değer doğruysa (yani sıfır olmayan) yürütme, içinde IF ... THENve sonra ne olursa olsun THEN; eğer değer sıfır ise, doğrudan sonrasına atlarız THEN. Bu kelimelerin dahili olarak nasıl uygulandıklarından (diğer Dördüncü kelimeler anlamındadır!) IFVe THENsadece “yorumlama durumunda” değil, sadece bir kelime tanımında kullanılabileceğini unutmayın.

Uzunluk 12

( x y -- y )

Bu bir yorum. (Bundan )hemen sonra bir sonrakine geçer . (Tercümanda, yeni bir satır da sona erebilir.) Bu, Forth'un sözdizimine "yerleşik" değildir (herhangi bir şey mi?); (Giriş akışındaki herşeyi bir sonrakine ayan bir başka kelimedir ). (Bu doğru - Forth, kaynak kodunun nasıl okunacağını değiştirebilir. Perl, çalıştırmadan tek bir dil değildir!) Bir kelime olduğu için, onu bir boşlukla takip etmeniz gerekir, yoksa Forth bundan şikayet eder. (xtanımsız. Kendimizi ayağımızdan (vurmak için devam etmekte olan kampanyamızın bir parçası olarak da yeniden tanımlayabiliriz .

Ancak yorumun içeriği daha ilginç. Bu yorum , bazı kelimeler için yığın efektini belirtir; --Listelerin solundaki kısım , sözcüğü çalıştırmadan önce yığının üstünde ne olması gerektiğini (üstte sağda) ve açıklamaların sağında --da yığının tepesinin daha sonra nasıl görüneceğini açıklar. , üst sağda). Genel kural, tanımladığınız herhangi bir kelimenin kaynağına, hemen sonra eklenmesidir ve yığın öğelerinin isimlendirilmesi: name hakkında , hatta takip ettikleri türünü belirtmek için çok güçlü bir kural da vardır . , standartların .

Bu arada, gösterilen yığın efekti nip kelime içindir. Sadece yorumdan ne yaptığını söyleyebilmelisin.

Uzunluk 13

1 2 3 4 d+ d.

Daha önce belirtildiği gibi, bir Forth değerinin türü, onu nasıl kullandığınızla ilgilidir - bir değeri işaretçi olarak görürseniz, bu bir işaretçidir ve eğer bu değer iyi bir işaretçi değilse, onu bir değer olarak kabul etmek sizin suçunuzdur. Bununla birlikte, bir değeri nasıl bir tür olarak kabul ettiğinize bakılmaksızın, her zaman veri yığınında bir hücre alır; istisnalar, olarak çift ​​hücreli veya çift ​​hassasiyetli tamsayılar . Bunlar, yığında iki değerle temsil edilen ve normalin iki katı kadar aritmetik işlem yapmanıza izin veren tamsayılardır. Daha belirgin veya daha yüksek bit hücresi, böylece daha az kayda değer ya da daha düşük bit biri üzerine yerleştirilir 1 0çift hücre temsilidir 1ve0 1Forth'un normal hücrelerinin ne kadar büyük olduğuna bağlı olarak 2 ^ 32 veya 2 ^ 64'tür. Doğal olarak, böyle bir çift hücreli değeri tedavi etmek için, açıkça çift hücreli değerler üzerinde çalışan kelimeleri kullanmamız gerekir; bunlar genellikle sadece d(veya udimzasız olanlar için) karşılık gelen tek hücreli kelimenin adıdır: d+ekleme,d<Karşılaştırma için, d.baskı için, vb.


Forth için +1. Henüz yapılmayan dilleri aramaya başlamıştım. Zaten burada gördüğüme sevindim.
mbomb007

2
Ayrıca, +1675'e ulaşırsanız, çıkacak güzel bir ASCII imajım olur. : D
mbomb007

31

Pyth

Daha fazla snippet için, golf mücadelelerine çözüm önerileri ve sorunla ilgili bir bağlantı gönderiyorum.

Uzunluk 17:

<ussC,cG\_GUQ*zQQ

İlk bul nSonsuz dizinin karakterlerini, giriş dizgisini sonsuza dek tekrarlamak, sonra alt dizilerini dizinin kendisi ile doldurmak, ardından sonsuza dek tekrarlamak suretiyle oluşan karakterleri .

Boşlukları doldurun

Uzunluk 14:

#QX=Qhf>FT.:Q2

Benzersiz öğelerin bir listesi göz önüne alındığında, listeyi komşu öğelerin çiftlerini değiştirerek, tüm ara sonuçları yazdırarak sıralayın.

Bir sayı kümesini sıraya göre yeniden düzenleme

Uzunluk 13:

?hu]+HG_UQYQY

Aşağıdaki yapıyı oluşturun: [0, [1, [2, [3]]]].

Listelerde Anasayfa

Uzunluk 12:

uxyG*HQjvz2Z

XOR çarpımı.

XOR çarpımı

Uzunluk 11:

lfqSzST.:wz

İlk kelimenin kaç alt dizisinin ikinci kelimenin anagramı olduğunu sayınız.

Ana Dizgideki anagramları algılama

Uzunluk 9:

fqJjQT_J2

Girişin bir palindrom olduğu en düşük tabanı bulun.

En Düşük Temel Palindrome

Uzunluk 5:

!%lQ1

Girişin 2 olup olmadığını kontrol edin. Günlük tabanını 2 alın, sonuç mod 1'i alın ve mantıksal olmayanı alın.

Bir tamsayı, +, - işlemleri kullanmadan 2 güç olup olmadığını denetleyin

Uzunluk 4:

sjQ2

Girişin temel 2 gösterimini toplayarak girişin hamming ağırlığını hesaplar.

İmzasız 16 bit tamsayıdakilerin sayısını

Uzunluk 3:

^G2

^ sekansta, int, birinci argümanın kartezyen ürününü n kere kendisiyle verir, burada n, ikinci argümandır.

Bu durumda, çünkü G( abcdefghijklmnopqrstuvwxyz) alfabe ^G22 harfli dizgilerin hepsinden aageçer zz.

Uzunluk 2:

lT

lnormal olarak sunarken len(), günlük tabanı 2 olarak da kullanılabilir T. Değişken başlangıç ​​durumuna getirildiği için 10bu yazdırır.3.3219280948873626 , 10 günlük 2'yi .

Uzunluk 1:

H

HPyth'taki boş sözlük (karma-tablo) ve Pyth'te bir sözlük almanın tek yolu v(eval) veya $(Python literal) kullanmaktan başka.

Uydurma:

Pyth, değişmezlerin dışında çok karakterli yapılara sahip değildir. Ayrıca, Pyth esasen bire bir Python'a derler.


Factoid'iniz, başlayacak komutlardan önce eklenmiş .mi?
Sızdıran Rahibe

@LeakyNun Evet ..
isaacg
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.