Etalase Bahasa


508

Catatan

  • Utas ini terbuka dan tidak dikunci hanya karena komunitas memutuskan untuk membuat pengecualian . Tolong jangan gunakan pertanyaan ini sebagai bukti bahwa Anda dapat mengajukan pertanyaan serupa di sini. Tolong jangan membuat pertanyaan tambahan .

  • Ini bukan lagi , tidak juga potongan cuplikan dibatasi oleh penghitungan suara. Jika Anda mengetahui utas ini dari sebelumnya, pastikan Anda membiasakan diri dengan perubahan tersebut.

Utas ini didedikasikan untuk memamerkan fitur menarik, berguna, tidak jelas, dan / atau unik yang ditawarkan oleh bahasa pemrograman favorit Anda. Ini bukan tantangan atau kompetisi, tetapi upaya kolaborasi untuk menampilkan sebanyak mungkin bahasa pemrograman sebaik mungkin.

Bagaimana ini bekerja?

  • Semua jawaban harus menyertakan nama bahasa pemrograman di bagian atas posting, diawali oleh a #.

  • Jawaban dapat berisi satu (dan hanya satu) factoid, yaitu, beberapa kalimat tanpa kode yang menggambarkan bahasa.

  • Selain dari factoid, jawaban harus terdiri dari potongan kode, yang dapat (tetapi tidak harus) program atau fungsi.

  • Cuplikan tidak perlu dikaitkan. Bahkan, cuplikan yang terlalu terkait mungkin berlebihan.

  • Karena ini bukan kontes, semua bahasa pemrograman dipersilakan, setiap kali mereka dibuat.

  • Jawaban yang berisi lebih dari beberapa cuplikan kode harus menggunakan Cuplikan Stack untuk menciutkan semuanya kecuali factoid dan salah satu cuplikan.

  • Bilamana memungkinkan, seharusnya hanya ada satu jawaban per bahasa pemrograman. Ini adalah wiki komunitas, jadi silakan tambahkan cuplikan ke jawaban apa pun, bahkan jika Anda belum membuatnya sendiri. Ada Cuplikan Stack untuk mengompresi posting , yang seharusnya mengurangi efek dari batas 30.000 karakter.

Jawaban yang ada sebelum pedoman ini harus diedit. Tolong bantu memperbarui mereka sesuai kebutuhan.

Jawaban saat ini, diurutkan berdasarkan abjad berdasarkan nama bahasa

$.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>

Jawaban:


413

Mathematica

Anda mungkin ingin membaca ini dari bawah ke atas karena itulah urutannya, dan beberapa penjelasan akan merujuk pada cuplikan sebelumnya atau menerima penjelasan dari bawah.

Daftar ini berkembang cukup panjang. Saya sudah mulai menghapus snippet yang kurang menarik, dan saya akan mulai melewatkan snippet sekarang. Lihat riwayat revisi untuk daftar lengkap cuplikan hingga 41. Untuk beberapa permata asli, lihat cuplikan 81 , 64 , 44 , 23 , 19 , 12 dan 8 .

Panjang 143 dan 144 cuplikan

Akhirnya ... Saya sudah menunggu ini untuk sementara waktu (dan telah bermain golf selama sekitar, jadi saya tidak perlu menunggu lebih lama lagi). Saya sebutkan sebelumnya bahwa Anda juga dapat persamaan secara numerik, dan Anda juga dapat menyelesaikan persamaan diferensial. Saya ingin menunjukkan contoh non-sepele tentang itu.

Pertimbangkan pendulum ganda pada batang (yaitu pendulum yang terpasang pada batang lain). Setiap batang memiliki panjang satuan dan masing-masing dari dua bandul memiliki bobot satuan. Saya juga menggunakan satuan gravitasi untuk mempersingkat persamaan. Potongan 143 karakter berikut ini memecahkan persamaan gerak Lagrangian untuk sistem seperti itu (dalam hal sudut pendulum dan momentum sudut). Derivasi dapat ditemukan dalam PDF ini , meskipun ini merupakan latihan yang cukup mudah jika Anda terbiasa dengan mekanik Lagrangian.

Ini sangat tidak bisa dibaca, karena saya harus sering bermain golf:

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}]

Apa yang rapi adalah bahwa Mathematica segera menampilkan plot miniatur seperti apa kira-kira solusi:

masukkan deskripsi gambar di sini

Oke, tapi itu agak timpang. Kami ingin tahu seperti apa gerakan pendula itu sebenarnya. Jadi di sini adalah potongan 144 karakter, yang menjiwai pendula sambil menelusuri lintasan pendulum bawah:

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}

Animasi yang dihasilkan terlihat seperti ini:

masukkan deskripsi gambar di sini

Saya harus sedikit curang: jika Anda plot di luar t = 30, ParametricPlotsecara default menggunakan terlalu sedikit poin plot dan garis menjadi cukup bergerigi. Tetapi sebagian besar dinamika menarik terjadi setelah waktu itu, jadi saya menggunakan opsi PlotPoints -> 200untuk membuat paruh kedua animasi terlihat lebih halus. Tidak ada yang berbeda secara substansial, dan paruh pertama akan terlihat tidak bisa dibedakan pula.

Saya pikir ini akan menjadi cuplikan terakhir saya, kecuali jika saya menemukan sesuatu yang benar-benar membingungkan. Semoga Anda menikmati ini!

Panjangnya 100 cuplikan

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

Saya sedang memikirkan beberapa Geofungsi yang bagus untuk cuplikan 100, tetapi akhirnya saya menemukan sesuatu yang sangat bagus di Tweet-a-Program , yang hanya harus saya curi. Di atas menghasilkan peta matahari tampak sangat bagus dari Bumi untuk waktu dan hari saat ini, dengan melapiskan bentuk semi-buram belahan bumi di atas peta bantuan:

masukkan deskripsi gambar di sini

Panjang 81 potongan

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

Saya berjanji itu adalah otomat seluler terakhir. Tapi itu benar ada Wireworld dalam 81 karakter. Kali ini saya tidak menyandikan aturan dalam satu angka, a) karena saya pikir itu akan sangat besar (saya tidak repot mencari tahu) dan b) untuk menunjukkan kepada Anda penggunaan lain dari CellularAutomaton. Kali ini, aturannya hanya ditentukan sebagai fungsi murni, yang menerima lingkungan sel dan mengembalikan nilai baru sel. Ini adalah pendekatan yang jauh lebih layak untuk automata seluler dengan lebih dari 2 warna / keadaan.

Bagaimanapun, saya telah menyiapkan contoh dari Wikipedia di i(dua jam menghasilkan sinyal, dan gerbang XOR) dan membiarkannya berjalan selama 50 langkah:

masukkan deskripsi gambar di sini

Jika Anda tertarik, plot sebenarnya dan animasi bisa saja cuplikan 77:

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

Panjangnya 69 cuplikan

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

Kembali ke sesuatu yang bermanfaat. Terlepas dari sistem persamaan normal, Mathematica juga dapat menyelesaikan sistem persamaan diferensial. Di atas secara teknis hanya satu persamaan diferensial dengan kondisi batas, tetapi Anda juga dapat menyediakannya sebagai sistem tiga persamaan. Mirip dengan fungsi mengintegrasikan DSolveadalah untuk solusi yang tepat sedangkan NDSolveakan menyelesaikan sistem secara numerik. Di atas menghasilkan solusi tunggal

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

yang sekarang dapat dengan mudah digunakan untuk perhitungan lebih lanjut atau diplot.

Panjangnya 64 cuplikan

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

Saya berjanji Anda lebih banyak CellularAutomatonsihir! Cuplikan ini menghitung Permainan Kehidupan Conways dengan kondisi awal iuntuk nlangkah - langkah dan memberi Anda hasilnya untuk semua tanda waktu menengah.

Beberapa kata tentang parameter: 2adalah jumlah status sel. {{2,2,2},{2,1,2},{2,2,2}}memberikan bobot untuk 9 sel di lingkungan 3x3. Ini memastikan bahwa sel itu sendiri dapat dibedakan dari jumlah dari 8 tetangga. {1,1}mengatakan bahwa aturan CA tergantung pada sel 1 langkah di kedua arah. Akhirnya, 224adalah aturan pembaruan aktual yang dikodekan dalam satu nomor. Mencari tahu nomor ini bisa sedikit rumit, tetapi ada tutorial yang cukup berguna dalam dokumentasi . Untuk automata yang lebih rumit, satu nomor tidak akan memotongnya (karena jumlahnya akan sangat besar). Mungkin kita akan sampai di sana besok! ;)

Bagaimanapun, jika saya memasukkan grid acak ke idan 200 ke dalam n, dan mengirimkan hasilnya melalui animasi ArrayPlot, kita dapat melihat bahwa itu benar-benar berfungsi:

masukkan deskripsi gambar di sini

Potongan 59 panjang

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

Ingat plot kutub dari cuplikan 26? Kita bisa melakukan hal yang sama dalam 3D! (Sebenarnya, ada dua fungsi: RevolutionPlot3Duntuk kutub silindris dan SphericalPlot3Duntuk kutub bola.) Sama seperti Graphics3Dsemua plot tiga dimensi secara otomatis dapat diputar di Mathematica, jadi Anda tidak perlu khawatir tentang sudut kamera yang baik di muka. Plot di atas sesuatu seperti harmonik bola (tidak cukup meskipun) dan terlihat seperti:

masukkan deskripsi gambar di sini

Potongan 52 panjang

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

Yang ini cukup bagus. Manipulatemengambil ekspresi apa pun , parameterkan dengan sekelompok variabel, dan kemudian memberi Anda widget, di mana Anda dapat mengubah parameter dan melihat langsung bagaimana ekspresi berubah. Sebagai ungkapan, Anda biasanya memiliki plot. Ini sangat berguna jika Anda menggunakan Mathematica dalam ceramah untuk menunjukkan bagaimana keluarga solusi merespons memodifikasi parameter. Di atas menunjukkan bagaimana adan bkoefisien skala dan menggeser parabola:

masukkan deskripsi gambar di sini

Panjangnya 48 cuplikan

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

Importadalah perintah yang cukup kuat. Ini digunakan untuk memuat file dari disk dan dari web. Ia tahu cukup banyak format file yang berbeda, dan bagi sebagian dari mereka (seperti halaman HTML) sebenarnya dapat mengekstrak data segera. Di atas mengunduh semua gambar dari halaman doodle Google.

Panjangnya 45 cuplikan

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

Waktu untuk pemrosesan gambar. Mathematica hadir dengan sejumlah besar data contoh, termasuk gambar (seperti Lena), tekstur, model 3D dan cuplikan audio. Pertama, kami memuat salah satunya:

masukkan deskripsi gambar di sini

Ingin mendeteksi tepi? Ini panggilan fungsi tunggal:

masukkan deskripsi gambar di sini

Panjangnya 44 cuplikan

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

Akhirnya, saya punya cukup karakter untuk digunakan CellularAutomatondan juga memberikan hasilnya. :) Sejauh yang saya ketahui, CellularAutomatonadalah satu-satunya fungsi di Mathematica yang terkait dengan CA. Tapi Stephen Wolfram tampaknya menganggap dirinya orang nomor satu dalam hal automata seluler, jadi fungsi ini sangat kuat. Di atas menunjukkan cukup banyak penggunaannya yang paling sederhana. Ini mensimulasikan automaton seluler 1D untuk 100 langkah - dan itu benar-benar akan mengembalikan keadaan otomat pada setiap langkah tersebut, sehingga hasilnya adalah dua dimensi. Aturannya adalah parameter pertama, yang dapat ditentukan secara detail melalui daftar, atau hanya dikodekan dalam satu nomor. Untuk contoh ini, saya telah memilih yang agak terkenal, Turing lengkap, Aturan 110 . {{1},0}mendefinisikan kondisi awal: satu1di depan latar belakang nol. Mungkin saya akan memamerkan lebih banyak fitur CellularAutomatondi masa depan ketika saya memiliki lebih banyak karakter yang tersedia: itu dapat mensimulasikan CA di dimensi yang lebih tinggi, menggunakan lingkungan yang lebih besar dan dengan lebih dari dua negara.

ArrayPlotadalah utilitas merencanakan yang bagus yang hanya memplot daftar 2D sebagai kisi warna solid yang menunjukkan nilainya. Dalam kasus paling sederhana, 0adalah mappend menjadi putih dan 1hitam. Hasil cuplikan adalah:

masukkan deskripsi gambar di sini

Panjangnya 43 cuplikan

HighlightGraph[graph,FindVertexCover@graph]

Sudah lama sejak saya menyebutkan grafik. Ada banyak masalah umum grafik teori bawaan Mathematica, bersama dengan alat visualisasi yang bagus. Di atas, untuk yang diberikan graph, akan menemukan penutup simpul minimum dari grafik, dan kemudian membuat grafik dengan simpul-simpul tersebut disorot. Misalnya jika graphyang PetersenGraph[7,2]kembali dari potongan 18, kita mendapatkan:

masukkan deskripsi gambar di sini

Panjang 42 potongan

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

Sangat sederhana untuk menghidupkan benda-benda di Mathematica (dan mereka bahkan tidak harus berupa gambar). Anda cukup memberikan ekspresi yang akan dievaluasi untuk setiap frame dan sekelompok parameter yang harus bervariasi di atas frame. Di atas hanya menghidupkan plot gelombang sinus bergerak. Animasi akan terlihat seperti GIF berikut:

masukkan deskripsi gambar di sini

Panjangnya 40 cuplikan

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

SortBymelakukan apa yang Anda harapkan: mengurutkan daftar berdasarkan nilai yang diperoleh dengan memetakan fungsi yang diberikan ke setiap elemen daftar. Tapi tunggu, panggilan di atas tidak mengandung daftar sama sekali. Sejak Mathematica 10, ada dukungan untuk aplikasi currying atau parsial untuk beberapa fungsi. Ini bukan fitur bahasa seperti dalam bahasa fungsional yang lebih purist, tetapi hanya diimplementasikan secara manual untuk sejumlah fungsi di mana ini sering berguna. Ini berarti bahwa potongan di atas mengembalikan fungsi baru, yang hanya mengambil daftar lalu mengurutkan berdasarkan fungsi yang diberikan. Ini bisa sangat berguna jika urutan pengurutan ini adalah sesuatu yang akan Anda gunakan lebih sering di seluruh kode Anda.

Dan ya, ada *Datafungsi bagus lainnya - di atas akan mengurutkan nama planet berdasarkan kecepatan pelarian planet .

Panjangnya 39 cuplikan

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

Saya berjanji untuk membuat fungsi Fibonacci lebih efisien. Cuplikan ini menunjukkan bagaimana memoisasi sepele dalam Mathematica. Perhatikan bahwa semua yang diubah adalah tambahan f[n]=di baris ketiga. Jadi ketika fdipanggil untuk nilai baru (katakanlah f[3]), maka f[3]=f[3-1]+f[3-2]akan dievaluasi. Ini menghitung f[2]+f[1], kemudian menetapkannya untuk f[3](dengan =, bukan dengan :=!), Dan pada akhirnya mengembalikan nilai untuk panggilan awal kami. Jadi memanggil fungsi ini menambahkan definisi baru untuk nilai ini, yang jelas lebih spesifik daripada aturan umum - dan karenanya akan digunakan untuk semua panggilan mendatang fdengan nilai tersebut.

Ingat bahwa fungsi Fibonacci lainnya membutuhkan waktu 4 detik untuk 30 nilai? Ini membutuhkan 3 detik untuk 300.000 nilai.

Potongan 37 panjang

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

Dalam cuplikan terakhir saya menyebutkan pola. Ini paling sering digunakan dalam aturan , yang (antara lain) dapat digunakan untuk memodifikasi struktur yang cocok dengan pola tertentu. Jadi mari kita lihat cuplikan ini.

{a___,x_,b___,x_,c___}:>{a,x,b,c}adalah sebuah aturan. x_dengan garis bawah tunggal adalah pola yang mengacu pada nilai arbitrer tunggal (yang dapat berupa daftar atau sejenisnya). a___adalah pola urutan (lihat juga cuplikan 15), yang mengacu pada urutan 0 atau lebih nilai. Perhatikan bahwa saya menggunakan x_dua kali, yang berarti bahwa dua bagian daftar harus memiliki nilai yang sama. Jadi pola ini cocok dengan daftar apa pun yang berisi nilai dua kali, memanggil elemen itu xdan memanggil tiga urutan di sekitar dua elemen itu a, bdan c. Ini digantikan oleh {a,x,b,c}- yaitu yang kedua xdijatuhkan.

Sekarang //.akan menerapkan aturan sampai polanya tidak cocok lagi. Jadi cuplikan di atas menghapus semua duplikat dari daftar l. Namun, ini sedikit lebih kuat dari itu: //.menerapkan aturan di semua tingkatan. Jadi jika litu sendiri berisi daftar (hingga kedalaman apa pun), duplikat dari daftar-daftar tersebut juga akan dihapus.

Potongan 36 panjang

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

Waktunya untuk fitur bahasa baru! Mathematica memiliki beberapa hal yang menyenangkan tentang mendefinisikan fungsi. Sebagai permulaan, Anda dapat memberikan beberapa definisi fungsi untuk nama yang sama, untuk jumlah atau jenis argumen yang berbeda. Anda bisa menggunakan pola untuk menggambarkan argumen seperti apa yang definisi gunakan. Selain itu, Anda bahkan dapat menambahkan definisi untuk nilai tunggal. Mathematica kemudian akan memilih definisi yang berlaku paling spesifik untuk panggilan fungsi apa pun, dan membiarkan panggilan yang tidak ditentukan tidak dievaluasi. Hal ini memungkinkan (antara lain) untuk menulis fungsi rekursif dengan cara yang jauh lebih alami daripada menggunakan Ifsakelar untuk casing dasar.

Satu hal yang perlu diperhatikan tentang cuplikan di atas adalah bahwa saya menggunakan keduanya =dan :=. Perbedaannya adalah bahwa sisi kanan =dievaluasi hanya sekali, pada saat definisi, sedangkan :=dievaluasi ulang setiap kali sisi kiri disebut. Bahkan :=bekerja ketika menetapkan variabel, yang kemudian akan memiliki nilai dinamis.

Jadi yang di atas, tentu saja, hanya fungsi Fibonacci. Dan yang sangat tidak efisien pada saat itu. Menghitung 30 angka pertama membutuhkan sekitar 4 detik pada mesin saya. Kita akan segera melihat bagaimana kita dapat meningkatkan kinerja tanpa harus menyingkirkan definisi rekursif.

Panjangnya 35 cuplikan

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

Plot yang sangat rapi, yang menampilkan streamline dari bidang vektor 2D. Ini mirip dengan plot vektor normal, di mana setiap panah bersinggungan dengan bidang vektor. Namun, panah tidak ditempatkan pada fix grid tetapi bergabung menjadi garis (streamline). Signifikansi dari garis-garis ini adalah bahwa mereka menunjukkan lintasan partikel (dalam fluida, katakanlah) jika bidang vektor adalah bidang kecepatan. Input di atas terlihat seperti:

masukkan deskripsi gambar di sini

Potongan 34 panjang

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

Mathematica juga dapat menyelesaikan persamaan (atau sistem persamaan, tetapi kami hanya memiliki begitu banyak karakter sekarang). Hasilnya, seperti biasa, akan menjadi simbol.

{
  {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)}
}

Perhatikan bahwa solusi diberikan sebagai aturan , yang mungkin akan saya tunjukkan lebih detail dalam beberapa cuplikan di masa mendatang.

Panjangnya 33 potongan

Dynamic@EdgeDetect@CurrentImage[]

Terima kasih kepada benwaffle untuk ide ini. CurrentImage[]memuat gambar webcam Anda saat ini. EdgeDetectmengubah gambar menjadi gambar hitam-putih di mana tepinya berwarna putih dan sisanya berwarna hitam (lihat cuplikan 45 sebagai contoh). Kesenangan nyata hadir dengan Dynamicyang membuat ekspresi diperbarui dengan sendirinya. Jadi hasil ini sebenarnya akan streaming gambar dari webcam Anda dan melakukan deteksi tepi langsung pada mereka.

Panjangnya 32 cuplikan

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

Jenis plot yang agak tidak biasa. Ia dapat memplot banyak hal yang berbeda di sepanjang garis bilangan, seperti titik dan interval. Anda juga dapat memberikannya kondisi, dan itu akan menunjukkan kepada Anda wilayah di mana kondisi itu benar:

masukkan deskripsi gambar di sini

Tanda panah menunjukkan bahwa wilayah tersebut berlanjut hingga tak terbatas. Lingkaran putih menunjukkan bahwa itu adalah interval terbuka (titik akhir bukan bagian dari interval). Untuk tujuan tertutup, lingkaran akan diisi.

Potongan 28 panjang

Graphics3D@{Sphere[],Cone[]}

Saatnya untuk beberapa grafik 3D. Di atas membuat bola dan kerucut yang dipaksakan super dengan parameter default, yang terlihat seperti bola kristal:

masukkan deskripsi gambar di sini

Di Mathematica, Anda dapat mengklik dan menarik widget kecil ini untuk memutarnya.

Potongan 27 panjang

CountryData["ITA", "Shape"]

Lagi *Data! CountryDatacukup gila. Mendapatkan bentuk sebuah negara bahkan bukan merupakan puncak gunung es. Ada begitu banyak data tentang negara, Anda mungkin bisa menulis seluruh buku tentang fungsi ini. Seperti ... ada FemaleLiteracyFraction. Anda juga dapat meminta data tersebut untuk berbagai titik waktu. Untuk daftar lengkap, lihat referensi.

masukkan deskripsi gambar di sini

Potongan 26 panjang

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

Saatnya untuk plot yang lebih menarik. PolarPlothanyalah sebuah plot di koordinat kutub. Alih-alih menentukan y untuk x yang diberikan, Anda menentukan radius r untuk sudut yang diberikan θ:

masukkan deskripsi gambar di sini

Panjangnya 25 potongan

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

Kami akhirnya memiliki cukup karakter untuk beberapa matematika vektor. Di atas menghitung perkalian matriks dari matriks 2x3 dan baris 2-vektor:

{53, 43, 92}

Potongan 23 panjang

Rotate[Rectangle, Pi/2]

Heh. Hehe. Anda pikir Anda tahu apa yang dilakukannya. Tapi kamu tidak. Rectangledengan sendirinya hanyalah fungsi bernama. Untuk benar-benar mendapatkan objek yang mewakili persegi panjang, Anda harus memanggil fungsi itu dengan beberapa parameter. Jadi menurut Anda apa yang terjadi, ketika Anda mencoba memutar Rectangle? Ini:

masukkan deskripsi gambar di sini

Panjangnya 22 cuplikan

30~ElementData~"Color"

Lain dari built-in *Datafungsi. Ya, untuk elemen kimia, Anda tidak hanya mendapatkan hal-hal seperti nomor atom, titik lebur dan nama ... Anda benar-benar bisa mendapatkan warnanya pada suhu kamar. Di atas memberikan warna seng:

SlateGray

Potongan 21 panjang

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

Kami memiliki diferensiasi beberapa waktu lalu. Waktunya untuk integrasi. Mathematica dapat menangani integral yang pasti dan tidak terbatas. Secara khusus, Integrateakan memberi Anda solusi yang tepat, dan dapat menangani satu ton integral standar dan teknik integrasi (untuk hasil numerik, ada NIntegrate). Jika Anda mengetahui kalkulus Anda, Anda akan memperhatikan bahwa integral Gaussian di atas sebenarnya tidak memiliki bentuk tertutup integral tak terbatas ... kecuali jika Anda menganggap fungsi galat bentuk tertutup, yaitu. Pengembalian Mathematica:

1/2 Sqrt[π] Erf[x]

Panjangnya 20 cuplikan

"Sun"~StarData~"Age"

Kembali ke data bawaan . Harus ada setidaknya dua lusin *Datafungsi untuk semua yang Anda bisa pikirkan. Masing-masing dari mereka mengambil pengidentifikasi untuk hal yang Anda inginkan data, dan properti (atau daftar properti) untuk mengambil. Di atas hanyalah salah satu yang terpendek yang bisa Anda dapatkan Sun, Stardan Agesemuanya cukup pendek, karena saya tidak sabar untuk menunjukkan fitur ini.

Oh ya, dan apakah saya menyebutkan bahwa Mathematica (sejak 9) mendukung jumlah dengan satuan? (Lebih lanjut tentang itu nanti.) Di atas mengevaluasi untuk:

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

yang ditampilkan sebagai

masukkan deskripsi gambar di sini

Potongan 19 panjang

MandelbrotSetPlot[]

Ya ... fungsi yang sangat berguna ... Saya menggunakannya setiap saat. (Terkadang, keinginan mereka untuk mendukung apa pun yang mungkin dapat dihitung mungkin agak jauh ...)

Grafik Mathematica

Dalam pembelaan mereka, fungsinya sedikit lebih berguna dari itu: Anda bisa memberikannya bagian tertentu dari grafik yang ingin Anda plot.

Panjangnya 18 cuplikan

PetersenGraph[7,2]

Sejak Mathematica 8, ia memahami apa itu grafik, sehingga ia hadir dengan segala macam fungsi terkait teori-grafik. Dan itu bukan Mathematica jika tidak termasuk satu ton built-in. Di atas menghasilkan data grafik untuk grafik Petersen umum . Itu memang menghasilkan struktur data aktual yang dapat dimanipulasi, tetapi Mathematica segera menampilkan data grafik itu ... secara grafis:

Grafik Mathematica

Potongan 17 panjang

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

Akhirnya cukup banyak karakter untuk melakukan ploting. Di atas adalah contoh sederhana dari plot satu dimensi. Saya berjanji akan memamerkan plot yang lebih keren nanti

Grafik Mathematica

Panjang 15 cuplikan

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

Ini menunjukkan dua fitur yang lebih kuat (dan juga yang berguna untuk bermain golf). Seluruhnya adalah fungsi murni yang tidak disebutkan namanya , sebanding dengan lambdas di Python, atau Procs di Ruby. Fungsi murni hanya diakhiri oleh a &. Operator ini memiliki prioritas yang sangat rendah, sehingga biasanya mencakup hampir semua yang tersisa. Argumen fungsi murni disebut dengan #, kadang-kadang diikuti oleh hal-hal lain. Argumen pertama adalah #atau #1, yang kedua adalah #2, dan seterusnya.

Fitur lainnya adalah Sequences. Ini pada dasarnya seperti percikan dalam bahasa lain. Urutan seperti daftar tanpa daftar di sekitarnya - secara harfiah hanya urutan nilai, yang dapat digunakan dalam daftar, argumen fungsi dll. ##Khususnya adalah urutan semua argumen fungsi murni. ##2adalah urutan semua argumen mulai dari yang kedua. Jadi jika kita menamai fungsi di atas f, dan menyebutnya seperti

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

Kami akan mendapatkannya

{4,5,1,2,3}

jadi fungsinya memutar argumen input 3 elemen ke kiri. Perhatikan bahwa yang ##4dimaksud 4,5diratakan ke dalam daftar.

Panjang 12 cuplikan

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

Diferensiasi parsial. Dakan membedakan ekspresi pertama berturut-turut sehubungan dengan argumen lainnya, memberikan Anda ekspresi simbolis sebagai hasilnya. Jadi di atas adalah d² (x ^ y ^ x) / dxdy (di mana d s parsial), yang melaporkan Mathematica menjadi

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

Potongan 9 panjang

Exp[I*Pi]

Kami belum melakukan aritmatika yang rumit! Seperti yang Anda lihat, πsebenarnya hanya alias untuk Pi. Bagaimanapun, hal di atas sebenarnya akan mengembalikan integer dengan benar -1.

Potongan 8 panjang

Sunset[]

Ya. Bicara tentang built-in gila. Tanpa parameter yang benar-benar memberi Anda objek waktu matahari terbenam berikutnya di lokasi Anda saat ini. Itu juga membutuhkan parameter untuk tanggal lain, lokasi lain, dll. Ini seperti apa yang saya alami sekarang:

masukkan deskripsi gambar di sini

Potongan 7 panjang

9!/43!!

Cuplikan ini memamerkan beberapa hal keren.

Mathematica tidak hanya memiliki operator faktorial bawaan !, tetapi juga memiliki faktorial ganda !!(yang mengalikan setiap angka lainnya dari nturun ke 1). Selain itu, ia mendukung bilangan bulat presisi arbitrer. The 43!!akan dievaluasi tepat, turun ke angka terakhir. Selanjutnya, bilangan rasional juga akan dievaluasi dengan tepat. Jadi, karena baik pembilang dan penyebutnya ada bilangan bulat, Mathematica akan mengurangi pecahan sejauh mungkin dan kemudian memberi Anda

128/198893132162463319205625

Tentu saja, Anda dapat menggunakan float kapan pun Anda inginkan, tetapi secara umum, jika input Anda tidak mengandung float, hasilnya akan tepat.

Potongan 4 panjang

Here

Sudah saatnya kita mulai dengan kekayaan bawaan bawaan Matematika. Di atas melakukan apa yang tertulis di kaleng dan (untuk saya) mengevaluasi GeoPosition[{51.51, -0.09}].

Potongan 3 panjang

x-x

Hanya untuk menampilkan Factoid asli : di atas berfungsi bahkan jika xbelum didefinisikan dan benar-benar akan menghasilkan dalam 0kasus itu.

Potongan 2 panjang

3x

Perkalian melalui penjajaran! Jika jelas bahwa pengidentifikasi berakhir dan yang lain dimulai, Anda tidak perlu *atau bahkan spasi putih untuk mengalikannya bersama. Ini berfungsi dengan hampir semua, termasuk string dan variabel yang belum memiliki nilai. Sangat nyaman untuk bermain golf. ;)

Potongan 1 panjang

π

Coba tebak, itu Pi. Dan pada kenyataannya, ini bukan representasi floating-point perkiraan, itu Pi persis - jadi semua jenis fungsi yang kompleks dan trigonometrik yang digunakan ini akan menghasilkan hasil yang tepat jika mereka diketahui.

Faktoid

Mathematica dapat melakukan manipulasi simbolik, jadi variabel tidak perlu nilai untuk bekerja dengannya.


19
Cuplikan 23 cukup aneh. Jika Anda melakukannya, Translate[Scale[Rectangle, 80], {0, 0, 100}]apakah kata besar itu Rectanglemuncul mengambang di depan monitor Anda?
Calvin Hobbies

53
@ Calvin Hobbies Baru saja mencobanya ... mengambil zoffset yang sial ... menampar wajahku.
Martin Ender

45
Situs web Mathematica resmi harus benar-benar terhubung dengan ini.
Caridorc

7
@ durron597 Dengan menjaganya sebagai simbol dan membuat semua fungsi trigonometri dan kompleks Anda mengetahui apa yang harus dilakukan dengan π.
Martin Ender

16
Begitu saya melihat bahwa Martin Büttner yang legendaris telah memposting jawaban Mathematica, saya tahu saya tidak memiliki peluang untuk memenangkan kontes popularitas. Anda Tuan adalah penyihir sejati.
Alex A.

187

Bahasa Pemrograman Shakespeare yang Terkenal

Bahasa Pemrograman Shakespeare diciptakan pada tahun 2001 oleh dua siswa Swedia, Karl Hasselström dan Jon Åslund, dan menggabungkan, seperti yang dinyatakan oleh penulis ,

ekspresi BASIC dengan keramahan pengguna bahasa rakitan.

Jawaban dari atas ke bawah. Juga, sangat umum melihat saya merujuk ke cuplikan yang lebih lama atau sebelumnya.

( tautan untuk saya sendiri: edit )

Faktoid:

Kode Shakespeare menyerupai, seperti yang diharapkan, drama Shakespeare, di mana variabelnya adalah karakter dalam permainan dan nilainya berubah ketika mereka "dihina" atau dipuji ".

Potongan 1 panjang:

I

Kode Shakespeare dibagi dalam Kisah Para Rasul, dan tindakan itu sendiri dibagi dalam Adegan, untuk kausalitas "lompat-ke". Mendefinisikan suatu Undang-Undang sebagai Act Isarana bahwa itu akan menjadi bagian pertama dari kode yang akan dijalankan, per contoh - tetapi tidak hanya.

Potongan 2 panjang:

as

Digunakan dalam perbandingan antara dua "karakter".

Potongan 3 panjang:

day

Sekarang, Anda mungkin merasa bahwa SPL sangat bertele-tele. Dan aneh. Dan Anda belum melihat apa pun. day, dalam SPL, adalah 1. Semua kata benda "positif" dan "netral" dianggap 1, serta semua kata benda "negatif" -1.

Potongan 4 panjang:

rich

Apa rich? Kata sifat. Dalam SPL, kata sifat membuat nilai dari kata benda yang dilampirkannya dikalikan dua. Lihat implementasi pada cuplikan 14.

Potongan 5 panjang:

Act I

Implementasi cuplikan pertama. Semua tindakan dapat diberi gelar, seperti Act I: Hamlet must die!, karena semuanya setelah angka Romawi diabaikan oleh pengurai.

Potongan 6 panjang:

better

Setiap bahasa memiliki kondisi, dan SPL tidak terkecuali. Kecuali, karena ini adalah bahasa dengan sintaks yang panjang (dan apakah saya menyebutkannya aneh?), Pernyataan kondisionalnya akan panjang. Memiliki Ophelia bertanya pada Juliet Am I better than you?seperti memiliki if (Ophelia > Juliet)sebagian besar bahasa "normal". Dan, tentu saja, Anda bisa bertanya sebaliknya: Am I not better than you?sama dengan if (Ophelia < Juliet). Dan Anda sudah bisa menebak bagaimana =itu diterjemahkan ke SPL: as good as- penggunaan potongan kode 2.

Namun, good/betterbukan satu-satunya cara untuk membuat perbandingan dalam bahasa shakesperian ini, Anda dapat menggunakan kata sifat apa pun. Prinsip snippet 3 yang sama berlaku di sini juga, dengan kata sifat "positif" memiliki nilai >, sedangkan yang "negatif" berarti <.

Potongan 7 panjang:

Juliet:

Ini adalah doa variabel; setelah ini, instruksinya / deklarasi / apa pun yang akan mengikuti.

Keterbatasan SPL adalah bahwa ia memiliki sejumlah variabel: Romeo, Juliet, Hamlet, Ophelia, MacBeth dan sebagainya adalah beberapa contoh "karakter" yang akan muncul pada program Shakesperian.

Potongan 8 panjang:

[Exeunt]

[Exeunt]ditempatkan ketika semua "karakter" meninggalkan "panggung". Semoga saya bisa menguraikan sedikit lebih lanjut tentang interaksi antara karakter. Umumnya adalah instruksi terakhir dari setiap program SPL, meskipun [Exeunt]tidak secara khusus merupakan "karakter" terminal dari bahasa tersebut. Untuk contoh lain, lihat cuplikan 27.

Potongan 9 panjang:

as bad as

Sembilan karakter hanya untuk mewakili belaka =- menggunakan cuplikan 2. Sudahkah saya menyebutkan bahwa SPL itu aneh? Lihat cuplikan 30 untuk contoh. (dan ya, ada lebih dari satu cara untuk menampilkannya)

Panjang 10 cuplikan:

difference

Cara mewah untuk mewakili -, pengurangan. Anda dapat melakukan operasi matematika di SPL, meskipun Anda mungkin perlu sehari penuh untuk memperbaikinya.

Factoid (karena saya entah bagaimana berhasil mencapai sepuluh cuplikan kode, mari kita istirahat sejenak dan minta factoid lain tentang SPL)

Jika Anda ingin menjalankan kode shakesperian Anda dengan segala kejayaannya, ada situs ini - saya masih mengujinya, karena saya baru menemukannya lima menit yang lalu. Ada juga cara untuk menerjemahkannya ke C menggunakan penerjemah .

Situs lain untuk menjalankan kode SPL adalah ini yang berfungsi dengan menerjemahkan kode SPL secara internal ke bahasa esoterik lain: Oracle PL / SQL.

Potongan 11 panjang:

[Exit Romeo]

Iya! Akhirnya saya bisa berbicara tentang interaksi antar karakter! Agar nilainya berubah atau berinteraksi dengan orang lain, "karakter" harus berada di atas panggung [Enter Romeo]. Jika karakter ditujukan tetapi tidak ada, ada kesalahan runtime dan program berhenti. Karena, dalam SPL, nilai variabel ditentukan oleh jumlah nama yang mereka puji - atau dihina - oleh karakter lain di atas panggung. Saya merasa bahwa saya harus memberi contoh untuk menghapus kebingungan yang mungkin dibuat penjelasan lumpuh saya, tetapi mungkin yang terbaik adalah menunda beberapa cuplikan.

Potongan 12 panjang:

Remember me.

SPL cukup "dasar", baik-baik saja - tetapi memiliki tumpukan! Ketika, misalnya, Romeo mengatakan pada Juliet untuk "mengingatnya", dia sebenarnya memberitahu orang yang dicintainya untuk mendorong nilai Romeo ke tumpukannya. Popping nilai dilakukan dengan Recall your happy childhood!, atau Recall your love for me, atau pada dasarnya kalimat apa pun yang dimulai dengan Recall- sisanya hanya omong kosong artistik, seperti potongan 22.

Potongan 13 panjang

Let us return

Cara Shakesperia untuk memiliki goto. Dan di sinilah Kisah Para Rasul dan Adegan berguna. Jika Romeo memberi tahu Juliet we shall return to Act II(ya, lagi, ada beberapa cara untuk menuliskannya), program akan melompat ke bagian kode yang spesifik. Itu juga terlihat di samping pernyataan bersyarat.

Panjang 14 cuplikan

my little pony

Ya, itu adalah seri di tahun 80-an. Ini dia 2*1. Mengapa? Karena a ponyadalah (agak) kata benda positif dan littlemerupakan kata sifat. Jadi, mengingat cuplikan 3 dan 4, kita punya little = "2 *"dan pony = "1".

Panjang 15 cuplikan

Speak thy mind!

Dalam program SPL, Anda akan melihat ini (atau Speak your mind!, yang sama) banyak . Ini pada dasarnya menampilkan nilai setiap "karakter" dalam digit, huruf atau apa pun, tergantung pada rangkaian karakter yang digunakan oleh komputer Anda. Ada juga Open your mind.yang melakukan hal yang hampir sama, meskipun hanya menghasilkan dalam bentuk angka.

Panjang cuplikan 16

You are nothing!

Ketika seseorang memberi tahu Anda hal ini dalam kehidupan nyata, Anda akan merasa tertekan. Ketika Ophelia menceritakan hal ini kepada Hamlet dalam pemrograman Shakespeare, Hamlet merasa tidak berharga. Apa artinya ini? Itu Hamlet = 0.

Potongan 17 panjang

Ophelia, a wench.

Dalam skenario, sebelum pemutaran sebenarnya dimulai, karakter harus disajikan. Dalam sebagian besar bahasa pemrograman, variabel juga harus dideklarasikan sebelum digunakan. Melihat bahwa SPL adalah bahasa pemrograman yang menyerupai skenario, ini adalah bagaimana Anda mendeklarasikan variabel-variabelnya, dengan menyatakan yang mana yang muncul selama program.

Tapi apa artinya "seorang dara"? Apakah ini berarti nama jenis data tertentu (dan keren)? Yah ... Aku benci mengecewakanmu, tapi itu tidak berarti apa-apa: semuanya setelah koma diabaikan oleh pengurai, artinya kamu bisa menempatkan di sana omong kosong paling keterlaluan yang bisa kamu pikirkan.

Panjangnya 18 cuplikan

lying sorry coward

-4untuk semua makhluk duniawi. Mengapa? Karena 2*2*(-1) = -4.

Potongan 19 panjang

Romeo:
 Remember me.

Akhirnya!!! Saya akhirnya dapat menghasilkan instruksi sintaks yang benar sepenuhnya (walaupun pendek)! Ini adalah bagaimana Anda menggunakan snippet 12: pertama Anda menyatakan siapa yang berbicara, kemudian pada baris berikutnya Anda menulis "dialog". Biasanya, hanya dua "karakter" di atas panggung, untuk menghindari membuat parser sedih dan bingung. Ketika Anda membutuhkan "karakter" lain, Anda mengambil satu dari panggung dan menggantikannya dengan yang baru.

Panjangnya 20 cuplikan

cube of thy codpiece

Saya ingin menguraikan sedikit lebih banyak untuk yang satu ini, tetapi, sejujurnya, hal-hal yang saya buat masih terlalu pendek untuk potongan ini. Dan, jadi, saya membawa Anda ini, yang akhirnya menjadi -1- karena (-1) 3 = -1 (dan codpiecemerupakan kata benda "negatif", karena mereka tidak nyaman dan semuanya). SPL memahami beberapa operasi aritmatika yang lebih rumit karena beberapa eksponensial dan akar kuadrat.

Factoid (satu lagi, karena kita telah mencapai tonggak sejarah lain)

"Hello World Program" di Shakesperian memiliki 89 baris dan lebih dari 2400 karakter, seperti yang terlihat di sini .

Potongan 21 panjang

Listen to your heart.

Dalam cuplikan 15 Anda menghasilkan sesuatu; di sini, Anda memasukkan nomor ke program. Jika Anda ingin memasukkan karakter, Anda akan menggunakannya Open your mind.. Dan, tentu saja, nilai ini akan disimpan dalam "karakter" yang diajak bicara.

Panjangnya 22 cuplikan

Recall your childhood!

Popping integer dari stack dilakukan dengan ini, seperti yang dijelaskan pada snippet 12. Ketika, misalnya, Ophelia memberi tahu Hamlet kalimat yang disebutkan di atas, itu menyebabkan Hamlet mengambil integer dari stack dan mengasumsikan nilainya.

Tentu saja, selama kata recalltersebut memulai kalimat, Anda dapat mengisi sisanya dengan apa saja yang diinginkan oleh pikiran kreatif penggembala Anda.

Potongan 23 panjang

Are you better than me?

Implementasi snippet 6. Ketika "karakter" membuat pertanyaan seperti ini kepada orang lain, apa yang dia lakukan setara dengan if (x > y)bahasa pemrograman yang lebih umum. Tindak lanjut dari instruksi ini harus ditunda hingga saya memiliki lebih banyak karakter.

Panjangnya 24 cuplikan

[Enter Romeo and Juliet]

Ya, "karakter" dapat masuk berpasangan. Tidak perlu memiliki satu "karakter" memasuki panggung, diikuti oleh yang lain.

Panjangnya 25 potongan

remainder of the quotient

25 karakter hanya untuk menulis a %. 25 karakter untuk memiliki sisa divisi. Dan untuk menggunakannya? Yah, itu bahkan lebih besar - lihat cuplikan 75.

Potongan 26 panjang

Let us return to scene II.

Ini dia, gotodalam SPL, yang berfungsi seperti yang diharapkan dalam bahasa pemrograman. Suatu hal adalah: Anda dapat melompat di antara adegan dalam aksi yang sama, dan di antara tindakan; tetapi Anda tidak dapat melompat di antara adegan dalam berbagai tindakan.

Potongan 27 panjang

[Exeunt Ophelia and Hamlet]

Ketika lebih dari satu "karakter" meninggalkan panggung, alih-alih Exit, dan mempertahankan tradisi dengan sifat teatrikal SPL, kata latin "Exeunt" digunakan. Terkadang itu bisa diganti hanya dengan potongan 8.

Potongan 28 panjang

Scene I: Ophelia's flattery.

Mendeklarasikan Adegan. Seperti yang sudah bisa Anda harapkan jika Anda telah mengatasi saya, yang penting adalah Scene I, sisanya adalah bulu artistik.

Ada beberapa kompiler yang dibuat (seperti ini yang mengkompilasi dari SPL ke C, ditulis dengan Python ) yang sebagai gantinya merujuk ke teks setelah penomoran Act / Scene. Meskipun lebih logis (setelah semua, selama bermain, memiliki karakter yang mengatakan baris seperti "mari kita kembali ke Act I" mungkin dianggap konyol), saya tetap berpegang pada cara asli.

Potongan 29 panjang

You pretty little warm thing!

Ya, konstanta lain (karena kita membutuhkan lebih banyak karakter untuk memiliki operasi aritmatika) Yang ini sama dengan 8, karena 2*2*2*1 = 8.

Panjangnya 30 cuplikan

You are as cowardly as Hamlet!

Mengatakan ini, misalnya, Romeo, berarti itu Romeo = Hamlet. Seperti cuplikan 9.

Factoid (ya, tengara lain tercapai!)

Bahasa ini dibuat untuk tugas dalam kursus Analisis Sintaks - dengan demikian, tidak ada kompiler SPL yang dibuat oleh penulis. Lebih lanjut: tampaknya penulis SPL telah memutuskan hubungan mereka dengan kreasi mereka, karena tidak ada yang tampaknya telah dimodifikasi dalam bahasa tersebut sejak tahun 2001 ...

Potongan 31 panjang

Am I as horrid as a flirt-gill?

Ya, saya tahu, ini potongan berulang 23, meskipun, di sini, kami membandingkan "karakter" yang berbicara dengan "genit-insang" (dari, jika Anda suka, if (Ophelia == -1)). Permasalahannya adalah...

Panjangnya 32 cuplikan

If so, let us return to scene I.

... sekarang saya bisa memperkenalkan thenSPL, dan lompatan bersyarat, dan cara Shakesperian menerapkan loop. Misalnya, Anda dapat membuat Romeo mengambil alih nilainya 0, menambah nilainya saat melakukan beberapa tugas lain dan berhenti ketika mencapai 10, melanjutkan dengan program sesudahnya.

Panjangnya 33 potongan

If not, let us return to scene I.

Sebagai pengingat, alih-alih, kami dapat melanjutkan ke adegan lain jika kondisi yang kami uji salah .

Potongan 34 panjang

Open your mind! Remember yourself.

Dua instruksi berturut-turut, yippie! Yang pertama membaca karakter, yang kedua mendorongnya ke tumpukan memori karakter lain.

Panjangnya 35 cuplikan

Act I: Death!

Scene I: Oh, shit.

Cara yang tepat untuk mendeklarasikan Act and a Scene. Tambahkan bubur artistik dengan selera tinggi.

Potongan 36 panjang

Thou art as sweet as a summer's day!

Cara lain untuk mengatakan bahwa "karakter" yang diajak bicara akan menerima nilai 1- karena hari-hari musim panas menyenangkan dan menyenangkan.

Potongan 37 panjang

Art thou more cunning than the Ghost?

Ophelia mengajukan pertanyaan ini ke Hamlet berarti, menerjemahkannya ke bahasa pemrograman yang kurang mudah dibaca if (Hamlet > the Ghost),. Itu potongan 23 lagi, ya - tapi itu menunjukkan kepada Anda bahwa tidak perlu bertanya "karakter" jika mereka lebih baik daripada satu sama lain: pertanyaan lain akan bekerja juga.

Potongan 38 panjang

[Enter the Ghost, Romeo and the Ghost]

Ya, saya memanggil "karakter" dua kali - karena saya ingin ada program yang memberi saya kesalahan. Memanggil "karakter" yang sudah ada di atas panggung, atau mengatakan yang tidak ada untuk keluar, akan menyebabkan kesedihan besar bagi parser / kompiler.

Panjangnya 39 cuplikan

the sum of a fat lazy pig and yourself!

Instruksi lengkapnya terlihat lebih baik dari ini, saya akan berikan itu, tapi ... inilah operasi aritmatika pertama kami! Apa artinya semua itu sebenarnya? Ya, pigitu binatang yang kotor (meski enak), jadi setara dengan -1, memiliki dua kata sifat, artinya fat lazy pigsama 2*2*(-1) = -4. Tapi bagaimana dengan itu yourself? Ini adalah kata ganti refleksif, bukan nama atau kata sifat. Nah, ingatlah bahwa SPL didasarkan pada dialog antara "karakter"; dengan demikian, yourselfmengacu pada "karakter" lain di atas panggung. Jadi, kita tiba di akhir dan kita menemukan bahwa "jumlah babi malas yang gemuk dan dirimu sendiri" sebenarnya adalah -4 + x.

Panjangnya 40 cuplikan

the sum of a squirrel and a white horse.

Ya, jumlah lain, tetapi yang ini lebih sederhana daripada cuplikan 39. Ini hanya 1 + 2- 3, jika matematika saya benar.

Factoid (masih bersamaku setelah empat puluh potongan bulu artistik ini? Kau pantas mendapatkan hadiah.)

SPL, dalam versinya 1.2.1, dapat diunduh di sini .

Potongan 41 panjang

Juliet:
 Speak thy mind!

[Exit Romeo]

Kadang-kadang, "karakter" hanya dipanggil di atas panggung untuk mengubah nilainya - yang, pada permainan nyata, akan menjadi sesuatu yang sangat aneh. Bagaimanapun, di sini, Juliet membuat Romeo yang dicintainya mencetak nilainya yang tersimpan, setelah itu ia keluar dari panggung.

Panjang 42 potongan

Speak YOUR mind! You are as bad as Hamlet!

Sekali lagi dua instruksi dalam satu baris (kita dapat memiliki banyak, tetapi panjang potongan belum mengizinkannya); di sini kita memiliki "karakter" yang memberi tahu orang lain untuk menampilkan nilainya dan menganggap nilai yang dimiliki Hamlet. Membingungkan? Mayhap.

Panjangnya 43 cuplikan

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

Juliet bertanya ini tidak berarti dia memiliki harga rendah (meskipun mungkin dalam kehidupan nyata); itu hanyalah yang lain if, seperti cuplikan 23 dan 37. Oh, saya hampir lupa: ini artinya if (Juliet == -2).

Panjangnya 44 cuplikan

You are as evil as the square root of Romeo!

Ya, akar kuadrat itu jahat, tidak tahukah kamu? Bagaimanapun, instruksi ini cukup mudah untuk memahami apa yang dilakukannya: atribut "karakter" diucapkan dengan nilai akar kuadrat dari nilai yang disimpan di Romeo.

Panjangnya 45 cuplikan

Hamlet:
 Art thou more cunning than the Ghost?

Cuplikan 37 ditulis dengan benar dengan karakter yang berbicara garis.

Potongan 46 panjang

the product of a rural town and my rich purse.

Oke ... pokoknya, SPL mungkin satu-satunya bahasa di dunia yang memungkinkan Anda untuk melipatgandakan kota dengan dompet. Ini berarti (2*1)*(2*1), jika saya tidak salah, sama dengan 4.

Potongan 47 panjang

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

Saya akan memberi Anda: itu mungkin salah satu dialog paling aneh dalam sejarah. Tapi itulah yang Anda dapatkan saat memilih bahasa aneh untuk ditampilkan. Romeo dan Juliet saling memberi tahu, singkatnya, untuk menampilkan nilai-nilai mereka.

Panjangnya 48 cuplikan

You lying fatherless useless half-witted coward!

Menerjemahkannya secara langsung 2*2*2*2*(-1),. -16, Baik?

Potongan 49 panjang

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

Contoh cara mengakhiri program di SPL. Anda dapat mendeklarasikan adegan khusus untuk itu (meskipun tidak diperlukan), lalu Hamlet meminta "karakter" lain untuk menampilkan nilai mereka, lalu mereka semua keluar dari panggung. Dan ya, mereka harus turun dari panggung.

Panjangnya 50 potongan

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

Lebih banyak presentasi "karakter", sebelum instruksi yang tepat. Seperti biasa, satu-satunya hal yang penting bagi kompiler adalah Othellodan Lady Macbeth, sehingga bagian selanjutnya siap untuk diperebutkan ...

Satu hal lagi: "karakter" tidak harus terkait satu sama lain untuk tampil dalam program SPL - sehingga Anda dapat memiliki Romeo, Othello dan Hamlet di drama yang sama.

Factoid (setengah abad dari semua ini? Fiuh! Setelah ini saya pikir saya akan membenci William Shakespeare ...)

Penerjemah SPL ke C, yang disebutkan beberapa waktu lalu dan dikembangkan oleh para pencipta SPL, didasarkan pada Flex dan Bison .

Potongan 51 panjang

Othello:
 Recall your great dreams. Speak your mind!

(Sangat muak dengan Romeo, Juliet dan Hamlet ... mari kita bawa Othello, untuk perubahan!)

Recall, seperti yang bisa Anda tebak, adalah kuncinya di sini. "Karakter" yang ditangani Othello akan mengambil nilai dari tumpukannya, menganggap nilai itu dan, setelah itu, akan menampilkannya.

Potongan 52 panjang

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

Jumlah lain. Menguap. Dengan asumsi yang satu ini ditujukan kepada Hamlet, berarti itu Hamlet = Hamlet + 1. Atau Hamlet += 1. Atau Hamlet++.

Potongan 53 panjang

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

Ah, ya, sesuatu yang saya lupa sebutkan sebelumnya: "karakter" yang berbicara dapat menyebut diri mereka sendiri.

Panjangnya 54 cuplikan

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

Contoh lain dari cuplikan sebelumnya, termasuk dalam suatu kondisi. Jadi yang kita miliki di sini adalah if (Romeo + Juliet == 0).

Panjang cuplikan 55

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

Jadi, di sini, Juliet memuji "karakter" yang dia ajak bicara (mari kita asumsikan itu Romeo, demi Shakespeare), menyatakan bahwa dia adalah 4. Ya, tugas lain dari nilai-nilai.

Potongan 56 panjang

Othello:
 You lying fatherless useless half-witted coward!

Cuplikan 48 dilakukan dengan benar, dengan "karakter". Jika Anda terlalu malas untuk menggulir ke atas (seperti saya), ini berarti orang yang dihina menerima nilai -16.

Potongan 57 panjang

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

Saya sudah menjelaskan bagaimana kondisi bekerja pada SPL secara umum; Namun, analisis yang lebih inline diperlukan. Kami tidak ada elsedi sini: misalnya, dalam contoh ini, jika kondisinya gagal, program akan kembali ke Undang-Undang I; tetapi jika itu benar, itu akan melanjutkan ke instruksi berikutnya, yaitu Recall- pop dari stack, yaitu.

Panjang 58 potongan

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

Meraih potongan 44 dan mempresentasikan bagaimana instruksi harus disajikan. Jika ini adalah dialog antara Romeo dan Othello, maka kita bisa menerjemahkannya ke Jawa sebagai Othello = Math.sqrt(Juliet).

Potongan 59 panjang

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

OK, jika Othello berbicara dengan Romeo, ini akan setara dengan Romeo+(-1); Romeo--, Singkatnya. Cukup mendasar, bukan? Itu SPL untuk Anda.

Panjangnya 60 cuplikan

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

Singkatnya,, if (The Ghost/Hamlet == 0)anggap "aku" adalah milik Hamlet.

Potongan 61 panjang

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

Setelah Anda mengupas lapisan dan lapisan kata dan penghinaan, Anda melihat bahwa SPL adalah hal yang cukup mendasar, tanpa fungsi dan hal-hal keren. Jadi kita memiliki banyak dan banyak fungsi aritmatika pada tubuh program. Jadi, jika ini ditujukan kepada Juliet, itu akan setara dengan Juliet++.

Potongan 62 panjang

twice the difference between a mistletoe and a oozing blister!

Ya, ya, lebih banyak operasi aritmatika. Secara kasar, 62 byte SPL ini dapat diterjemahkan 2*(1-2*(-1)). Ini akan menjadi bahasa golf yang sangat mengagumkan, bukan? Baik.

Panjang 63 cuplikan

You lying stupid fatherless rotten stinking half-witted coward!

Snippet 48 dikeluarkan -16, yang satu ini sama dengan -64: 2*2*2*2*2*2*(-1).

Panjangnya 64 cuplikan

your coward sorry little stuffed misused dusty oozing rotten sky

Dari apa yang saya mengerti tentang SPL, ini sangat sah. Anda memiliki banyak sekali kata sifat yang menghina yang menghasilkan kata benda "positif". Karena kata sifat tidak memiliki perbedaan khusus apakah itu negatif atau tidak (satu-satunya nilainya mengalikan angka di kanan dengan dua), kita dapat memiliki kalimat yang benar-benar konyol seperti ini. Yang setara dengan 256. Karena 2*2*2*2*2*2*2*2*1=256.

Panjang 65 cuplikan

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

Hmm, sangat benci, bukan? Jadi, apa yang kita miliki di sini setara dengan y=0; y=y+(-1);Mungkin bisa "bermain golf" You are a pig!, tapi heh.

Panjang 66 potongan

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

Jadi, kurangi Juliet dari dirimu sendiri, heh? Yang ini cukup mudah untuk diterjemahkan: Romeo=Juliet-Romeo;dengan anggapan Romeo-lah yang diajak bicara.

Potongan 67 panjang

Juliet:
 Am I better than you?

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

Bagaimana sebagian besar kondisi bekerja pada SPL. Anda menguji ekspresi dan, jika itu benar (atau tidak: lihat snippet 33), Anda melompat ke bagian lain dari program; jika tidak, Anda akan melanjutkan ke kalimat berikutnya.

Potongan 68 panjang

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

Ya, ya, saya menjadi agak monoton. Tapi SPL seperti itu. Seperti yang saya katakan sedikit sebelumnya, ekspresinya adalah campuran dari operasi aritmatika. Dengan demikian, ini adalah kenaikan lain - karena stone wallmerupakan "kata benda" netral.

Panjangnya 69 cuplikan

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

Alih-alih penjumlahan, kami memiliki pengurangan antara dua karakter, Othello dan siapa pun yang diajak bicara.

Panjangnya 70 snippet

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

Kami kembali ke tambahan, ya - panggil aku formula, heh. Kami menerjemahkannya ke Romeo + 2*2*1.

Panjang 71 cuplikan

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

Adegan bisa sekecil ini. Julietmemasuki panggung, Othello memberitahunya untuk menampilkan nilai yang tersimpan, kemudian dia turun panggung lagi.

Panjangnya 72 cuplikan

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

Satu lagi operasi aritmatika - karena SPL penuh dengan mereka. Kami dapat menerjemahkan ini ke 2*(1-2*2*(-1)).

Panjangnya 73 potongan

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

Empat instruksi berturut-turut ?! Sebenarnya saya cukup bangga dengan diri saya sendiri. Bagaimanapun, mari kita asumsikan ini adalah dialog antara Romeo dan Juliet (dan dia berbicara): ini berarti bahwa nilai Juliet dimulai dari 0; kemudian, Juliet akan mendorong nilai Romeo ke dalam tumpukan ingatannya, meletuskannya dan mengeluarkannya dalam bentuk yang dimasukkan. Sederhana bukan?

Panjangnya 74 potongan

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

Ya, ya, contoh yang membosankan, saya tahu. Tapi ini X = (Romeo + 1) + 1.

Panjangnya 75 snippet

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

Yah, ini sangat mudah. Jika kemampuan decoding Anda tidak berfungsi, itu diterjemahkan ke if (Othello % X == 0).

Panjang 76 potongan

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

Lompatan dari cuplikan 26 dengan ekspresi di depannya. A gotopada SPL tidak selalu ditemukan di dekat suatu kondisi, bisa seperti ini - dan, tentu saja, tipe ini gotoakan selalu ditemukan di akhir Undang-Undang atau Adegan, karena instruksi setelah itu tidak akan pernah dikompilasi / dilakukan. Instruksi pertama adalah cukup sederhana: x=x+1.

Panjang 77 cuplikan

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

Jadi, ada Juliet dan Hamlet di atas panggung; tapi kami membutuhkan nilai dari Romeo. Jadi, untuk menghindarkan kompiler dari sakit kepala yang sangat buruk, pertama-tama kita menghapus Hamlet dari atas panggung (meskipun itu mungkin Juliet yang harus dituju), kita memberitahu Romeo untuk naik ke atas panggung, Juliet memberinya instruksi untuk menghasilkan nomor (lihat penjelasan cuplikan 21), maka Romeo keluar dari panggung dan Hamlet kembali. Cukup mudah dan sederhana.

Panjang 78 cuplikan

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

Jadi, The Ghost (ayah almarhum Hamlet) memberi tahu Lady Macbeth untuk memberikan nilainya, sementara dia memerintahkan The Ghost untuk membaca nomor dan mendorongnya ke tumpukannya.


32
Ini gambar yang sangat menarik dan profil Anda sangat cocok, dia persis seperti apa yang saya bayangkan seorang programmer SPL akan terlihat.
overactor

3
@ overactor Saya tidak tahu apakah harus dihina atau bangga disamakan dengan Gumby. ^ _ ^
Rodolfo Dias

9
Anehnya ini BUKAN yang paling tidak jelas untuk dibaca contoh di sini ... dan tampaknya terikat untuk "paling tidak praktis".
HRRambler

6
ROFL inilah +1 untuk membantu Anda dalam perjalanan - Sekali lagi ke pelanggaran Rodolfo!
HRRambler

3
@RodolfoDias Anda bisa mulai. Saya menunggu untuk melihat mereka. Anda memiliki 120 suara.
ghosts_in_the_code

176

Piet

Faktoid

Piet adalah bahasa pemrograman di mana kode sumber terdiri dari gambar. Alur program dimulai dengan piksel kiri atas dan bergerak di sekitar gambar antara piksel dan grup piksel hingga berakhir.

Untuk keterbacaan, program Piet biasanya ditampilkan dalam versi yang diperbesar. Dalam kasus seperti itu istilah codelini digunakan untuk menggambarkan sekelompok piksel berwarna sama yang sesuai dengan piksel individual pada gambar sumber.

Untuk tantangan ini, karena Piet tidak menggunakan karakter, satu codel per suara akan digunakan untuk program sampel.

1 Codel

1 Codel

Ini adalah program yang valid, tidak melakukan apa pun dan berakhir. Aliran kontrol dimulai pada piksel kiri-atas (hanya) dan tidak memiliki jalan keluar, yang mengakhiri program.

Pixel dapat dalam hal ini adalah warna apa saja untuk efek yang sama persis.

2 Codel

2 Codel

Ini akan terus membaca karakter dari stdin dan menjaga total berjalan nilai unicode mereka (meskipun tidak ada yang dilakukan dengan total ini dan itu tidak ditampilkan).

Progam flow bergerak bolak-balik di antara 2 kode, karena satu-satunya jalan keluar dari masing-masing adalah ke yang lain. Perintah dalam piet dieksekusi oleh perpindahan dari satu codel atau region ke yang lain, tergantung pada perbedaan rona dan cahaya dari 2 region. Ini inputadalah perintah yang bergerak dari kiri ke kanan dan kemudian dari addkanan ke kiri. Pada addperintah pertama , tidak ada yang terjadi karena hanya ada satu nilai pada stack, dan spesifikasinya mengatakan bahwa perintah tanpa nilai yang cukup diabaikan.

Program ini adalah loop yang tidak akan pernah berakhir, karena sebagian besar program piet akan berukuran sangat kecil, karena dibutuhkan setidaknya beberapa codel untuk "menjebak" aliran program dengan benar dan mengakhirinya.

3 Codel

3 Codel

Ini adalah program dasar-tipe gema, ia akan membaca karakter setiap saat dari stdin dan mencetaknya ke stdout.

Sekali lagi ini adalah infinite loop. Program dimulai dengan perjalanan kiri-ke kanan, yang melakukan hal inputitu output. Program akan terus mengalir ke arah yang sama kapan saja bisa. Pada kode hijau muda satu-satunya jalan keluar adalah mulai bergerak mundur dengan cara lain. Ketika melakukan perjalanan kembali dari kanan ke kiri, ia mencoba melakukan subtractdan addmemerintahkan, tetapi stack kosong sehingga ini menjadi no-op.

4 Codel

4 Codel

Mencetak 2 ke stdout tanpa batas.

Bukan program yang sangat menarik secara fungsional, tetapi sekarang setelah kita akhirnya memiliki jumlah gabungan dari codels kita dapat memamerkan aliran yang sedikit lebih maju daripada dari kiri ke kanan. Ketika aliran program mencoba untuk keluar dari codel, ia terlebih dahulu mencoba arah saat ini. Jika tidak dapat (dalam hal ini karena tepi gambar) itu berputar 90 derajat searah jarum jam dan mencoba untuk keluar lagi. Dalam hal ini, program berjalan sekitar 1 codel searah jarum jam, memasukkan push1 ke tumpukan dua kali, addmenyatukan yang satu, kemudian outputhasilnya.

5 Codel

5 Codel

Membaca karakter berulang kali dari stdin dan melacak jumlah nilai unicode mereka.

Ini pada dasarnya fungsi yang sama dengan versi 2-codel, tetapi tantangan ini adalah tentang menampilkan bahasa, dan salah satu hal keren tentang piet adalah bagaimana Anda dapat memiliki gambar yang tampak berbeda yang melakukan hal yang sama.

Di sini kita melihat codel putih untuk pertama kalinya, yang memungkinkan aliran program meluncur di atasnya tanpa menjalankan instruksi. Magenta dan kode biru melakukan semua pekerjaan di sini. Bepergian dari biru ke merah tidak melakukan apa-apa karena melintasi codel putih di tengah. 2 yang merah hanya pushnomor 1 ke stack dan popmundur saat bergerak dari kiri ke kanan kemudian kanan ke kiri melintasi mereka, dan kemudian melintasi codel putih sehingga tidak ada instruksi yang dijalankan.

6 Codel

6 Codel

Sekali lagi, ulangi fungsi sebelumnya dengan tampilan yang berbeda. Ini adalah program gema lain yang membaca karakter sekaligus dari stdin ke stdout.

Di sini kita melihat codel hitam pertama kami. Alur program tidak dapat memasukkan codel hitam, jadi dari codenta magenta terang di kanan atas program akan gagal keluar tepat karena tepi gambar, gagal keluar turun karena codel hitam, dan memantul kembali ke kiri ke codel merah . Kode biru dan hijau murni dekoratif, program tidak akan pernah memasukkannya.

7 Codel

7 Codel

Namun program gema lain dengan tampilan yang berbeda.

Di sini kita melihat blok kode pertama kami lebih besar dari ukuran 1. Dalam piet, setiap blok kode berdekatan dengan warna yang sama diperlakukan sebagai satu blok. Ukuran blok tidak masalah kecuali ketika menjalankan pushinstruksi, jadi program ini diperlakukan persis seperti versi 3-codel, kecuali dengan warna yang berbeda.

8 Codel

8 Codel

Membaca angka dari stdin dan mengeluarkan kuadrat ke stdout, berulang kali.

Aliran kontrol adalah pola dasar searah jarum jam seperti pada program 4-codel. Mulai dari kiri atas, operasi berurutan adalah input, duplicate(mendorong salinan tambahan dari nilai teratas tumpukan ke tumpukan) multiply,, output. Kemudian pushnilai 1 ke stack, slide di atas putih sehingga tidak ada perintah dijalankan, dan kemudian pop1 dari stack ketika bergerak dari kiri bawah ke kiri atas codel. Ini mengembalikannya ke awal program dengan tumpukan kosong, dan itu berulang.

9 Codel

9 Codel

Menambahkan 1 + 2 = 3, dan kemudian berakhir.

Sekarang kita memiliki program dengan lebih dari 2 codel di kedua dimensi, kita akhirnya dapat mengatur wilayah yang akan menjebak program dan mengakhirinya alih-alih mengulang selamanya. Operasi pertama bergerak dari codel merah ke wilayah merah gelap adalah push1, maka program berputar dan mengalir ke bawah ke codel merah muda di tengah dan pushnilai 2. mengalir dari merah muda ke kuning muda dijalankan sebuah addoperasi. Bilah kuning bawah cahaya menyebabkan program berakhir karena tidak ada cara untuk itu mengalir karena semua sudut diblokir.


Program 1 dan 2 tinggi dengan cepat menjadi jelek dan tidak menarik sehingga mulai saat ini saya akan fokus pada angka yang memungkinkan setidaknya beberapa codel di setiap arah.

12 Codel

12 Codel

Akhirnya sebuah program yang melakukan sesuatu yang bisa dikatakan berguna (meskipun masih sedikit sulit). Membaca 2 angka dari stdin secara berurutan dan kemudian mengeluarkan jumlah mereka, dan melakukan ini berulang kali.

Program mengalir dari kiri ke kanan melintasi 4 bilah berwarna yang menampilkan 2 inputsdiikuti dengan addperintah. Kemudian bergerak ke codel kanan bawah dan melakukan output, dan kemudian pergi ke kiri melintasi wilayah putih kembali ke awal.

Ini bisa dilakukan dalam 8 kode, tetapi karena kami memiliki ruang ekstra, kami dapat membuat sesuatu yang sedikit terinspirasi oleh tampilan TV tanpa sinyal lama.

15 Codel

15 Codel

Membaca angka dari stdin dan mengeluarkan kuadratnya.

Ini menggunakan beberapa trik untuk mendapatkan tampilan simetris pada program yang benar-benar melakukan sesuatu. Bilah merah paling kiri adalah warna yang berbeda pada codel bawah daripada yang lain, mengambil keuntungan dari fakta bahwa (bagi saya setidaknya) 2 warna merah ini terlihat sangat mirip. program akan bergerak dari daerah merah yang lebih terang ke codel biru muda, dan kemudian lurus melintasi tengah program ke hijau muda di sisi kanan tempat ia terperangkap. Ia melakukan input, duplicate, multiply, dan outputoperasi.

Codel merah gelap, bersama dengan codel hijau sedang di bagian atas dan bawah kolom tengah, dekoratif dan program tidak akan pernah mencapainya.

20 Codel

20 Codel

Membaca angka dari stdin hingga angka 0 dibaca, pada titik mana ia mengeluarkan jumlah semua angka yang dimasukkan dan keluar.

Kami akhirnya memiliki cukup ruang untuk melakukan aliran kontrol dalam bentuk pointeroperasi. Keempat codel di bagian atas berkinerja input,, duplicatedan notoperasi, dan kemudian notoperasi lain bergerak dari magenta di kanan atas ke 2-codel kuning di bawahnya. The notoperasi muncul nilai atas off dari stack dan mendorong 1 jika nilai atas adalah 0, dan 1 sebaliknya. Oleh karena itu double- notmenggantikan nilai bukan nol dengan 1. Bergerak dari bilah kuning ke biru gelap melakukan pointeroperasi, yang mengeluarkan nilai teratas dari tumpukan dan menggerakkan penunjuk arah searah jarum jam yang berkali-kali.

Jika nilai teratas adalah 1 (yaitu kita tidak memasukkan nol), penunjuk arah akan menunjuk ke kiri, pindah ke magenta codels untuk addoperasi (yang akan diabaikan pertama kali karena hanya satu nilai pada tumpukan) dan kemudian melalui putih kembali ke awal program.

Jika nilai teratas tumpukan adalah nol pada operasi penunjuk, penunjuk arah tidak akan berubah dan program akan terus ke bawah. Pindah ke pita biru yang lebih terang akan pop0 yang dimasukkan dari tumpukan, hanya menyisakan jumlah dari jumlah akumulasi. Pindah ke bar cyan di bagian bawah akan outputmenjumlahkan, dan kemudian berakhir karena aliran program terjebak.

25 Codel

25 Codel

Countdown! Membaca angka dari stdin, dan kemudian mencetak hitungan mundur ke 1 untuk stdout satu nomor sekaligus. Misalnya, jika 5 dibaca, akan mencetak 54321.

Operasi pertama dari cyan menjadi kuning adalah input. Kemudian kuning adalah tempat program "loop" dimulai. Kuning> Magenta> Biru adalah duplicatekemudian output, sehingga mencetak nilai teratas pada tumpukan tetapi menyimpan salinan. Bergerak turun sisi kanan, kita pushnilai 1 ke stack kemudian melakukan subtraction, penurunan nilai kita dimasukkan oleh 1. Selanjutnya adalah duplicate, not, dan lain notbergerak dari magenta cahaya di kanan bawah untuk kuning gelap di sampingnya. Ini adalah cek nol / bukan nol yang sama dengan program sebelumnya. Bergerak ke kiri ke codel biru muda melakukan pointeroperasi, yang akan bergerak ke kiri ke cyan gelap untuk mengakhiri program jika kita sudah selesai, atau hingga kuning untuk memulai kembali loop kita tanpa input awal tetapi nilai aslinya menurun oleh 1.

Ketiga kode merah tersebut bersifat dekoratif dan dapat berupa warna apa saja.

30 Codel

30 Codel

Generator Fibonacci. Mencetak syarat-syarat deret Fibonacci ke stdout dan tidak berhenti.

Ini adalah perkenalan pertama dari rolloperator, dan juga pertama kalinya ukuran wilayah yang lebih besar dari 1 digunakan dengan pushoperator untuk mendapatkan nilai tertentu ke stack.

Seperti biasa dimulai di kiri atas bergerak ke kanan. 2 operasi pertama pusha 1 ke stack dan kemudian outputsejak deret Fibonacci dimulai dengan dua 1, tetapi loop program utama hanya akan mencetak 1 sekali. Kemudian ada push2 lagi 1s ke stack untuk berakhir di magenta gelap di kanan atas untuk memulai loop program utama.

Bergerak ke bawah di sisi kanan kita duplicatedan outputuntuk mencetak istilah urutan berikutnya, sekali duplicatelagi untuk mendapatkan salinan nilai urutan saat ini. Bergerak ke kiri melintasi bagian bawah menjalankan 2 pushoperasi. Karena wilayah merah muda di kanan bawah berukuran 3 codel, yang pertama pushakan mendorong 3 ke stack, bukannya 1.

Bergerak naik ke biru muda adalah rolloperasi. Ini mengeluarkan 2 nilai teratas dari tumpukan dan melakukan sejumlah gulungan sama dengan nilai pertama yang muncul, hingga kedalaman yang sama dengan nilai kedua yang muncul. Dalam hal ini, ia akan melakukan 1 roll hingga kedalaman 3. Roll to depth nmengambil nilai teratas dari stack (nilai saat ini yang diduplikasi) dan menguburnya hingga ke nkedalaman. Tumpukan kami hanya 3 dalam sekarang sehingga akan mengubur nilai teratas di bagian bawah.

Bergerak ke atas sekali lagi melakukan addoperasi yang menambahkan bersama nilai urutan saat ini dengan nilai urutan sebelumnya. Tumpukan kami sekarang memiliki nilai urutan berikutnya (baru saat ini) di atas, dan nilai terakhir di bawahnya. Program sekarang bergerak melintasi putih ke magenta gelap untuk memulai loop lagi.

Pola kuning di tengah tidak pernah digunakan.

54 Codel

54 Codel

Cetakan "hai!" ke stdout

Bukan pesan yang terlalu panjang, tetapi mencetak dengan piet membutuhkan ruang yang mengejutkan. Pencetakan dilakukan dengan menggunakan nilai unicode, dan bilangan bulat didorong ke tumpukan dengan menggunakan ukuran wilayah yang sedang keluar. Karena kami memiliki jumlah kode yang sangat terbatas untuk tantangan ini, kami menggunakan beberapa matematika untuk mencapai kisaran yang dapat dicetak yang kami inginkan.

Program dimulai dengan push5 dari wilayah cyan di sebelah kiri. Dari sini, ia mengalir di sepanjang bagian atas dengan 6 duplicateoperasi untuk menumpuk stack dengan sekelompok 5s. Berikutnya adalah push1, subtractuntuk meletakkan 4 di atas tumpukan, kemudian 2 multiplyoperasi untuk meletakkan 4 * 5 * 5 = 100 di atas tumpukan. Kemudian duplicateuntuk 2 100-an.

Sekarang program memantul dari hitam dan mulai bekerja ke kiri di sepanjang bagian bawah. Pushoperasi 3 dan 2 dan kemudian a rolluntuk mengubur 2 100 di bawah 5. Berikutnya adalah push1, kurangi, dan tambahkan untuk mendapatkan 100 + 5-1 = 104 di atas tumpukan, yang merupakan unicode "h". 2 operasi berikutnya adalah push1 dan pointeruntuk mendapatkan sekitar sudut dan mulai bergerak tepat di tengah, dan kemudian outputmencetak "h".

Berikutnya adalah add100 + 5 = 105 di atas tumpukan, dan outputuntuk mencetak "i". Tumpukan sekarang berisi dua 5s. Push1, add, multiplymemberi (1 + 5) * 5 = 30. Akhirnya push3 dan add33, dan outputuntuk trailing "!". Program kemudian berjalan melalui ruang putih yang tersisa untuk berakhir di hijau di sebelah kanan.


5
Hah ya, sudah menunggu ini :)
Sp3000

Apa bedanya dengan bahasa karakter 2D? Itu hanya cara Anda menyampaikan nilai sel.
JDługosz

25
@ jdlugosz Banyak bahasa pemrograman esoteris, ketika Anda mulai, hanya beberapa perintah manipulasi tumpukan dasar dengan cara unik untuk menyandikan perintah. Saya pribadi berpikir untuk menyandikannya dalam gambar adalah ide yang rapi.
Spencer

13
Jika kita berbicara tentang kesetaraan fungsional, Anda dapat bertanya "Apa bedanya dengan mesin Turing?" tetapi kemudian Anda dapat
mengarahkan

3
Contoh 9 codel terlihat seperti mini-pokeball. Bagus.
The_Basset_Hound

154

> <> (Ikan)

(Catatan: Beberapa cuplikan dibuat berdasarkan cuplikan sebelumnya, jadi tidak seperti kebanyakan jawaban, saya memutuskan untuk membuatnya dari yang paling awal hingga yang terbaru.)

Faktoid:

Seperti Befunge,> <> adalah bahasa 2D berbasis stack. Ini berarti bahwa instruksi tidak dijalankan secara linear seperti kebanyakan bahasa tradisional - aliran program dapat naik, turun, kiri atau kanan!

Potongan 1 panjang:

X

Xadalah perintah yang tidak valid di> <>, sehingga pesan kesalahan something smells fishy...dicetak. Faktanya, ini adalah satu-satunya pesan kesalahan di> <>, apakah penyebabnya adalah pembagian dengan nol atau mencoba memunculkan tumpukan kosong.

Potongan 2 panjang:

1n

Aliran program di> <> dimulai dari kiri atas dan awalnya ke kanan. 1mendorong 1 ke tumpukan, lalu nmencetaknya sebagai angka (bukan sebagai karakter ASCII). Tetapi program <> adalah toroidal, yang berarti bahwa penunjuk instruksi membungkus ketika mencapai akhir baris. Jadi setelah nkita membungkus untuk memulai, tekan 1, cetak, bungkus ke awal, tekan 1, cetak ... dan kita akhirnya mencetak 1selamanya!

Potongan 3 panjang:

"o;

Berikut "ini string parsing, ooutput sebagai karakter ASCII dan ;mengakhiri program. Tapi apa yang sebenarnya dilakukan oleh program secara keseluruhan?

Yah pertama-tama kita mulai mengurai string, mendorong setiap char yang kita lihat ke stack sampai kita menemukan penutupan ". Kami mendorong o, lalu ;... dan membungkus penunjuk instruksi kembali ke awal. Tapi sekarang kita berada di "sehingga kita berhenti mengurai string, dan akhirnya kita menjalankan odan ;seperti biasa untuk mencetak bagian atas tumpukan (the ;) dan mengakhiri.

Ya, kami baru saja menggunakan tanda kutip yang sama untuk memulai dan mengakhiri string!

Potongan 4 panjang:

42n;

Berdasarkan apa yang telah kita lihat sejauh ini, Anda mungkin mengharapkan ini untuk mendorong 42, output sebagai angka kemudian berakhir. Tetapi semua instruksi dalam> <> adalah karakter tunggal, jadi ini sebenarnya mendorong angka 4 dan 2 , kemudian menampilkan bagian atas tumpukan sebagai angka (hanya angka 2) dan berakhir.

Potongan 5 panjang:

<v
;>

Ingat,> <> adalah bahasa 2D. Ini berarti harus ada cara untuk mengubah arah aliran program!

Seperti Befunge, salah satu cara Anda dapat melakukan ini adalah melalui panah >^v<. Untuk mengilustrasikan cara kerjanya, mari kita lihat program di atas:

  • Aliran program awalnya benar
  • < membuat program mengalir ke kiri - kita ke kiri dan membungkus ke v
  • v membuat program mengalir ke bawah - kita turun ke menu >
  • > membuat program mengalir ke kanan - kita ke kanan dan membungkus ke ;
  • Akhirnya, kami mengakhiri.

Potongan 6 panjang:

";"00p

Fitur keren lain dari << adalah refleksif - program dapat memodifikasi kode sumbernya sendiri dengan cepat!

Di sini kita dorong a ;, diikuti oleh dua nol. pkemudian muncul tiga unsur y, x, v( ymenjadi bagian atas tumpukan) dan tempat-tempat vdi posisi x,y. Dengan kata lain, pdalam program ini menempatkan tanda titik koma di posisi 0,0, mengubah kode menjadi ;;"00p. Ini kemudian memungkinkan program untuk berhenti, karena penunjuk instruksi sekarang membungkus dan mengeksekusi yang baru ditempatkan ;.

Potongan 7 panjang:

\7*n;
6

Un seperti Befunge,> <> juga memiliki mirror ( \/|_#) yang mencerminkan arah aliran program. Jadi di sini kita:

  • Mulai dari kanan, tetapi itu \mencerminkan kita ke bawah
  • Dorong 6 dan bungkus
  • Tekan bagian belakang \dan refleksikan kembali ke kanan
  • Dorong 7
  • Lipat gandakan dua tumpukan teratas
  • Keluaran dan terminasi

Bergerak horizontal melalui _cermin atau vertikal melalui |cermin adalah larangan.

Potongan 8 panjang:

"r00g>o<

Sangat mungkin yang paling sederhana> <> quine jika kesalahan diizinkan untuk dilemparkan. Dua instruksi baru di sini adalah:

  • r: Membalikkan tumpukan
  • g: Dapatkan - pop y, xdan dorong karakter x,yke atas ke tumpukan (padanan dengan p)

Menggunakan trik pembungkus string dari sebelumnya, program awalnya mendorong r00g>o<lalu klik kutipan pertama lagi. Tumpukan kemudian dibalik, memberi <o>g00r. Setelah itu kita dorong char di 0,0, the ", to give <o>g00r". Akhirnya, kami menjebak di oantara dua panah, mengeluarkan bagian atas tumpukan sampai tidak ada yang tersisa dan kami mendapatkan kesalahan.

Potongan 9 panjang:

x0\>
\1n>

x(huruf kecil) menggerakkan penunjuk instruksi ke arah acak, dan program menampilkan fungsi ini dengan mencetak bit acak selamanya. Coba ikuti panah dan cermin untuk mengetahui cara kerjanya! (Jangan lupa untuk memeriksa keempat arah, termasuk atas dan kiri)

Panjang 10 cuplikan:

;a comment

Tidak ada sintaks komentar di> <> - tidak perlu satu. Cukup tulis apa yang Anda inginkan di mana saja dan pastikan itu tidak dijalankan sebagai kode!

Potongan 11 panjang:

1!X2!X+!Xn;

!adalah trampolin yang melompati instruksi. Ini sangat berguna ketika digunakan dengan ?, trampolin bersyarat yang muncul di bagian atas tumpukan dan menjalankan instruksi berikutnya jika elemen yang muncul adalah nol. Kita akan lihat bagaimana ini bekerja nanti.

Kode di atas mencetak 3 dengan melompati Xs, hanya mengeksekusi 1! 2! +! n;.

Potongan 12 panjang:

01v
ao>:@+:n

Mencetak angka Fibonacci selamanya mulai dari yang kedua 1, satu di setiap baris. Perintah baru adalah:

  • a: Tekan 10, yang kami butuhkan untuk baris baru. a-ftekan masing-masing 10 hingga 15.
  • :: Gandakan bagian atas tumpukan
  • @: Putar tiga elemen teratas tumpukan, mis [5 4 3 2 1] -> [5 4 1 3 2].

Lacak untuk beberapa iterasi pertama:

masukkan deskripsi gambar di sini

Potongan 13 panjang:

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

Program "tac" yang berbunyi dalam barisan input dan keluarannya dibalik. Terima kasih kepada @tomsmeding untuk cuplikannya.

=muncul dua elemen teratas dan mendorong 1 jika mereka sama, 0 sebaliknya. Baris pertama terus membaca dalam input sampai ASCII char 13 (carriage return) ditemukan, pada titik mana ia bergerak ke baris kedua.

The l?!;oLoop adalah membangun penting dalam> <> yang output seluruh stack. Tidak seperti >o<itu, itu tidak menyebabkan kesalahan. Begini Cara kerjanya:

  • l mendorong panjang tumpukan
  • Kami memeriksa panjangnya dengan ?:
    • Jika panjangnya bukan nol, maka instruksi selanjutnya !dijalankan, lewati;
    • Jika panjang adalah nol, maka kita tidak mengeksekusi !dan mengakhiri karena;

Perhatikan bahwa tidak ada output yang benar-benar terjadi sampai Anda menekan carriage return.

Potongan 14 panjang:

32.

   X67*n;

Selain mengubah arah aliran program, Anda sebenarnya dapat memindahkan penunjuk instruksi ke mana pun Anda suka!

.muncul y, xdan teleport pointer instruksi ke x,y, mempertahankan arah. Namun, perlu diketahui bahwa Anda harus pindah ke satu kotak sebelum ke mana Anda ingin pergi - penunjuk instruksi diperbarui sebelum instruksi berikutnya dijalankan. Jadi di sini pointer instruksi mendarat pada yang tidak valid X, tetapi semuanya baik-baik saja karena pointer pindah ke 6sebelum melanjutkan eksekusi.

.memungkinkan untuk mengonversi sebagian besar program <>> menjadi satu-liner, tetapi mengapa Anda ingin kehilangan kesenangan 2D? :)

Panjang 15 cuplikan:

01+:aa*=?;:nao!

Mencetak angka 0ke 99, satu di setiap baris. Program ini menunjukkan penggunaan !trampolin yang rapi - untuk memastikan bahwa 0 awal hanya ditekan satu kali.

Potongan 16 panjang:

"r00g!;oooooooo|

Quine yang tepat yang tidak menghasilkan kesalahan, terinspirasi oleh quine di halaman esolang .

Jika Anda bertanya-tanya tentang bagaimana memodifikasi quine sebelumnya (snippet # 8) sehingga tidak akan menyebabkan kesalahan dan berpikir "mengapa saya tidak menambahkan satu ton oinstruksi saja?", Maka Anda mungkin menyadari bahwa untuk setiap oAnda menambahkan , Anda perlu menampilkan yang lain o! Quine ini dengan rapi menyelesaikan masalah dengan meletakkan |cermin di ujungnya, yang memungkinkan masing o- masing digunakan dua kali .

Jika kita beralih ke tanda kutip tunggal (yang juga untuk parsing string), maka alternatif quine yang tidak digunakan gadalah

'r3d*!;oooooooo|

Potongan 17 panjang:

b2,63,.

   17,n;

Kami memiliki penjumlahan ( +), pengurangan ( -), perkalian ( *), modulo ( %) ... tetapi bagaimana dengan pembagian? Itu ada di sana, tetapi karena /sudah menjadi cermin, pembagian telah diberi ,simbol sebagai gantinya. Menariknya, divisi adalah divisi float , bukan divisi integer!

Program di atas mengeksplorasi beberapa perilaku yang tidak terdefinisi dengan mencoba melompat ke sana 11/2, 6/3. The Python intepreter tampaknya baik-baik saja jika koordinat pertama tidak integer (meskipun melompat ke tempat yang salah), tapi tersedak jika kedua adalah tidak.

Potongan 18 panjang:

123456${{$}nnnnnn;

Kami telah melihat rmana yang membalik tumpukan dan @yang memutar tiga elemen teratas. Berikut adalah beberapa perintah yang memindahkan elemen pada stack:

  • $: Tukar dua elemen teratas
  • {: Geser seluruh tumpukan ke kiri
  • }: Geser seluruh tumpukan ke kanan

Untuk menunjukkan cara kerjanya, berikut ini adalah jejak program:

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

Lalu kami memberi, memberi 256431.

Potongan 19 panjang:

"reward"4[roooo]oo;

Sampai sekarang saya sudah mengatakan "tumpukan", "tumpukan" ...

Meskipun sebagian besar program hanya menggunakan satu tumpukan,> <> sebenarnya dapat memiliki banyak tumpukan! Berikut adalah instruksi yang relevan:

  • [: Muncul xdan pindahkan xelemen atas ke tumpukan baru
  • ]: Menghapus tumpukan saat ini, dan memindahkan nilainya ke tumpukan yang mendasarinya.

Inilah jejak untuk program di atas:

       [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

Perhatikan bahwa hanya mendorong rewarddan mengeluarkannya lagi ooooooakan mencetak drawer, karena sifat tumpukan pertama, terakhir keluar.

Potongan 20 panjang:

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

Fitur yang sedikit diketahui dari> <> adalah bahwa, seperti Python, garis miring terbalik dapat digunakan untuk kelanjutan garis dalam banyak kasus. *

Kode di atas secara fungsional sama dengan

aa*5+7a*2+oo;

* Penafian: Alasan mengapa ini berfungsi mungkin atau tidak karena alasan yang sama sekali berbeda

Panjang 22 cuplikan:

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

Selain tumpukan,> <> juga memiliki register (satu untuk setiap tumpukan) yang dapat digunakan untuk menyimpan nilai. Memanggil &untuk pertama kalinya akan memindahkan nilai teratas tumpukan ke register, dan mengeksekusi &kembali akan mengembalikan nilai tersebut. Ini bisa sangat berguna ketika mengumpulkan nilai, misalnya jumlah dan faktorial.

Program di atas menghitung faktorial f(15), mencetak 1307674368000. Berikut jejak untuk fdiganti dengan 4:

masukkan deskripsi gambar di sini

Panjang 24 cuplikan:

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

Kami memiliki cukup karakter untuk program favorit semua orang! Di sini kita menggunakan .teleporter untuk loop keluaran.

Potongan 25 panjang:

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

Sayangnya> <> hanya memungkinkan membaca dari STDIN satu karakter pada satu waktu, yang membuat membaca dalam angka sedikit rumit. Untuk input yang terdiri dari angka 0-9, program ini pada dasarnya adalah atoi, mengubah serangkaian digit dari STDIN menjadi angka pada tumpukan (yang kemudian dicetak).

Catatan lain adalah bahwa pada EOF, itekan -1 ke tumpukan. Ini memudahkan pemeriksaan EOF dengan membandingkannya dengan 0 menggunakan (, atau "kurang dari".

Cuplikan ini juga menggunakan ~, yang muncul dan membuang elemen atas tumpukan.

Panjang 33 cuplikan:

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

Sampai sekarang, sebagian besar cuplikan relatif linier, atau hanya contoh sederhana yang menunjukkan fungsionalitas> <>. Sekarang saya bisa memberikan contoh yang menyoroti betapa mudahnya memvisualisasikan aliran program dalam> <> dengan program yang ditata dengan baik.

Program membaca dalam satu karakter ASCII dan menjalankan 3x+1algoritma pada titik kode-nya (In> <>, karakter pada dasarnya adalah bilangan bulat). Setiap langkah dari algoritma dicetak sampai kita menekan 1.

Berikut ini adalah jejak untuk beberapa iterasi pertama dengan input a(titik kode 97):

masukkan deskripsi gambar di sini

Panjang 44 cuplikan:

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

Saya tidak merasa seperti saya telah melakukan pkeadilan perintah, karena hanya menggunakannya sekali dalam potongan # 6, jadi inilah fungsi atoi yang berbeda. Apa yang keren tentang ini? Program menulis ekspresi yang diperlukan untuk menghitung angka ketika membaca input!

Jadi untuk input seperti 573, setelah semua karakter dibaca, akhir baris ketiga akan terlihat seperti \0a*5+a*7+a*3+, yang dievaluasi menjadi 573!

Sekali lagi, input diharapkan hanya digit. Lacak GIF di sini .

Panjang 74 cuplikan:

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

Jika Anda berhasil turun ke sini, maka Anda mungkin setuju dengan saya ketika saya mengatakan bahwa ini adalah program ROT13 yang sangat mudah dibaca. Diberikan char c1, kami menemukan char pertama c2di AN[an{, sehingga c1 < c2, kemudian menerapkan offset yang sesuai dengan menambahkan / mengurangi d(13). Perhatikan bahwa [dan {adalah karakter langsung setelah Zdan zmasing - masing.

Cobalah di konsol, dan saksikan huruf-huruf berubah saat Anda mengetik!

(Anda juga dapat menyalurkan input, tetapi karena saya kehilangan EOF, ceknya :0(?;akan berhenti dengan kesalahan saat mencoba mencetak -1 sebagai char)


Gagasan untuk cuplikan 13: i:d=?v NEWLINE o;!?l<- mencetak garis masukan mundur
tomsmeding

12
Saya berharap bisa memberikan suara lebih banyak, saya sekarang terinspirasi untuk mulai belajar> <> ...
Robobenklein

6
+1 untuk memulai dari atas dan ke bawah (dan juga hanya karena itu menyenangkan untuk dibaca).
mbomb007

5
@ mbomb007 Sayang sekali, bahwa pesanan tidak bisa ke kiri / kanan dan bungkus ke bagian bawah halaman: P
krs013

Cuplikan panjang 8 Anda akan menjadi quine benar jika Anda menulis something smells fishy...di baris berikutnya.
wizzwizz4

148

C - mengedit

Terima kasih untuk suaranya! Jika dibandingkan dengan bahasa lain dan apa yang dapat mereka lakukan dalam byte terbatas, C terlihat usang, cerewet, dan terlalu bergantung pada pengembang. Dalam banyak hal, itu adalah: bahasa yang ditulis dengan skrip dan tingkat yang lebih tinggi dengan manajemen memori otomatis jauh lebih ekspresif dan lebih cepat untuk diproduksi daripada C yang pernah ada.

Jadi mengapa fitur C?

Rahasia tersembunyi di balik semua bahasa scripting adalah bahwa penafsir kemungkinan ditulis dalam C (atau lebih baru, C ++ atau Java). Kompiler C ++ pertama sebenarnya dikompilasi ke kode C. Bahkan, sampai ada pasar untuk kompiler langsung, biasanya lebih efektif untuk menulis kompiler untuk menghasilkan C, dan kemudian kompilasi itu.

Jika Anda bekerja pada platform yang sangat kecil, mungkin bahkan tanpa sistem operasi yang tersedia, Anda mungkin bekerja di C. Saat ini, hampir setiap alat memiliki mikrokontroler yang tertanam di dalamnya, tidak diragukan lagi diprogram dalam C. Ketika mereka membutuhkannya kecil dan cepat, C adalah jalan yang harus ditempuh. (Juga FORTH, untuk para masokis.)

Mengetahui C akan membawa Anda sedekat mungkin dengan logam tanpa harus menjadi assembler, dan membantu Anda dalam bahasa lain. Anda memiliki ide bagus bagaimana fungsi virtual C ++ mungkin bekerja. Anda tahu ketika Anda menulis fungsi rekursif pass-by-value di PHP, yang secara internal melakukan banyak alokasi memori dan penyalinan, jadi Anda secara naluriah mencoba pass-by-reference. Callback dan referensi tidak membuat pengembang C takut, mungkin Haskell juga.

Seperti yang Kernighan dan Ritchie sebutkan dalam kata pengantar mereka tentang Bahasa Pemrograman C klasik , edisi ke-2, C bukan bahasa yang besar, dan itu tidak terlayani dengan baik oleh sebuah buku besar. Saya mencoba mengikuti saran ini: contoh melakukan tugas ganda, rangkap tiga atau lebih jika memungkinkan.

Semua potongan setidaknya dapat dikompilasi sendiri. Mereka yang dapat ditautkan dan dieksekusi diindikasikan demikian. Saya tahu ini bukan persyaratan, tetapi membuatnya lebih sederhana daripada mencoba menjelaskan kerangka kerja yang diperlukan untuk membuat potongan kode apa pun berfungsi.

Saya juga mencoba memastikan setiap potongan kode sesingkat mungkin sehingga saya tidak memperkenalkan ruang ekstra hanya untuk membanjiri dengan panjang tertentu. Dalam kasus di mana kode indentasi, indentasi tidak termasuk dalam panjangnya, hanya satu karakter untuk setiap baris baru.

Faktoid

C batu.

Panjang 0 cuplikan

Program reproduksi-diri terpendek di dunia http://www.ioccc.org/1994/smr.hint

Potongan 1 panjang

;

C membuat perbedaan antara kompilasi dan penautan. Banyak entitas di C yang baru saja dikompilasi dan dihubungkan - contohnya adalah semua perpustakaan statis dan dinamis.

Entitas lain hanya disertakan dan tidak menghasilkan kode sendiri.

Semi-colon di atas pasti akan dikompilasi menjadi kode objek, dan tidak melakukan apa-apa!

Potongan 2 panjang

x;

C, sebagai bahasa pemrograman yang lebih lama, telah melalui beberapa iterasi. Yang paling awal digunakan secara luas dikembangkan oleh Kernighan dan Ritchie dan disingkat K&R. K&R C terkenal karena membuat banyak asumsi tentang kode Anda jika Anda tidak secara eksplisit menyediakannya.

Secara khusus, dalam K&R C, kode di atas dianggap sebagai integer global yang xdiinisialisasi ke 0. Mengkompilasinya dalam mode K&R akan menghasilkan file objek yang menyediakan program apa pun yang menghubungkannya dengan variabel ini untuk penggunaannya.

Potongan 3 panjang

??/

C begitu luas sehingga perlu menyediakan fitur kompatibilitas untuk sistem yang tidak memiliki semua karakter yang digunakannya. Di atas adalah trigraph untuk garis miring terbalik, yang digunakan dalam C sebagai karakter kelanjutan garis. Di atas akan dikompilasi, kemungkinan dengan peringatan bahwa tidak ada garis yang mengikuti.

Budaya umum dalam C adalah mengabaikan peringatan kompilasi, dan banyak basis kode besar selalu memiliki beberapa atau lebih peringatan ketika sedang dibangun.

Potongan 4 panjang

f();

Sekali lagi dengan K&R, hal di atas "diisi" untuk berarti pada kompilasi bahwa "Ada, dengan hubungan global, suatu fungsi f, yang akan disediakan kemudian, yang mengambil sejumlah argumen tetap tetapi tidak ditentukan dan mengembalikan integer."

Perhatikan perbedaan mendasar antara ini dan f;.

Potongan 5 panjang

s="";

K&R C terkenal karena benar-benar memaafkan. Setelah dikompilasi, kode ini akan memberikan integer suntuk hubungan global yang diinisialisasi ke alamat awal dari string kosong (saya pikir). K&R dengan tenang menangani semua paksaan, termasuk pemotongan jika bilangan bulat tidak cukup besar untuk menampung alamat.

Ini adalah konstruksi seperti ini yang telah menghasilkan banyak bug yang sulit ditemukan dan memberikan banyak inspirasi dalam kompetisi IOCCC.

Potongan 6 panjang

o=042;

Sebuah gotcha dari timer yang bahkan lama, 0 di depan dalam angka literal berarti digit berikut berada di pangkalan oktal. Kode di atas, saat dikompilasi, akan memberikan integer ountuk hubungan global yang diinisialisasi ke desimal 34.

Fitur C ini telah menggigit banyak pengembang yang berusaha keras untuk menambah jumlah mereka agar mereka dapat berbaris dengan baik dan merata!

Potongan 7 panjang

f(){f;}

Kode di atas adalah fungsi dengan tubuh. Tapi apa fungsinya? Itu mengambil alamat fungsi, dan tidak melakukan apa-apa dengan itu! Biasanya fungsi yang akan dikembalikan tidak terdefinisi. Kode tidak masuk akal seperti ini sering dapat dikompilasi tanpa peringatan.

Potongan 8 panjang

main(){}

Ini mewakili kode yang dapat dikompilasi dan terpendek terpendek dalam C. Sementara dalam versi C modern, fungsi biasanya tidak dapat didefinisikan secara implisit, karena alasan historis pembatasan ini direlaksasi main.

Keajaiban program ini, yang tidak melakukan apa pun kecuali mengembalikan 0, akan dikompilasi ke ukuran yang tidak dapat diabaikan, dan tautan dalam berbagai rutinitas runtime C. Anda dapat mengkompilasi dan menautkan dengan verbositas yang disetel ke penuh untuk melihat apa yang terjadi di bawah tenda.

Potongan 9 panjang

#define Z

File header C andalan adalah #definearahan preprosesor. Program C mengkompilasi dalam berbagai tahap, dan dalam salah satu tahap ini definisi ini diganti dengan nilai aktualnya.

Ketika argumen hilang, C akan menyiratkan 1, sehingga di atas akan menggantikan di 1mana pun Zdigunakan dalam kode sumber.

Di atas biasanya akan dimasukkan ke dalam file header dan #included seperti yang diperlukan.

Panjangnya 10 cuplikan

enum{P,Q};

Kata enumkunci menyediakan cara yang kadang-kadang aman untuk menentukan serangkaian konstanta. Seperti mendefinisikan, mereka sering digunakan dalam file header. Kode di atas ketika disertakan akan didefinisikan Psebagai bilangan bulat 0 dan Q1.

Potongan 11 panjang

volatile v;

Kata volatilekuncinya adalah membuat kompiler tahu bahwa suatu variabel dapat diubah oleh agen lain dan tidak membuat asumsi bahwa itu akan tetap konstan di antara akses.

Panjang 12 cuplikan

#pragma once

#pragma once adalah arahan preprocessor yang tidak standar tetapi didukung secara luas untuk menunjukkan bahwa file sumber saat ini dimasukkan hanya sekali dalam satu kompilasi.

Teknik tradisional dan didukung penuh adalah dengan menggunakan #includepenjaga dengan kekurangan kode tambahan dan kemungkinan bentrokan nama.

Potongan 13 panjang

w(){for(;;);}

Ada banyak konvensi dalam C, dan salah satunya adalah bagaimana merepresentasikan loop tak terbatas. Dalam hal ini, for(;;)menunjukkan tidak ada inisialisasi, tidak ada pemeriksaan keluar yang default ke 1 artinya benar - yaitu tidak rusak, dan tidak ada kode pengulangan.

Kadang mungkin untuk melakukan semua yang ada di dalam ()dan loop itu sendiri tidak memerlukan tubuh. Dalam hal ini titik koma ditambahkan di bagian akhir.

Dalam kode di atas, ketika dikompilasi, itu akan menyediakan fungsi yang akan memasuki lingkaran sibuk ketat - salah satu yang tidak boleh ada dalam desain perangkat lunak - dan tidak pernah kembali.

Panjang 14 cuplikan

int a[]={1,2};

Array dalam C tidak perlu panjang yang ditentukan. Kurung kotak kosong []memberitahu kompiler untuk "mencari tahu sendiri". Namun dalam C, tidak seperti bahasa lain, tidak ada cara bawaan untuk mencegah mengakses array di luar batas ini, yang mengarah ke metafora "tembak dirimu sendiri" yang dikenal C.

Kode di atas, ketika dikompilasi, akan menyediakan array global yang bisa berubah adari dua integer yang diinisialisasi dengan 1 dan 2.

Panjang 15 cuplikan

const long k=7;

The constspecifer adalah tambahan kemudian C dipinjam dari C ++. Pertanyaan wawancara yang umum adalah "Apakah masuk akal untuk mendefinisikan variabel sebagai volatile const?". constbersama enumdan inlinedimaksudkan untuk mengurangi ketergantungan #defineyang memiliki masalah dengan keamanan jenis.

Panjang cuplikan 16

extern void **q;

externdigunakan untuk menunjukkan bahwa suatu variabel dideklarasikan di tempat lain. The void *jenis adalah jenis generik standar dalam C, yang berarti tidak perlu secara eksplisit dilemparkan atau cor dari dalam laporan tugas. The **urut Operator berarti pointer ke pointer, yang sering berhembus pikiran pemula, tapi benar-benar berlaku dan sering digunakan C.

Potongan 17 panjang

double d=4/3-1/3;

Jika Anda mencetak di atas, hasilnya akan menjadi satu, dan Anda akan berpikir, super! Ubah ke double d=4/3-2/3;dan apa jawabannya? Itu masih satu! C menggunakan bilangan bulat aritmatika untuk menghitung 4/3 → 1 dan 2/3 → 0, dan 1 - 0 → 1!

Panjangnya 18 cuplikan

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

Akhirnya kita mendapatkan beberapa kode yang benar-benar melakukan sesuatu! putsadalah favorit pegolf C karena tidak memerlukan file header untuk digunakan.

putsjuga akan menambahkan umpan baris ke output. Sebaliknya, mitranya getsakan menghapus feed garis. Seseorang tidak boleh menggunakan getskecuali dalam keadaan yang sangat terkontrol - ia tidak memiliki perlindungan untuk buffer overruns dan merupakan akar penyebab banyak eksploitasi.

Potongan 19 panjang

#include <stdlib.h>

Dimasukkannya file header sering merupakan tanda tangan pribadi pengembang. Banyak yang memasukkan libdan ioterlepas dari apakah mereka dibutuhkan. Beberapa memesan file header sehingga panjangnya bertambah atau berkurang. Banyak yang menempatkan <>sebelumnya "". Secara pribadi saya telah menggunakan tanda tangan ini di TA hari saya untuk memeriksa kecurangan di antara siswa: tanda tangan header yang sama? Lihat lebih dekat!

Panjangnya 20 cuplikan

char*p=(char*)0x300;

C dirancang untuk digunakan pada platform dasar tingkat yang sangat rendah. Dalam beberapa kasus, Anda mungkin perlu mengakses port yang dipetakan memori khusus secara langsung.

Dalam kode di atas alamat port didefinisikan sebagai heksadesimal 300. Anda akan mengakses nilai port dengan menggunakan *p, seperti *p=0xff;untuk mengaktifkan semua bit, atau v=*p;untuk mengambil nilai saat ini.

Potongan 21 panjang

int w=sizeof(double);

The sizeofoperator menyediakan ukuran dalam bytes dari jenis. Dengan nama variabel, tanda kurung tidak diperlukan misalnya double d;int w=sizeof d;.

Panjangnya 22 cuplikan

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

Cara asmyang akan digunakan ditentukan oleh kompiler. Di atas adalah contoh kode in-line Linux gcc pada platform Intel.

Unix yang asli memiliki sebagian kecil tetapi tidak dapat diabaikan dari kode di assembler. Bahkan hari ini, jika kecepatan menjadi perhatian utama dan portabilitas sama sekali tidak, Anda akan melihatnya digunakan.

Pada sistem yang kompatibel, kode di atas akan dikompilasi, dan itu akan benar-benar menjadi instruksi perakitan terisolasi tanpa cara konvensional untuk mengaksesnya! BTW xor R,Radalah idiom bahasa majelis umum untuk membersihkan register dengan cepat.

Potongan 23 panjang

union u{char c;int i;};

A unionakan menyediakan setidaknya cukup ruang untuk elemen terbesar. Anda mungkin melihatnya digunakan bersamaan void *untuk menyediakan tipe "buram" yang umum di perpustakaan tertentu. Dalam hal ini, serikat pekerja biasanya akan menjadi bagian dari struktur yang lebih besar, dengan struktur yang memiliki lapangan untuk mengidentifikasi jenis serikat pekerja.

Panjangnya 24 cuplikan

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

Komentar C asli dibatasi sebagai /* comment */, dan meminjam // comment to end of lineformat dari C ++.

Panjangnya 25 potongan

int main(void){return 1;}

Ini adalah versi yang lebih sesuai dari cuplikan 8 panjang di atas. Tipe pengembalian dan tipe fungsi ditentukan, dan memiliki nilai yang dikembalikan secara eksplisit.

Konvensi dalam C adalah menggunakan nilai balik 0untuk kesuksesan dan 1kegagalan, atau jika Anda ingin benar-benar sesuai EXIT_SUCCESSdan EXIT_FAILUREseperti yang didefinisikan dalam stdlib.h.

Potongan 26 panjang

typedef struct{int x,y;}P;

typedefsangat berguna, khususnya typedef struct,. Dalam istilah modern, Anda mungkin menyebutnya "objek-orientasi-cahaya".

Setelah memasukkan di atas, kode dapat digunakan Psebagai tipe reguler dalam deklarasi dan fungsi, dengan pengecekan tipe penuh. Tidak seperti C ++, Anda tidak dapat mendefinisikan operator seperti +, *, atau <<, karenanya "orientasi objek-cahaya".

Potongan 27 panjang

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

C memiliki #definesintaks makro yang nyaman .

Kesalahan pemula yang baru adalah menghilangkan tanda kurung bagian dalam dan / atau luar, yang mengakibatkan kesalahan prioritas operator yang sulit ditemukan.

Potongan 28 panjang

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

C dapat secara eksplisit mendefinisikan bit-field yang dapat ditugaskan dan dibaca dan dimanipulasi seperti integer apa pun.

Di atas adalah perkiraan struktur data floating point IEEE lebar-tunggal.

Potongan 36 panjang

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

Dalam banyak bahasa, Anda tidak perlu peduli bagaimana angka diwakili. Dalam C, Anda harus sangat menyadari representasi internal mereka.

Contoh terbaik yang dapat saya pikirkan adalah menentukan apakah integer adalah kekuatan dua {1, 2, 4, 8, ...}. Mereka yang tidak terbiasa dengan C akan melakukan loop dan shift dan segala macam hal untuk run-time O (log (n)), tidak buruk, tetapi di atas adalah fungsi yang akan melakukan hal yang sama dalam run-time O (1). Saya akan meninggalkannya sebagai latihan bagi pembaca untuk mengonfirmasi itu berfungsi, tetapi itu benar-benar ...

The !!konvensi sering digunakan untuk memaksa integer dari non-nol dan nol sampai 1 dan 0 masing-masing. Banyak pengembang C suka menggunakan trik semacam ini (seringkali bertentangan dengan mereka yang menghargai kejelasan kode).

Pengembang C yang sangat tajam dapat mengonfirmasi bahwa hal di atas akan bekerja pada perangkat yang melengkapi dan menandatangani. Bagi mereka yang bertanya-tanya, Anda hampir pasti akan mengerjakan perangkat keras berpasangan dua sekarang. Hanya yang benar-benar beruntung (atau tidak beruntung tergantung pada sudut pandang Anda) yang perlu khawatir tentang ini!

Panjangnya 48 cuplikan

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

C99 termasuk dukungan untuk bilangan kompleks. Seperti yang dapat Anda lihat dari kode, itu mengambil bentuk pengubah untuk tipe nyata. Anda juga bisa menggunakan int complex c=3+I*4;tetapi secara internal itu memaksa ke tipe floating point. Kode di atas akan dikompilasi dalam gcc menggunakan gcc -std=c99 -c length-48.c.

Jika Anda ingin melihat lebih banyak internal, coba kompilasi dengan sakelar -E. Untuk versi gcc saya, deklarasi di atas menjadi double _Complex c=3.0+(__extension__ 1.0iF)*4.0;. Perhatikan bahwa tipe kompleks adalah tambahan yang signifikan untuk bahasa, bukan hanya beberapa makro murah.

Ini hanya penggoda, ketika kita mendapatkan lebih dari 125 karakter, maka kita dapat mulai bersenang-senang nyata dengan bilangan kompleks!

Potongan 51 panjang

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

Karena berbagai alasan, C tidak secara otomatis menautkan ke fungsi matematika standar seperti sin, cos, tan, sqrt, dll. Jadi jika mereka digunakan, tetapi tidak terhubung, pengembang akan disajikan dengan kesalahan tautan yang tidak ditentukan referensi ke 'sqrt' , atau kesalahan lainnya.

Di gcc, kode di atas akan mengkompilasi dan menggunakan tautan gcc length-51.c -lm.

Note sin(3.2)akan mengembalikan angka negatif, yang akar kuadratnya tidak legal di domain sebenarnya. Dalam C, nilai khusus NaNdikembalikan untuk menunjukkan kesalahan ini, yang bebas untuk diabaikan oleh program!

Di C99, ada banyak fungsi penanganan pengecualian baru untuk memberikan kontrol yang sangat aman dan terinci dari jenis kesalahan matematika ini, yang hampir tidak ada yang menggunakan!

Panjang 63 cuplikan

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

Atau lebih terformat:

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

Seperti yang mungkin sudah Anda duga, ini semua tentang kata kunci staticyang memiliki lebih dari satu makna dalam C.

Dalam dua kasus pertama, staticmemberitahu kompiler bahwa integer wdan fungsi Xtidak terlihat di luar file atau unit kompilasi ini, yaitu kompiler internal.

Fungsi-fungsi ini tidak dimaksudkan untuk dipanggil secara eksternal, sehingga mereka mungkin tidak memeriksa argumen untuk validitas, dan memotong sudut lainnya. Karena mereka memiliki ruang lingkup internal, Anda dapat mendefinisikan ulang wdan Xdalam file lain, dan mereka biasanya akan terpisah.

Dalam kasus terakhir, staticmenunjukkan bahwa integer smempertahankan nilainya antara panggilan fungsi. Pertama kali Xdipanggil, sakan menjadi nilai awal 7, ketika eksklusif-ORed dengan x, nilai baru akan dipertahankan.

Secara internal, meskipun tergantung implementasi, organisasi memori yang biasa adalah yang sberada di heap, khususnya memori yang diinisialisasi, sementara argumennya xberada di stack. Di mana variabel berada penting jika Anda ingin menerapkan algoritma rekursif, misalnya.

Gotcha dalam C adalah bentrok dengan variabel global. Sampai wdan Xbenar-benar didefinisikan sebagai static, jika mereka didefinisikan secara global di suatu tempat, maka wdan Xakan merujuk pada entitas global sebagai gantinya.

Di sini qdan wmungkin tidak diinisialisasi ke nilai yang sama, karena global wdigunakan untuk mengatur q:

static int q = w;
static int w;

Jika global wtidak ada, kompilasi akan gagal.

Di sini qdan wakan diinisialisasi ke nilai yang sama:

static int w;
static int q = w;

Biasanya, desainer akan mengurangi bentrokan nama dengan menambahkan awalan atau akhiran khusus ke variabel dan fungsi global mereka.

Di C99, statictelah digunakan lagi, misalnya int Y(int a[static 10]);yang berarti bahwa ada fungsi Yyang mengambil setidaknya 10 integer array .

Panjangnya 74 potongan

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

Atau ditata dengan baik:

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

Kata kunci registermemberikan petunjuk kepada kompiler bahwa menggunakan register perangkat keras akan bermanfaat di sini. Fungsi di atas akan menyalin lbilangan bulat dari qke p, menggunakan register perangkat keras jika memungkinkan.

Terkadang speedups bisa jadi signifikan. Misalnya, dalam keluarga mikroprosesor 68K, baris *p++ = *q++dapat diterjemahkan ke satu instruksi MOVE.W (Ap)+,(Aq)+vs. enam atau delapan jika Anda tidak menggunakannya register. Mikroprosesor 68K memiliki mode post-increment dan pre-decrement yang eksplisit, sehingga pengembang yang paham, jika dia tahu platformnya, akan menyesuaikan kode dengan menggunakan x++dan --yvs ++xdan y--.

Hari-hari ini sebagian besar kompiler mengabaikan register, selain tidak mengizinkan alamat diambil dari mereka (misalnya di atas &lakan menyebabkan kesalahan kompiler).

Panjang 88 potongan

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

Atau dengan tata letak yang lebih waras:

#include <stdio.h>

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

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

Ah, rekursi! Cuplikan adalah program lengkap untuk mengkompilasi, menautkan, dan menjalankan. Fungsi ini fmenghitung faktorial dari argumennya xdengan menggunakan rumus rekursif f (x) = x * f (x - 1). Faktorial menjadi besar dengan sangat cepat, jadi misalnya f(12)adalah nilai terbesar yang dapat Anda peroleh dalam bilangan bulat 32-bit yang ditandatangani.

Untuk contoh kode yang sangat rekursif, lihat implementasi naif dari fungsi Ackermann .

Kompiler pintar dapat mengoptimalkan fungsi, menggunakan petunjuk inlinedan "membuka gulungan" fungsi ketika konstanta disediakan sebagai argumen sehingga:

f(12)

Menjadi:

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

Tanpa fungsi panggilan diperlukan!

Kompiler lain dapat mengatur ulang fungsi:

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

Dan mengimplementasikan sesuatu yang disebut ekor-rekursi. Ini berlaku menggantikan fungsi panggilan terakhir ke goto sederhana dan memungkinkan fungsi berurusan dengan pengembalian. Keuntungannya adalah mengurangi tumpukan tumpukan, kode lebih cepat dan lebih kecil.

Dalam bahasa rakitan, jenis peluang pengoptimalan ini sangat mudah dikenali dan dapat diimplementasikan dengan sesuatu yang disebut "pengoptimal lubang kunci", yang pada dasarnya mencari pola kecil dan menggantinya dengan sesuatu yang lebih cepat dan / atau lebih kecil.

Panjangnya 117 cuplikan

#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;}

Atau:

#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;
}

C meminjam dari bahasa kontemporer pada saat itu, konsep I / O universal yang dapat secara konsisten diterapkan pada perangkat apa pun, baik konsol, kartu punch, tape, disc atau printer, tetapi dalam bentuk C yang sebenarnya, itu memungkinkan pengembang untuk membuat pernyataan yang sangat singkat tapi kuat.

Dalam cuplikan di atas, ia akan mengambil input baris perintah, parsing dua bilangan bulat yang dipisahkan oleh spasi, tab atau koma dan hasilkan. Itu mengambil keuntungan dari scanfspecifier baru %*[\t ,]yang akan: [\t ,]menarik semua tab, spasi dan koma, dan: *abaikan.

Saya ingat merevisi beberapa kode C ++ di mana pengembang melakukan semuanya dengan cara "murni" C + + <<dan gudang metode seperti finddan substr. Itu setidaknya selusin baris dan masih tidak bisa menangani koma sebagai pembatas. Saya mengganti semua kode kikuk itu dengan satu sscanfbaris seperti di atas!

Panjangnya 132 cuplikan

#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;}

Atau:

#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;
}

Fungsi printf, sprintf, fprintfdll penggunaan format specifiers untuk menentukan lebar dan padding dari output.

Kompilasi dan jalankan argumen di atas menggunakan perintah untuk melihat berbagai output:

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

Perhatikan .5batas output untuk specifier paling banyak lima karakter, sementara yang terdepan 5memastikan output setidaknya lima karakter, dengan -menunjukkan perataan kiri. Menggabungkan mereka menetapkan output tepat lima karakter.


4
Saya tidak berpikir bahwa ada persyaratan untuk menambahkan factoid baru untuk setiap upvote :)
Pengoptimal

28
Budaya umum dalam C adalah mengabaikan peringatan kompilasi , saya tidak berpikir ini mendekati kebenaran!
Shahbaz

4
Jika Anda memiliki proyek besar dan mempertimbangkan banyak kompiler, akan sia-sia mencoba menghilangkan semua peringatan.
feersum

5
Ini luar biasa
Kik

4
Saya seorang programmer C, dan saya tidak takut pada Haskell.
Shahbaz

138

x86 Kode Mesin

Faktoid:

x86 Machine Code adalah versi rakitan x86 Assembly yang benar-benar dijalankan prosesor. Ini dikembangkan kembali ketika memori dan ruang penyimpanan mahal, dan dirancang agar agak kompatibel ke belakang ke Intel 8008. Menjaga kode yang dapat dieksekusi kecil adalah salah satu tujuannya, dan itu menggunakan instruksi panjang variabel dan arsitektur CISC untuk membantu mencapai ini (yang memiliki kelemahan membuatnya lebih rumit untuk meningkatkan kinerja prosesor modern). Ini, bersama dengan sifat sederhana dari perakitan dan kode mesin pada umumnya, memberikan program x86 kemampuan untuk menjadi sangat kompak.

Panjang 1:

Sekarang untuk program pertama:

0xC3

Buka hex editor, masukkan byte itu, dan simpan sebagai test.com.

Anda sekarang memiliki program MS-DOS yang valid yang segera kembali tanpa melakukan apa-apa, karena 0xC3 adalah instruksi 'RET'. Namun ini tidak menunjukkan aspek lain yang menarik untuk bermain golf dengan format file x86: the .com. Format yang dapat dieksekusi ini sama sekali tidak memiliki header - file hanya dimuat ke dalam memori mulai dari alamat 0x100, dan kemudian eksekusi dimulai pada 0x100. Ini berarti tidak ada byte yang terbuang untuk metadata!

Panjang 2:

Program kami selanjutnya:

0x4D 0x5A

atau 'MZ' di ASCII.

Ok, saya sedikit curang, itu sebenarnya bukan program yang berguna, karena sesuai dengan instruksi

DEC     BP
POP     DX

Yang sebenarnya tidak berguna untuk memulai program .com. Faktanya, itulah inti dari kedua nilai tersebut - tidak ada file .com yang layak dimulai dengan mereka! File .com dibatasi hingga 65280 byte (64KiB - 0x100), jadi ketika program yang lebih besar mulai dibutuhkan, format baru harus dikembangkan. Ini adalah format file .exe, yang memang memiliki header. Namun, MS-DOS perlu menjaga ekstensi .com pada komponen tertentu agar kompatibilitas, sehingga diperlukan cara untuk mendeteksi apakah file .com benar-benar file .exe. Mereka memilih sengatan 'MZ' sebagai angka ajaib ini, dan hingga hari ini, jika Anda membuka file Windows .exe (atau .dll) di hex editor, Anda akan melihat mereka mulai dengan dua byte tersebut. Ini menghibur saya bahwa bahkan program Windows paling modern dimulai dengan kendala kompatibilitas dari 70-an.

Panjang 3:

Sekarang untuk loop tak terbatas:

41 E2 FD

Yang diterjemahkan menjadi

start:
inc cx
loop start 

Program ini menambah nilai CX (yang akan menjadi> 0 untuk memulai), kemudian mengeksekusi instruksi loop. Loop adalah contoh yang sangat baik dari instruksi CISC karena menggabungkan 3 operasi sederhana menjadi satu operasi tujuan khusus: ia menurunkan nilai CX, memeriksa apakah 0, dan melompat ke label target jika tidak. Ada juga bentuk loop yang memeriksa flag lain selain berakhir ketika CX adalah 0. Kita bisa melakukan 'jump start' untuk infinite loop 2 byte, tapi ini lebih menarik.

Panjang 4:

Program yang bermanfaat minimal:

40 CD 10 C3

Diterjemahkan ke majelis:

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

Program ini mengatur konsol menjadi 40x25 karakter, membersihkan layar, lalu kembali ke baris perintah. AX diatur ke mode video yang kita inginkan (1), maka BIOS interrupt 10h dipanggil untuk benar-benar mengatur mode video & menghapus jendela, sebelum kembali. Berharap untuk melihat lebih banyak gangguan BIOS ini di masa depan.

Panjang 5:

Kami sekarang dapat menerapkan program jeda:

B4 01 CD 21 C3

Diterjemahkan ke majelis:

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

Program ini memberi tahu BIOS untuk menunggu tombol ditekan dan menggema ke layar sebelum kembali. Ini juga menunjukkan bagaimana pada x86, beberapa register dapat dibaca atau ditulis sebagian. Dalam hal ini, kami menetapkan byte atas AX (AH) ke 1. Pada prosesor 32 bit, Anda juga dapat beroperasi pada 16 bit rendah tanpa mempengaruhi 16 bit teratas. Kemampuan untuk memodifikasi register parsial ini bisa berguna untuk programer perakitan, tetapi memiliki kelemahan untuk prosesor modern yang mencoba melakukan eksekusi out-of-order , karena mereka dapat memperkenalkan dependensi data palsu.

Panjangnya 9:

Sekarang untuk benar-benar menampilkan output:

68 00 B7 07 AB 40 79 FC C3

Diterjemahkan ke majelis:

; 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

Outputnya adalah karakter default yang diatur berulang dalam warna berbeda. Byte rendah dari AX adalah kode karakter, dan byte tinggi menentukan warna yang akan digunakan. Set karakter standar diulang dalam berbagai warna

Program 16 bit hanya dapat menangani hingga 64KiB secara langsung. Untuk menyiasatinya, x86 menggunakan 'segmen' - register khusus yang akan dikalikan 16 dan ditambahkan ke semua akses memori untuk memberikan 20 bit memori yang bisa dialamatkan. Suatu program dapat mengubah nilai register segmen ini untuk mengakses lebih banyak memori - atau area memori khusus: program ini memodifikasi segmen tambahan untuk menulis ke memori video. Berbagai jenis akses memori menggunakan register segmen yang berbeda, memungkinkan kode, data, dan tumpukan dapat diakses dalam potongan memori yang berbeda secara bersamaan. Segmen default juga dapat diganti untuk banyak instruksi.

Panjangnya 20:

Mari kita membuat sesuatu yang dikenali - kita akan menggunakan 'Aturan 90' untuk menggambar segitiga Sierpinski.

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

Dalam perakitan:

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

Output sampel: Segitiga Sierpinski

Untuk program ini, kami menggunakan 'Mode 13' yang agak terkenal - mode grafis yang memiliki resolusi 320x200 dengan 256 warna. Itu digunakan oleh banyak game DOS populer , seperti Doom.

Panjangnya 21

Mari kita lihat siapa yang membuat CPU yang kita jalankan.

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

Diterjemahkan ke majelis:

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

Output sampel:

c:\misc>cpuid.com
GenuineIntel

Program ini menggunakan instruksi CPUID untuk mendapatkan info tentang prosesor yang digunakannya, khususnya string identifikasi vendor. Kebanyakan orang akan melihat 'GenuineIntel' atau 'AuthenticAMD', kecuali mereka memiliki produsen CPU yang tidak biasa atau berjalan di mesin virtual tertentu.

Panjang 26

Kita sekarang dapat melakukan animasi yang menarik

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

Dalam Majelis

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 

Dan hasilnya akan terlihat seperti ini:

Berbaris XOR

Fungsi X pos ^ Y pos menghasilkan fraktal yang menarik, terutama saat dianimasikan

Panjangnya 27

Anda tidak hanya dapat menghasilkan teks dan gambar dalam program x86 .com kecil, Anda juga dapat menghasilkan suara dan musik:

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

Dalam perakitan:

    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  

Program ini menggunakan kartu midi untuk mengubah keyboard menjadi piano. Untuk melakukan ini, kartu midi diatur ke mode UART, yang memainkan catatan midi segera setelah diterima. Selanjutnya, program menunggu karakter ditekan, dan mengeluarkan nilai ASCII sebagai catatan ke kartu midi. Program berjalan sampai escape ditekan.

Panjangnya 29

Mari kita gunakan sistem fungsi yang diulang untuk menghasilkan fraktal Dragon Curve:

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

Diterjemahkan ke majelis:

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  

Keluaran:

Kurva Naga

Menekan tombol non-kontrol akan menyebabkan program keluar. Ini didasarkan dari Fire Coral oleh Desire di Pouet.net.

Panjangnya 52

Program ini adalah sedikit fitur ganda, ini menunjukkan sedikit co-prosesor floating-point x87, dan kode modifikasi sendiri.

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

Saat dijalankan, program akan menampilkan beberapa konstanta matematika:

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

Ini adalah Satu, Log2 (10), Log2 (e), Pi, Log10 (2), Log e (2), dan Nol.

Dalam perakitan:

org 100j

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

Matematika floating point pada sistem x86 pada awalnya ditangani oleh co-prosesor x87 opsional, baru pada 486 ia dipindahkan ke chip yang sama. X87 juga memiliki arsitektur yang agak berbeda, berbasis stack, dengan 8 register 80bit tersedia. Itu juga memiliki berbagai mode pembulatan, presisi, dan pengecualian yang bisa diatur yang dapat diatur.

Program ini mencetak nilai-nilai untuk tujuh konstanta yang dimasukkan ke prosesor. Mungkin tampak aneh bahwa ruang instruksi akan terbuang sia-sia pada konstanta sederhana seperti 0 dan 1, tetapi perlu diingat bahwa set instruksi dibuat ketika memori kecil, dan instruksi ini biasanya 2 byte lebih kecil dari operasi yang setara. Program ini juga menggunakan instruksi yang tidak jelas, FBSTP -'Store BCD Integer dan Pop '. Kembali ketika x86 dikembangkan, operasi pada nomor BCD lebih umum, dan x86 / x87 memiliki beberapa instruksi khusus untuk menyederhanakan matematika BCD, seperti instruksi AAM 'ASCII Adjust for Multiple' juga digunakan dalam program.

Dalam model memori yang tidak dilindungi yang digunakan oleh program x86 awal, tidak ada perbedaan antara data dan kode. Karena itu, mudah untuk beralih melalui instruksi 'Load Constant' yang dikodekan secara berurutan dengan hanya menambah nilai yang sesuai.

Panjangnya 64

Posting silang entri saya untuk Tantangan Mandelbrot , sebuah program dapat ditulis yang menampilkan fraktal Mandelbrot warna 320x200 hanya dalam 64 byte.

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

Dalam perakitan:

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

Hasil akhirnya adalah gambar ini:

Mandelbrot Fractal

Program ini menggunakan matematika fixed-point untuk menghasilkan fraktal, karena dibutuhkan lebih sedikit byte. 6 bit terendah dari register 16 bit dianggap sebagai bagian fraksional dari angka tersebut, dan nilainya dinaikkan kembali setelah dikalikan.


7
Dari semua bahasa untuk dilihat di PPCG, saya tidak mengharapkan ini.
Alex A.

23
Wow. Ditambah karakter lain untuk membuat ini menjadi komentar. Tapi serius. Wow.
krs013

2
@Michael Edenfield Itulah gunanya DOSBox!
Sir_Lagsalot

1
Sierpinski 20 byte sangat mengesankan.
qwr

1
Saya menganggap diri saya sebagai programmer yang baik, tetapi ketika saya melihat ini saya harus mengakui kekalahan.
Stephan Bijzitter

121

Haskell

Anda mungkin ingin membaca dari bawah ke atas. Terkadang saya merujuk kembali ke cuplikan yang lebih rendah, tetapi tidak pernah ke yang lebih tinggi, sehingga mungkin membantu pemahaman.

Pembaca yang tidak tahu Haskell: apakah saya jelas? Kapan saya tidak jelas? Saya tidak tahu.

Panjang 86 potongan

Contoh lipat untuk struktur data pohon kami (snippet 23). Lipat adalah kelas tipe - seperti dalam, kelas (/ grup) jenis. Ini paralel dengan antarmuka di Jawa. Mereka pada dasarnya menggeneralisasi jenis, menyatukan jenis yang memiliki karakteristik umum; misalnya, mereka dapat ditambahkan bersama-sama ( Monoid), wadah ( Functor), dapat dicetak sebagai teks ( Show, yang sudah kita temui, dalam showfungsi), dan sebagainya. Yang ini menyatukan tipe data yang seperti daftar di mana mereka dapat diulang atau diratakan ke daftar.

Dalam cuplikan ini, kami mendefinisikan instance dengan mendefinisikan foldr, yang pada dasarnya beralih pada tipe data dari kanan ke kiri. Sekarang, kita dapat menggunakan banyak kode pra-tertulis umum. Pertama, kita mendefinisikan fungsi pembantu untuk mendapatkan pohon tunggal, untuk menghindari semua kekacauan: s a = N E a E. Sekarang:

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]

dan seterusnya.

Ini gambar pohon kami:

7
| \
3  5
    \
     8

Panjangnya 70 snippet

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

Ini saringan utama!

(catatan: /=adalah apa yang !=ada dalam bahasa lain)

Ini berfungsi dengan mendefinisikan fungsi sieveyang memfilter daftar dan hanya menyimpan angka-angka yang tidak dapat dibagi oleh perdana sebelumnya. Ini didefinisikan secara rekursif - untuk sievedidefinisikan sebagai membagi daftar ke elemen pertama pdan ekor, menyaring dari ekor nomor yang dapat dibagi dengan p, sievebit yang tersisa, lampirkan ppada awal itu, dan kembali.

Sekali lagi, kami bekerja dengan daftar tak terbatas di sini - tetapi perhitungan akan terhenti dalam waktu selama Anda tidak memerlukan jumlah bilangan prima tak terbatas untuk dihitung.

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

Potongan 68 panjang

Akhirnya, seekor quine!

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

Saat pertama kali membaca ini, Anda mungkin berpikir bahwa output dari quine ini akan hilang tanda kutip, dan mengapa Anda pernah menulis putStrdan sekali print? Kedengarannya sama.

Di Haskell, putStradalah fungsi yang hanya mencetak isi string yang didapatnya ke stdout; printNamun, mencetak hal-hal untuk stdout. Jadi, print 4sama dengan putStr "4\n", tetapi putStr 4tidak masuk akal - 4bukan string! Jadi, ketika printmendapat nilai, pertama-tama mengubahnya menjadi string, dan kemudian mencetak string itu. Secara umum cara untuk mengubah hal menjadi string adalah dengan menemukan cara Anda menuliskannya dalam kode. Jadi, cara Anda menulis string abcdalam string dalam kode Haskell adalah "abc", jadi print "abc"sebenarnya dicetak "abc", bukan abc.

Betapa beruntungnya saya memiliki cukup suara sekarang, saya tidak perlu golf hal-hal ini

Panjang 33 cuplikan:

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

Yang penting untuk diperhatikan adalah bahwa kami tidak menggunakan loop. Haskell tidak mengulang. Haskell berulang. Haskell tidak memiliki loop. Ini lebih dalam dari itu: Haskell bahkan tidak memiliki aliran Kontrol . Bagaimana, Anda mungkin bertanya? Yah, itu tidak perlu.

Hidup dengan detail. Program ini mencetak urutan peningkatan bilangan bulat yang tak terbatas, mulai dari 0. gomencetaknya mulai dengan inputnya, lalu mainmemanggilnya 0.

doadalah kekuatan sintaksis khusus dari Haskell. Dalam skenario ini, itu hanya menggabungkan tindakan I / O, seperti >>halnya (lihat cuplikan 22).

Potongan 26 panjang:

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

Ini mendefinisikan mapfungsi, mungkin akrab bagi semua orang, menggunakan foldr. Perhatikan bahwa walaupun kami tidak menyatakan maptipe, komputer entah bagaimana mengetahui tipenya (a -> b) -> [a] -> [b], yaitu diberi fungsi dari ato b, dan daftar as, mengembalikan daftar bs.

Bagaimana bisa tahu ?? ;-)

Potongan 25 panjang:

main=putStr"Hello World"

Hello World standar. Perhatikan tipe: mainmemiliki tipe IO ()dan putStrtipe String -> IO ()(fungsi dari string ke tindakan I / O yang tidak menghasilkan apa-apa).

Potongan 23 panjang:

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

Ini adalah definisi standar dari Tree. Betapa jauh lebih mudah daripada semua baris yang diperlukan untuk mendefinisikan pohon di Jawa, C, atau apa pun.

(lihat cuplikan 10)

Mari kita jabarkan:

data- deklarasi ini menyatakan tipe data. T a- pohon yang mengandung elemen tipe a. Ini adalah tipe yang kita definisikan. =- setiap nilai T aakan menjadi salah satu dari berikut ini, dipisahkan oleh pipa |. E- salah satu nilai yang mungkin dari T s- pohon kosong. N (T a) a (T a)- Nilai lain yang mungkin dari pohon - simpul. Setiap node terdiri dari anak kiri ( (T a)) elemen ( a) dan anak kanan ( (T a)).

Panjang 22 cuplikan:

main=putStrLn"y">>main

yesFungsi Haskell . >>adalah operator yang menggabungkan dan mengurutkan dua tindakan I / O. Ini memiliki tipe >> :: IO a -> IO b -> IO b.

maindidefinisikan secara rekursif dengan sendirinya, sebagai tindakan I / O yang pertama mencetak "y"dan kemudian melakukan apa pun mainitu sendiri.

Potongan 18 panjang:

fix f=r where r=f r

Definisi yang lebih baik untuk fix. (Lihat cuplikan 14.) Masalah dengan definisi pertama fix f = f(fix f), adalah bahwa setiap kali kita memanggil fix f fixpenarikan fix f, yang mengingat fix f, menghasilkan salinan tanpa akhir dari perhitungan yang sama. Versi ini memperbaikinya dengan mendefinisikan r(hasil) sebagai hasilnya; dengan demikian f r = r,. Jadi, mari kita definisikan r = f r. Sekarang kita kembali r.

Potongan 17 panjang:

f n=product[1..n]

Ini adalah cara fungsional untuk mendefinisikan faktorial.

Potongan 16 panjang:

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

(\x -> x + x + x)adalah lambda (seseorang berpikir \menyerupai surat itu.).

(\x -> x + x + x) nadalah lambda diterapkan n(ini persis sama dengan n + n + n).

fadalah fungsi multiply-by-three (juga f = (*3))

Panjang 15 cuplikan:

sum=foldl (+) 0

Ini mendefinisikan sumfungsi menggunakan lipatan. Lipatan pada dasarnya adalah sebuah lingkaran di atas elemen daftar dengan satu akumulator.
foldlmengambil argumen beberapa fungsi fdan beberapa nilai awal xuntuk akumulator dan daftar xs. Fungsi fharus mendapatkan input nilai akumulator sebelumnya dan nilai saat ini dari daftar, dan mengembalikan akumulator berikutnya.
Kemudian flip berulang pada nilai daftar, menerapkan fpada akumulator sebelumnya, dan kemudian mengembalikan akumulator terakhir.

Cara lain untuk memikirkan lipatan adalah seperti lipatan 'sisipan' fantara nilai daftar dan dengan akumulator awal di salah satu sisi. Misalnya, foldl (*) 1 [4,2,5]evaluasi ke 1 * 4 * 2 * 5.

Potongan 14 panjang:

fix f=f(fix f)

The ycombinator. Biasanya dinamai fixkarena menemukan titik tetap persamaan f x = x. Perhatikan bahwa x = infinite loopterkadang juga merupakan solusi, jadi fix (\x -> x^2 + 5*x + 7)tidak akan menyelesaikan persamaan x^2 + 4*x + 7 = 0tetapi sebaliknya mengembalikan infinite loop.

Anda juga dapat mencatat bahwa tidak selalu x = infinite loopmerupakan solusi, karena kemalasan Haskell.

Versi ini adalah kebocoran waktu dan ruang; kami akan mendefinisikannya kembali dalam cuplikan yang lebih panjang.

Potongan 13 panjang:

f=sum.map(^2)

Ini mendefinisikan fungsi f yang diberikan daftar mengembalikan jumlah kuadratnya. Ini adalah komposisi fungsi dari fungsi sum dan fungsimap(^2) , yang pada gilirannya adalah fungsi yang map diterapkan pada fungsi (^2) ( fungsi kuadrat ), yang pada gilirannya merupakan bagian dari fungsi (bagian diperkenalkan pada snippet 2, dan komposisi pada snippet 3 ). ^

Seperti yang Anda lihat, fungsi sangat penting dalam bahasa fungsional seperti Haskell. Bahkan, telah dikatakan bahwa Haskell merupakan bahasa dengan perpustakaan yang paling standar fungsi yang mendapatkan fungsi sebagai input atau kembali fungsi sebagai output (ini umumnya dikenal sebagai tingkat tinggi fungsi .

By the way, secara teknis, setiap fungsi argumen dua atau lebih adalah fungsi yang mengembalikan fungsi sebagai output (ini disebut currying).

Panjang 10 cuplikan:

data B=T|F

Ini adalah definisi dari boolean Haskell dengan nama yang berbeda. Tipe boolean dinamai B.
Definisi ini memperkenalkan dua konstruktor: true ( T) dan false ( F).
Cuplikan kode ini pada dasarnya memberi tahu kompiler bahwa setiap boolean ( B) adalah true ( T) atau false ( F), atau dengan kata lain B=T|F,.

Faktanya, semua tipe data yang pernah dapat didefinisikan dalam Haskell, ketika dalam bahasa lain jumlah, referensi dan tipe data array memerlukan dukungan khusus dari kompiler. Dalam praktiknya ada dukungan khusus dalam Haskell karena akan sangat merepotkan sebaliknya, tetapi misalnya Booltipe data didefinisikan sepenuhnya dalam bahasa.

Potongan 9 panjang:

main=main

Program tidak masuk akal ini akan didefinisikan mainsebagai utama. Karena Haskell malas, nilai-nilai yang memerlukan loop tak terbatas untuk mengevaluasi dapat digunakan secara bebas jika kita tidak menggunakan nilai aktualnya. Nilai-nilai yang mengandung loop tak terbatas, seperti kami main, disebut "bottoms".

Fakta yang menyenangkan adalah bahwa kompiler GHC Haskell dapat mendeteksi jenis loop tak terbatas ini dan melempar pengecualian (!) Yang dapat ditangkap ketika dijalankan.

Potongan 8 panjang:

f(x:_)=x

Ini mendefinisikan fungsi fyang, mengingat daftar yang tidak kosong, akan mengembalikan kepalanya.

Pola di Haskell seperti urutan Python membongkar, tetapi digeneralisasi untuk semua jenis. Pola dapat menolak atau mencocokkan suatu nilai, dan jika cocok, dapat mengikat variabel ke nilai.

Pola dalam cuplikan ini adalah:

  • _: pola yang cocok dengan apa pun dan tidak mengikat variabel.
  • x: pola yang mengikat apa pun dan mengikatnya ke variabel x.
  • :: pola ini sampai ke pola anak, yaitu, satu untuk kepala, dan satu untuk ekor. Jika daftar ini tidak kosong, itu cocok dengan kepala dan ekornya.

Pencocokan pola sangat umum. Bahkan, hanya mendefinisikan tipe data baru akan secara otomatis memperkenalkan pola untuk bekerja dengannya.

Potongan 5 panjang:

x=2:x

Whoa, ada banyak yang bisa dijelaskan tentang ini.

Pertama-tama, Haskell malas. Ini berarti bahwa subekspresi akan dievaluasi hanya jika benar-benar diperlukan.

Catatan: cuplikan kode ini tidak menunjukkan tugas, tetapi definisi. Haskell tidak memiliki tugas.

Cuplikan kode ini didefinisikan x, daftar tak terbatas yang seluruhnya terdiri dari 2. Biasanya dalam bahasa lain xharus dievaluasi sebelum 2:xdapat dievaluasi, tetapi di Haskell kita bisa melakukan ini.

Daftar tak terbatas Haskell adalah semacam campuran iterator dan daftar tertaut reguler: mereka bertindak seperti keduanya (iterasi pada rentang akan menggunakan memori konstan, misalnya).

Potongan 4 panjang:

2:[]

Cuplikan ini hanya menyandikan daftar tunggal [2]. :adalah operator Kontra di Haskell. Bahkan, sintaks daftar reguler hanyalah gula sintaksis untuk operator kontra dan literal daftar kosong. Ini erat terkait dengan cara Haskell berurusan dengan pencocokan Pola dan tipe data (terutama konsep konstruktor).

Potongan 3 panjang:

f.g

Dalam Haskell, .singkatan komposisi fungsi. Haskell dapat ditulis dalam gaya "point-free", yang ditandai dengan tidak menyebutkan argumen fungsi dan sebagai gantinya menggunakan .operator untuk memanipulasi aliran data.

Potongan 2 panjang:

1-

Ketika kode ini dibungkus dengan tanda kurung (untuk alasan sintaksis) itu disebut "bagian". Ini kemudian fungsi yang diberi nomor tertentu, "mengisi" tempat kosong dan mengembalikan satu minus angka itu. Gagasan ini terkadang berguna dalam bahasa fungsional seperti Haskell, di mana jika tidak diperlukan lambda.

Potongan 1 panjang:

1

Dalam Haskell, 1dapat menjadi sebuah Int, Float, Double, Worddan sebagainya. Bahkan, Anda dapat menulis kode untuk menentukan versi 1dalam jenis apa pun dan menggunakannya secara bebas.
ini dilakukan juga dalam JavaScript, Python dan sebagainya, tetapi tidak seperti itu, ini dilakukan dengan keamanan tipe penuh.

factoid:

Awalnya, komite Haskell bermaksud untuk memanggil bahasa "Curry" setelah nama Haskell B. Curry tetapi memutuskan untuk mengubah nama menjadi Haskell karena beberapa permainan kata mungkin muncul. Baru kemudian mereka melihat kesamaan Haskell dengan "Pascal" dan "Hassle"!


saya tidak tahu apakah saya harus mengganti factoid dengan fakta bahwa Haskell memiliki fungsi paling banyak / operator di perpustakaan standarnya yang menghasilkan fungsi dari fungsi lain (dan secara teknis setiap dua atau lebih fungsi parameter adalah seperti itu). Haruskah saya?
haskeller bangga

Pamerkan dalam potongan dan tambahkan dalam penjelasan.
Martin Ender

f=0:1:zipWith(+)f(tail f) -- 25 chars, sebuah fungsi yang mengembalikan daftar angka-angka Fibonacci yang malas.
chamini2

ugh saya menambahkan banyak cuplikan dan kemudian komputer saya mati
haskeller bangga

@proudhaskeller Menyimpan op. Saya tidak pernah melakukan ini secara pribadi, tetapi jika Anda memiliki pengeditan besar untuk dilakukan sekaligus, Anda dapat melakukan pengeditan dalam dokumen eksternal dengan menyimpan, lalu tempelkan di saat sudah selesai.
mbomb007

99

C #

C # adalah campuran fitur yang menyenangkan dan gila dari Java, C, Haskell, SQL, dan banyak bahasa lainnya, dan ia menyediakan banyak fitur dan API yang sangat bagus. Itu juga dikenal di sekitar sini karena cukup bertele-tele, tapi kita akan lihat apa yang bisa kita lakukan!

Saya akan mengabaikan boilerplate yang diperlukan:

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

Panjang 1:

;

Perintah diakhiri dengan titik koma di C #! Baris kosong adalah sintaks yang benar-benar valid.

Panjang 5:

x=5f;

Ketika Anda menentukan angka literal dalam C #, kompilator akan menganggap bahwa mereka int atau ganda (berdasarkan apakah mereka memiliki titik desimal). Jika Anda ingin menggunakan float literal, Anda harus menentukan bahwa dengan menambahkan 'f' ke nomor tersebut, atau itu akan dilemparkan pada saat runtime, menimbulkan sedikit biaya.

Panjang 7 (byte):

s=@"
";

Jika Anda awali string literal dengan tanda @, itu menjadi string literal "verbatim". Literal string normal menguraikan urutan melarikan diri seperti '\ n' menjadi karakter khusus, tetapi literal verbatim tidak, memungkinkan Anda untuk menggunakan karakter backslash tanpa menghindarinya. Mereka juga dapat menyertakan pengembalian baris, seperti yang ditunjukkan. Itu bisa menghemat beberapa byte dalam golf, atau membuat multi-line string literal Anda lebih mudah dibaca. Berhati-hatilah karena lekukan dimasukkan dalam string.

Panjang 8:

()=>x=y;

Ekspresi ini adalah fungsi anonim. Ini mengembalikan objek bertipe Actionyang dapat diedarkan dan juga disebut seperti fungsi. Fungsi anonim mewarisi ruang lingkup di mana mereka dideklarasikan, dan mereka menarik setiap variabel lokal dalam lingkup itu ke mana pun mereka pergi.

Panjangnya 9:

(a)=>a.p;

Inilah fungsi anonim lain yang menggunakan parameter dan mengembalikan nilai. Ekspresi mengembalikan objek bertipe Func(Func itu sendiri mengembalikan jenis a.p. Anda akan menggunakan Funcbanyak untuk berinteraksi dengan Linq.

Panjang 10:

enm.Any();

Ini adalah pengantar pertama kami untuk Linq! Linq adalah seperangkat metode ekstensi yang dapat dipanggil pada objek apa saja yang dapat dihitung (mengimplementasikan antarmuka IEnumerable) - seperti Arraydan List. IEnumerable menggunakan evaluasi malas: ia pergi melalui koleksi satu item pada suatu waktu, tanpa mengetahui tentang koleksi secara keseluruhan - bahkan bisa tak terbatas!

Di situlah Anymasuk - itu kembali truejika Enumerable mengandung setidaknya 1 item. Jauh lebih baik daripada menghitung seluruh panjangnya.

Panjang 11:

var a=1.5f;

Kata varkunci memerintahkan kompiler untuk secara otomatis menentukan jenis a. adalam hal ini akan diketik sebagai Single. Sangat berguna untuk kode golf, karena jauh lebih pendek daripada hampir semua jenis nama, meskipun banyak yang tidak suka menggunakannya dalam kode produksi.

Panjangnya 15:

yield return 0;

Ini pernyataan gila yang mungkin kurang Anda kenal. Anda tahu bahwa objek dapat dihitung dengan mewarisi IEnumerable, tetapi apakah Anda tahu bahwa fungsi dapat dihitung? Deklarasikan fungsi dengan tipe pengembalian IEnumerable, dan miliki yield returnsesering yang Anda inginkan. Ketika Anda mendapatkan Enumerator ke fungsi, setiap panggilan ke GetNextprogram akan menjalankan semua kode hingga berikutnya yield return, mengembalikan nilai itu, dan kemudian berhenti sampai Anda memajukannya lagi. Anda gunakan yield breakuntuk mengakhiri iterasi.

Panjangnya 16:

[Obsolete]int a;

Cuplikan ini menunjukkan atribut. Atribut adalah jenis tag yang dapat Anda tempel pada pernyataan apa pun dalam kode Anda. Beberapa menginstruksikan kompiler untuk melakukan hal-hal tertentu, seperti ini yang memancarkan peringatan usang jika Anda menelepon a. Anda dapat membuat sendiri dengan memperluas Attribute, dan Anda dapat meminta mereka menggunakan Refleksi (lebih lanjut tentang itu nanti, mungkin). Anda bisa menggunakan meta dan membatasi jenis deklarasi apa yang bisa digunakan AttributeUsageatribut dengan atribut tersebut.

Panjangnya 17

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

Ini metode golf yang praktis. Mengingat Funcyang memetakan sebuah elemen dari enumerable cuntuk boolitu, mengembalikan jumlah elemen dalam cyang yang Funcmengembalikan true. Jauh lebih baik daripada menulis satu lingkaran.

Panjangnya 18:

foreach(T t in c);

Ini adalah untuk setiap loop. Dengan semua pembicaraan tentang hal-hal yang tak terhitung ini, ini adalah struktur yang sangat dibutuhkan. foreachadalah gula sintaksis yang akan mengatur Enumerator untuk c(yang harus dapat dihitung) dan beralih melalui elemen satu tper satu. Anda dapat mengubah atau memeriksa setiap elemen individu, tetapi mengubah koleksi itu sendiri akan membatalkan enumerator.

Panjangnya 19

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

Ini adalah fungsi 'peta' Anda, untuk penggemar pemrograman fungsional. Pilih adalah cara ringkas yang bagus untuk melakukan konversi sewenang-wenang (ditentukan oleh yang Funcditeruskan) pada setiap elemen yang dapat dihitung. Ini mengembalikan IEnumerable yang akan memuntahkan elemen "dikonversi" ketika Anda mengulanginya.

Panjangnya 21

Console.Write("Hi!");

Baris ini menulis beberapa teks ke stdout, dan mungkin salah satu alasan utama C # tidak banyak digunakan untuk bermain golf!

Panjangnya 23

typeof(T).GetMethods();

C # mendukung fitur yang sangat kuat yang disebut Reflection. Refleksi memungkinkan Anda memeriksa struktur kode Anda saat runtime. Misalnya, panggilan ini akan mengembalikan Array semua metode pada tipe yang ditentukan. Anda dapat memeriksa metode-metode itu, memanggilnya, atau bahkan memodifikasi nilai-nilai bidang dan properti. Atribut (lihat Panjang 16) adalah cara yang baik untuk menandai bagian kode Anda untuk digunakan dengan Reflection.

Panjangnya 25

from t in c select t.a/2;

Apakah itu SQL? Dalam kode C #? Cukup dekat. Ungkapan ini melakukan hal yang sama dengan yang di Panjang 19.

Panjangnya 27

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

C # adalah bahasa yang dikumpulkan sampah, yang berarti bahwa setiap memori yang Anda alokasikan (menggunakan newkata kunci) dapat secara otomatis dirilis selama tidak ada referensi untuk itu. Kode ini akan berjalan bahagia selamanya meskipun saya tidak pernah secara eksplisit membebaskan memori yang dibuat. Pengumpulan sampah memiliki biaya, meskipun - cari di web untuk mempelajari lebih lanjut.

Panjangnya 29

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

Enumerable.Rangeadalah fungsi golf yang berpotensi berguna. Ini mengembalikan struktur yang dapat disebutkan dan akan menghasilkan setiap angka dalam rentang yang ditentukan, secara berurutan. Parameter kedua adalah hitungan, bukan indeks.

Panjangnya 31

public int pr{get;private set;}

Di sini, kami dapat menampilkan 'properti' sederhana, fitur OOP, dan ciri khas C # lainnya. Jika Anda pernah menggunakan Java, Anda mungkin membuat metode 'get' dan 'set' untuk bidang untuk memisahkan aksesibilitas mereka atau menjalankan kode ketika itu diubah. Nah, C # memungkinkan Anda mendeklarasikan kode itu tepat di atas bidang, dan juga mengatur pengubah akses terpisah untuk mendapatkan dan mengatur. Cuplikan khusus ini secara otomatis membuat pengambil dan penyetel default, tetapi menjadikan penyetel pribadi.

Panjangnya 32

public static void m(this T o){}

Cuplikan ini menunjukkan fitur C # yang bagus untuk desain API. Dengan menerapkan thispengubah ke parameter pertama dari metode statis, metode itu menjadi metode "ekstensi". Setelah ini dideklarasikan, T.msekarang dapat dipanggil pada objek tipe T seolah-olah itu sebenarnya metode T. Ini dapat digunakan untuk menambahkan fungsionalitas baru ke kelas yang ada, tanpa memodifikasi atau bahkan memiliki akses ke kode sumbernya.

Panjangnya 38

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

Metode ini menampilkan berbagai jenis pelintas parameter yang dapat Anda miliki di C #. Parameter yang tidak dimodifikasi dilewatkan oleh nilai . Parameter diawali oleh refdilewatkan oleh referensi: Anda dapat menetapkan objek yang sama sekali baru untuk mereka dan mereka akan membawanya keluar dari metode. Parameter yang diawali dengan outseperti nilai pengembalian tambahan: Anda diharuskan untuk memberi mereka nilai dalam metode, dan mereka dijalankan kembali seperti halnya parameter ref.

Panjangnya 42

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

Standar C # 6 yang baru dapat menghemat beberapa karakter saat Anda harus mengeluarkan string yang dirangkai, menggunakan interpolasi string. Fitur ini memungkinkan Anda untuk menulis ekspresi apa pun dalam kurung kurawal di dalam string literal, dan string tersebut akan secara otomatis dirangkai dengan nilai-nilai ekspresi tersebut pada saat runtime.

Panjangnya 48

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

Cukup karakter sekarang untuk melakukan sesuatu dengan tujuan yang sebenarnya! Metode ini menggunakan beberapa ide yang kami eksplorasi di atas untuk membuat Enumerable tak terbatas yang hanya akan mengembalikan bilangan bulat, satu-per-satu, dimulai dengan 0. Ingat bahwa C # menggunakan evaluasi malas dengan Enumerables, sehingga urutan tak terbatas sangat valid - Anda dapat iterate sebanyak urutan yang Anda inginkan, dan keluar kapan saja.

Panjangnya 56

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

Berikut adalah contoh lain dari 'properti' (lihat cuplikan 31). Di sini, saya telah benar-benar mendefinisikan potongan kode yang berbeda untuk getdan setdaripada menggunakan yang otomatis seperti sebelumnya. Contoh ini menunjukkan bagaimana Anda bisa menggunakan properti untuk memvalidasi nilai yang diberikan ke variabel - di sini, nilai tersebut tidak boleh menjadi kurang dari 0. Penggunaan properti yang baik lainnya termasuk memberi tahu peristiwa ketika suatu nilai diubah, atau membangun kembali nilai yang di-cache yang mungkin didasarkan pada yang satu ini.

Panjangnya 65

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

Fitur ini disebut pemeran implisit. Ini semacam metode ekstensi karena merupakan kode statis yang beroperasi pada kelas tertentu (lihat cuplikan 32). Namun, pemeran implisit tidak digunakan dengan menyebutnya - itu digunakan hanya dengan memperlakukan Programobjek sebagai integer (misalnya int i=new Program()). Ketika Anda melakukan ini, objek akan secara diam-diam dikonversi menjadi tipe yang Anda gunakan, berdasarkan kode dalam pemeran implisit. Praktik terbaik mengatakan untuk hanya melakukan ini ketika tidak ada informasi yang hilang sebagai akibat dari konversi.


1
Mari kita lihat apa yang bisa kamu lakukan dengan karakter-karakter ini ... ;-)
bangga haskeller

9
Saya akan mengatakan bahwa itu lebih dekat ke java daripada C, sebenarnya
haskeller bangga

Dicatat. Saya pikir kita hampir memiliki cukup untuk melakukan beberapa Linq - datang malam ini!
BMac

int public implisit operator statis (MyClass o) {return o.objVal;} // 65. Dengan kode ini, baris ini valid: MyClass o1 = new MyClass (10); int o2 = o1; // o2 adalah 10 sekarang. msdn.microsoft.com/en-us/library/85w54y0a.aspx
Zukki

Lebih banyak cuplikan
Cyoce

98

Jawa


Panjangnya 44 cuplikan

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

Mencetak Hello, World!ke STDOUT.

Panjangnya 43 cuplikan

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

a berisi 10 array yang masing-masing berisi 2 array yang masing-masing berisi 7 array yang masing-masing berisi 3 array yang masing-masing berisi 5 array float s.

Panjang 42 potongan

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

Program yang lengkap. Karena segala sesuatu dalam suatu interfacesifatnyapublic , kita dapat menghilangkan kata publicdari metode utama.

Potongan 36 panjang

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

A memiliki kelas batin B . Ini berarti kita dapat mendeklarasikan variabel tipe A.B.

Tetapi Badalah subclass dari A, yang berarti memiliki semua metode, bidang, dan kelas batin dari A. Jadi, kita bisa merujuk ke tipe B.Bjuga.

Dalam kode ini, kami mengambil langkah ini lebih jauh, dan memberikan Bcontoh variabel tipe B.B.B.

Moral: mengikuti pertanyaan panas tentang SO dapat mengajarkan Anda banyak teknik yang menarik, jika tidak ada gunanya.

Panjangnya 35 cuplikan

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

Jika ldaftar String, ini memberitahu kita berapa banyak dari mereka yang sama "a".

Potongan 34 panjang

public static void main(String[]a)

Metode tanda tangan dari metode utama program. Hanya 11 karakter lagi dan kita dapat membuat program lengkap!

Panjangnya 33 potongan

enum D {NORTH, EAST, SOUTH, WEST}

NORTH, EAST, SOUTH, Dan WESTsemua konstanta tipe D.

Panjangnya 32 cuplikan

Files.readAllBytes("hello.txt");

Membaca seluruh file, mengembalikan satu byte[]konten.

Potongan 31 panjang

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

Setara dengan "hi". Berguna jika "kuncinya rusak.

Panjangnya 30 cuplikan

new JFrame().setVisible(true);

Membuat bingkai terlihat baru, di mana Anda dapat menempatkan komponen lain ke dalamnya.

Potongan 29 panjang

throws ClassNotFoundException

Memaksa setiap metode yang memanggil ini untuk menggunakan try-catch blok, atau yang lain untuk meneruskan kesalahan ke tumpukan. Pengecualian diperiksa adalah salah satu keputusan paling kontroversial dari desainer Java.

Potongan 28 panjang

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

Fungsi ini tidak berjalan selamanya; pada kenyataannya, pada komputer biasa dibutuhkan kurang dari satu detik. Terima kasih, Stack overflow.

Potongan 27 panjang

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

Membuat array string baru.

Potongan 26 panjang

Object.class.newInstance()

Menciptakan yang baru Object.

Panjangnya 25 potongan

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

Yang terbaik adalah menghindari konstanta hard-coding. Ini adalah cara berorientasi objek untuk mendapatkan nilai 1tanpa menggunakan konstanta selain 0.

Panjangnya 24 cuplikan

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

Fungsi penerus.

Potongan 23 panjang

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

Jika ldaftar bilangan bulat, ini menghapus semua nilai yang habis dibagi 10.

Panjangnya 22 cuplikan

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

Menciptakan array baru tujuh bilangan bulat, dan mendapatkan elemen kelima.

Potongan 21 panjang

Arrays.asList(2L,"a")

Membuat ArrayList dengan elemen-elemen ini.

Panjangnya 20 cuplikan

System.out.print(s);

Cetakan s.

Potongan 19 panjang

import java.util.*;

Memungkinkan penggunaan ringkas kelas seperti List, Map, Scanner, Timer, dan Random.

Panjangnya 18 cuplikan

Math.addExact(x,y)

Menambahkan dua bilangan bulat xdan y. Jika terjadi overflow, metode melempar pengecualian daripada memberikan jawaban yang salah.

Potongan 17 panjang

Double.MIN_NORMAL

Nilai positif terkecil dari jenis double, di mana bit terkemuka signifikan adalah 0.

Panjang cuplikan 16

System.in.read()

Membaca satu karakter dari konsol.

Panjang 15 cuplikan

Long.reverse(x)

Membalikkan bit dalam representasi biner dari x.

Panjang 14 cuplikan

int x=050+120;

xsekarang 160, karena apa pun yang dimulai dengan 0diperlakukan sebagai oktal.

Potongan 13 panjang

private C(){}

Konstruktor pribadi mencegah kelas lain dari instantiate itu. Pola ini digunakan oleh SystemdanMath kelas, antara lain. Konstruktor pribadi juga dapat digunakan untuk menegakkan Pola Singleton.

Panjang 12 cuplikan

static class

Mengizinkan pembuatan kelas dalam tanpa kelas luar yang terlampir - solusi untuk masalah yang dihadapi oleh banyak programmer .

Potongan 11 panjang

throw null;

Seringkali perlu untuk melempar NullPointerException, tetapi juga cukup bertele-tele. Ini adalah alternatif yang jauh lebih sederhana.

Panjangnya 10 cuplikan

int[]a,b[]

Mendefinisikan dua variabel: adan b. aadalah tipe int[]dan btipe int[][].

Potongan 9 panjang

switch(x)

Pergi ke suatu tempat, tergantung pada nilai x.

Potongan 8 panjang

break a;

Keluar dari blok berlabel a .

Potongan 7 panjang

goto x;

Kata gotokunci dicadangkan di C, C ++, dan Java. Jika xadalah label, maka kode ini mengirimkan program ke label yang sesuai - dalam C dan C ++. Tapi itu Jawa, itu memicu misterius RuntimeException. Bahkan, tidak ada cara sama sekali untuk menggunakan gotokata kunci di Jawa.

Potongan 6 panjang

\u003b

Mengakhiri pernyataan. Jawa aneh .

Potongan 5 panjang

a-=-a

Ganda adengan mengurangi negasinya.

Potongan 4 panjang

a&=b

Menetapkan nilai abitwise dan dari adan b.

Potongan 3 panjang

...

Sejumlah argumen, dikonsolidasikan ke dalam array.

Potongan 2 panjang

<>

Mengizinkan kompiler mengetahui jenis generik apa yang mungkin Anda maksudkan. Sangat tidak seperti Jawa.

Potongan 1 panjang

@

Menunjukkan anotasi untuk memungkinkan informasi tambahan ditampilkan tentang metode dan kelas.

Faktoid

Di Jawa, infinite loop terkadang menyebabkan kesalahan kompilator. Misalnya, loop while(true);tidak dapat dihentikan tanpa keluar dari metode, sehingga kode apa pun setelah itu akan memicu kesalahan "pernyataan yang tidak dapat dijangkau". Seperti yang ditunjukkan oleh @Optimizer, hanya beberapa loop tanpa batas yang akan ditangkap dengan cara ini.


5
Dalam java, loop tak terbatas tidak menyebabkan kesalahan kompilator. Ini adalah IDE Anda yang mendeteksi mereka dan menghasilkan kesalahan. Java hanya memiliki konsep pernyataan Unreachable, jadi jika Anda memiliki sesuatu seperti while(true);dalam kode Anda, apa pun yang dimasukkan setelah baris itu akan menimbulkan kesalahan kompilasi pernyataan Unreachable. Logika di balik mendeteksi pernyataan seperti itu sangat ketat, sehingga tidak akan mengenali semua loop tak terbatas dengan cara apa pun
Pengoptimal

4
Anda baru saja terpilih, saya kira ini berarti Anda harus menghapus cuplikan! ;) (Downvote adalah untuk "Jawa aneh")
Simon Forsberg

1
Tampaknya potongan # 36 bersifat rekursif dan dapat diperpanjang tanpa batas waktu: class A{class B extends A{B.B.B.B.B.B.B b;}}masih dikompilasi.
Natix

3
Terpilih untuk membantu Anda membuat program lengkap;)
durron597

1
But it Java, [goto] triggers a mysterious RuntimeExceptionSalah. gotobahkan tidak bisa dikompilasi.
dorukayhan

93

Python

Sekarang mulai dengan yang terbaru untuk kenyamanan Anda! Untuk membaca panjang 30 dimulai dengan yang paling awal, buka riwayat revisi.

Jika ada yang punya saran, jangan ragu untuk berkomentar.

Panjang 52:

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

Diambil dari entri saya dalam tantangan Teks Teks Palsu . sdan nperlu diatur ke string dan integer sebelumnya. Ini tidak benar-benar berfungsi dengan baik dalam juru bahasa Python 2 gratis yang saya gunakan, jadi saya menambahkan tanda kurung di sekitar (' '*n+s)[i:n+i], dan Anda dapat melihatnya berjalan dalam juru bahasa Python 3 di sini .

Panjangnya 43:

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

Dengan Python Anda dapat menyandikan sumber dengan codec tertentu. Ini menunjukkan bagaimana sumbernya dapat ditulis dalam Rot13. Sintaks umumnya adalah ini: # -*- coding: <codec-name-goes-here> -*-.

Ini diterjemahkan:

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

The umenetapkan bahwa berikut string literal adalah string Unicode. Ini diperlukan jika Anda ingin string Anda juga berada di Rot13, jika tidak setiap string dalam sumber mudah dibaca meskipun enkripsi. Atau, Anda dapat menggunakan .encode("Rot13")setelah setiap string (jangan lupa untuk menggunakan Rot13 pada ini juga.) Menurut artikel ini , beberapa penyandian alternatif adalah "base64“, "uuencode", "zlib", "zlib", atau "bz2 ″.

Panjangnya 33:

import cmath
print cmath.sqrt(-1)

Ini adalah modul Python untuk bilangan kompleks (imajiner) . Ini mencetak 1j, karena Python sesuai dengan standar teknik dan digunakan jsebagai unit imajiner, meskipun saya lebih suka i, yang lebih umum digunakan dalam matematika, dan menggunakan jdan ksebagai tambahan iuntuk angka empat , tetapi saya ngelantur. Baca bug / ubah urutan di sini (tidak akan diubah).

Panjangnya 30:

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

Sekarang kita mendefinisikan fungsi faktorial kita sendiri menggunakan rekursi dan ternary if-else! Sejauh yang saya tahu, ini golf seperti yang didapat dengan Python. Bisa juga ditulis dengan cara ini f=lambda n:n and f(n-1)*n or 1:, menampilkan pasangan operator Boolean Python (dan juga dilakukan dalam 30 karakter.) Lihat panjang 15 potongan untuk informasi tentang lambdasintaks.

Panjangnya 29:

import math
math.factorial(7)

Menemukan faktorial 7, kembali 5040.

Panjang 25:

import math
print math.pi

Modul matematika Python menyediakan banyak fungsi dan konstanta yang berguna. Inilah PI. Pengembalian 3.14159265359. (Dalam kode di atas, saya menghitung baris baru sebagai karakter.)

Panjang 24:

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

Ini adalah contoh penutupan. Memanggil cube = f(3)akan membuat fungsi kubik yang kemudian dapat dipanggil dengan print cube(24), pencetakan 13824.

Durasi 19:

print"Hello World!"

Akhirnya, cukup ruang untuk mencetak beberapa output dasar! Ruang tidak diperlukan di sini, karena tanda kutip dan tanda kurung juga pembatas. Ini hanya akan bekerja di Python 2, karena Python 3 mengubah printfungsi untuk dipanggil seperti fungsi lainnya. Dalam Python 3, gunakan print("Hello World!"). Untuk informasi lebih lanjut tentang fungsi cetak dan perbedaan antara Python 2 dan 3, lihat Apa yang Baru Di Python 3.0 .

Panjangnya 16:

[x*3 for x in l]

Sekali lagi, anggap ladalah daftar atau objek lain yang dapat diulang seperti string atau generator. Pernyataan ini dikenal sebagai daftar pemahaman . Ini jauh lebih pendek daripada menggunakan standar untuk struktur loop. Di sini, ia mengembalikan daftar dengan semua angka yang dikalikan dengan 3. JUGA, string dapat dikalikan! Jadi setiap string dalam daftar akan ditambahkan (disatukan dengan dirinya sendiri) beberapa kali.

Panjangnya 15:

import this #:)

Ini sebenarnya potongan panjang 11, tetapi saya menyadari bahwa saya lupa memamerkan telur Paskah Python yang luar biasa ! Mengimpor modul ini mencetak The Zen of Python (Lihat Factoid.) Fakta menarik: modul this.pyini dikodekan dalam rot13, yang saya harap akan ditampilkan nanti.

Panjang 14:

lambda x:x**.5

Ini mendefinisikan fungsi root kuadrat menggunakan lambdasintaksis Python untuk fungsi literal. Fungsi literal dalam Python hanya bisa berisi ekspresi, bukan pernyataan. Lambda ini dapat ditugaskan ke variabel, diteruskan ke suatu fungsi, atau dieksekusi sejalan dengan (lambda x:x**.5)(9), yang mengembalikan 3.0. Menggunakan eksponen untuk akar kuadrat adalah alternatif untuk mengimpor sqrtfungsi dalam mathmodul.

Panjang 13:

1 if x else 0

Ini adalah contoh terner Python jika operator. Ini ditambahkan dalam Python 2.5 untuk mencegah coders dari mengimplementasikannya secara manual dengan operasi Boolean. Di sini, 1dikembalikan jika xdievaluasi True, jika 0tidak dikembalikan.

Panjang 12:

s=input(">")

Ini akan mencetak >untuk teks prompt dan memungkinkan pengguna untuk memasukkan nilai. Python 2 menginterpretasikan nilai apa pun yang dimasukkan, sehingga string apa pun membutuhkan tanda kutip. Python 3 mengubah ini, sehingga input yang dimasukkan tidak diartikan secara otomatis. Untuk memasukkan input tanpa menafsirkannya di Python 2, gunakan raw_input(). Dalam Python 2, input()sama dengan eval(raw_input()).

Panjang 11:

eval("2e3")

2e3adalah notasi ilmiah untuk float 2 x 10³. The evalFungsi menafsirkan dan mengevaluasi string apapun sebagai ekspresi. Dalam hal ini, ia memiliki hasil yang sama dengan menggunakan literal 2e3atau float("2e3"). Ia kembali 2000.0.

Panjang 10:

range(013)

Fungsi ini mengembalikan daftar bilangan bulat dari 0ke nilai oktal 013, yaitu 11(eksklusif), artinya daftar tersebut akan menjadi [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Fungsi memakan waktu sampai tiga parameter mirip dengan slicefungsi kami meninjau sebelumnya: range(start, stop[, step]). Perbedaannya adalah, dengan hanya satu parameter parameter mewakili nilai berhenti.

Perhatikan bahwa Python 3.x tidak memiliki padanan. Itu rangemirip, tetapi sebenarnya sama dengan Python 2 xrange, mengembalikan objek generator bukan daftar.

Panjangnya 9:

a,b = b,a

Penugasan berganda. Ini adalah fitur yang sederhana namun elegan, memungkinkan Anda untuk menetapkan beberapa nilai sekaligus. Dalam cuplikan yang disediakan, swap adan b. Bagaimana dengan urutan evaluasi, Anda bertanya? Semua ekspresi di sebelah kanan operator penugasan dievaluasi sebelum penugasan dibuat. Ini mengalahkan banyak bahasa yang membutuhkan penugasan menengah ke variabel sementara.

Panjang 8:

#comment

Anda tahu apa itu ... Tunggu, Anda tidak? Anda tahu, hal-hal yang memungkinkan Anda mengetik teks sewenang-wenang untuk menggambarkan sebaris kode, sehingga lebih mudah dimengerti? Tidak? Oh baiklah...

Panjang 7:

l[::-1]

Sekali lagi dengan asumsi ladalah daftar, ini akan mengembalikan daftar dalam urutan terbalik. Argumen ketiga menunjukkan ukuran langkah. Karena ketiga argumen bisa menjadi nilai negatif, ukuran langkah negatif berarti iterasi dalam urutan terbalik. Argumen kosong pertama dan kedua menunjukkan bahwa kita mengulangi seluruh daftar.

Kita sampai di mana kita dapat mulai menggunakan beberapa konstruksi yang lebih menarik!

Panjang 6:

l[-6:]

Ini disebut operasi irisan . Jika ldaftar, ini akan mengembalikan daftar baru yang mengandung enam elemen terakhir lsebagai daftar. -6mewakili indeks awal (6 dari akhir), dan titik dua berarti melanjutkan hingga akhir indeks setelah itu (yang kami biarkan kosong, jadi sampai akhir.) Jika daftar kami berisi angka 1 hingga 10, ini akan kembali [5, 6, 7, 8, 9, 10].

Panjang 5:

1<x<5

Salah satu fitur luar biasa Python adalah memungkinkan Anda untuk menghubungkan operator perbandingan. Dalam banyak bahasa lain, ini akan diketikkan sebagai 1 < x && x < 5. Itu menjadi lebih baik ketika Anda mempertimbangkan beberapa perbandingan: 1 < x < y < 5sangat valid!

Panjang 4:

0256

Integer dengan nol di depan adalah nilai oktal literal. Ini adalah trik yang bagus untuk kebingungan kode juga. Ini mengembalikan nilai desimal 174. Dalam Python 3.x, nilai oktal akan dituliskan sebagai 0o256.

Panjang 3:

`3`

Mengelilingi ekspresi dalam backticks sama dengan menggunakan repr(), yang mengembalikan representasi string dari objek. Fungsi mencoba mengembalikan string sedemikian rupa sehingga ketika dilewatkan sebagai argumen ke evalfungsi, itu akan mengembalikan objek asli. Ini tidak sama dengan menggunakan str(), meskipun hasilnya terkadang sama. Untuk input ini, '3'dikembalikan dalam kedua kasus. Ini adalah favorit saya untuk golf kode!

Hanya bekerja di Python 2!

Panjang 2:

[]

Daftar kosong.

Panjang 1:

_

Karakter garis bawah adalah nama variabel throwaway yang banyak digunakan. Namun, jika Anda menggunakan shell Python (interpreter interaktif), ia menyimpan hasil dari pernyataan yang dieksekusi terakhir (dan akan mengembalikannya lagi.) Selain itu, menurut utas ini , ini juga digunakan untuk pencarian terjemahan di i18n.

Factoid : Python adalah bahasa yang mirip dengan Java dan C. Itu dibangun dengan filosofi desain khusus (diambil dari " PEP 20 - The Zen of Python ":

  • Cantik lebih baik daripada jelek
  • Eksplisit lebih baik daripada implisit
  • Sederhana lebih baik daripada kompleks
  • Kompleks lebih baik daripada rumit
  • Jumlah keterbacaan diperhitungkan

Karena itu, meskipun semi-titik dua diperbolehkan sebagai pembatas pernyataan, mereka biasanya dihilangkan dengan menggunakan beberapa baris untuk keterbacaan. Juga, lekukan garis sangat penting!


Kapan saja! Saya tidak akan menambahkan cuplikan lagi (tidak bisa menahan Panjangnya 9!), Karena Anda sudah melakukan pekerjaan yang hebat dengannya. Semoga berhasil!
nasser-sh

1
panjang 6: itu akan kembali [5, 6, 7, 8, 9, 10](6 angka terakhir dalam daftar)
Vincent

Durasi 16: ltidak harus berupa daftar, bisa berupa objek yang dapat diubah; tuple, daftar, dan generator misalnya semua pekerjaan
nasser-sh

@ Sp3000: Saya sudah menggunakannya dengan tantangan [sumber terbatas].
Robbie Wxyz

4
Tidak mencintai orang tua yang baik import antigravity?
Cipher

87

JavaScript

Ini berlaku terbaru ke terlama. Tautan untuk saya sendiri: [ sunting ]

Potongan 51 panjang:

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

Node.JS quine kali ini, meskipun akan gagal dengan persyaratan "quine ketat", karena membaca kode sumbernya sendiri.

Panjangnya 50 cuplikan:

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

Akhirnya! Permintaan AJAX (menggunakan Vanilla.JS ). Kami menginisialisasi, membuka, dan mengirim permintaan, tetapi saya kehabisan ruang untuk menambahkan penangan dan benar - benar melakukan apa pun dengan hasilnya.

Potongan 49 panjang:

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

Siapkan vokal "Hello World!". Akan sedikit lebih banyak pekerjaan untuk benar-benar berbicara itu. Kami juga dapat menyesuaikan volume, nada, kecepatan, dan aksen. Lihat API Sintesis Suara di HTML5Rocks . Belum didukung oleh Firefox, pasti bukan IE .

Panjang 48 cuplikan:

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

Simulasikan setIntervaldengan setTimeouting secara rekursif .

Potongan 47 panjang:

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

NodeJS lagi, tetapi prinsipnya sama di mana-mana di JS. Ini adalah fungsi konstruktor yang sangat dasar, yang membuat objek dengan satu properti ( a). Pengaturan module.exportsmengekspor fungsi untuk digunakan oleh require()-ing.

Potongan 46 panjang:

canvas.getContext('2d').fillRect(46,46,46,46);

Ini membutuhkan <canvas id="canvas"></canvas>elemen. Itu mengambil keuntungan dari fakta bahwa elemen dengan ID diisi sebagai variabel global, sehingga elemen dapat diakses canvasdari JS. Kemudian kita mengisinya dengan 46x46 persegi di x = 46, y = 46.

Panjang 45 cuplikan:

JSON.parse(require('fs').readFileSync('jsn'))

Kembali ke Node. Di sini, kami mem-parsing file JSON yang dinamai jsndari direktori saat ini.

Panjang 44 cuplikan:

(a=document.createElement('a')).href="/url";

Membangun # 39. Sekarang kita membuat elemen dan menetapkan atribut. Itu masih belum di DOM.

Panjang 43 cuplikan:

sq=[1,2,3,4,5].map(function(n){return n*n})

Membuat array dari 5 kotak pertama, menggunakan map().

Potongan 42 panjang:

six="1+5",nine="8+1";eval(six+' * '+nine);

Ini bekerja pada prinsip yang sama seperti ini , tetapi JS tidak memiliki #definedan berakhir lebih buruk. Tentu saja mengembalikan jawaban untuk kehidupan, alam semesta, dan segalanya .

Potongan 41 panjang:

c=function(){var i;return function(){}}()

Awal dari penutupan. csekarang merupakan fungsi (yang internal) dengan akses ke variabel internal i, tetapi tidak melakukan apa-apa.

Panjang 40 cuplikan:

$('p').click(function(){$(this).hide()})

Kami benar-benar membuang paragraf tersebut dan menggunakan jQuery.

Panjang 39 cuplikan:

script=document.createElement('script')

Ini adalah awal dari penambahan skrip eksternal baru. Buat <script>elemen kosong , dan simpan referensi untuk itu.

Potongan 38 panjang:

document.getElementsByClassName('abc')

Temukan semua .abcelemen dalam dokumen. Tentu saja, dengan jQuery, itu hanya $('.abc')...

Potongan 37 panjang:

b=JSON.parse(JSON.stringify(a={3:7}))

Membuat dua objek yang identik, tetapi dipisahkan a,, dan b. Jika Anda mau

a={a:1};
b=a;
b.a=3;

Anda akan berakhir dengan a=={a:3}, karena adan barahkan ke objek yang sama. Kami menggunakan JSON untuk memisahkan mereka.

Potongan 36 panjang:

(function f(){return "("+f+")()"})()

Sebuah quine . Ini mencetak kode sumbernya sendiri.

Panjang 35 cuplikan:

document.body.style.display="none";

Lihat # 32. Yang ini hanya menyembunyikan dokumen, tanpa menimpa isinya.

Potongan 34 panjang:

Object.prototype.toString.call(34)

Memanggil Object.prototype.toStringadalah cara yang baik untuk mengetahui jenis objek. Sementara 34..toString()itu "34", cuplikannya adalah [object Number].

Potongan 33 panjang: (kredit untuk yang ini ke pengguna anonim )

+0%-0.&(v\u0061r=~void[{}<<!(0)])

Pikirkan ini bukan JavaScript yang valid? Lebih baik coba ... (gunakan Chrome);)

Potongan 32 panjang:

document.body.innerHTML="hacked"

Berhenti! Hazxxors! Sebelas !! 11!

Potongan 31 panjang:

a=[];for(i=0;i<31;i++)a.push(i)

Tidak bercanda, saya telah menunggu begitu lama untuk dapat benar-benar menggunakan forloop! Yang ini menciptakan array dari 0-30.

Panjangnya 30 cuplikan:

new Date().getDay()==1?"S":"E"

Pertama kali menggunakan operator ternary. Saya tidak dapat memuat lebih dari ini dalam 30 karakter, jadi kami hanya tahu jika hari ini adalah hari Minggu, atau sesuatu yang lain. : P

Potongan 29 panjang:

Object.keys(window).push('i')

Object.keys(window)akan mendapatkan array dari variabel global (properti window). .push()akan menambahkan item ke array itu. Pikirkan ini setara dengan window.i=undefined? Nggak!

Potongan 28 panjang:

setTimeout("a=confirm()",28)

Menunggu 28 milidetik tidak begitu berguna, kecuali untuk membuat utas baru.

Potongan 27 panjang:

document.querySelector('a')

Sayang sekali bahwa nama DOM begitu panjang. Saya hanya bisa mendapatkan satu tautan di sini.

Potongan 26 panjang:

JSON.stringify({twenty:6})

Lihat # 16. Sekarang kita mendapatkan JSON aktual - sebuah string.

Potongan 25 panjang:

new Badge("Good Answer");

Dengan asumsi Badge()adalah fungsi konstruktor yang mengambil argumen ... lencana Jawaban Bagus baru saja dibuat!

Panjang 24 cuplikan:

do {alert(24)} while(!1)

Saya sebenarnya tidak menggunakan do..whilebanyak sekali, tetapi beberapa melakukannya. Jika ini adalah whileloop biasa , itu tidak akan mengingatkan apa pun, karena itu selalu salah. do..whileakan selalu berjalan setidaknya sekali, jadi kita bisa melihat 24.

Potongan 23 panjang:

window.parent==self.top

Ini semua merujuk pada objek yang sama, umumnya dikenal sebagai window. Jika Anda memanggil fungsi secara normal, ada juga this. Itulah 5 cara mengakses objek global!

Panjang 22 cuplikan:

for(i in self)alert(i)

Ingatkan semua variabel global. Kebetulan itu self==window. (Lihat cuplikan selanjutnya.)

Potongan 21 panjang:

"2"+1==21 && 2+1=="3"

Oh, lihat, ini aturan casting JS lagi. Pernyataan ini benar, btw.

Potongan 20 panjang:

Math.random()<.5?0:1

Pilih angka acak dari 0-1, dan bulat menggunakan operator ternary. Meskipun akan lebih mudah digunakan Math.round...

Potongan 19 panjang:

[1,2,3].map(i=>i*i)

Yang ini baru. Seperti, benar-benar baru. Ia menggunakan fungsi panah ES6 untuk menghitung kuadrat 1, 2, dan 3. Saat ini, tampaknya hanya didukung oleh Firefox.

Potongan 18 panjang:

location.href="/";

Seperti # 15, tapi kali ini, ia pergi ke beranda PPCG, bukan SE.

Potongan 17 panjang:

(function(){})()

Ini cuplikan dari 14, tapi lebih baik! Sekarang ini adalah IIFE.

Potongan 16 panjang:

obj={not:'json'}

Ini menjelaskan salah satu kencing hewan peliharaan saya. Ini adalah objek , bukan JSON ! JSON adalah format pertukaran data berdasarkan objek JavaScript, tetapi mengambil format yang lebih ketat.

Panjang 15 cuplikan:

open('//s.tk/')

Bayangkan itu. Buka beranda SE, menggunakan http://s.tk/ redirect.

Potongan 14 panjang:

function f(){}

W00t! Fungsi! Sayang sekali tidak ada ruang untuk melakukan apa pun.

Potongan 13 panjang:

Math.random()

Hasilkan angka acak dari 0 hingga 1. Ingin menentukan batas Anda sendiri? Keberuntungan yang cukup. (Tidak juga, itu mudah.)

Potongan 12 panjang:

new Date<=12

Pernyataan ini tidak pernah benar di JS. JS tidak dibuat sampai '95 (lihat factoid), lama setelah 1/1/1970 00: 00: 00.012.

Potongan 11 panjang:

Math.PI*121

Luas lingkaran dengan jari-jari 11.

Panjang 10 cuplikan:

if('j')9+1

Jika Anda belum menyadarinya, saya suka melakukan sesuatu dengan nomor snipet dalam kode. Yang ini mengembalikan 10, dan menggunakan j, huruf kesepuluh dari alfabet.

Potongan 9 panjang:

[9].pop()

Buat array dengan satu item. poplanjut musang 9.

Potongan 8 panjang:

document

Dasar untuk semua pekerjaan DOM. Tapi kita tidak bisa melakukan apa-apa, karena terlalu lama. :( Buka jQuery!

Potongan 7 panjang:

alert()

Oh Boy! Panggilan fungsi! Akhirnya bisa melakukan hal-hal!

Potongan 6 panjang:

var x=6

Berdasarkan # 3. Jauh lebih baik, karena sekarang global eksplisit . : P

Potongan 5 panjang:

[][5]

Bahkan lebih pendek dari void 0pada mendapatkan undefined. BTW: ''.abahkan lebih pendek; hanya 4 karakter.

Potongan 4 panjang:

+"4"

Ini akan membuat angka 4keluar dari string "4". Anda dapat menggunakan kembali 4 karakter yang sama persis ini dalam urutan yang berbeda untuk melakukan yang sebaliknya!

Potongan 3 panjang:

x=3

Oh sial, kami baru saja membuat variabel global implisit ...

Potongan 2 panjang:

{}

Apa fungsinya? Jika Anda mengatakan membuat objek literal, Anda salah. Ini sebenarnya adalah blok kosong. Buka konsol dan coba! Ia kembali undefined, bukan {}.

Pada tahun 2018, {}di konsol Chrome sebenarnya mengembalikan objek kosong.

Potongan 1 panjang:

1

Itu dia. Angka apa pun adalah ekspresi JS yang valid.

Factoid: JavaScript pada awalnya bernama LiveScript. Itu diubah menjadi JavaScript untuk memanfaatkan popularitas Java, pada saat itu (1995). Secara pribadi, mereka seharusnya menyimpan nama lama; JavaScript telah menjadi sumber kebingungan sejak saat itu. Faktanya, Java dan JavaScript hampir sama dengan "mobil" dan "karpet" .


1
Cuplikan 33 tidak berfungsi di Firefox. Apakah JS benar-benar valid?
Oriol

Saya menemukan string dan reparsing objek untuk menyalinnya sangat kotor. ECMAScript 6 memperkenalkan Object.assign, jadi snippet 37 menjadi b = Object.assign({ }, a = {3 : 7}).
Oriol

@Oriol Ya, hanya Firefox yang mendukungnya sekarang, jadi kita harus tetap menggunakan cara yang kotor untuk saat ini. Setidaknya itu lebih baik daripada eval(uneval(a)), kan? ;)
Scimonster

Tentang # 38, selalu ada document.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)"). (Mendukung pemilih CSS yang valid).
Mateon1

Cuplikan # 40 itu sendiri tidak begitu menarik, tetapi komentarnya sangat berharga.
Scimonster

85

R

Fakta: Bahasa pemrograman R dimulai sebagai implementasi GNU dari bahasa pemrograman S. Ini terutama digunakan untuk statistik dan aplikasi terkait.

Catatan: Meskipun bukan persyaratan kompetisi, setiap cuplikan di sini dapat dijalankan sendiri di R.


Panjangnya 32:

`[.data.frame`(swiss,3,2,drop=F)

Ini terlihat sedikit misterius ... dan memang seharusnya begitu! Ada cara yang jauh lebih baik untuk menulis ini:

swiss[3, 2, drop = FALSE]

Seharusnya terlihat lebih akrab. Inilah yang terjadi ketika kita menjalankan salah satu dari potongan kode ini:

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

Itu swiss data dikirimkan bersama R seperti beberapa lainnya yang telah kita lihat sejauh ini. Ini berisi indikator kesuburan dan sosial ekonomi untuk 47 provinsi berbahasa Perancis di Swiss dari sekitar tahun 1888. Baris ketiga adalah untuk provinsi Franches-Mnt, dan kolom kedua adalah persentase pria yang terlibat dalam pertanian sebagai profesi di setiap provinsi. Jadi pada tahun 1888, 39,7% pria di provinsi Franches-Mnt di Swiss bekerja di bidang pertanian.

Saat Anda mengekstrak baris atau kolom dari bingkai data menggunakan notasi yang lebih sederhana, R sebenarnya menggunakan [.data.framedi latar belakang. Seperti yang kita lihat dalam snippet 24, hampir semua hal dapat didefinisikan sebagai nama fungsi asalkan dikelilingi di belakangnya, jadi snippet kami di sini sah meskipun nama fungsi secara teknis mengandung tanda kurung yang tidak cocok.

The drop=Argumen memberitahu R apakah Anda ingin menjatuhkan hasilnya ke dimensi yang lebih rendah jika mungkin. Memang, jika kita katakan drop=TRUE, kita mendapatkan ini:

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

Di mana sebelumnya hasilnya adalah kerangka data, R sekarang memberi kita dua kali lipat.


Panjang 31:

print(fortune("hadleywickham"))

The fortune()fungsi dari semua-mengetahui fortunespaket, yang menyediakan berbagai kutipan bijak dari berbagai orang yang bijaksana. Cuplikan ini akan memberi Anda permata berikut dari Hadley Wickham (23) dengan mencetak ke konsol:

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)

Panjangnya 30:

pie(rep(1,12),col=rainbow(12))

Siapa yang tidak suka diagram lingkaran yang baik? The pie()fungsi akan melayani Anda sebuah pie chart baru dipanggang berdasarkan vektor angka. rep()menciptakan vektor dengan mengulangi elemen pertama r kali di mana r adalah argumen kedua. The col=parameter memberitahu pie()bagaimana warna irisan. Fungsi magisrainbow() menghasilkan vektor dengan panjang tertentu yang berisi kode hex untuk warna pelangi yang "berjarak sama".

Apa yang Anda miliki di sini adalah bagan dasar "Jumlah Setiap Warna dalam Bagan Ini":

masukkan deskripsi gambar di sini


Panjangnya 29:

summary(lm(mag~depth,quakes))

Ada beberapa hal yang terjadi di sini, jadi mari kita selangkah demi selangkah.

quakesadalah dataset yang dikirimkan bersama R. Ini berisi informasi tentang 1000 peristiwa seismik yang besarnya lebih besar dari 4,0 pada skala Richter dekat Fiji sejak 1964. Dua kolom dalam dataset adalah mag, yang merupakan magnitudo gempa bumi, dan depth, yang merupakan kedalaman episentrum dalam kilometer.

The lm()fungsi, seperti yang disebutkan dalam potongan 28, cocok model linier. Ini mengembalikan lmobjek, atau lebih tepatnya, objek kelas lm. Ada dua cara untuk menentukan prediktor (atau variabel independen ) dan respons (atau variabel dependen ), dan saya telah memilih metode rumus. Ini berbentuk response ~ predictor. Beberapa prediktor ditetapkan sebagai y ~ x1 + x2. Objek dalam rumus dievaluasi dalam konteks yang disediakan dalam argumen berikutnya.

Jadi apa lm(mag ~ depth, quakes)yang dilakukan adalah menyesuaikan model linier menggunakan regresi kuadrat terkecil biasa di mana besarnya adalah respons dan kedalaman adalah prediktor. Ia tahu apa magdan apa depthkarena kami mengatakan bahwa mereka berasal quakes.

summary()adalah fungsi generik yang digunakan terutama untuk merangkum hasil model pas. Ini memanggil metode khusus untuk kelas argumennya. Karena kita melewati sebuah lmobjek, sebenarnya memanggil fungsi yang disebut summary.lm().

Jika disatukan, kita mendapatkan ringkasan model linear yang mencoba menjelaskan gempa bumi dari kedalaman gempa. Secara khusus, inilah yang dilontarkan R:

> 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

Perhatikan bagaimana hal pertama yang memberitahu Anda adalah pemanggilan fungsi? Itu karena lm()fungsi menggunakan match.call(), seperti yang kami lakukan di cuplikan 28!


Durasi 28:

f<-function(x,y)match.call()

Fungsi R sering ingin melacak apa yang Anda katakan kepada mereka. Memang, kadang-kadang perintah yang Anda kirimkan diberikan kembali kepada Anda sebagai atribut dari objek yang dikembalikan. (Contohnya adalah lm(), yang menciptakan model linier.) Mengingat instruksi yang tepat dilakukan menggunakan match.call()dalam fungsi. Ini menangkap, atau mencocokkan , panggilan fungsi yang ditafsirkan.

Di sini kita telah mendefinisikan fungsi f()yang membutuhkan dua argumen dan kemudian memberi tahu Anda apa yang dilihatnya.

> f(1,2)
f(x = 1, y = 2)

Ini terutama berguna ketika mengembangkan fungsi untuk penggunaan umum (bukan hanya untuk Anda), seperti dalam pengembangan paket. Jika Anda ingin melihat contoh match.call()di dalam, lihat kode sumber lm()dengan mengirimkan stats:::lm. Salah satu hal pertama yang dilakukannya adalah menangkap panggilan fungsi menggunakan match.call().


Durasi 27:

install.packages("ggplot2")

Ini mungkin tampak sepele, tetapi ini menunjukkan salah satu alasan mengapa R sangat populer: Sangat mudah diperluas melalui paket. Dan siapa pun dapat mengembangkan dan membagikan paket mereka dengan bebas!

install.packages()tidak persis seperti namanya. Ini berlaku untuk paket yang menggunakan mirror CRAN (Comprehensive R Archive Network) default Anda kemudian menginstalnya pada sistem Anda di mana R dapat menemukannya. Anda juga dapat menginstal paket dari kode sumber lokal.

Ingat snippet 23 di mana kami menggunakan ggplot2paket? Paket itu tidak disertakan bersama R, tetapi hanya dalam 27 karakter Anda dapat mewujudkan semua ggplot2impian Anda dengan menginstalnya.


Panjang 26:

filled.contour(t(volcano))

The volcanokapal dataset dengan R. Ini matriks yang berisi informasi topografi pada Maungawhau (atau Gunung Eden) gunung berapi di Auckland, Selandia Baru. Baris-baris matriks berhubungan dengan garis-garis grid yang membentang dari timur ke barat dan kolom-kolomnya adalah garis-garis grid yang membentang dari selatan ke utara.

Demi disorientasi, mari kita menukar arah, jadi kolom sekarang timur-barat dan baris selatan-utara. Kita dapat melakukan ini dengan menggunakan transpose matriks, diselesaikan melalui t(). Dan mengapa tidak membuat peta kontur saat kita berada di sana? filled.contour()tidak hanya itu.

masukkan deskripsi gambar di sini


Panjang 25:

pmatch("s",c("n","size"))

The pmatch()Fungsi memberikan keajaiban di balik semua pencocokan parsial yang telah kita lihat sejauh ini. Argumen pertama adalah string yang dibandingkan dengan setiap elemen argumen kedua, sebuah vektor. Jika ada kecocokan unik, indeks elemen yang cocok dikembalikan, jika tidak Anda dapatkan NA.

Cuplikan di sini adalah contoh "dunia nyata" dari penggunaan fungsi ini. Pikirkan kembali cuplikan 13 tempat kami menggunakan sample()fungsi. Ia menerima argumen n, size, replace, dan prob, tetapi hanya membutuhkan dua yang pertama. Di cuplikan 13, kami digunakan s=sebagai singkatan size=. Apa yang sebenarnya terjadi di latar belakang adalah sesuatu seperti cuplikan ini, di mana apa yang kami berikan dibandingkan dengan yang diharapkan. Karena "s" cocok dengan "ukuran" secara unik, itu benar-benar sah untuk digunakan s=sebagai singkatan.


Panjang 24:

`(`=function(x)9;2*(3-1)

Contoh sempurna dari sesuatu yang seharusnya tidak Anda lakukan! Pernah!

Anda dapat menetapkan karakter sebagai fungsi selama Anda mengelilinginya dalam kutu belakang saat mendefinisikan fungsi. Di sini kami memberi tahu R bahwa (ini adalah fungsi yang selalu mengembalikan 9 terlepas dari inputnya. Seperti dalam banyak bahasa lain, ;dapat digunakan untuk memasukkan dua perintah pada satu baris. Jadi yang kami sampaikan kepada R adalah mendefinisikan fungsi (, lalu mencetak 2*(3-1).

Sekarang, hampir semua orang akan memberi tahu Anda bahwa 2 * (3-1) harus 4 karena Anda 3-1 = 2, kemudian 2 * 2 = 4. Tetapi kami telah memberi tahu R bahwa apa pun di dalam tanda kurung adalah 9. Jadi, sementara 3-1 = 2, kami sekarang memiliki (3-1) = 9. Kemudian kita mendapatkan 2 * (3-1) = 2 * 9 = 18.

Karena hal-hal mengerikan seperti ini dimungkinkan, setiap kali Anda mengirimkan kode yang mengandung tanda kurung dalam ekspresi (yaitu bukan panggilan fungsi), penerjemah R sebenarnya mencari fungsi apa pun yang dipanggil (terlepas dari apakah Anda telah menetapkan (sebagai fungsi. Secara umum, semakin banyak Anda menulis, semakin banyak pekerjaan yang dilakukan oleh penerjemah R.


Panjangnya 23:

qplot(Na,y=RI,data=fgl)

Akhirnya cukup banyak suara untuk contoh (sangat) sederhana ggplot2. The ggplot2paket merupakan implementasi R dari Grammar dari Graphics, diciptakan oleh R dewa legendaris Hadley Wickham . Secara umum sintaksinya sangat berbeda dari grafis R dasar dan memerlukan beberapa waktu untuk membiasakan diri. Namun, qplot()adalah antarmuka yang lebih sederhana untuk beberapa fitur inti dari paket dan memiliki sintaks yang mirip dengan plot()basis R. Tapi tidak seperti banyak contoh yang saya tunjukkan kepada Anda, qplot()tidak mendukung pencocokan parsial nama parameter fungsi.

The fgldataset berasal dari MASSpaket. Ini berisi pengukuran sifat fragmen kaca forensik. Di sini kita menggunakan variabel Na, yang merupakan persen natrium (Na) berdasarkan berat, dan RI, yang merupakan indeks bias gelas.

masukkan deskripsi gambar di sini


Panjang 22:

unique(presidential$n)

The unique()mengembalikan fungsi vektor yang mengandung nilai-nilai yang unik dari vektor input dalam urutan di mana mereka muncul di masukan. The presidentialkapal dataset dengan ggplot2paket (27). (Terima kasih kepada Jemus42 untuk memperbaikinya!) Penjelasannya:

Nama-nama setiap presiden, tanggal mulai dan akhir masa jabatan mereka, dan partai mereka yang terdiri dari 10 presiden AS dari Eisenhower hingga Bush W.

presidentialadalah bingkai data, dan bingkai data berisi kolom seperti daftar berisi item. Kolom direferensikan berdasarkan nama menggunakan $. Dataset khusus ini memiliki kolom yang disebut name, berisi nama presiden. Tapi tunggu, kami hanya menentukan n! Sebenarnya, ini adalah contoh lain dari pencocokan sebagian (13, 16), jadi nini sepenuhnya sah.

Mengirimkan ini memiliki hasil yang menarik:

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

Perhatikan bagaimana nama Lyndon B. Johnson dieja ... Ups.

(Catatan: Telah menjadi perhatian saya, lebih dari setahun setelah memposting ini, bahwa kesalahan ketik Johnson telah diperbaiki. RIP humor.)


Panjang 21:

integrate(dexp,0,Inf)

R memiliki fungsi bawaan untuk quadrature adaptif dari fungsi variabel tunggal selama interval terbatas atau tak terbatas. Dalam R, infinity ditentukan Infuntuk + infinity dan -Infuntuk-infinity. The dexp()fungsi adalah fungsi distribusi probabilitas untuk distribusi eksponensial. Karena dukungan dari distribusi eksponensial adalah [0, + tak terhingga) dan distribusi probabilitas berintegrasi ke 1, kami berharap hasilnya menjadi 1. Lihatlah, hasil yang diharapkan!

1 with absolute error < 5.7e-05

Panjangnya 20:

deriv(~cos(x^3),"x")

R dapat melakukan turunan simbolik! Ini mengembalikan:

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

Melihat melalui itu Anda bisa melihat bagaimana ia mem-parsing fungsi dan menggunakan aturan rantai. Semua fungsi yang mengambil kalkulus tahun pertama harus bisa dilakukan! Argumen pertama ke deriv()fungsi adalah ekspresi R (yang merupakan tipe R aktual) dalam hal beberapa variabel, dalam hal ini x. Argumen kedua adalah nama variabel sehubungan dengan turunannya diambil, di sini "x".

Ingin melihat sesuatu yang sangat rapi? Tetapkan hal di atas ke variabel, katakanlah dx. Tetapkan variabel xsebagai vektor numerik. Kemudian kirimkan eval(dx). R mengevaluasi derivatif di x!


Durasi 19:

c(matrix(1,3,3),"a")

Dalam R,, c()kependekan dari "menggabungkan" atau "menyatukan," membuat vektor dari argumennya. Elemen-elemen vektor harus dari jenis yang sama dan semua memiliki panjang 1. Tetapi alih-alih marah pada Anda tentang hal itu, R akan meratakan elemen dengan struktur, dalam hal ini sebuah matriks, dan melemparkan semuanya ke jenis yang sama.

Jika argumen yang c()berisi hanya satu jenis, tidak ada jenis casting, misalnya jika semua argumen adalah logis ( TRUEdan FALSE), vektor akan menjadi semua logis. Jika itu berisi logika dan angka, itu semua angka. Jika itu berisi karakter dan apa saja, itu semua karakter. Jadi cuplikan kami memberi kami ini:

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

Perhatikan bahwa matriks 3 oleh 3 diratakan dan penambahan "a" membuat semuanya menjadi karakter.


Panjangnya 18:

(1-1/3-1/3-1/3)==0

Pelajaran dalam presisi mesin. Ini kembali FALSE.


Durasi 17:

example(readline)

The example()fungsi akan memberikan contoh bagaimana untuk menggunakan built-in fungsi. Jika Anda perlu mencari tahu cara menggunakannya readline(), R memiliki jawaban sombong untuk Anda.

> 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?

Cara untuk menjadi rendah hati, R.


Panjangnya 16:

acf(lh,t="part")

The acf()mengembalikan fungsi fungsi autokorelasi untuk time series. lhadalah dataset yang dikirimkan bersama dengan R. Deskripsi:

Rangkaian waktu yang teratur memberikan hormon luteinzing dalam sampel darah dengan interval 10 menit dari wanita manusia, 48 sampel.

Dalam contoh ini, pencocokan parsial digunakan dua kali : sekali dengan parameter fungsi dan sekali dengan nilai string diteruskan ke parameter. Nama parameter lengkap typedan nilai-nilai yang diakui adalah "correlation", "covariance", dan "partial". Hanya cukup string harus diberikan untuk mengidentifikasi secara unik, sehingga kita dapat menggunakan "part"untuk "partial", yang memberi kami fungsi autokorelasi parsial (PACF).

masukkan deskripsi gambar di sini


Panjangnya 15:

p3d(bunny,p=99)

Sekali lagi kita melihat kelinci yang terkenal (11). The onionpaket memberi kita cara yang lebih baik untuk melihat dataset yang paling berguna yang pernah, menggunakan merencanakan fungsi 3D p3d(). Ini memanggil fungsi grafis dasar persp()di latar belakang, yang mengambil argumen rotasi phi. Menggunakan pencocokan sebagian nama parameter (13), kita dapat menentukan hanya p=di tempat phi=.

masukkan deskripsi gambar di sini


Panjang 14:

stats:::rgamma

R adalah open source tetapi Anda tidak harus menjadi penyihir untuk melihat kode sumber; Anda cukup mengetikkan nama paket dan fungsi yang kodenya ingin Anda lihat dipisahkan oleh tiga titik dua ( :::). Ini memberi Anda kode yang mendefinisikan rgamma()fungsi, yang menghasilkan penyimpangan acak dari distribusi gamma. Mengirimkan ini memberi:

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>

Perhatikan bahwa ia menggunakan suatu fungsi .External(). Ini panggilan fungsi yang ditulis dalam bahasa lain, biasanya C dan Fortran, bahasa yang terdiri lebih dari dasar R. Menemukan bahwa kode sumber tidak mengambil sedikit sihir. Sunting: @Vo menunjukkan bahwa orang biasa memang dapat melihat kode C yang mendasarinya dipanggil dengan .Internal()dan .Primitive()menggunakan pryrpaket. Terima kasih, @Vo!


Panjang 13:

sample(9,s=4)

Ini tidak terlihat seperti banyak, tetapi mencontohkan konsep yang kuat dalam R: pencocokan sebagian parameter fungsi . Parameter yang dinamai dalam sample()fungsi adalah size,, replacedan prob, tetapi Anda hanya perlu memberikan huruf yang cukup dari parameter yang dinamai untuk mengidentifikasinya secara unik. Jadi untuk sample(), Anda bisa menggunakan s=bukan size=karena tidak ada nama parameter lain yang dimulai dengan huruf "s". Kode di sini memilih sampel acak ukuran 4 dari bilangan bulat 1 hingga 9.


Panjang 12:

LETTERS[-pi]

Ada vektor built-in yang disebut LETTERSyang berisi semua huruf Inggris huruf besar yang dipesan sesuai abjad. Tidak seperti banyak bahasa lain, Anda dapat mengindeks vektor menggunakan nomor floating point. Tidak ada yang terlalu menarik terjadi; R hanya mengambil porsi integer. Menggunakan -sebelumnya indeks vektor menghapus elemen dengan indeks itu dari vektor. piadalah konstanta bawaan yang mengandung - Anda dapat menebaknya - bilangan irasional π. Jadi ini menghilangkan elemen 3 dari vektor dan mengembalikan "A" melalui "Z" menghilangkan "C".


Panjang 11:

plot(bunny)

Dalam onionpaket tersebut, ada dataset yang disebut bunny. Merencanakannya memberi Anda apa yang mungkin menjadi grafik paling berguna sepanjang masa:

masukkan deskripsi gambar di sini


Panjang 10:

????sample

Katakan Anda benar-benar bingung tentang sample()fungsinya dan Anda sangat membutuhkan bantuan. Daripada biasanya ?sampleuntuk membuka halaman manual R, Anda mengeluarkan empat tanda tanya. R mendengar penderitaan Anda dan berusaha membantu ...

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

Sayang.


Panjangnya 9:

isTRUE(1)

Pada awalnya ini terlihat untuk menentang konvensi di sisa paket dasar R untuk memisahkan isdan kata berikut dalam nama fungsi dengan a .. Namun, itu hanya berlaku untuk tes logis apakah argumennya bertipe tertentu, seperti di bawah ini (8). Dalam hal ini, kami sedang menguji apakah itu TRUE, yang bukan tipe. Ini menggunakan definisi ketat TRUE, yaitu 1 tidak "benar" dalam arti yang biasa. isTRUE(1)kembali FALSE.


Panjang 8:

is.na(8)

Tidak seperti kebanyakan bahasa pemrograman lain, .karakter yang valid dalam fungsi dan nama variabel. Itu tidak menunjukkan metode atau heirarki apa pun; itu hanya bagian dari namanya. The is.na()Fungsi memeriksa apakah argumen mengevaluasi ke NA(hilang) dan kembali TRUEatau FALSE.


Panjang 7:

stop(7)

Ini masalah kesalahan dengan input sebagai pesan kesalahan. Jika dipanggil di dalam suatu fungsi, eksekusi fungsi akan berhenti. Tetapi menyebutnya di luar fungsi tidak akan menghentikan skrip. Dalam hal ini, outputnya adalah Error: 7.


Panjang 6:

x < -1

Meskipun ini mungkin tampak sepele, itu menampilkan kritik utama terhadap operator penugasan <-: yaitu, makna berubah tergantung pada penempatan ruang. Seperti disebutkan, x <- 1menugaskan 1 untuk x. Memisahkan <dan -dengan satu ruang seperti di atas mengubahnya menjadi tes logis apakah xkurang dari -1. Karena alasan itu, banyak yang memilih =untuk tugas.


Panjang 5:

x<<-1

Mirip dengan <-kecuali <<-selalu menempatkan variabel ke ruang lingkup global terlepas dari ruang lingkup saat ini.


Panjang 4:

x<-1

R digunakan <-untuk menetapkan variabel dalam lingkup saat ini. Cuplikan ini memberikan nilai 1 ke x.


Panjang 3:

!0i

The !operator adalah R untuk "tidak", dan 0iadalah bilangan kompleks 0+0i, AKA 0 di bidang kompleks. Mengirimkan pernyataan ini kembali TRUEkarena 0 salah.


Panjang 2:

NA

Ini mengembalikan nilai R khusus NA, yang berarti "tidak tersedia," yang menunjukkan nilai yang hilang.


Panjang 1:

T

Ini kembali TRUE. Dalam R, Tdan Fmerupakan sinonim untuk nilai boolean TRUEdan FALSE, masing-masing.


Yay R "!"(T)!
Vlo

@Vo: "!"(T)dievaluasi menjadi FALSE. Namun, pernyataan "Yay R" tidak pernah salah. ;)
Alex A.

Bagaimana cara saya menambahkan lebih banyak untuk lebih banyak entri ???? "Menemukan kode sumber itu memang membutuhkan sedikit sihir" adalah sepele untuk .Internaldan .Primitive->pryr::show_c_source(.Primitive("sum"))
Vlo

@Vo: Saya belum pernah mendengar tentang pryrpaket itu. Sangat keren! Terima kasih telah menunjukkannya. Saya senang Anda menyukai entri sejauh ini, terima kasih atas dukungannya. :)
Alex A.

2
@ Jemus42 Ah, sepertinya kamu harus lakukan data(bunny)dulu.
Alex A.

75

Brainfuck

Factoid: Brainfuck (Juga dikenal sebagai brainf * ck) adalah bahasa esoterik eksperimental untuk menciptakan juru bahasa turing-complete terkecil yang pernah dibuat oleh Urban Müller, dan saat ini merupakan bahasa yang paling terkenal dari jenisnya. Ini hanya memiliki delapan perintah, mudah dipelajari, tetapi sulit digunakan.

Brainf * ck memiliki memori berbasis tape dengan 30000 sel dan pointer yang dapat digerakkan, dan dapat divisualisasikan seperti ini:

0 0 0 0 0 0
    ^

Dengan ^karakter yang mewakili pointer, dan 0 mewakili nilai untuk setiap sel.

Brainfuck memiliki delapan instruksi:

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 ke 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;
}

Panjang 1 Potongan

Baca satu karakter dan letakkan di sel saat ini.

,

Memori (dengan input: abc )

0 0 97 0 0 0
    ^

Potongan 2 Panjang

Tambahkan satu ke sel saat ini, dan geser penunjuk ke kanan.

+>

Ingatan

0 0 1 0 0 0
      ^

Potongan 3 Panjang

Hapus satu dari sel saat ini sampai nol; Setel sel saat ini ke nol

[-]

Memori yang mungkin:

Memori: (Sebelumnya)

0 0 100 0 0 0
    ^

Memori: (Setelah)

0 0 0 0 0 0
    ^

Potongan 4 Panjang

Komentar: Dalam brainfuck, semua yang bukan instruksi diabaikan. Karena alasan itu, program berikut adalah program brainfuck yang benar-benar valid (tapi kosong):

Hey!

Panjang 5 Potongan

Program kucing sederhana (Tulis input ke output)

,[.,]

Terima kasih kepada tomsmede untuk komentarnya

Potongan 6 Panjang

Pindahkan nilai sel saat ini ke sel ke kanan (Mengasumsikan sel ke kanan adalah 0, jika tidak maka akan menambah nilai sel saat ini ke nilai sel ke kanan):

[>+<-]

Secara umum, orang menggunakan kode ini untuk memindahkan variabel.

Memori: (Sebelumnya)

10 0 100 0 0 0
     ^

Memori: (Setelah)

10 0 0 100 0 0
     ^

Panjang 25 Snippet

Balikkan input enam karakter dan cetak, diikuti oleh setiap karakter ASCII (N-1) .. 1 (di mana N adalah nilai karakter input pertama).

,>,>,>,>,>,.<.<.<.<.<[.-]

Panjang 53 Snippet

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

Program C yang diperkecil ini juga merupakan program Brainfuck yang menyamar, dan sebaliknya! Bahkan, mereka (hampir) melakukan hal yang sama. Ini kode Brainfuck tanpa "komentar" (kode C).

><+-

Biarkan saya menjelaskan kode Brainfuck (dan kode C). Seperti yang Anda lihat, ia menggunakan dua sel ( idan j). Ini menambah sel pertama (selisih i1). Kemudian ia mengurangi sel yang sama (dikurangi i1).

Ini hanyalah contoh konyol dari beberapa kode sumber yang dapat dikompilasi sebagai dua bahasa yang berbeda dan menjalankan (secara praktis) sama.


2
,[.,]- 5 karakter, program kucing
mulai

13
Ini mungkin "Brainfuck 101" terbaik yang pernah saya lihat.
hoosierEE

panjang 6: itu akan menempatkan jumlah di sel kanan, dan nol yang kiri. Tidak bergerak, kan?
Filip Haglund

Menambahkan variabel dummy ke panjang 6 untuk lebih menjelaskan konsep. Program ini sebenarnya akan menambahkan sel # 3 ke sel # 4 dan membuat sel # 3 0.
YoYoYonnY

58 suara - dapatkah Anda memperbarui? :)
Conor O'Brien

65

C ++

Dengan preprosesornya, templat, lambdas, tipe sifat, dan fitur kompleks lainnya yang tak terhitung yang tak seorang pun bisa berharap untuk memahami secara keseluruhan, C ++ ditemukan kembali oleh setiap generasi baru dari standarnya. Dengan memanfaatkan berbagai cara untuk melakukan hal-hal pada waktu kompilasi, seseorang dapat menulis nol abstraksi overhead seperti perpustakaan yang memungkinkan unit fisik dilampirkan ke tipe data numerik untuk memeriksa kesehatannya pada waktu kompilasi (misalnya Anda tidak dapat menetapkan hasil dari kg* muntuk N)

Panjang 1

#

Biasanya memperkenalkan pernyataan preprosesor, # bisa berdiri sendiri pada garis. Ini pada dasarnya tidak berarti apa-apa dan tampaknya sangat tidak dikenal sehingga sebagian besar highlighters sintaks yang saya lihat tidak mengetahuinya.

Panjangnya 2

%:

Tentu saja tidak semua orang memiliki #kunci, jadi C ++ adalah (well, itu benar-benar mewarisinya dari C kuno) murah hati untuk memungkinkan Anda untuk menulisnya dengan token alternatif ini (alias digraf )

Panjangnya 3

??=

Ini adalah kursus sejarah tentang C ++. Hari-hari ini tidak lagi berlaku, meskipun implementasi dapat mendukungnya, adalah trigraph. Urutan ini diterjemahkan ke #dalam sistem yang mendukungnya, tetapi untuk tidak mengganggu literal string mentah, itu tidak diperbolehkan di dalam mereka. Implementasi dapat memilih untuk menghentikan dukungan secara keseluruhan.

Panjangnya 4

auto

Merupakan salah satu dari penemuan yang lebih baru (sejak C ++ 11) untuk membuat bekerja dengan kode umum menjadi mudah. Ini untuk mendeduksi tipe ekspresi, dan karena C ++ 14 bahkan dapat digunakan untuk mendeduksi parameter lambda dan tipe kembalinya fungsi.

Panjangnya 5

 catch

Merupakan kata kunci yang juga dikenal dari banyak bahasa lain, hadir dalam C ++, tetapi programmer C ++ idiomatis yang baik hampir tidak pernah menggunakannya. Dengan konstruktor dan destruktornya, idiomatik C ++ menggunakan prinsip yang secara luas disebut RAII (Perolehan Sumber Daya adalah Inisialisasi) atau bagaimana saya suka menyebutnya dengan lebih tepat: SBRM (Scope Bound Resource Management). Karena kelas seperti pointer pintar, seseorang dapat mengikat masa pakai sumber daya yang dialokasikan secara dinamis (yang bukan hanya memori!) Ke objek lain. Ketika mereka keluar dari ruang lingkup (misalnya dengan pengecualian yang dilemparkan), objek-objek ini secara otomatis membersihkan sumber daya. Ini memungkinkan untuk pengecualian kode aman dan mudah digunakan yang tidak perlu digunakan catch.

Panjangnya 6

[](){}

[]{}()

Seperti Stefan yang disebutkan dalam komentar, Anda dapat menggunakan []{}sebagai objek lambda terpendek, jadi ini adalah bentuk terpendek untuk memanggil lambda. Teks berikut ini untuk versi lama:

mungkin merupakan bentuk terpendek dari lambda. Lambdas di C ++ adalah objek (tipe implementasi yang ditentukan) yang dapat menangkap bagian dari lingkup yang mereka buat di (sintaks [] mengontrol ini), dan dapat dipanggil (sintaks yang dipanggil () mengontrol ini). Kode mereka (Bagian {}) memiliki akses ke variabel-variabel ini seolah-olah mereka berada dalam ruang lingkup mereka. Dengan mereka opsional tipe kembali deduksi dan parameter auto pemotongan diperkenalkan pada C ++ 14, mereka yang alat untuk digunakan untuk semua algoritma perpustakaan standar yang mengharapkan callable (misalnya ketiga parameter std :: semacam).

Panjangnya 7

virtual

Adalah kata kunci untuk mulai menggunakan polimorfisme runtime dalam C ++, salah satu blok dasar pemrograman berorientasi objek. Ini mengikuti prinsip "jangan bayar untuk apa yang tidak Anda gunakan", karena dalam bahasa lain semua fungsi adalah virtual secara default. Menjadi bahasa multi-paradigma, mungkin mengejutkan bagi orang-orang yang berpikir "C ++ berorientasi objek" untuk melihat program atau perpustakaan yang hampir tidak menggunakan kata kunci ini, misalnya karena mereka mengikuti prinsip pemrograman generik.

Panjangnya 8

override

Bekerja bersama dengan kata kunci virtual, overrideadalah salah satu tambahan C ++ untuk membuat kompiler melakukan lebih banyak pekerjaan untuk Anda. Dengan menggunakannya, Anda menyatakan niat untuk menimpa fungsi virtual di kelas dasar, dan kompiler akan keluar kesalahan jika Anda melakukan kesalahan dan kelas itu tidak memiliki fungsi yang ditentukan. Secara umum itu dianggap gaya yang baik jika kode Anda menyatakan niatnya, daripada mengutak-atik bit.

Panjangnya 9

constexpr

Menjadi tambahan tambahan untuk C ++, constexprmemungkinkan programmer untuk mengekspresikan fungsi atau variabel, bahwa mereka diketahui pada waktu kompilasi dan harus dapat dihitung pada waktu kompilasi. Ini memungkinkan fungsi-fungsi ini untuk digunakan dalam konteks yang memerlukan kompilasi ekspresi waktu (misalnya sebagai parameter template atau ukuran array). Banyak fungsi perpustakaan standar (jika mungkin) sudah constexpr sehingga mereka dapat digunakan di sini.

Panjangnya 10

for(i:c){}

Adalah lingkaran lengkap di atas wadah, atau wadah seperti konstruksi yang mendukung std::begindan std::enduntuk mendapatkan iterator (yang mencakup larik gaya C). Ini pada dasarnya setara dengan for(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }. Ini memungkinkan perulangan yang mudah dalam kode generik.

Panjangnya 11

void f()&&;

Merupakan cara baru untuk mendeklarasikan fungsi anggota dan properti pada objek tempat mereka dipanggil. Dalam versi C ++ sebelumnya kami hanya memiliki kemampuan untuk memilih void f() const;untuk memberitahu kompiler agar dapat memanggil fungsi pada objek const (sehingga tanpa const Anda tidak dapat memanggilnya pada objek non-const). Cara yang sama kita sekarang memiliki &&sintaks untuk referensi r-nilai yang digunakan untuk dapat memanggil fungsi-fungsi tersebut pada nilai.

Panjangnya 12

int main(){}

Ini mungkin program lengkap terpendek yang dapat Anda kompilasi dan jalankan. Ini tidak akan melakukan apa pun dan mengembalikan 0. Pengembalian ini adalah salah satu dari banyak kasus khusus yang dapat Anda temui di C ++. Biasanya mengembalikan apa-apa adalah perilaku yang tidak terdefinisi, tetapi untuk fungsi titik masuk utama, mengembalikan apa-apa berarti mengembalikan 0.

Panjang 13

auto f()->int

adalah cara yang agak baru untuk mendeklarasikan tipe kembalinya suatu fungsi. Biasanya Anda tidak akan melakukan ini jika Anda sudah tahu jenisnya, tetapi ada banyak situasi dalam pemrograman generik di mana jenisnya tergantung pada parameter templat dan variabel yang Anda gunakan. Melakukannya dengan cara ini memungkinkan akses yang lebih mudah ke parameter-parameter ini sebagai template<class T> auto f( const T& t ) -> decltype(t.foo())gantitemplate<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
Saya akan menyarankan menggunakan ;sebagai potongan 1-char alternatif, karena itu bukan makro preprocessor dan fakta bahwa Anda dapat memiliki pernyataan 1-karakter di C ++ sama sekali tampaknya membingungkan.
Joe Z.

1
[](){}bukan bentuk lambda terpendek: Karena daftar parameter kosong, mungkin dihilangkan. Oleh karena itu []{}adalah lambda terpendek. Sepele, []{}()adalah eksekusi terpendek dari lambda ;-) ideone.com/k8fAvs
stefan

@stefan: memang, saya selalu lupa karena tidak terlihat berfungsi seperti itu;) Saya menambahkannya ke jawaban.
PlasmaHH

@PlasmaHH Saya benar-benar membencinya karena memang itu tidak terlihat seperti sebuah fungsi .. ;-)
stefan

59

Regex

Potongan 2 panjang

[]

JavaScript : Kelas karakter kosong yang tidak cocok dengan apa pun.

PCRE , Java , Pythonre , Ruby (diuji pada versi 2.0): Kesalahan sintaksis.

Potongan 1 panjang

.

., disebut dot-all, tersedia dalam semua rasa yang saya punya kesempatan untuk melihatnya.

Apa yang cocok?

Terima kasih, ̡͟ ̕̕ ̴.̸̴̢̛́ ̸̡̢m͞ąt̴̨c͞h̛e͢͡s̶͘ ͘a҉n̛͜͠ỳ̸ ͢c̵̡hár͘͝a̕͢ćt͘͠e͏̀͠r̷̀ ̴̕͢ex͝͞͞c҉ep̀t̛ ̕f̴҉o͟͜r̴͢ ͞n͏ę͟w̢̕͜ ͡ļ̸̸̸̶̧̧

JavaPattern : Dalam mode default, dot-all cocok dengan titik kode mana pun, kecuali untuk 5 titik kode ini \r\n\u0085\u2028\u2029. Dengan UNIX_LINESmode aktif (tetapi tanpa DOTALL), titik-semua cocok dengan titik kode mana pun, kecuali untuk \n. Dengan DOTALLmode on, dot-all cocok dengan titik kode mana pun. Dari Java 5, Patternberoperasi pada titik kode, sehingga karakter astral dicocokkan dengan titik-semua.

Pythonre (diuji pada 2.7.8 dan 3.2.5, mungkin berbeda pada 3.3+): Dalam mode standar, dot-all cocok dengan unit kode UTF-16 mana pun (termasuk 0000 ke FFFF), kecuali untuk \n. re.DOTALLmengangkat pengecualian dan membuat .cocok dengan unit kode UTF-16 mana pun. Dalam versi ini, reberoperasi pada unit kode UTF-16, jadi .hanya berhasil mencocokkan satu unit kode karakter dalam bidang astral.

.NET : Sama seperti Python. Mode dot-all dalam .NET disebut Singleline.

JavaScript (C ++ 11 <regex>) : Dalam mode default, dot-all cocok dengan unit kode UTF-16 apa pun, kecuali untuk 4 poin kode ini \n\r\u2028\u2029. Dengan sbendera menyala, dot-semua cocok dengan unit kode UTF-16 mana pun. JavaScript juga beroperasi pada unit kode UTF-16.

PCRE : Bergantung pada opsi build, dot-all dapat mengecualikan \r, \natau \r\n, atau semua 3 urutan CR LF, atau urutan baris baru Unicode dalam mode default. Dalam mode default, mesin beroperasi pada unit kode (bisa 8, 16, atau unit kode 32-bit), jadi dot-semua cocok dengan unit kode apa pun, kecuali untuk urutan baris baru. Dalam mode UTF, mesin beroperasi pada titik kode, jadi dot-semua cocok dengan titik kode apa pun kecuali untuk urutan baris baru. Mode dot-all disebut PCRE_DOTALL.

PHP (diuji pada ideone): PCRE, dikompilasi sebagai pustaka UTF-8 dan \nmerupakan satu-satunya urutan baris baru secara default. Mode dot-all dapat diakses melalui sflag.

Postgres : Dalam mode default, dot-all cocok dengan titik kode apa pun tanpa kecuali.

Ruby (diuji pada versi 2.0.0): Dalam mode default, .cocok dengan titik kode apa pun kecuali untuk \n. Mode dot-all dapat diakses melalui mflag (!).

s flag digunakan untuk menunjukkan pengkodean Windows-31J di Ruby.


Faktoid

Ŗ͞e̡͟҉ǵ͟͢e̴̢͘͡x̡́͞ ̛̀҉҉̢c҉̷̨a̸̛͞n҉̛͠ ̷̸̀p̴͠͡҉̵ą̧͜͢r̸̸̷̢͝s̢̀͡e̷̷̷͘͞ ̨̧̀H̨̧͜͜T̷͞M̷̛͜L͢.̴̡́ Ulangi setelah saya. R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̣̻͓̠͈͕̥̜͚̝̫͚̳̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒̚̚ ̸̦͈̥̬̺͇ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡ mengurai ͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
Saya merasa sedih untuk siapa pun yang tidak mendapatkan referensi factoid.
Robobenklein

6
@robobenklein Saya tahu obat rahasia untuk rasa sakit Anda: Cukup beri tahu kami!
flawr

24
@ flawr Bagi mereka yang tidak tahu pertanyaan terkenal: jawaban pertama di stackoverflow.com/questions/1732348/… adalah apa yang Anda cari.
Robobenklein

1
Anda dapat membaca teks Zalgo'ed, tetapi jangan menganggapnya terlalu serius di kedua arah. Jelas salah untuk mengikuti jalan Zalgo secara membabi buta, tetapi teks Zalgo tidak salah sepanjang waktu.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

12
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, tidakkah Anda akan menggunakan semua suara itu untuk menunjukkan kepada kami cara menguraikan HTML?
mbomb007

57

J

PS: Cuplikan sekarang ditautkan ke tryJ.tk memungkinkan Anda bermain-main dengan mereka yang berjalan dalam JavaScript di browser Anda, tanpa menginstal J.

PPS: Saya bertukar pesanan; ini lebih masuk akal bagi orang yang bergabung, dan untuk referensi di masa mendatang.

PPS: Saya pikir, karena keterbatasan waktu, saya akan menambahkan satu cuplikan sehari

factoid:

J adalah turunan APL (lihat di sini untuk sejarah keluarga) tanpa set karakter lucu.

Potongan 1 panjang

_

J menggunakan _keduanya sebagai infinity dan sebagai indikator negatif , ketika dilampirkan ke angka literal (berlawanan dengan kata kerja -).

Potongan 2 panjang

a.

a.disebut Alphabet , berisi semua karakter 1 byte. Karena J tidak mengandung fungsi seperti atoi, karena itu adalah pencarian sederhana dalam alfabet:a. i. 'z' =122

Potongan 3 panjang

i.9

i.adalah untuk Integer, bila digunakan secara monadik (mis. hanya satu argumen, yang benar, biasanya disebut y). Ketika digunakan secara dua bahasa, ia berfungsi sebagai indeks , seperti dalam contoh di atas.

Potongan 4 panjang

!!6x

J mendukung bilangan bulat presisi rasional dan bilangan rasional . Ini menghitung faktorial dari faktorial 6 (angka 1747 digit).

Potongan 5 panjang

^.^:_ 

Yang padat ... Pertama, kata kerja (seperti fungsi panggilan J) diatur berdasarkan tema. Semua kata kerja terikat dengan eksponensial. ^untuk eksponensial (dan expbila digunakan secara monadik, ^.untuk logaritma .^: adalah yang khusus, konjungsi Daya (fungsi orde yang lebih tinggi), yang menerapkan fungsi beberapa kali. Ketika argumen yang benar adalah infinity ( _) ia mengeksekusi argumen kirinya (dalam contoh ^.) pada outputnya sendiri sampai konvergen. Akibatnya, ^.^:_adalah penyelesaian kata kerja x = ln(x)ketika diterapkan pada argumen apa pun kecuali 1, menghasilkan 0.318132j1.33724.

Potongan 6 panjang

^0j1p1

atau setara

^o.0j1

Identitas Euler dalam J. Seperti yang dikutip di atas, ^adalah exp(). Terlepas dari bilangan bulat presisi dan rasional, itu juga mendukung kekuatan pi dan bilangan kompleks, dan kombinasi daripadanya sebagai literal. 0j1p1berarti (0 + j) * pi ^ 1.

Potongan 7 panjang

+/&.:*:

Kata kerja mengambil 2-norma dari vektor apa pun. Ini menunjukkan 2 hal:

  • yang Insert adverbia ternyata Tambah kata kerja +ke Sum dengan memasukkan di antara setiap elemen dari argumen. Karenanya(0+1+2+3) = +/ i.4 .

  • Konjungsi Under ketika digunakan sebagai v &.: u ysetara dengan vi u v y, di mana vibagian depan (umumnya kebalikannya).

Ya, J tahu tentang invers fungsional. Menggabungkan ini membuat kata kerja dalam cuplikan setara dengan%: @: (+/) @: *: , atau sqrt(sum(y.^2))dalam Matlab misalnya.

Potongan 8 panjang

$#:I.@:,

Sebuah garpu terdiri dari 3 kata kerja tanpa referensi untuk argumen. Ini memungkinkan apa yang ada di J disebut pemrograman tacit (point-free). Garpu f g h, dalam kasus monadik (seperti dalam contoh ini) setara dengan (f y) g (h y). Seperti fork, array multidimensi adalah bagian intrinsik dari J. "Indeks" mengembalikan indeks yang dalam vektor, tetapi tidak meluas ke dimensi yang lebih tinggi seperti itu. Contoh ini menggunakan Shape , Antibase dan I.@:,sebagai 3 tine dari fork yang mengimplementasikan I. untuk array dimensi yang lebih tinggi, misalnya:

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

Potongan 9 panjang

<"1 i.4 6 

Array kotak adalah tipe data dalam J, memungkinkan untuk menggabungkan konten heterogen (baik tipe dan ukuran) menjadi satu nilai. Mengandung satu unsur< Kotak itu argumen. Rank adalah konsep sentral dalam J, dan memungkinkan untuk secara otomatis memperluas kata kerja menuju array dimensi yang lebih tinggi. Kata benda dan kata kerja memiliki peringkat.

Rank kata benda adalah jumlah dimensi dari kata benda apa pun, yang $@$dapat dikatakan oleh kata kerja Anda. Misalnya i. 2 3 4array dari peringkat 3.

Peringkat kata kerja adalah peringkat kata kerja yang akan diterapkan. Setiap kata kerja memiliki peringkat intrinsik yang dapat ditanyakan dengan kata dasar . v b. 0mengembalikan 3 angka untuk monadik, kiri diadik dan pangkat kanan diad dari kata kerja v.

Kata kerja bekerja pada sel kata benda dengan peringkat yang sama dengan kata kerja, dan menggantikan hasil dalam rank-verb rankbingkai kata benda . Pangkat kata kerja dapat dibatasi menggunakan penghubung Peringkat , seperti yang dilakukan di sini, tinju sel peringkat 1 (baris) alih-alih bekerja pada pangkat _, yaitu. tinju seluruh array. Info lebih lanjut tentang peringkat dapat ditemukan di sini .

Panjangnya 10 cuplikan

<./ .+~^:_

Cuplikan ini adalah kata kerja yang menghitung lintasan terpendek atas digraf tertimbang. Ini memperkenalkan minimum ( <./) dan konjungsi Dot . Titik konjungsi adalah generalisasi dari produk matriks, yang dapat ditulis sebagai +/ . *. Secara umum, u . vsetara denganu@(v"(1+lv,_)) mana lv adalah pangkat kiri dari kata kerja v. Atau dalam kata-kata "u diterapkan pada hasil v pada daftar" sel argumen kiri "dan argumen kanan dalam toto". (Lihat di atas untuk peringkat)

Dengan demikian kata kerja bagian dalam <./ .+~menggantikan item y(i,j)dengan minimumy(i,k)+y(k,j) untuk semua k.

^:_ ulangi langkah ini sampai konvergensi.

Contoh, menampilkan jarak jalur asli dan terpendek:

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

Potongan 11 panjang

<.@o.10x^99

Cuplikan ini memperkenalkan kode khusus : Beberapa kode J didukung oleh kode yang ditulis secara khusus untuk kasus penggunaan tertentu, dikenali pada waktu parse, dan dioptimalkan; baik untuk akurasi yang lebih tinggi (seperti halnya di sini) atau kinerja yang lebih tinggi (lihat Kombinasi khusus )

Frasa ini memberikan 99 digit pi (meskipun bergeser 99 tempat desimal). Kode khusus tergantung pada frasa yang tepat, yang biasanya setara adalah tidak setepat kode cuplikan: <.o.10x^99 kehilangan presisi yang diperluas.

Panjang 12 cuplikan

($-.1:)($,)]

Dari waktu ke waktu, Anda berakhir dalam situasi di mana karena pilihan yang dibuat dalam data, ada dimensi tunggal yang berjalan di jalan. Utilitas praktis ini, disebut memeras di Matlab, memeras semua dimensi tunggal. Tine kiri dari fork ($-.1:)menghasilkan semua dimensi tanpa yang, sedangkan yang tengah ($,) membentuk kembali array yang berlepasan ke dimensi yang dipertahankan. Tine kanan ]berfungsi hanya untuk membuat garpu ini, dan referensi argumen yang tepat.

Potongan 13 panjang

1 :'-u%u d.1'

Metode Newton menemukan perkiraan akar dari fungsi yang terdiferensiasi. Ini kata keterangan eksplisit diterapkan dengan fungsi yang akar dicari, dan merupakan salah satu langkah dari prosedur iterasi. uadalah argumen yang merujuk fungsi, digantikan saat kata keterangan diterapkan. d. adalah fungsi penghubung konjungsi, dan mungkin di sini diganti dengan D.yang melakukan hal yang sama secara numerik (tetapi berbeda ketika diterapkan pada fungsi peringkat yang lebih tinggi). Hasilnya adalah pengait yang mengurangi garpu ( udibagi dengan turunannya) dari argumen.

Sebagai contoh:

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

Panjang 14 cuplikan

(%-.-*:)t.i.10

10 angka pertama dari seri Fibonacci oleh ekspansi Taylor dari x / (1 - x - x^2). Menganalisis kail %-.-*:memberi (y % (-.-*:) y) = (y % ( (1 - y) - *: y).

Panjang 15 cuplikan

(#{.+//.)!/~i.9

Pandangan lain tentang seri Fibonacci. Kali ini dari sudut lain; mulai dari segitiga Pascale '! / ~ i.9'.

/ketika digunakan secara diadili berarti Table , menerapkan kata kerja itu terikat antara setiap sel argumen itu, menghasilkan tabel operasi antara argumen x dan y. Dalam hal ini !digunakan secara dua arah, sebagai Kombinasi (atau Keluar) . ~membuat kata kerja Refleksif , yaitu. gunakan argumen yang benar sebagai yang kiri juga.

Kata keterangannya /.aneh, itu berlaku kata kerja di sepanjang anti-diagonal array (mis. Coba di </.!/~i.5sini )

Jadi cuplikan ini mengambil jumlah pada 9 anti-diagonal pertama pada segitiga Pascal, yang merupakan seri Fibonacci kemunculan lainnya.

Panjang cuplikan 16

;/@~.,. <"0@#/.~:

Ok, saya menambahkan spasi hanya untuk sampai ke 16 :). Cuplikan ini menunjukkan garpu menggunakan Kunci : daftar semua item dalam argumen dan frekuensinya.

x u/. yberlaku u untuk y dalam potongan di mana x adalah unik, atau J: (=x) u@# y, di mana =adalah Self-Klasifikasikan , yang menghasilkan array boolean yang mengandung 1 di posisi di mana mereka muncul di nub ~. Di sini itu diterapkan secara refleks, sehingga mengeksekusi Tally pada setiap item unik dalam y, menghitung jumlah penampilan.

Karena sebagian besar kata kerja dalam J menjaga urutan nub (urutan penampilan item unik baru, berlawanan dengan misalnya uniquedalam Matlab, yang mengurutkan argumennya) ini dapat digunakan untuk Stiching item ke frekuensi mereka seperti yang dilakukan di sini. ;/@~.digunakan untuk membuat daftar semua item dalam kotak.

Perhatikan bahwa karena konsep Rank yang berlaku , kode ini berfungsi untuk dimensi apa pun .

Potongan 17 panjang

*./ @:(#&>)@C.@A.

J mendukung beberapa primitif khusus tentang permutasi:

  • Anagram A. Secara monumental ia menemukan indeks Anagram, secara diadik, ia menerapkan permutasi yang ditentukan oleh indeks anagram dalam argumen kiri ke argumen kanan.
  • Cycle - Permute C. mengkonversi antara representasi permutasi langsung dan siklus.

Cuplikan ini adalah kata kerja yang mengambil indeks anagram ke kiri (antara 0 dan !#y) dan argumen kanan y sebuah array untuk permutasi. Setelah itu, ia menghitung LCM *./ dari panjang siklus #&>, yaitu. periode setelah itu Anda mendapatkan kembali array asli:

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

Panjangnya 21

<:@(#/.~)@(i.@#@[,I.)

Kata kerja kecil ini berasal dari add-on "stats / base", dan disebut histogram . Itu tidak persis itu, mengingat daftar mulai bin, jumlah semua kejadian data antara dalam interval di ]bn-1,bn]mana bn adalah awal dari nomor bin n.

Itu mengeksploitasi Indeks IntervalI. untuk menemukan interval:

Jika y memiliki bentuk item x, maka x I. y adalah j paling tidak negatif sehingga j {x mengikuti y dalam pemesanan, atau #x jika y mengikuti {: x dalam pemesanan atau jika x memiliki tidak ada barang.

Membuat total setiap interval dilakukan dengan menggunakan kunci seperti yang disorot dalam snippet 16.

Cuplikan yang ditautkan ke pada tryj.tk menunjukkan teorema batas pusat menggunakan histogram ini:

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

Panjangnya 22

=,&(+/)(~:#[)e.&~.~:#]

Kegembiraan dalam J. Ini mengimplementasikan mesin dalang, mengambil array rahasia sebagai argumen kiri, dan tebakan sebagai kanan. Nilai yang dikembalikan adalah jumlah pasak putih dan hitam. Dipisahkan:

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

Untuk digunakan seperti

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

Di mana secretdan guessapa pun array. Ini bekerja dengan semua tipe data sebenarnya.


17
Baik, Anda mendapatkan tumpukan simbol aneh yang tidak dapat dibaca, atau Anda mendapatkan tumpukan simbol ASCII yang tidak dapat dibaca. Pilih racunmu.
John Dvorak

16
@JanDvorak Semua bahasa tidak dapat dibaca hingga Anda mempelajarinya. ;-)
Gareth

5
Dulu saya berpikir panjang, nama deskriptif memahami kode bantuan. Kemudian saya sedang tercerahkan .
hoosierEE

@ Gareth Tapi tidak semua tidak dapat dibaca bahkan setelah Anda mempelajarinya. Tidak akan menyebutkan nama.
flawr

45

RPL (Bahasa Pemrograman Redstone) [dan Minecraft]

Ini adalah masalah besar pada apakah kita dapat menganggap ini sebagai bahasa pemrograman nyata atau tidak, tetapi kita akan tetap mencobanya. Dan, karena kedua "bahasa" ini praktis sama, saya akan menggabungkannya, terkadang memposting cuplikan dalam bahasa "Minecraft" (redstone, dll.) Dan kadang-kadang dalam RPL. Juga, karena banyak cuplikan di Minecraft, saya akan memposting tautan ke gambar daripada gambar itu sendiri untuk menghemat ruang. Selain itu, semua cuplikan akan menjadi konsep pemrograman di Minecraft, bukan redstone umum (yaitu tidak akan ada pintu redstone yang muncul). Karakter akan dihitung dalam byte (dalam RPL) atau sesuai dengan ini (dalam Minecraft).

Faktoid:

RPL adalah bahasa pemrograman oleh Tossha the Inventor yang mengubah kode menjadi Minecraft redstone dan blok perintah. Ia dapat melakukan input dan output, loop, manipulasi integer, fungsi trigonometri, root, dan banyak lagi.

Panjang 1:

Tombol (1 byte) adalah bentuk input paling sederhana di Minecraft. Itu juga dapat memulai atau menghentikan "program". Demikian pula, tuas (juga 1 byte) adalah bentuk input lain, dan juga dapat digunakan untuk memulai dan menghentikan program karena memiliki status "hidup" dan "mati". Yang perlu diingat adalah bahwa Minecraft secara harfiah adalah bahasa pemrograman 3D, jadi di mana tombol / tuas ditempatkan dalam program dapat membuat perbedaan besar.

Panjang 2:

Sebuah tombol yang terpasang pada lampu redstone adalah program kucing Anda yang paling mendasar . Dibutuhkan input (dengan tombol atau tuas, baik 0atau 1( offatau on)) dan output dalam bentuk cahaya dari lampu sebagai salah satu 0atau 1( offatau on).

masukkan deskripsi gambar di sini

Panjang 3:

Seperti yang terlihat di bawah ini, ini salah satu program pemodifikasi kode sumber terpendek (seperti Anda dapat memodifikasi sumber saat runtime dengan Minecraft!). Sekarang, yang spesifik ini benar-benar tidak ada gunanya, tetapi konsepnya dapat dikombinasikan dengan yang lain untuk membuat beberapa program yang luar biasa (karena akan datang dengan lebih banyak upvotes). Saat dijalankan, program ini menghapus sumber inputnya, dan membuatnya tidak dapat dijalankan lagi. masukkan deskripsi gambar di sini

Panjangnya 4

"Cuplikan" ini sebenarnya menunjukkan dua konsep: delay, dan NOT gate. Keterlambatan dibuat menggunakan elemen redstone tertentu yang memiliki penundaan redstone-tick . Kutu redstone sama dengan sepersepuluh detik. Komponen redstone yang berbeda memiliki penundaan yang berbeda: obor memiliki penundaan 1rt (1 redstone-tick), pembanding memiliki penundaan 1rt, repeater dapat memiliki penundaan 1, 2, 3, atau 4rt, tergantung pada bagaimana pengaturannya. Dalam contoh ini, repeater redstone diatur ke penundaan 4rt.

Berikutnya adalah gerbang NOT. Gerbang NOT mengambil input dan membalikkannya. Jadi dalam pengaturan ini, output akan hidup jika input mati, dan output akan mati jika input aktif.

Panjangnya 5

Gerbang OR sangat mudah dicapai di Minecraft. Dua input terhubung ke output yang sama. Hanya itu saja. Tidak ada tipuan lucu atau apa pun, itu cukup sederhana.

masukkan deskripsi gambar di sini

Panjangnya 6

Berikut ini tip untuk memadatkan "kode" Anda. Jika Anda tahu kekuatan sinyal dari dua input cukup kecil untuk tidak mengganggu output yang sesuai, Anda dapat menghubungkan kanan redstone satu sama lain. Pada contoh di bawah ini, ada timer hopper sederhana, yang mentransfer item bolak-balik dalam sekitar 0,5 detik di masing-masing hopper, yang terhubung ke komparator yang menghasilkan kekuatan sinyal 1. Ini berarti bahwa kedua ouput tidak akan saling mengganggu. Dalam contoh, lampu ada untuk tujuan demonstrasi saja dan tidak dihitung terhadap jumlah total blok.

masukkan deskripsi gambar di sini


7
Anda 13 upvotes, saya bisa melihat 10 program moar?
Rɪᴋᴇʀ

4
Tak satu pun dari program Anda yang benar-benar ditulis dalam RPL, jadi jangan lewatkan begitu saja. Ini murni "kode" Minecraft.
mbomb007

2
Anda memiliki defisit 14 program m8. Saya ingin melihat apa yang ada dalam pikiran Anda;)
Conor O'Brien

4
Anda dapat 21 pembaruan, saya bisa melihat 15 program moar?
wizzwizz4

1
Anda dapat 29 upvotes, saya bisa haz 23 program moar?
bb010g

42

TI-DASAR

[Bahasa ini bervariasi berdasarkan pada kalkulator yang digunakan, tetapi ini akan menggunakan TI-84 kecuali dinyatakan lain.]

Potongan 31 panjang

Menu("","1",A,"2",B
Lbl A
Lbl B

Ini menunjukkan penggunaan menu. Yang di atas cukup berguna, karena tidak melakukan apa-apa, tetapi mereka dapat digunakan untuk menavigasi bagian program yang berbeda. Argumen pertama adalah judul menu, diikuti oleh pasangan opsi (string ditampilkan diikuti oleh label 1- atau 2 huruf). Ini adalah contoh yang lebih intuitif:

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lbljuga dapat digunakan untuk bercabang dengan Goto. Menu memiliki beberapa batasan yang membuat mereka menjengkelkan untuk digunakan, namun: Hanya ada tujuh item menu, dan masing-masing judul dapat paling banyak empat belas karakter, sehingga semuanya cocok pada satu layar.

Potongan 29 panjang

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(diaktifkan secara default) menempatkan kalkulator dalam mode bilangan real, sehingga perhitungan yang melibatkan bilangan kompleks menimbulkan NONREAL ANSkesalahan. Ketika dimasukkan ke a+bimode, kalkulator menampilkan jawaban sebagai angka kompleks jika berlaku, jadi contoh kedua kembali 4i. re^θiMode menggunakan kutub bukan koordinat persegi panjang, sehingga menghasilkan 4e^(1.570796327i).

Potongan 23 panjang

If A≥9
Then
1→X
7→Y
End

Ini hanya persyaratan sederhana, meskipun bisa ada Elsepernyataan. Thendan Endtidak diperlukan jika hanya satu pernyataan.

Potongan 21 panjang

(-B+√(B²-4AC))/(2A)→X

Favorit semua orang, rumus kuadratik. Menyimpan solusi pertama ke persamaan kuadrat karena X, dengan asumsi a, b, dan c disimpan dalam variabel masing-masing, seperti dalam ax 2 + bx + c .

Panjangnya 20 cuplikan

Shade(|X/2|-3,5-X²,0

Ini menaungi persimpangan dari dua fungsi, dengan beberapa parameter opsional: nilai minimum dan maksimum x dan arah dan jarak antara garis peneduh.

Panjangnya 18 cuplikan

LinReg(ax+b) L1,L2

Di sini kita menghitung persamaan regresi linier, atau persamaan linear yang paling cocok dengan sekelompok poin, dengan nilai x disimpan sebagai daftar L1dan nilai y L2. Ada banyak opsi regresi lain yang tersedia, termasuk kuadrat, kubik, dan eksponensial.

Potongan 17 panjang

dbd(1.2711,1.2115

Ini menghitung jumlah hari antara dua tanggal, dalam hal ini 27 Januari 2011, hari situs ini dimulai, dan 21 Januari 2015, hari penulisan ini. (Itu 1455 hari untuk malas.) Cara untuk menyandikan tanggal agak aneh: baik DDMM.YY atau MM.DDYY, memimpin nol opsional.

Panjang cuplikan 16

For(A,0,5
Disp A

Ini menunjukkan dua bagian sisi pemrograman bahasa. Yang pertama adalah forloop khas Anda , mirip dengan for(var A=0;a<5;a++)dalam bahasa lain. (Anda juga harus menggunakan Endperintah untuk keluar dari loop.) Yang kedua adalah cukup jelas: ini ditampilkan A, dalam hal ini 5 kali karena loop.

Panjang 15 cuplikan

Y1=|X³-4|
Y2=3X

Berikut adalah dua contoh fitur kalkulator grafik yang terkenal : persamaan grafik. Anda dapat memiliki 10 persamaan yang berbeda di grafik pada bidang yang sama, dan ada banyak perintah yang berguna untuk menemukan persimpangan, maxima, nilai x , dll. Persamaan itu terlihat seperti ini ketika dibuat grafik di jendela standar:

Grafik

Panjang 14 cuplikan

[[1,2][34,5]]T

Tanda kurung digunakan untuk membuat matriks, dan Ttransposes matriks:

[[1 34]
 [2 5]]

Potongan 13 panjang

dayOfWk(9,1,6

Ini menemukan hari minggu 6 Januari, 9 Masehi. Outputnya adalah angka di mana 1 adalah hari Minggu, 2 adalah hari Senin, dan seterusnya. Tanggal khusus ini adalah hari Selasa, jadi hasilnya adalah 3.

Panjang 12 cuplikan

Circle(1,3,5

Yang pertama dari alat menggambar dasar, ini menggambar lingkaran pada grafik dengan pusat di (1,3) dan jari-jari 5.

Potongan 11 panjang

randInt(0,8

Ini menghasilkan integer acak (pseudo-) antara 0 dan 8 inklusif. Ada argumen ketiga opsional yang memberitahu berapa banyak bilangan bulat yang akan dihasilkan. Ada beberapa fungsi acak lainnya, termasuk yang untuk distribusi normal dan binomial, satu untuk matriks acak, dan satu untuk daftar yang diurutkan secara acak tanpa pengulangan. randIntdapat diunggulkan dengan menyimpan nomor sebagai rand: 2→rand.

Panjangnya 10 cuplikan

4>5 or 2≠7

Di sini kami memiliki operator kesetaraan dan logika TI-BASIC. Pernyataan ketidaksetaraan dievaluasi terlebih dahulu 0 or 1, dan ormengembalikan true jika kedua sisi benar, jadi ini akan ditampilkan 1.

Potongan 9 panjang

.656▶F◀▶D

Ini dapat mengkonversi dari desimal ke pecahan dan sebaliknya, yang sangat berguna. Ada juga fungsi khusus ▶Fracdan ▶Decyang hanya berjalan satu arah. Mencetak 82/125dalam hal ini.

Potongan 8 panjang

lcm(14,6

Ini mencetak kelipatan paling umum dari 14 dan 6, yaitu 42.

Potongan 7 panjang

getDate

Cukup jelas, hanya mencetak tanggal sistem saat ini sebagai daftar, dalam hal ini {2015 1 19}.

Potongan 6 panjang

√({4,9

Array (atau daftar) dikelilingi oleh kawat gigi dan dipisahkan oleh koma. Ini mirip dengan mapfungsi banyak bahasa, di mana ia mengulangi melalui setiap elemen daftar dan menerapkan operasi di luar kurung kurawal, dalam hal ini akar kuadrat, sehingga hasilnya {2 3}. Perhatikan bahwa tanda kurung penutup adalah opsional, sehingga akan dihilangkan mulai sekarang.

Potongan 5 panjang

4iii6

Kami punya beberapa hal keren yang terjadi di sini. Pertama, bagian nyata, 4 dan 6 dikalikan, dan kemudian bagian imajiner dikalikan:, i^3atau -i. Ini memberi berlipat ganda -24i. Ini menampilkan perkalian penjajaran yang tampak funky dan penanganan angka imajiner TI-BASIC.

Potongan 4 panjang

8°5′

Ini adalah 8 derajat, 5 arcminutes, yang dikonversi menjadi derajat 8.0333...

Potongan 3 panjang

8→T

Ini menunjukkan bagaimana angka-angka dapat disimpan sebagai variabel, yang agak tidak biasa karena angkanya lebih dulu, diikuti oleh panah toko, kemudian nama variabel. Seperti disebutkan dalam factoid, θ(theta) juga dapat digunakan sebagai variabel, dan variabel hanya bisa satu huruf besar.

Potongan 2 panjang

4M

Demikian pula dengan Mathematica, Anda dapat mengalikan dengan penjajaran, tidak *perlu. Semua variabel diinisialisasi ke 0 secara default, jadi ini akan menghasilkan 0 kecuali Anda telah menyimpan sesuatu yang lain ke variabel itu (lihat cuplikan 3).

Potongan 1 panjang

e

Ini adalah konstanta untuk nomor Euler , yang ditampilkan sebagai 2.718281828.

Faktoid

Variabel hanya dapat menyimpan tipe data tertentu. Misalnya, A- Z(dan θ) menyimpan nilai numerik, str0- str9string toko, dan [A]- [J]matriks toko (array 2 dimensi).


By the way, huruf kecil n(bukan n) juga dapat digunakan sebagai variabel.
Ypnypn

Menarik. Saya tidak pernah menggunakan variabel itu.
NinjaBearMonkey

3
Seseorang dapat berdebat tentang str0menjadi 1 karakter atau menjadi 4. Semua instruksi dalam TI-BASIC adalah 1 karakter.
Ismael Miguel

@IsmaelMiguel Saya memikirkan hal itu, tetapi mereka 1 atau 2 byte , dan saya memutuskan untuk menghitung karakter secara normal.
NinjaBearMonkey

1
Aku menghormati keputusanmu. Ini sangat membantu dalam hal ini. Saya sangat menikmati pemrograman di oldie saya TI-83. (Saya bahkan merancang program cat di dalamnya!)
Ismael Miguel

41

GNU Sed

Saya menerapkan persyaratan yang lebih ketat - semua cuplikan akan menjadi sedprogram yang lengkap .

Faktoid

sed adalah bahasa turing-lengkap. Ini buktinya.

Panjang 0 Potongan

Saya tidak berpikir potongan 0 panjang sangat diperlukan, tetapi karena itu benar-benar melakukan sesuatu dalam sed, ini dia:

Sed adalah "Stream EDitor", yaitu membaca aliran (baris-demi-baris) dari STDIN, diedit, kemudian output ke STDOUT. Program sed nol panjang hanya menyalin STDIN ke STDOUT. Dengan demikian catutilitas dapat ditiru oleh sed. Berikut ini adalah setara:

cat a.txt b.txt > c.txt

dan

sed '' a.txt b.txt > c.txt

Panjang 1 Potongan

=

Program sed ini mencetak nomor baris setiap baris ke STDOUT. Ini kira-kira setara dengan:

nl

atau

cat -n

meskipun versi sed menempatkan nomor baris pada barisnya sendiri.

Potongan 2 Panjang

5q

Menyalin STDIN ke STOUT dan qmenggunakan setelah baris 5. Ini sama dengan:

head -n5

Anda mungkin mulai melihat sedikit pola di sini - seddapat digunakan untuk meniru banyak alat-alat inti-utils standar.

Potongan 3 Panjang

iHi

inserts "Hai \ n" sebelum setiap baris. Ah.

Potongan 4 Panjang

/a/d

Banyak kekuatan sed dalam kemampuan regex-nya. Program ini menyebabkan semua lini cocok regex aakan deleted dari sungai. Semua baris lain masih akan menjadi output ke STDOUT. Ini setara dengan:

grep -v "a"

Panjang 5 Potongan

:l;bl

Ini adalah loop tanpa batas. Kita semua menyukai loop tanpa batas CPU-hogging. Tetapkan label l, lalu branches (melompat) ke sana. Ad infinitum.

Potongan 7 Panjang

s/a/A/g

Secara default, sed menerapkan sperintah sehingga hanya akan cocok dengan kemunculan pertama di setiap baris. Jika Anda membutuhkannya untuk mencocokkan (dan mengganti) setiap kemunculan pada sebuah baris, maka gflag di akhir sperintah akan melakukan ini.

Potongan 8 Panjang

y/01/10/

Perintah kecil yang digunakan ymirip dengan trutilitas shell (meskipun tidak cukup fleksibel). Program ini akan mengganti semua 0dengan 1s dan sebaliknya.

Potongan 9 Panjang

1!G;$p;h

Cuplikan ini sebenarnya 8 byte, tetapi membutuhkan parameter -n untuk mengurangi output default, sehingga sesuai aturan kode-golf standar, saya menghitung ini sebagai 9. Program ini membalikkan baris dalam aliran. Begitu:

sed -n '1!G;$p;h'

persis sama dengan:

tac

Potongan 10 Panjang

s/[ <TAB>]+$//

Ini adalah kunjungan ulang dari cuplikan 6 panjang (salah). Strip ini mengikuti spasi putih (spasi dan TAB) dari garis.


2
Lihat juga TULISAN SATU-GARIS BERMANFAAT UNTUK SED , yang pada dasarnya adalah bagaimana saya belajarsed
Adam Katz

Anda memiliki lebih banyak suara. Bisakah kita memiliki lebih banyak?
luser droog

2
Fakta dirimu 404.
Wauzl

1
Bagus, tetapi harap dicatat banyak dari ini menggunakan ekstensi GNU dan tidak standar — secara khusus panjang 3 (standar akan i\<newline>Hi<newline>), panjang 5 (standar akan sed -e :l -e blatau :l<newline>bl<newline), dan panjang 10 (yang membutuhkan +pembalikan *untuk bekerja sama sekali). Perhatikan bahwa panjang 9 snippet -n '1!G;$p;h' adalah standar, sedangkan tacyang tidak . :)
Wildcard

1
@ Kartu Memori Ya - Saya telah membatasi ini untuk GNU sed.
Digital Trauma

39

Python

( mbomb007 sudah memiliki sejumlah besar potongan Python, tapi saya pikir saya akan ikut serta dengan beberapa fakta aneh)

Faktoid

Python adalah bahasa yang diketik secara dinamis dengan penekanan pada keterbacaan.

Potongan 1 panjang

1

Dalam Python 3, di atas sama dengan Truedalam arti bahwa 1 == True(dan juga 0 == False). Perhatikan bahwa ini tidak perlu berlaku di Python 2, di mana Anda dapat mendefinisikan kembali nilaiTrue .

Potongan 2 panjang

<>

<>adalah operator perbandingan usang yang setara dengan !=. Ini masih berfungsi di Python 2 (meskipun penggunaannya tidak disarankan), dan telah dihapus sama sekali dari Python 3.

Potongan 3 panjang

...

Python memiliki sejumlah fitur yang tidak digunakan builtin, tetapi hanya ada demi perpustakaan pihak ketiga. EllipsisObjek ini adalah salah satunya, dan biasanya digunakan untuk memotong. Sebagai contoh, jika kita memiliki array numpy 3D berikut :

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

lalu a[..., 0](setara dengan a[:,:,0]) memberikan semua elemen pertama:

array([[1, 4], [7, 10]])

Dalam Python 3, ...literal dapat digunakan di luar sintaks slicing, yang secara mengejutkan memungkinkan Anda untuk menggunakannya sebagai penanda "yang harus dilakukan" sebagai pengganti passatau NotImplemented:

def f(x):
    ... # TODO

Potongan 4 panjang

(1,)

Sebuah tuple satu elemen dalam Python.

Python memiliki daftar (misalnya [1, 2, 3, 4]) yang bisa berubah, dan tupel (misalnya (1, 2, 3, 4)) yang im bisa berubah. Salah satu penggunaan yang umum untuk tuple adalah sebagai kunci kamus, karena daftar tidak dapat hashable.

Kesalahan pemula yang umum adalah meninggalkan koma di atas, yaitu (1), yang hanya nomor 1 yang dikelilingi oleh tanda kurung. Satu-elemen tuple adalah satu-satunya waktu Anda memerlukan koma sebelum parens penutup - itu menimbulkan SyntaxErrorjika Anda mencoba memasukkan satu ke dalam tuple kosong() , dan opsional untuk tupel dengan panjang minimal 2.

Potongan 5 panjang

0or x

Ada beberapa hal yang terjadi di cuplikan ini, jadi mari kita lihat!

orseperti ||dalam banyak bahasa. Dalam Python, A or Bhubungan pendek, kembali A(tanpa mengevaluasi B) jika Abenar, jika tidak kembali B. Misalnya, 1 or xselalu kembali 1, seperti 1yang selalu benar, dan bahkan berfungsi jika xtidak didefinisikan. Di sisi lain, 0 or xapakah kembali xjika xdidefinisikan, atau melempar NameErrorjika tidak.

Saat bermain golf, kita biasanya bisa menjatuhkan spasi putih antara angka dan angka or, seperti 1 or xmenjadi 1or x. Ini dimungkinkan karena 1ordimulai dengan angka, menjadikannya pengenal Python ilegal.

Namun ada satu pengecualian - 0or, yang secara misterius melempar a SyntaxError. Mengapa? Karena literal oktal dalam Python dimulai dengan 0o(misalnya 0o20 == 16), dan parser tersedak ketika mencapai r!

Catatan: Dalam Python 2, literal oktal juga dapat mulai dengan nol di depan, misalnya 020.

Potongan 6 panjang

*x,y=L

Cuplikan ini menunjukkan jenis penugasan khusus dalam Python, di mana Lada daftar, tuple, atau jenis pengalihan lainnya.

Dengan Python, Anda dapat "membuka kemasan" tupel dan daftar seperti ini:

a,b = [1,2]

Ini menetapkan 1 ke adan 2 untuk b. Sintaks ini juga digunakan untuk banyak tugas, seperti

a,b = b,a+b

yang berguna saat menulis program yang menghitung seri Fibonacci.

Jika panjang di kedua sisi tidak cocok, maka ValueErrordilemparkan. Namun, Python 3 memperkenalkan sintaks baru, diperpanjang membongkar iterable (atau lebih bahasa sehari-hari, "tugas berbintang") yang memungkinkan Anda untuk melakukan hal-hal seperti ini:

*x,y = [1, 2, 3, 4, 5]

Ini menugaskan yke elemen terakhir, 5, dan xke seluruh daftar , yaitu [1, 2, 3, 4]. Anda bahkan dapat melakukan sesuatu seperti ini:

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

yang menetapkan 1 ke a, 2 ke b, [3, 4, 5]ke c, 6 ke ddan 7 ke e.

Potongan 7 panjang

zip(*x)

zip adalah fungsi yang mengambil banyak daftar dan, yah, ritsletingnya:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

Catatan: Dalam Python 3 zipobjek dikembalikan sebagai gantinya, jadi jika Anda ingin daftar seperti di atas Anda harus membungkus panggilanlist()

Ini fungsi yang cukup nyaman jika Anda memiliki dua atau lebih daftar terkait, dan Anda ingin menautkan entri mereka masing-masing.

Sekarang katakan Anda ingin membuka ritsleting daftar - bagaimana Anda melakukannya? Kita dapat mencoba menggunakan ziplagi, tetapi sayangnya ini memberi:

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

Masalahnya adalah bahwa semuanya ada dalam satu daftar, tetapi zipmengambil daftar individual sebagai argumen fungsi yang terpisah. Untuk memperbaikinya, kami memperkenalkan *operator percikan, yang membutuhkan daftar / tuple / etc. dan membukanya sebagai argumen fungsi:

f(*[1,2]) ==> f(1, 2)

Dan hasilnya adalah:

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

Potongan 8 panjang

x='a''b'

Pertama kali saya melihat ini, saya sedikit diambil kembali - apa artinya memiliki dua string di samping satu sama lain? Jawabannya sederhana:

>>> x
'ab'

Python hanya menyatukan dua string! Ini sangat berguna untuk keterbacaan, karena memungkinkan Anda untuk memecah string panjang seperti itu (perhatikan tanda kurung di sekitarnya):

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

Potongan 9 panjang

0!=2 is 2

Anda mungkin sudah tahu bahwa Python memungkinkan rantai operator pembanding, jadi 5 < x <= 7hanya benar jika 5 < xdan x <= 7. Jika Anda tidak tahu itu ... maka kejutan!

Bagaimanapun, yang kurang diketahui adalah fakta bahwa, karena is/ is not/ in/ not injuga operator pembanding, mereka juga dapat dirantai. Dengan kata lain, kode di atas setara dengan (0 != 2) and (2 is 2), yaitu True.

Catatan: Ada beberapa kehalusan dengan 2 is 2setengah meskipun, karena iscek apakah dua hal yang sama objek , bukan apakah dua hal yang sama nilai . Python cache bilangan bulat kecil sehingga 1+1 is 2yaitu True, tapi 999+1 is 1000adalah False!

Panjangnya 10 cuplikan

x=[];x+=x,

Apa yang terjadi ketika Anda menambahkan daftar ke dirinya sendiri? Jika kami mencoba mencetak x, kami mendapatkan:

[[...]]

Untungnya, Python printcukup pintar untuk tidak meledak ketika mencoba mencetak daftar rekursif. Kita kemudian dapat melakukan banyak hal menyenangkan, seperti:

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

Fitur ini juga berfungsi dengan kamus, dan merupakan salah satu cara membuat struktur data dengan siklus, misalnya grafik.

Potongan 11 panjang

help(slice)

The helpFungsi ini sangat berguna untuk debugging di Python. Ketika dipanggil tanpa argumen di REPL, help()memulai sesi bantuan, di mana Anda dapat mencari dokumentasi untuk fungsi / tipe data / dll. Saat dipanggil dengan argumen tertentu, helpakan memberikan informasi tentang item terkait.

Misalnya, help(slice)berikan informasi berikut (terpotong karena cukup panjang):

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
 |
 | ...

Adapun slice, seperti yang kita lihat, kita dapat membuat sliceobjek untuk pengindeksan. Sebagai contoh:

>>> 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]

Fungsi lain yang berguna untuk debugging adalah dir(), yang mengembalikan semua nama dalam lingkup saat ini ketika dipanggil tanpa argumen, dan mengembalikan semua atribut dari objek yang diberikan ketika dipanggil dengan argumen.

Panjang 12 cuplikan

round(5.0/2)

Untuk apa evaluasi ini? Jawabannya tergantung pada versi Python Anda!

Dalam Python 2, pembagian antara dua bilangan bulat menghasilkan pembagian bilangan bulat (yaitu 5/2 == 2) sedangkan dalam Python 3 kita mendapatkan pembagian float (yaitu 5/2 == 2.5). Namun, ini adalah pembagian antara float dan integer, yang harus selalu menghasilkan float. Mengapa kita mendapatkan hasil yang berbeda?

Jika kita melihat dokumentasi rounduntuk kedua versi Python, kita akan menemukan jawabannya:

  • Dalam Python 2 , roundtiebreak dengan pembulatan dari 0.
  • Dalam Python 3 , roundtiebreak dengan pembulatan ke bilangan bulat terdekat bahkan .

Dengan kata lain, pembulatan 5.0/2 = 2.5ke 3dalam Python 2, tetapi 2pembulatan ke dalam Python 3. Pembulatan ke bilangan bulat terdekat bahkan mungkin terdengar aneh, tapi itu sebenarnya disebut pembulatan bankir , dan mencoba untuk memperlakukan nilai-nilai positif dan negatif sama untuk mengurangi bias.

Potongan 13 panjang

class C:__x=1

Menjadi berorientasi objek, Python memiliki kelas. Di atas adalah kelas Cyang memiliki atribut tunggal __xditetapkan ke 1.

Kita dapat mengakses atribut kelas menggunakan notasi titik. Misalnya, jika kita memiliki kelas

class MyClass(): my_attr = 42

maka pencetakan MyClass.my_attrakan menghasilkan 42, seperti yang diharapkan.

Namun, jika kita melakukan hal yang sama dan mencoba mengakses C.__xseperti yang didefinisikan di atas, kita mendapatkan:

AttributeError: type object 'C' has no attribute '__x'

Apa yang sedang terjadi? Cjelas memiliki __xatribut!

Alasannya adalah bahwa atribut dimulai dengan __mengemulasi variabel "pribadi", sesuatu yang tidak dimiliki Python . Python menguraikan nama atribut apa pun yang dimulai dengan __, menambahkan nama kelas sehingga konflik penggunaan kembali nama dihindari. Dalam contoh di atas, jika kita benar-benar bertekad untuk mengaksesnya 1, kita harus melakukannya

>>> C._C__x
1

Panjang 14 cuplikan

NotImplemented

Python tidak hanya memiliki kelas, tetapi juga memiliki kelebihan operator. Misalnya, Anda dapat memiliki kelas

class Tiny():
    def __lt__(self, other):
        return True

di mana __lt__operator kurang dari itu. Sekarang jika kita membuat contoh Tiny, kita bisa melakukan ini

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

karena kami telah menetapkan __lt__untuk selalu kembali True. Perhatikan bahwa kita juga bisa melakukannya

>>> 42 > t
True

tetapi istirahat berikut:

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

Tunggu, bagaimana cara kerjanya? Kami belum menentukan perilaku yang lebih baik daripada dengan Tiny, jadi tidak mengejutkan jika kasus terakhir rusak. Tapi bagaimana seorang int(42) tahu bahwa itu lebih besar dari Tinyobjek kita ?

Python memiliki konstanta bawaan NotImplemented, yang dapat dikembalikan dengan metode khusus perbandingan. Mari kita coba:

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

Sekarang jika kita membuat instance dari kelas baru kita:

>>> u = Unknown()

Kita bisa melakukan ini:

>>> t < u
True
>>> u > t
Called me first!
True

Seperti yang dapat kita lihat, yang terjadi u > tadalah bahwa Python mencoba memanggil metode yang lebih besar daripada yang Unknownpertama, menemukan bahwa itu tidak diimplementasikan, dan Tinysebagai gantinya mencoba metode yang kurang dari untuk kelas lain ( )!

Panjang 15 cuplikan

x=[],;x[0]+=[1]

Ini sedikit yang menyenangkan. Pertama kita menetapkan xuntuk menjadi [],daftar kosong di dalam tuple, yaitu ([],). Kemudian kita lakukan x[0]+=[1]yang mencoba memperluas daftar kosong di dalam oleh daftar kedua [1].

Sekarang, ingat bahwa daftar yang bisa berubah dan tupel adalah im bisa berubah - apa yang terjadi ketika Anda mencoba untuk mengubah benda bisa berubah dalam sebuah objek abadi?

>>> 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 jadi itu memberikan kesalahan, saya kira itu yang diharapkan. Tetapi bagaimana jika kita mencoba mencetak x?

>>> x
([1],)

Hah? Daftarnya berubah!

Jika Anda ingin tahu tentang apa yang terjadi di sini, pastikan untuk memeriksa posting blog ini .

Panjang cuplikan 16

@lru_cache(None)

Cukup tambahkan cache! Ini adalah contoh sederhana dekorator yang tersedia di Python 3.

Misalkan kita memiliki implementasi Fibonacci naif berikut:

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Seperti yang bisa disampaikan oleh sebagian besar pengantar kursus pemrograman kepada Anda, ini adalah cara yang sangat buruk untuk mengimplementasikan Fibonacci, yang mengarah ke runtime eksponensial karena kami secara efektif hanya menambahkan banyak 1 pada kasus dasar. f(10)? Berjalan dalam sepersekian detik. f(32)? Butuh beberapa saat, tetapi sampai di sana. f(100)? Nggak.

Tetapi jika kita menyimpan hasilnya, banyak hal akan menjadi lebih cepat. Kami selalu dapat menggunakan kamus untuk cache, tetapi mari kita coba yang lain sebagai gantinya:

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Seperti yang bisa kita lihat, semua yang saya lakukan adalah mengimpor lru_cachedari functoolsmodul dan menambahkan @lru_cache(None)sebelum fungsi saya. @menunjukkan dekorator yang membungkus suatu fungsi, dalam hal ini untuk memoisasi. lru_cacheArgumen pertama adalah maxsize, ukuran maksimum cache - di sini kami mengaturnya Noneuntuk menunjukkan tidak ada ukuran maksimum.

Sekarang jika kita mencoba menggunakannya:

>>> f(100)
573147844013817084101

Dan bahkan tidak butuh waktu sedetik pun!

Catatan: f(1000)mengarah ke kesalahan kedalaman rekursi, tapi itu cerita lain kali


Berapa kisaran bilangan bulat kecil yang ditangkap oleh Python untuk isoperator?
mbomb007

@ mbomb007 Dari pertanyaan ini , tampaknya menjadi -5 hingga 256. Anda dapat mencoba -5-1 is -6dan 255+2 is 257menguji.
Sp3000

37

Mencatat

Factoid: Saya dapat mendefinisikan Jot dengan 2 upvote, dan membuktikan bahwa itu Turing lengkap dengan 8 (tidak menggunakan panjang 4, 6, atau 7).

Panjang 1

1

Ini adalah contoh dari dua fungsi di Jot. Yang pertama adalah string kosong, yang mengevaluasi fungsi identitas. Yang kedua adalah 1, yang merupakan operator pengelompokan Jot. 1mengevaluasi ke λxy.[F](xy)( notasi kalkulus lambda ), di mana [F]program sebelum 1(di sini, string kosong). Jadi, program ini adalah fungsi λxy.(λz.z)(xy)yang disederhanakan λxy.xy.

Panjangnya 2

10

Sekarang kami memperkenalkan simbol lainnya di Jot: 0. Sekali lagi jika [F]mewakili nilai dari program sejauh ini, 0dievaluasi ke [F]SK, di mana Sdan Kdari logika kombinatorik . Saya telah mendefinisikan seluruh bahasa sekarang.

Panjangnya 5

11100

Saya sekarang akan membuktikan bahwa Jot adalah Turing lengkap dengan mendefinisikan pemetaan dari logika kombinasinya ke Jot. Program Jot ini adalah K combinator .

Panjangnya 8

11111000

Ini adalah kombinasi S.

Panjangnya 3

1AB

Di sini, Adan Bbukan bagian dari Jot, melainkan pengganti untuk ekspresi sewenang-wenang. Ekspresi ABdalam peta logika kombinatori 1ABdalam Jot, dengan Adan Bsecara rekursif diubah oleh tiga aturan ini. QED

Panjang N

1
10
11
100
101
110
[...]

Setiap bilangan alami, dinyatakan dalam biner, adalah program Jot yang valid. Karenanya, saya secara algoritmik dapat menghasilkan lebih banyak cuplikan dengan panjang sewenang-wenang. Diberi cukup upvotes, saya bisa memecahkan masalah yang terputus - putus .


2
Dua upvotes diberikan. Sekarang tentukan bahasanya.
John Dvorak

@JanDvorak mengerjakannya ... sudah begitu lama sejak saya meneliti hal ini sehingga saya lupa semuanya :)
Phil Frost

1
Saya tidak mengerti mengapa ini harus terus mendapatkan lebih banyak suara. Anda hanya akan menghasilkan angka biner acak dengan panjang yang meningkat: |
Pengoptimal

1
Anda mengatakan demikian untuk nomor upvote 4. Tetapi di sini kita melihat "nomor acak yang baru saja Anda hasilkan"
Pengoptimal

1
bagaimana Anda bisa memecahkan masalah penghentian? Saya kira itu ada hubungannya dengan menggunakan program infinite (jumlah tak terbatas)?
Filip Haglund

37

Pesta

Faktoid:

Bug ShellShock yang sangat serius ada di Bash sejak 1989, dan tetap belum ditemukan selama seperempat abad. Sebagian besar kegembiraan menulis Bash datang dengan berbagai keanehan dan inkonsistensi.

Potongan 1 panjang:

[

Alias ​​untuk testbuiltin, yang memungkinkan kode format if [ a == b ]; then- pada kenyataannya [adalah perintah mandiri, bukan elemen sintaksis, dan ]murni dekoratif (walaupun diperlukan oleh [, persyaratannya arbitrer dan Anda dapat menghapusnya dengan menggunakan alias [=test).

Potongan 2 panjang:

||

Seperti logis ordalam kebanyakan bahasa, tetapi untuk proses. Akan menjalankan perintah setelah ||hanya jika perintah sebelum mengembalikan non-nol.

Potongan 3 panjang:

x=y

Tugas. Bagus dan dapat diprediksi ... tetapi tidak seperti kebanyakan bahasa lain, ruang tambahan tidak diperbolehkan. Yang agak lucu karena Anda dapat menempel ruang ekstra di mana-mana antara hal-hal di bash, hanya saja tidak di sekitar =.

Potongan 4 panjang:

$IFS

Pemisah Bidang Internal - variabel ini memengaruhi bagaimana Bash membagi data untuk banyak tindakan bawaan, seperti iterasi untuk loop dan populating array dari string. Jika digunakan dengan benar, itu bisa sangat kuat; tetapi lebih sering penyebab bug halus dan tak terduga.

Potongan 5 panjang:

${x^}

Ganti string dalam x, tetapi dengan karakter pertama dikapitalisasi! Fitur yang sering digunakan sehingga memiliki sintaks bahasa tersendiri.

Potongan 6 panjang:

x=($y)

Isi array, x, dari string atau daftar elemen y, pisahkan pada apa pun IFS saat ini diatur ke - secara default, spasi. Fitur yang sangat berguna untuk pemrograman bash tingkat lanjut.

Potongan 7 panjang:

${x[y]}

Array! Tapi tunggu, apa itu ... y adalah string, bukan indeks numerik? Ya memang, Bash mendukung array asosiatif! Banyak orang tidak tahu ini. Anda hanya perlu declare -A xterlebih dahulu.

Potongan 8 panjang:

${x##*,}

Pengganti x, semuanya hingga ,karakter terakhir (atau apa pun yang Anda tentukan). Berguna untuk mendapatkan bidang terakhir dari csv - ini adalah sesuatu yang tidak dapat Anda lakukan dengan mudah cut, yang hanya menghitung bidang dari kiri. % dan %% memungkinkan hal yang sama memotong dari kanan; % dan # dipilih untuk lokasinya di papan ketik AS sehingga akan menjadi jelas mana yang berarti kiri dan mana yang benar, tetapi itu tidak memiliki banyak nilai bagi semua orang yang tidak menggunakan papan ketik AS :)

Potongan 9 panjang:

[ a = b ]

Dalam sebagian besar bahasa lain, satu yang sama dengan operasi perbandingan akan menghasilkan perilaku yang tidak diinginkan dalam bentuk penugasan. Tapi tidak di Bash. Hanya saja, jangan menghilangkan salah satu ruang, apa pun yang Anda lakukan!

Panjang 10 cuplikan:

if [ a=b ]

Inilah yang terjadi jika Anda lupa tentang ruang wajib. Tidak akan melempar kesalahan. Akan selalu mengembalikan true - bahkan jika adan bmerupakan variabel yang tidak disetel, atau apa pun yang mereka setel, tidak masalah - itu akan selalu kembali benar. Pikirkan kode suka if [ "$password"="$correctpass" ]melihat potensi kesenangan dari "fitur" ini.

Potongan 11 panjang:

x=${y//a/b}

Penggantian substring gaya regex! Set x ke nilai y tetapi dengan setiap instance dari diganti dengan b.

Potongan 12 panjang:

[[:upper:]]*

Pola pencocokan - Anda tidak terbatas hanya menggunakan * wildcard di shell, Anda dapat menggunakan POSIX pertandingan standar seperti alnum, alpha, digitdll

Potongan 13 panjang:

function x(){

Sedikit sintaks C telah secara misterius merangkak masuk! Salah satu dari banyak kegunaan yang sangat berbeda untuk kurung kurawal, dan contoh lain elemen dekoratif opsional untuk membuat Bash lebih mirip bahasa lain - baik ()atau functiondapat dihilangkan di sini (tetapi tidak keduanya). Juga lebih menyenangkan dengan ruang yang tidak konsisten - ruang setelah {wajib, tetapi tidak sebelum penutupan }, seperti padafunction x { y;}

Potongan 14 panjang:

echo {Z..A..3}

Namun penggunaan lain yang sama sekali tidak terkait kawat gigi keriting. Perluas rentang dengan langkah yang ditentukan. Dalam hal ini, akan menghasilkan setiap huruf ke-3 dari Z hingga A. Berguna untuk menghasilkan urutan tanpa menggunakan seq, tetapi tidak dapat digunakan dengan variabel, sehingga memiliki fungsi terbatas.

Panjang 15 cuplikan:

echo {a,b,c,d}x

Penggunaan lain yang serupa tetapi tidak identik untuk kurung kurawal dalam pembuatan urutan; mencetak ax bx cx dx, dan berguna untuk menghasilkan daftar string dari urutan atau daftar dalam satu perintah. Namun lagi, terbatas kegunaannya karena tidak dapat digunakan dengan variabel di dalam kawat gigi.


Sebenarnya ]tidak murni dekoratif. [akan menolak berfungsi jika argumen terakhirnya tidak ].
FUZxxl

Ya, tetapi tidak ada gunanya selain kosmetik; dan jika Anda mengganti [dengan bentuk lainnya test, maka ]dapat dihilangkan tanpa mengubah apa pun dalam panggilan - Saya hanya membuat titik bahwa itu bukan sintaks bash sebenarnya, hanya gula visual.
Kerusuhan

Anda benar karena ini bukan sintaks bash, tetapi trailingnya ]adalah [sintaks dan Anda harus memberikannya sama seperti bagaimana Anda harus mengakhiri pernyataan dalam C dengan tanda titik koma.
FUZxxl

Memang benar bahwa itu wajib, tetapi tidak sama sekali dengan cara yang sama dengan titik koma C. Persyaratan untuk itu sepenuhnya arbitrer, seperti yang terlihat jika Anda hanya alias [=testkemudian menulis if [ 1 = 1; thendll. Tapi saya akan mengklarifikasi kata-kata saya untuk memperhitungkan poin Anda :)
Riot

1
Mengenai function x(){sintaksis: Anda dapat menjatuhkan parens, seperti yang Anda katakan, tetapi Anda juga bisa langsung menjatuhkan functionbagian. Bahkan, begitulah shell POSIX mendefinisikan fungsi, jadi lebih portabel seperti itu. Anda bisa mendefinisikan fungsi penuh dalam 13 karakter. Misalnya:x(){ startx;}
kojiro

37

APL

Faktoid

APL ( A P rogramming L language ) dimulai sebagai penerjemah untuk notasi rumus yang dibuat oleh Ken Iverson . Ketika bahasa itu dirancang, orang menggunakan teletypwriter untuk berkomunikasi dengan komputer. Rangkaian karakter ini terbatas, tetapi karena konstruksinya, seseorang dapat menempatkan beberapa karakter pada posisi yang sama untuk menyusun karakter kompleks. Fitur ini banyak digunakan oleh APL, berkontribusi pada reputasi terkenalnya sebagai bahasa hanya-baca.

Anda dapat mencoba sebagian besar contoh di http://www.tryapl.org .

Panjang 1

Karakter , yang disebut kap lampu, baik untuk bentuknya maupun untuk pencerahan yang Anda dapatkan dari kehadirannya, memperkenalkan komentar. Secara historis, itu dibuat dengan overstriking a (jot) dan (sepatu).

Panjangnya 2

⍳3

Fungsi monadic (satu argumen) (iota) menghasilkan vektor dari beberapa bilangan asli pertama. Misalnya, yang disebutkan di atas ⍳3akan menghasilkan 1 2 3, vektor dari tiga bilangan alami pertama. Pada beberapa implementasi APL, itu akan menghasilkan 0 1 2sebaliknya, ini tergantung pada nilai ⎕IO, i ota o rigin.

Panjangnya 3

5\3

Berbeda dengan monadik , fungsi diad \(memperluas) menyalin argumen di sebelah kanan sesering argumen di sebelah kiri; dengan demikian, 5\3hasil 3 3 3 3 3. Anda mungkin ingin bermain-main dengan argumen vektor (seperti 1 2 3\4 5 6) untuk melihat apa fungsinya.

Panjangnya 4

A←⍳3

Ini memberikan Anilai dari ⍳3. (panah kiri) adalah operator penugasan. Tugas tidak harus menjadi hal paling kiri dalam pernyataan; tugas diuraikan seperti panggilan fungsi dan menghasilkan nilai yang ditetapkan untuk penggunaan lebih lanjut.

Panjangnya 5

∘.×⍨A

Tabel perkalian tiga demi tiga, yaitu,

1 2 3
2 4 6
3 6 9

Ini agak rumit, jadi izinkan saya menjelaskannya. ⍺∘.f⍵(baca: alpha iota dot f omega) adalah produk luar dari dan lebih f. Produk luar adalah tabel hasil penerapan funtuk setiap pasangan elemen yang mungkin dari dan . Dalam contoh ini, fis ×(multiply), menghasilkan tabel perkalian. Operator (tilde Diaresis) kemacetan argumen, yaitu, ⍺f⍨⍵sama dengan ⍺f⍵dan f⍨⍵tanpa operan kiri adalah sama dengan ⍵f⍵. Tanpa operator bolak-balik, potongan ini akan menjadi a∘.×a. Operator produk luar sangat fleksibel; memeriksa apa yang terjadi jika Anda mengganti =untuk ×!

Panjangnya 6

{×/⍳⍵}

Fungsi faktorial. Sepasang kurung kurawal membungkus dfn (fungsi dinamis), yaitu fungsi anonim (lih. Ekspresi lambda). Argumen ke dfn terikat ke variabel dan atau hanya jika dfn disebut sebagai fungsi monadik (argumen tunggal, sebagai lawan dari dyadic, dua argumen). Kami menerapkan argumen yang benar, menghasilkan bilangan bulat dari 1hingga . Operator /(garis miring) mengurangi, yaitu f/⍵menyisipkan di fantara item dari . Misalnya +/⍳5saja 1+2+3+4+5. Dalam hal ini, kami mengurangi dengan ×, menghasilkan produk dari item ⍳⍵, yang hanya merupakan faktorial dari .

Panjangnya 7

2×3*4+5

Hasil 39366. ⍺*⍵(alpha star omega) dinaikkan ke kekuatan . APL memiliki aturan presedensi yang sangat sederhana: Semuanya dievaluasi dari kanan ke kiri, semua fungsi asosiatif-kanan. Operator mengikat lebih kuat dari fungsi dan dievaluasi dari kiri ke kanan. Dengan demikian, ungkapan di atas dengan tanda kurung eksplisit akan ditulis 2×(3*(4+5))sebagai kebalikan dari yang biasa (2×(3*4))+5.

Panjangnya 8

¯1+3 3⍴A

Cuplikan ini menghasilkan

0 1 2
3 4 5
6 7 8

dan menunjukkan dua konsep penting: Konsep pertama adalah fungsi (rho), yang membentuk kembali argumen kanannya ke bentuk yang ditentukan dalam argumen kirinya. Bentuk array adalah vektor dari panjang setiap sumbu dalam array. Bentuk skalar adalah vektor kosong. Jadi, 3 3⍴Amembentuk kembali Amenjadi matriks tiga kali tiga. Konsep kedua adalah bagaimana penambahan digunakan di sini: Kami menambahkan ¯1(overbar satu), yang berarti negatif ( ¯adalah awalan untuk menentukan angka negatif, sementara -adalah operator) ke array. Dua operan memiliki bentuk yang berbeda, sehingga operan dengan bentuk yang lebih kecil didistribusikan ke operan lainnya, mengurangi satu dari setiap item dalam matriks yang dihasilkan.

Panjangnya 9

+.×⍨3 3⍴A

A, dibentuk kembali menjadi 3 oleh 3 matriks, dikalikan dengan dirinya sendiri. Operator .(titik) mengambil dua fungsi dan membangun produk dalam , di mana fungsi pertama mewakili penambahan dan penggandaan fungsi kedua . Penggandaan matriks yang polos, lama, adalah +.×, varian yang umum adalah ≠.∧(di mana tidak sama dan (up caret) adalah logis dan) untuk matriks boolean; banyak hal menarik yang dapat dimodelkan sebagai produk dalam dengan operator tertentu menggantikan +dan ×.

Panjangnya 10

(.5×⊢+÷)⍣≡

(Baca: tanda kurung kiri dot lima, gandakan -tak kanan ditambah bagilah kurung kanan star-diæresis sama) Hitung akar kuadrat dari nyata menggunakan metode Babel . Argumen kiri adalah angka yang ingin Anda hitung dari akar kuadrat, argumen yang tepat adalah tebakan awal untuk akar kuadrat. Saya awalnya ingin memberikan tebakan awal yang berarti, tetapi saya kehabisan karakter (tambahkan untuk menggunakan nomor itu sendiri sebagai tebakan awal).

Jadi bagaimana cara kerjanya? Mari kita mulai dengan bagian kiri (.5×⊢+÷),, pertama. Ungkapan ini menggunakan notasi diam-diam yang berasal dari J yang kemudian diangkut kembali ke Dyalog APL. Notasi diam-diam agak sulit untuk pemula, jadi silakan baca bagian ini dengan seksama. Urutan terisolasi, seperti +/÷≢, yang aturan parsing "normal" tidak menyelesaikan ke satu bagian pidato disebut kereta. Kereta dua atau tiga fungsi menghasilkan fungsi dan (dengan resolusi berulang), kereta fungsi dengan panjang berapa pun juga menghasilkan fungsi. Kereta tiga fungsi fghberperilaku seperti {(⍺f⍵)g⍺h⍵}, yaitu, fdan hditerapkan pada argumen fungsi yang dihasilkan dan hasil dari ini diterapkan g. Kereta array dan dua fungsi sukaAfgberperilaku seperti {Af⍺g⍵}, ini,gditerapkan pada argumen fungsi yang dihasilkan dan Adan hasil yang diterapkan f. Kereta dua fungsi memiliki semantik juga, yang dijelaskan dalam dokumentasi tetapi tidak digunakan dalam contoh ini.

Dalam kereta khusus ini, satu fungsi baru, (taktik kanan) digunakan. Itu berperilaku seperti {⍵}, menghasilkan argumen yang benar. Dengan demikian, seluruh ekspresi sama dengan {.5×⍵+⍺÷⍵}, yang hanya merupakan langkah iterasi dari rumus Babel. Sangat mudah untuk melihat bagaimana notasi diam-diam menguntungkan pegolf; ini memungkinkan Anda untuk mencukur beberapa karakter yang berharga di mana berlaku.

Bagian terakhir dari teka-teki adalah (star diæresis), operator listrik . Jika argumen yang tepat adalah array, f⍣A⍵berlaku funtuk total Akali. Misalnya, f⍣3⍵sama dengan fff⍵. Hitungannya bisa negatif, dalam hal ini APL mencoba menyimpulkan fungsi terbalik fdan menerapkannya. Jika argumen yang tepat untuk adalah fungsi, juga, f⍣g⍵berlaku funtuk sampai (fY)gYdi mana Ymerupakan hasil dari penerapan berulang funtuk . Terutama, jika gini =(sama) atau (sama), f⍣≡menghitung suatu titik fix darif. Inilah tepatnya yang kita butuhkan untuk metode Babel! Kami ingin mengulang sampai hasilnya bertemu. Terakhir, jika diterapkan pada sepasang hal dipanggil sebagai fungsi diadik, argumen kiri terikat ke fkiri, yaitu ⍺f⍣g⍵sama dengan di (⍺∘f)⍣g⍵mana A∘fberperilaku seperti {Af⍵}.


Anda mendapat lebih banyak suara! Bisakah kita memiliki lebih banyak?
luser droog

@luserdroog Tentu, izinkan saya memikirkan lebih banyak lagi.
FUZxxl

Bolehkah saya mengedit dan memperpanjang ini?
Adám

@ Adám Ya, silakan.
FUZxxl

∘.×⍨a memberi saya kesalahan nilai . Apakah saya menggunakannya dengan benar?
Cyoce

37

Matlab

Cuplikan 26 - beralih di atas matriks

Ini adalah sesuatu yang baru saya temukan. Biasanya Anda beralih pada vektor yang diberikan untuk loop. Tetapi alih-alih vektor, Anda juga dapat menggunakan matriks ( rand(10)menghasilkan matriks 10x10 dengan angka yang terdistribusi secara seragam antara 0 dan 1).

for k=rand(10);disp(k);end

Ini kemudian menampilkan satu vektor kolom dari matriks acak per iterasi.

Cuplikan 25 - plot mudah

Kita tahu memplot itu mudah di matlab, tapi ada fungsi yang super mudah ezplot( E-Zmengerti? Butuh waktu cukup lama sampai akhirnya saya dapatkan, karena saya dieja Zselalu sebagai sedganti c, apa pun ...) Semua orang suka kurva elips:

ezplot('y^2-x^3+9*x-10.3')

kurva elips

Cuplikan 24 - integrasi

Kata kuno (tetapi masih digunakan dalam perhitungan numerik) untuk integrasi adalah 'quadrature', dapatkah Anda menebak apa hasil dari yang berikut ini?

quad(@(x)4./(1+x.^2),0,1)

Cuplikan 23 - gambar

Tentu saja Matlab juga sangat populer di kalangan ilmuwan yang harus bekerja dengan gambar (misalnya analisis citra medis), jadi di sini adalah fungsi yang sangat berguna. Argumen pertama adalah gambar, sudut kedua dan argumen opsional ketiga di sini memberitahu fungsi untuk memotongnya ke ukuran asli.

imrotate(rand(99),9,'c')

sini

Cuplikan 22 - musik

load handel;sound(y,Fs)

Akan terdengar seperti ini (tautan youtube)

Cuplikan 21 - bedakan & integrasikan

polyint(polyder(p),c)

Anda dapat dengan mudah membedakan dan mengintegrasikan polinomial dengan menggunakan kedua fungsi tersebut. Saat mengintegrasikan, Anda bisa memberikan argumen kedua yang akan menjadi konstanta.

Cuplikan 20 - kembali ke polinomial

p=poly(r);cp=poly(A)

Ingin polinomial dengan akar r? Mudah:p=poly(r) . Ingin polinomial karakteristik dari matriks A? Mudah: cp=poly(A). Demikian roots(p)juga r(atau permutasi r).

Cuplikan 19 - trik sulap lainnya

fminsearch(fun,x0);

Ada orang yang sangat menyukai fungsi ini. Ini pada dasarnya hanya mencari minimumfun dengan nilai awal x0(dapat berupa vektor) tanpa kondisi apa pun fun. Ini bagus untuk memasang model kecil di mana Anda tidak dapat (atau Anda terlalu malas) untuk membedakan fungsi error / penalti / objektif. Ini menggunakan algoritma simpleks Nelder-Mead yang cukup cepat untuk fungsi di mana Anda tidak dapat membuat asumsi.

Cuplikan 18 - intro ke polinomial

p=polyfit(x,y,deg)

Matlab memiliki solusi yang bagus untuk mengatasi polinomial. Dengan polyfitAnda mendapatkan polinomial kuadrat terkecil dari derajat degyang mendekati titik di x,y. Anda mendapatkan vektor pyang menyimpan koefisien polinomial, karena itulah satu-satunya yang Anda perlukan untuk merepresentasikan polinomial. Jika Anda kembali ke cuplikan 15, Anda dapat melakukan hal yang sama dengan menulisc = polyfit(x,y,2) . Jadi mis [1,-2,3]mewakili polinomial x^2 - 2*x+3. Tentu saja ada juga fungsi untuk pemasangan fungsi elementer, atau arbitrer lainnya.

Cuplikan 17 - sudut dan diskontinuitas

unwrap(angle(c))

Jika Anda ingin mendapatkan argumen vektor bilangan kompleks 'berkelanjutan', Anda sering mendapatkan kembali nilai yang tampaknya memiliki diskontinuitas. Misalnya angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])akan membuat Anda [-2.94,-3.04,3.14,3.04,2.94]karena anglehanya mengembalikan sudut antara -pidan pi. Fungsi unwrapakan menangani ini! Jika Anda mendapatkan diskontinuitas seperti ini, itu hanya akan menambahkan kelipatan 2*piuntuk menghapusnya: '[-2,94, -3,04, -3,14, -3,24, -3,34]' Ini bahkan bekerja untuk matriks 2d! Jika Anda hanya memplot argumen bilangan kompleks dengan bagian real negatif Anda mendapatkan grafik pertama Anda akan mendapatkan gambar pertama, dengan membuka bungkusan Anda mendapatkan yang kedua:

tanpa membuka bungkus dengan membuka bungkus

[x,y] = meshgrid(-1:0.01:0,-0.5:0.01:0.5);
z = x+i*y;
imagesc(angle(z))
imagesc(unwrap(angle(z)))

Cuplikan 16 - produk skalar

[1;2;3]'*[4;5;6]

Tentu saja ada metode yang dibangun (seperti dot), tetapi dengan operator transformasi-matriks 'itu sesederhana itu. Jika Anda tidak tahu apakah Anda memiliki vektor baris atau kolom, Anda bisa menggunakannyaa(:)'*b(:) mana a(:)selalu mengembalikan vektor kolom.

Cuplikan 15 - kuadrat terkecil linier, metode jelek dengan tongkat sihir

[x.^2,x,x.^0]\y

xadalah vektor (kolom) dengan nilai pada sumbu x, ynilai y berisik. Ketik c=[x.^2,x,x.^0]\ydan Anda mendapatkan koefisien polinomial tingkat 2. Tentu saja Anda dapat menggunakan salah satu dari milyar fungsi bawaan matlab (betapa membosankan) mengapa tidak menggunakan tongkat ajaib? =)

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

Cuplikan 14 - grafik

gplot(graph,x)

Begitulah cara menggambar grafik. graphharus mengandung matriks adjacency kuadrat dan xharus berupa matriks nx2 yang berisi koordinat setiap node. Mari kita buat grafik acak: graph = triu( rand(8)>.7)(buat Matriks yang berisi 0s dan 1s, dapatkan hanya segitiga atas untuk grafik yang menarik). x = rand(8,2)kemudian plot dengan beberapa gaya mewahgplot(graph,x,'k-.d')

grafik (Saya menyatakan ini sebagai seni modern.)

Cuplikan 13 - meshgrid

meshgrid(a,b)

Ini adalah salah satu fungsi yang paling menakjubkan, sederhana namun bermanfaat. Jika Anda ingin memplot fungsi bernilai nyata bergantung pada dua variabel, Anda bisa mendefinisikan vektor nilai untuk sumbu x dan satu untuk sumbu y (a dan b). Kemudian dengan meshgrid, Anda dapat membuat dua matriks ukuran len (a) x len (b) di mana satu hanya memiliki vektor asebagai kolom, dan yang lainnya hanya memiliki kolom yang hanya memiliki vektorb sebagai baris. Contoh penggunaan: a = -3:0.2:3;[x,y]=meshgrid(a)(jika kedua vektor sama, cukup hanya melewatkan satu.) Kemudian Anda bisa mengetikz=x.^2+-y.^2 dan misalnyamesh(x,y,z). Ini berfungsi untuk sejumlah dimensi yang berubah-ubah! Jadi ini tidak hanya bagus untuk merencanakan, tetapi juga untuk mendapatkan semua kemungkinan kombinasi vektor yang berbeda dll ... (Jadi, jika Anda ingin membuat bahasa golf kode baru, ini harus ada di sana, pastikan Anda menggunakan yang lebih pendek nama fungsi ...)

jala

Cuplikan 12 - merencanakan

plot(x,x.^2)

Ambil vektor x=-3:0.5:3dan biarkan plotsisanya. Ada banyak lagi fungsi untuk memplot ini hanya yang sangat mendasar yang dapat Anda gunakan sepanjang waktu. Itu sudah cukup untuk menulis plot(v)dan data di vakan diplot terhadap indeks array. Seberapa sederhana itu? Jika Anda ingin mendesain plot Anda, tambahkan saja string sebagai argumen ketiga: mis. 'r:o'Akan membuat garis merah bertitik dengan lingkaran di sekitar titik data. Jika Anda ingin banyak plot, cukup tambahkan lebih banyak argumen, atau gunakan matriks, bukan vektor. Sangat mudah.merencanakan

Cuplikan 11 - gagang fungsi

f=@(x,y)x+y

Ini adalah contoh dari pegangan fungsi yang disimpan di f. Sekarang Anda bisa menelepon f(1,2)dan mendapatkan 3. Pegangan fungsi di matlab sangat berguna untuk fungsi matematika (misalnya merencanakan) dan Anda dapat mendefinisikannya dalam satu baris. Tetapi satu kelemahannya adalah Anda tidak dapat memiliki conditional atau piecewise (dan karenanya tidak ada rekursi). Jika Anda menginginkan ini, Anda harus menggunakan functionpernyataan dan mendeklarasikan fungsi baru, dan masing-masing harus disimpan dalam file terpisah ... (WHYYYYYY ????)

PS: Anda akan mendapatkan telur easter lucu lagi jika Anda mengetik whydi konsol: Mereka membuat fungsi besar yang menghasilkan pesan acak seperti:

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.

... yang sangat menghibur jika Anda cukup putus asa untuk meminta konsol why...

Cuplikan 10 - Bagaimana tampilan matriks saya?

spy(eye(9))

Seperti yang Anda ketahui sekarang eye(9)membuat matriks identitas 9x9. spyhanya menciptakan yang menunjukkan entri nol / bukan nol dari matriks. Tetapi Anda juga dapat menggunakannya untuk menampilkan data 2d biner. Jika Anda menelepon spytanpa argumen, Anda akan mendapatkan telur paskah kecil yang menyenangkan =)

memata-matai identitas memata-matai Easteregg

Cuplikan 9

kron(a,b)

The kronFungsi mengevaluasi produk Kronecker dari dua matriks. Ini sangat berguna untuk operator linear multidimensi yang diskritisiasi. Saya juga menggunakannya setiap sekarang dan kemudian untuk kode golf. Anda ingin semua produk yang mungkin dari entri adan b? kron(a,b), ini dia.

Cuplikan 8

5*a\b.*b

Ok di sini saya mencampur 3 operator yang berbeda. Anda dapat mengalikan matriks apa pun dengan skalar hanya dengan menggunakan *. (Kemudian setiap entri dari matriks dikalikan dengan skalar itu). Tetapi *juga melakukan perkalian matriks. Jika Anda menambahkan satu titik Anda mendapatkan .*operator, yang satu ini mengalikan dua matriks dengan ukuran yang sama tetapi masuk bijaksana . (Ini juga dapat dilakukan dengan operator divisi seperti /dan \.)

Selanjutnya, operator backslash dapat digunakan sebagai pembagian kiri (berbeda dengan /yang melakukan pembagian kanan seperti yang biasa Anda lakukan) tetapi juga operator matlab yang paling kuat dan berkarakter: Ia menjalankan 'pembagian matriks'. Katakanlah Anda memiliki sistem persamaan linear A*x=bdan Anda ingin menyelesaikannya x, maka Anda cukup mengetik x=A\b. Dan \(Anda juga dapat menggunakan /tetapi itu kurang umum untuk matriks) pertama-tama dengan cepat menganalisis matriks, dan menggunakan hasilnya untuk menemukan algoritma tercepat untuk melakukan inversi-perkalian ini! (Lihat misalnya di sini )

Tetapi Anda juga dapat menggunakannya untuk sistem di bawah atau lebih yang didefinisikan (di mana tidak ada invers atau di mana matriks bahkan tidak persegi, misalnya untuk metode kuadrat terkecil). Ini benar-benar tongkat sihir matlab.

Cuplikan 7

[a,b;c]

Ok itu tidak terlihat seperti banyak, tetapi ini adalah alat yang sangat nyaman: Matrix concatenation. Tanda koma di antara dua ekspresi berarti mereka digabungkan secara horizontal (itu berarti mereka harus memiliki ketinggian yang sama) dan tanda titik koma berarti 'garis' sebelumnya akan berada di atas 'garis' berikutnya (dengan garis yang saya maksudkan semuanya antara dua titik koma. Contoh sederhana: a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];akan menghasilkan sama ddengan d=[1,2,5; 3,5,6; 7,8,9]. (Get it?)

Dipotong 6

eye(7)

Fungsi ini menghasilkan matriks identitas 7x7 penuh. Sangat mudah. Ada fungsi lain seperti nan,inf,ones,zeros,rand,randi,randnitu yang bekerja dengan cara yang sama. (Jika Anda melewati dua argumen, Anda dapat mengatur tinggi / lebar dari matriks yang dihasilkan.) Seperti yang akan saya tunjukkan nanti, Anda dapat dengan mudah membuat dan (dengan cara yang sangat visual) menggabungkan matriks (2d-array) yang sangat berguna dan mudah jika Anda harus menyelesaikan persamaan diferensial parsial secara numerik. (Ketika Anda memecahkan PDE, pendekatan umum adalah discretisizig operator turunan, pada dasarnya Anda hanya akan mendapatkan sistem besar persamaan linier yang perlu diselesaikan. Matriks ini biasanya jarang (hanya sedikit elemen bukan nol) dan memiliki beberapa jenis simetri. Itulah sebabnya Anda dapat dengan mudah 'menyusun' matriks yang Anda butuhkan.

Cuplikan 5

a(a>0.5)

Saya harap Anda tidak bosan dengan semua cara mengakses array. Ini menunjukkan cara mudah untuk mendapatkan semua elemen dari array yang memenuhi beberapa persyaratan. Dalam hal ini Anda mendapatkan vektor semua elemen ayang lebih besar dari 0,5. Ekspresi a>0.5hanya mengembalikan matriks dengan ukuran yang sama adengan yang untuk setiap elemen yang memenuhi kondisi dan 0untuk setiap elemen yang tidak.

Cuplikan 4

a(:)

Ini lagi hanya mengembalikan konten asebagai vektor kolom (matriks nx1). Ini bagus jika Anda tidak tahu apakah Anda menyimpan data Anda sebagai vektor kolom atau baris, atau apakah data Anda dua dimensi (misalnya untuk metode perbedaan hingga 2d).

Cuplikan 3

1:9

Anda dapat dengan mudah membuat vektor (dalam hal ini matriks 1xn) dengan operator titik koma. Dalam hal ini Anda mendapatkan vektor [1,2,3,4,5,6,7,8,9]. Ini juga sangat bagus untuk mengakses potongan vektor lainnya seperti misalnya a(2:4)mengakses elemen vektor kedua, ketiga dan keempat a. Anda juga dapat menggunakannya dengan ukuran langkah, suka 0:0.5:10atau lebih.

Cuplikan 2

i;

Tanda titik koma menekan output ke konsol. Anda bisa melihatnya sebagai hal yang baik atau buruk, tapi saya suka untuk debugging. Setiap garis kalkulasi, dll. Akan secara otomatis mencetak hasilnya ke konsol, selama Anda tidak menekan output dengan titik koma.

Cuplikan 1

i

Bilangan kompleks adalah tipe angka dasar. (Sayang sekali banyak orang menggunakan isebagai variabel penghitung untuk loop dalam hal ini akan ditimpa.)

Intro

Bagi mereka yang tidak tahu, MatLab adalah bahasa pemrograman (dengan IDE bagus yang juga disebut MatLab?) Yang pertama-tama ditujukan untuk perhitungan numerik * dan manipulasi data. (Ada mitra sumber terbuka yang disebut "Oktaf") Karena hanya ** ditafsirkan itu tidak terlalu cepat, tetapi kekuatannya adalah bahwa Anda dapat dengan mudah memanipulasi matriks dan banyak algoritma diimplementasikan dengan cara yang dioptimalkan sehingga mereka berjalan cukup cepat bila diterapkan pada matriks. Ini juga merupakan bahasa yang sangat mudah dipelajari, tetapi saya tidak merekomendasikannya sebagai bahasa pemula karena Anda akan menganggap kebiasaan 'pemrograman' yang sangat buruk.

* Karena ini adalah bahasa yang diartikan, itu bisa sangat lambat untuk proyek-proyek mahal, tetapi Anda memiliki metode paralelisasi built-in, dan Anda juga dapat menggunakan beberapa komputer secara bersamaan untuk menjalankan suatu program. Tetapi jika Anda benar-benar ingin cepat, saya pikir Anda masih bergantung pada C atau Fortran atau hal-hal gila seperti itu. Tetapi masih banyak algoritma yang diimplementasikan (perkalian matriks, sistem penyelesaian persamaan linear dll) sangat dioptimalkan dan berkinerja cukup baik. Tetapi jika Anda memprogram algoritma yang sama di Matlab itu sendiri, Anda harus menunggu =) (Sesuatu yang sangat tidak intuitif ketika Anda berasal dari bahasa lain adalah bahwa jika Anda membuat vektor operasi Anda alih-alih menggunakan loop, Anda dapat menghemat banyak waktu di Matlab .)

** Anda dapat mengompilasi program Anda, tetapi itu terutama mengubah kode sumber ke file yang tidak dapat dibaca (untuk manusia), yang tidak lebih cepat ketika dijalankan.


1
Saya memiliki masalah ini sangat sering ... pengaturan ike sesuatu dan kemudian mengalami perilaku yang tidak terduga ketika itu bukan unit yang kompleks.
feersum

3
Telur paskah yang enak! Jika Anda mengetik 'edit mata-mata', Anda menemukan contoh kode kebingungan :-)
Abulafia

1
Saya pergi untuk memperbaiki ini dan kemudian menyadari bahwa saya sudah memilikinya. Sial, kalau saja saya bisa memperbaikinya lagi. Terus mereka datang, @ flawr!
Alex A.

2
Jika Anda kehabisan inspirasi pada hal-hal untuk ditampilkan, saya dapat merekomendasikan blog Mathworks: Tentang Seni MATLAB oleh Loren Vershure Sering kali mereka menggambarkan praktik terbaik yang dapat ditampilkan dalam batas karakter. Untuk rasa ingin tahu pertimbangkan Abaikan Matlab , dan untuk fungsi dan fitur yang tidak berdokumen, Anda dapat mengunjungi Matlab
Tanpa Dokumen

1
@ flawr - Untuk factoid, mungkin juga keren untuk menyebutkan fakta bahwa secara historis, MATLAB pada awalnya diciptakan untuk para mahasiswa Ilmu Komputer di Universitas New Mexico (Cleve Moler adalah ketua pada saat itu) sebagai antarmuka yang mudah ke LINPACK dan EISPACK (... sekarang digantikan oleh LAPACK ) tanpa harus belajar FORTRAN .... dan karena kemudahan penggunaannya, ia menyebar ke lembaga akademik lainnya dengan sangat cepat :)
rayryeng

35

CJam

Coba cuplikan di bawah ini di sini

Potongan 20 panjang:

q~{]__~z\z<=\~*0>*}*

Kalkulator min-mod . Kutipan dari pertanyaan:

Fungsi minmod adalah varian dari min yang familier , yang muncul dalam skema resolusi tinggi yang membatasi-lereng untuk persamaan diferensial parsial. Diberikan sejumlah lereng, ia mengambil kemiringan yang paling rata, sambil menjaga tanda relatif di antara lereng.

Fungsi ini mengambil sejumlah parameter yang berubah-ubah. Kemudian minmod (x 1 , x 2 , ..., x n ) didefinisikan sebagai:

  • min (x 1 , x 2 , ..., x n ) , jika semua x i benar-benar positif
  • maks (x 1 , x 2 , ..., x n ) , jika semua x i benar-benar negatif
  • 0 , jika tidak.

Potongan 18 panjang:

l'[,65>Dm>_el+_$er

Encoder ROT13. Menggeser hanya a-zA-Zkarakter dari string input melalui STDIN

Panjang 15 cuplikan:

T1{_2$+}ri2-*]p

Program lengkap untuk mencetak Nangka pertama dari seri Fibonacci di mana Ndisediakan sebagai input melalui STDIN.

Potongan 12 panjang:

{{_@\%}h;}:G

Fungsi GCD sederhana. Ini bisa digunakan 2706 410 Guntuk mendapatkan GCD di stack.

Potongan 11 panjang:

123456 789#

#adalah operator listrik. Cuplikan ini menunjukkan fitur keren CJam yang mendukung BigInts untuk hampir semua operasi matematika. Jadi output dari kode di atas adalah

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

Panjang 10 cuplikan:

"`%W_"_W%`

Kami sudah melakukan quine, mari kita balikkan !. Ini adalah salah satu quine terbalik terpendek di CJam. Reverse quine adalah quine yang mencetak kode sumbernya dalam urutan terbalik.

Potongan 9 panjang:

5,K,+_&S*

Cuplikan ini menampilkan banyak fitur CJam,

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"

Potongan 8 panjang:

"`_~"`_~

Salah satu quines terkecil yang mungkin ada di CJam. Ini adalah quine yang benar dalam arti bahwa itu tidak benar-benar membaca kode sumber dengan cara apa pun. (Membaca kode sumber bahkan tidak mungkin di CJam)

Potongan 7 panjang:

"AB"_m*

m*menciptakan semua produk Cartesian dari dua elemen tumpukan teratas. Misalnya, kode di atas akan diletakkan di ["AA" "AB" "BA" "BB"]atas tumpukan, yang merupakan produk cartesian dari "AB"dan "AB".

Potongan 6 panjang:

"_~"_~

Kode berulang yang terlihat bagus. JANGAN jalankan ini :). Representasi kode ini adalah dasar untuk quine paling sederhana dalam CJam. Anda meletakkan string "_~"pada tumpukan, membuat salinan ( _) dan mengevaluasinya. Yang pada gilirannya melakukan hal yang sama lagi (dan lagi ..) sampai Anda mencapai pengecualian rekursi maksimum.

Potongan 5 panjang:

{A}:F

Ini adalah bagaimana fungsi dasar bekerja di CJam, Ekspresi di atas memberikan blok kode {A}ke variabel F. Sekarang dalam kode Anda, Anda dapat meletakkan di Fmana saja untuk menjalankan blok kode (dan dapatkan 10dalam kasus ini)

Potongan 4 panjang:

"A"~

Anda dapat mengevaluasi blok kode atau string apa pun atau bahkan menggunakan satu karakter ~. Ekspresi di atas menghasilkan10

Potongan 3 panjang:

Kmr

Generator angka acak tipikal dari rentang 0 hingga K20.

Potongan 2 panjang:

es

Ini memberikan cap waktu saat ini (milidetik dari zaman). CJam juga memiliki etwaktu lokal dalam format yang lebih dapat digunakan yang mengembalikan array yang terdiri dari berbagai bagian dari waktu saat ini (hari, jam dll).

Potongan 1 panjang:

A

CJam memiliki hampir semua huruf kapital sebagai variabel yang telah ditentukan. Aadalah 10, Badalah 11 dan sampai K20. Padalah pi (3.141592653589793), Nadalah baris baru dan banyak lainnya . Ini bisa sangat berguna ketika Anda membutuhkan nilai awal dalam variabel, atau bahkan ketika Anda membutuhkan dua digit angka dalam 1 byte.

Faktoid

CJam terinspirasi oleh GolfScript tetapi membangun banyak fitur di atasnya termasuk dukungan untuk panggilan GET jaringan: D

PS: Saya akan mencoba memperbarui jawabannya setiap 5 upvotes atau setiap 2 jam (yang lebih awal)


Ada beberapa masalah dengan contoh ROT13 Anda: p Tapi saya terkesan dengan quine, saya pikir saya akan meminjamnya :)
aditsu

@aditsu apa masalahnya?
Pengoptimal

Ini mengubah kasus huruf nz. Juga, ia memiliki @ tanpa alasan, Anda dapat menempatkan D di sana sebagai gantinya.
aditsu

@aditsu Cukup yakin bahwa ini adalah ROT 13 pada rentang a-zA-Z dan itulah alasan untuk perubahan kasus. Bisakah kamu tidak membacanya? ini hanya bahasa Anda sendiri: P @ ada selama 18 karakter saya kira: D
Pengoptimal

Bukan itu yang biasa dilakukan ROT13. Saya tidak mengerti mengapa Anda bertanya apakah saya bisa membaca bahasa saya sendiri, masalahnya bukan tentang memahami apa yang program lakukan, tetapi tentang fakta bahwa itu tidak melakukan apa yang diharapkan.
aditsu

34

Gangguan umum

Lisp (dari LISt Processing) adalah salah satu bahasa tertua yang masih digunakan saat ini (hanya FORTRAN yang lebih tua). Ini penting untuk menjadi bahasa pertama di mana kode adalah data dan data adalah kode; disebut homoiconicity. Itu juga bahasa pertama yang memiliki pengumpulan sampah. Awalnya dirancang oleh John McCarthy dalam makalah tahun 1958 sebagai bahasa yang sepenuhnya teoritis, itu menjadi bahasa nyata ketika Steve Russel menyadari bahwa fungsi eval dapat diimplementasikan pada komputer. Ini paling lazim dalam Kecerdasan Buatan, dan langsung dikenali dari banyaknya tanda kurung. Lisp umum dirancang untuk menyatukan banyak dialek Lisp lama ke bentuk yang lebih standar.

Saya akan mencoba agar setiap cuplikan dapat dijalankan dengan sendirinya, meskipun tidak harus melakukan sesuatu yang bernilai. Selain itu, karena saya menggunakan Common Lisp, konsep dasar dan banyak sintaks berlaku dalam dialek lain, tetapi fungsi tertentu tidak akan berfungsi, katakanlah, Skema.

Panjang 1

*

Karena penekanan pada penggunaan S-Ekspresi dan daftar untuk pengkodean, ada sangat sedikit ekspresi valid dalam Lisp yang tidak mengandung tanda kurung, yang disebut atom. Apa pun yang diketik langsung ke REPL (read-eval-print loop) diperlakukan sebagai variabel dan dievaluasi seperti itu. *memegang nilai sebelumnya yang dicetak oleh REPL.

Panjangnya 2

()

Ini adalah daftar kosong, salah satu simbol paling penting di Lisp. Setiap daftar yang benar dalam Lisp diakhiri dengan daftar kosong, mirip dengan bagaimana setiap string yang tepat dalam C berakhir \0.

Panjangnya 3

(*)

Ini adalah panggilan fungsi dasar, yang terdiri dari simbol yang dibungkus dengan tanda kurung. Lisp tidak mengandung operator, mereka hanya berfungsi juga. Saya memilih perkalian khusus karena itu sebenarnya bukan fungsi biner; operator perkalian di Lisp mengambil jumlah argumen yang tidak terbatas. Jika tidak diberikan argumen yang dikembalikan 1, operator identitas untuk penggandaan.

Panjangnya 4

`(1)

Ini adalah sel kontra, yang hanya cara lain untuk mengatakan itu adalah sepasang elemen. Dalam Lisp, setiap daftar terdiri dari sel kontra yang terhubung ke sel kontra, di mana elemen pertama (the car) adalah nilai dan elemen kedua (the cdr) menunjuk ke sel kontra berikutnya. Ini membentuk dasar Lisp berdasarkan daftar tertaut. Sel khusus ini memiliki 1sebagai mobil dan daftar kosong sebagai cdr nya.

Panjangnya 7

(not t)

Saya ingin menyentuh nilai-nilai kebenaran di Lisp. Ini akan kembali nil. Dalam Common Lisp, tadalah simbol untuk true sementara nildan ()mewakili false dan setara satu sama lain, tetapi perhatikan bahwa definisi ini tidak standar untuk semua dialek Lisp; Skema, misalnya, membedakan antara #ffalse dan '()untuk daftar kosong.

Panjangnya 9

(cdr ())

Seperti yang saya katakan sebelumnya, cdr adalah elemen ekor daftar, yang bisa Anda dapatkan dengan fungsinya cdr. Demikian juga, Anda bisa mendapatkan elemen kepala, mobil, dengan fungsinya car. Cukup sederhana, bukan? Mobil dan cdr dari daftar kosong keduanya nil.

Panjangnya 10

(cons 1 2)

Akhirnya, cukup panjang untuk mulai bekerja dengan daftar. consmembuat sel kontra dengan parameter pertama sebagai mobil dan yang kedua sebagai cdr. Tapi bukannya mencetak (1 2), itu memberi (1 . 2). Kembali ke potongan panjang 2, daftar yang tepat seharusnya diakhiri dengan daftar kosong, jadi cdr dari sel kontra terakhir harus menunjuk ke daftar kosong. Dalam kasus ini, sel kontra terakhir menunjukkan 2, jadi Lisp memberi tahu kami bahwa kami memiliki daftar yang tidak patut, tetapi masih memungkinkan kami melakukannya, seperti bagaimana Anda dapat membuat string C tanpa string \0.

Panjangnya 11

(cons 1 ())

Sekarang kita telah membuat daftar pertama yang dibentuk dengan benar. Ini adalah sel kontra tunggal dengan mobil 1dan cdr (). Anda akan melihat bahwa untuk setiap daftar lainnya, saya memimpinnya dengan tanda kutip / centang; daftar lain yang layak akan berusaha mengevaluasi argumen pertamanya sebagai fungsi dengan elemen yang tersisa sebagai parameter. Sebenarnya, ()bukan daftar; itu adalah simbol yang terdiri dari (dan )yang mewakili daftar kosong. Lisp memungkinkan Anda untuk menggunakan hampir semua karakter yang dapat dicetak dalam nama simbol dan akan membiarkan Anda mendefinisikan kembali simbol apa pun yang Anda inginkan.

Panjangnya 12

(cdr `(1 2))

Ini akan menghasilkan (2), bukan 2karena beberapa orang akan menebak. Ingat, setiap cdr seharusnya menunjuk ke sel cons lain atau daftar kosong; jelas 2bukan daftar kosong, jadi harus ada sel kontra lain mobil 2dan cdr ().

Panjang 13

'#1=(1 . #1#)

Ini akan menghasilkan daftar bundar hanya dengan nilai tunggal 1. Jika dicetak, itu akan mencetak "(1 1 1 1 ..." selamanya, sehingga dalam praktiknya dapat dianggap sebagai daftar tak terbatas (di mana Anda dapat melakukan cdrwaktu tak terbatas untuk mendapatkan selalu hasil yang sama, itu sendiri!). Kecuali jika seseorang menugaskan Tke variabel global *print-circle*, dalam hal ini akan dicetak sebagai #1=(1 . #1#).


Sunting terakhir! Cepat, seseorang membuat esolang bertema Beatles: D
fede s.

1
@fedes. John McCarthy, Paul McCartney ... bahasanya disebut CarthyCartney.
kucing

33

GNU Make

Saya akan mengambil risiko yang satu ini. Saya pikir ini mungkin yang pertama kali makeditampilkan di PPCG.

Faktoid

Make dapat dianggap sebagai bahasa fungsional.

Panjang 0 cuplikan

Saya tidak berpikir panjang 0 snippet diperlukan, tapi di sini ada satu. Saya pikir ini mungkin yang paling berguna dari semua program 0 panjang. Dengan Makefile kosong (atau bahkan tidak ada makefile sama sekali), make masih memiliki banyak aturan bawaan. Misalnya ada aturan bawaan bawaan untuk mengkompilasi file .c menjadi .o atau binary, mengingat file .c ada di direktori saat ini. Jadi jika kita lakukan:

make hello.o

make akan menemukan .c untuk .o memerintah dan mengkompilasi hello.c untuk memberikan hello.o

Demikian pula jika kita lakukan:

make goodbye

Jika ada file selamat tinggal di direktori saat ini akan dikompilasi ke dalam binary selamat tinggal.

Panjang 1 Potongan

TAB

Ya, karakter TAB. Meskipun ini tidak melakukan banyak hal dengan sendirinya, ia memiliki makna besar di Make. Khususnya semua baris resep mengikuti definisi target dalam aturan HARUS dimulai dengan TAB. Ini menyebabkan semua jenis frustrasi ketika men-debug file makefile ketika TAB dan spasi bercampur.

Potongan 2 Panjang

$@

Ini adalah variabel otomatis untuk digunakan dalam resep. Ini akan diperluas ke nama file target aturan. Ada variabel otomatis bermanfaat lainnya .

Potongan 3 Panjang

a:=

Penugasan variabel sederhana yang diperluas. Variabel a diatur ke "" segera ketika Makefile pertama diurai. Jika sebaliknya kita lakukan a=, maka penugasan diperluas secara rekursif, yaitu ekspansi ditangguhkan sampai saat variabel benar-benar direferensikan.

Potongan 4 Panjang

W:;w

Spesifikasi aturan lengkap terpendek yang berguna. Ini mendefinisikan target Wdengan aturan yang hanya menjalankan wperintah shell. Jadi

make W

setara dengan:

w

Ini adalah sintaks aturan alternatif karena resep mengikuti target pada baris yang sama yang dipisahkan oleh baris baru. Lebih umum garis resep segera mengikuti garis target yang terpisah, dengan TABkarakter memulai setiap garis resep.

Panjang 5 Potongan

$(@D)

Variabel otomatis lain. Mirip dengan $@, tetapi ini diperluas ke bagian direktori path, dengan nama file dan trailing / dihapus.


Mungkin beberapa fungsi string suka $(basename )atau $(patsubst )? ( mis. )
luser droog

32

Marbelous

Panjang 14 cuplikan

}0}1
Mulx
HxHx

Cuplikan ini memamerkan beberapa perpustakaan Marbelous dan memperkenalkan konsep baru, yaitu, papan multi-sel. The Mulxpapan mengambil dua kelereng sebagai masukan dan output 2 kelereng. Kelereng yang memasuki sel paling kiri Mulxakan sesuai dengan }0perangkat di papan itu dan sel paling kanan ke }1. Secara analog, output akan keluar dari sel yang berbeda juga. Lebar papan dapat dihitung sebagai MAX(1, highest output device + 1, highest input device + 1)sel yang tidak sesuai dengan perangkat input akan membuang marmer yang jatuh ke atasnya.

Potongan 13 panjang

7E
??
>Y!!
{0

Ini adalah papan yang akan memuntahkan karakter ascii yang dapat dicetak secara acak pada setiap centang. Marbelous memiliki dua cara menghasilkan nilai acak. Ada ??yang mengembalikan nilai acak antara 0 dan marmer input yang diterimanya, inklusif, dan ?n: masing ?0- ?Zmasing. Yang bertindak sangat mirip ??. Kami juga memiliki !!yang mengakhiri papan bahkan jika tidak semua output diisi. Bisakah Anda mencari tahu bagaimana ?nperangkat dapat diimplementasikan sebagai papan di Marbelous menggunakan ???

Panjang 12 cuplikan

}0}1
Fb//
Dp

Di sini kita melihat beberapa fungsi perpustakaan Marbelous dalam aksi. Fbmenghasilkan angka fibonacci ke-n di mana n adalah marmer input. Dpmencetak input marmer ke STDOUT sebagai angka desimal. Ini keduanya diimplementasikan dalam Marbelous dan dapat dipanggil ketika Anda memeriksa termasuk perpustakaan di juru online , untuk juru bahasa python, Anda harus secara eksplisit menyertakan setiap file. Keterlibatan papan ini dapat ditemukan di github . Perhatikan bahwa program khusus ini membutuhkan 2 input dan akan memanggil papan Fibonacci dua kali. Papan yang dipanggil kembali dalam satu tanda centang papan yang memanggil mereka.

Potongan 11 panjang

}0}0
{<{0{>

Yang ini perlu penjelasan. The }0perangkat imputs, karena mereka memiliki jumlah yang sama (0), mereka akan berisi nilai yang sama ketika dewan ini dipanggil. Tiga perangkat di baris bawah adalah output. {<output di sebelah kiri papan, {0output di bawah sel pertama papan dan {>output di sebelah kanan. Output hanya didorong ketika semua perangkat output berbeda diisi. Namun dalam hal ini, perangkat output yang tepat tidak pernah tercapai. Papan akan keluar karena kurangnya aktivitas dan menghasilkan dua nilai yang dimilikinya. Bisakah Anda bayangkan bagaimana orang bisa menerapkan /\sebagai papan Marbelous?

Panjangnya 10 cuplikan

..40
FF
\\

Ada beberapa hal yang memainkan peran penting dalam Marbelous di sini. Pertama, ada tambahan. Jika Anda melacak jalur kedua kelereng di papan, Anda akan melihat bahwa mereka akan berakhir di sel yang sama pada saat yang sama. Ketika ini terjadi, mereka akan ditambahkan bersama. (Fakta menyenangkan: pada titik tertentu dianggap bahwa alih-alih ditambahkan bersama, kelereng harus membentuk tumpukan) Namun, Marbelous adalah bahasa 8 bit, Jadi menambahkan marmer ke FFsetara dengan mengurangi 1 dari itu.

Potongan 9 panjang

00
\\/\]]

Ini adalah cara terpendek untuk mengimplementasikan versi kucing yang belum sempurna di Marbelous. 00 \ / \ Adalah loop yang menempatkan 00nilai marmer pada ]]perangkat setiap detik. Ini adalah perangkat STDIN. Ketika marmer mendarat di perangkat ini, ia mencoba membaca karakter pertama dari STDIN, jika ada, ia akan didorong ke bawah (dan dalam kasus ini dicetak lagi). Jika tidak ada, amrble asli akan didorong ke kanan. (dan dalam hal ini sampah)

Potongan 8 panjang

}0
~~
{0

Cuplikan ini menunjukkan beberapa fitur. Pertama, dibutuhkan input melalui} 0. Dalam hal ini, ini adalah Papan Utama dan ini akan digantikan oleh input baris perintah. Anda juga dapat memanggil fungsi ini, dalam hal ini, argumen akan diambil alih-alih input baris perintah. Lalu ada ~~, yang agak bukan operator. Setelah itu, kita mulai }0, Jika semua }nperangkat diisi, nilai-nilai ini dikembalikan sebagai fungsi mengembalikan nilai. (Marbelous mendukung lebih dari satu nilai pengembalian per fungsi)

Potongan 7 panjang

00
\\/\

Ini adalah loop tak terbatas paling kompak yang bisa Anda buat di Marbelous. The \\perangkat mendorong setiap marmer ke kanan, /\salinan marmer dan mendorong satu salinan ke kiri dan lain ke kanan. Karena papan hanya sel dua sel, marmer di sebelah kanan jadi hancur.

Potongan 6 panjang

46MB75

Berikut ini adalah contoh rekursi, MB(papan utama yang diberi nama secara implisit dipanggil pada setiap centang, tetapi tidak sebelum Mencetak Fuke STDOUT pada setiap panggilan. (Menghasilkan yang berikut: FuFuFuFuFuFu...Ini jelas meluap-luap pada callstack).

Potongan 5 panjang

2A
++

Beberapa aritmatika, Marmer dengan nilai 2Ajatuh pada centang pertama dan menemukan dirinya di ++sel. Ini adalah operator. Operator khusus ini menambah marmer apa saja yang mendarat di atasnya dan membiarkannya jatuh. Marmer sekarang memiliki nilai 2Bdan jatuh dari papan. Ini mencetak +ke STDOUT.

Potongan 4 panjang

:
24

Dua penafsir tidak setuju di sini, saya telah memberikan papan pertama nama file dalam contoh ini (Namanya adalah string kosong). Penerjemah python menganggap ini adalah papan utama dan memanggil papan ini saat menjalankan program (yang dicetak $). Penerjemah javascript tidak menemukan Papan Utama dan karenanya tidak ada titik masuk. Ini bisa bermanfaat saat menulis file perpustakaan untuk Marbelous.

Potongan 3 panjang

:Bo

Ini adalah papan nama, tanpa tubuh, kita dapat menyebut papan ini dengan Menulis Bodi sel papan apa pun (termasuk Bodirinya sendiri)

Potongan 2 panjang

3A

Kode ini adalah badan papan sel 1x1 (setiap sel lebar dua karakter), dinamai secara implisit MB(untuk Papan Utama). Ini mencetak nilai ascii dari nilai heksadesimal 3Aketika marmer jatuh dari papan. Output dari program ini adalah kode sumber:

Potongan 1 panjang

:

Bersamaan dengan #ini, ini adalah salah satu dari dua program karakter 1 hanya valid di marbelous. #adalah indikator dari komentar dan karenanya tidak terlalu menarik. :memberitahu marbelous bahwa Anda akan mendeklarasikan dewan. Tak satu pun dari dua kompiler yang peduli bahwa Anda tidak benar-benar memberi nama atau mendefinisikan papan. Program tidak melakukan apa pun.

factoid:

Marbelous dikembangkan oleh orang-orang di situs ini, beberapa nama yang sedang berjalan untuk bahasa ini adalah Rube dan hanya Marbles .


2
kalahkan aku untuk itu. potongan yang bagus!
Sparr

potongan 12 panjang Anda tampaknya mengambil dua input, dan mencetak dua nomor fibonacci yang berbeda. Apakah itu disengaja?
Sparr

@Parr, ya itu untuk memamerkan cara kerja fungsi di Marbelous sedikit.
overactor

mungkin menambahkannya ke penjelasan? dari apa yang Anda tulis, saya harapkan cuplikan mengambil satu input dan menghasilkan satu nomor fib.
Sparr

Saya sangat berharap Anda mendapatkan 40 poin sehingga fungsi fibonacci saya akan cocok ...
Sparr

31

Keempat

Keempat hanya memiliki dua jenis, int dan mengapung (dan mengapung adalah opsional!) Tetapi masih berhasil memiliki karakter, string, int panjang panjang, pointer, pointer fungsi, struct, dan banyak lagi; itu semua bagaimana Anda menggunakannya!

Panjang 1

.

The .perintah (atau "kata" seperti kita menyebutnya) mencetak nilai integer di atas tumpukan data; jika tumpukan kosong, Anda mendapatkan kesalahan runtime. Itu juga menghapus nilai dari tumpukan - upvote untuk melihat bagaimana kita bisa menyimpannya!

Panjangnya 2

.s

The .sKata menampilkan nilai saat ini di stack, tanpa menghapus salah satu dari mereka. Ini juga menampilkan jumlah total nilai. Di Gforth, .ssecara default dibatasi hanya untuk menampilkan 9 nilai teratas; mungkin kita akan menemukan cara untuk menunjukkan lebih banyak?

Panjangnya 3

see

Ketik seediikuti oleh kata Forth untuk melihat kode sumber kata itu. Sebagian besar kata Forth didefinisikan dalam Forth sendiri, dan hanya beberapa primitif yang didefinisikan dalam kumpulan.

Panjangnya 4

1 0=

Apakah saya menyebutkan bahwa Forth adalah bahasa berbasis stack dengan operator postfix? Mengetik 1 0=mendorong 1ke tumpukan dan kemudian mengeksekusi 0=kata, yang mengeluarkan nilai teratas dari tumpukan dan mendorong truejika sama dengan 0, falsejika tidak. 0=adalah kata yang mudah untuk 0 =; ada beberapa kata singkatan seperti itu untuk nilai umum + kombinasi kata, seperti 1+dan 0<>. Selain itu, sementara falsedi Forth adalah 0 dan nilai bukan nol mana pun adalah benar, kata-kata tes bawaan mengembalikan truehasil yang benar, dan trueberjalan sepanjang jalan - itu adalah nilai dengan semua bit yang ditetapkan, yaitu -1,!

Panjangnya 5

-1 u.

Dorong -1ke tumpukan, lalu lepas dan cetak sebagai bilangan bulat yang tidak ditandatangani. Ini dapat digunakan untuk dengan cepat melihat nilai maksimum untuk int yang tidak ditandatangani pada versi Forth Anda (tetapi bukan nilai integral maksimum yang didukung secara asli!). Anda mungkin bertanya, "Bagaimana kita tahu kapan int harus dicetak dengan .dan kapan dengan u.?" Jawab: .kapan ditandatangani, u.kapan tidak ditandatangani? "Bukan itu maksudku," katamu. "Bagaimana kita tahu kapan nilai di atas tumpukan ditandatangani dan kapan tidak ditandatangani?" Jawab: Anda adalah programmer - itulah tugas Anda! Anda harus tahu apakah setiap integer pada stack mewakili int, int unsigned, an int*, achar*, penunjuk fungsi, atau lainnya, atau Anda mendapatkan setan di hidung Anda. Keempat tidak akan melacak itu untuk Anda; apa ini, C?

Panjangnya 6

." Hi"

Cetakan Hi. ."adalah kata Forth (yang, seperti semua kata Forth, harus diikuti oleh whitespace atau EOF) yang membaca aliran input naik melalui berikutnya "dan mencetak byte di antaranya. Jika Anda menempatkan lebih dari satu spasi setelah .", semua kecuali ruang segera setelah ."akan dicetak. Urutan melarikan diri tidak didukung (jadi Anda tidak dapat mencetak string dengan "di dalamnya dengan ."), tetapi Gforth menambah .\"bahasa, yang memang mendukungnya.

Panjangnya 7

: + - ;

Anda mendefinisikan kata-kata Anda sendiri di Forth dengan menulis titik dua, nama kata, kata-kata yang Anda ingin eksekusi kata-kata Anda, dan tanda titik koma. Sebuah kata dapat berupa urutan karakter non-spasi putih (whitespace adalah bagaimana Forth mengatakan di mana satu kata berakhir dan yang lain dimulai, setelah semua), bahkan tanda baca, dan bahkan operator (yang hanya kata-kata, setelah semua). Cuplikan di atas mendefinisikan ulang +artinya -, jadi sekarang setiap kali Anda mencoba menambahkan, Anda kurangi. Kata-kata yang sudah ada sebelumnya yang menggunakan +tidak terpengaruh, karena mereka menyimpan referensi ke definisi asli dari +.

Catatan: Beberapa kata melakukan hal-hal yang berbeda di dalam definisi kata lain daripada di luar, tetapi selain struktur kontrol, semuanya sangat esoteris. Kebanyakan kata melakukan hal yang sama di dalam definisi seperti di luar, tetapi kadang-kadang hal itu tidak jelas - : show-see see see ;tidak akan melakukan apa yang Anda pikirkan!

Panjangnya 8

: 42 - ;

Ketika saya mengatakan sebuah kata bisa berupa urutan karakter spasi apa pun , maksud saya urutan apa pun . Tidak, Forth tidak memiliki kata untuk setiap nomor individu; angka hanya sedikit istimewa. Ketika Forth menemukan urutan non-spasi putih, ia pertama kali melihat apakah itu kata yang dikenal; jika tidak, ia mencoba menguraikannya sebagai angka; jika itu gagal, barulah Anda mendapatkan kesalahan. Mendefinisikan kata yang dieja sama dengan angka berarti Anda tidak akan bisa lagi memasukkan ejaan angka itu tanpa mendapatkan kata, tetapi Gforth dan berbagai Forths lainnya memberi Anda beberapa cara untuk mengeja angka .

Panjangnya 9

IF 1 THEN

Akhirnya , sesuatu yang akrab! Jelas, kode ini menguji apakah argumennya 1benar dan, jika demikian, jalankan apa pun setelahnya THEN, bukan? Salah. Ketika eksekusi mencapai IF, nilai di atas tumpukan yang muncul dari, dan jika itu nilai benar (yaitu, nol), eksekusi terus dengan apa pun yang di dalam IF ... THENdan kemudian apa pun yang setelah THEN; jika nilainya nol, kita langsung lewati setelahnya THEN. Perhatikan bahwa, karena cara kata-kata ini diterapkan secara internal (yang dalam istilah kata Forth lainnya!), IFDan THENhanya dapat digunakan di dalam definisi kata, bukan dalam "interpretate state."

Panjangnya 12

( x y -- y )

Ini adalah komentar. Itu pergi dari (yang berikutnya )segera setelah itu. (Dalam penerjemah, baris baru juga dapat mengakhirinya.) Ini bukan "bawaan" untuk sintaks Forth (Apakah ada sesuatu?); (hanyalah kata lain, yang membuang semua yang ada di input stream hingga yang berikutnya ). (Itu benar - Forth dapat memanipulasi bagaimana kode sumbernya dibaca. Perl bukan satu-satunya bahasa yang tidak dapat diurai tanpa menjalankannya!) Karena itu sebuah kata, Anda harus mengikutinya dengan spasi, atau Forth akan mengeluh bahwa (xtidak terdefinisi. Kita juga dapat mendefinisikan kembali (sebagai bagian dari kampanye penembakan diri kita yang sedang berjalan.

Namun, konten komentar lebih menarik. Komentar ini menentukan efek tumpukan untuk beberapa kata; bagian di sebelah kiri --daftar apa yang harus di bagian atas tumpukan sebelum Anda menjalankan kata (bagian atas di sebelah kanan), dan sisi kanan --menggambarkan seperti apa bagian atas tumpukan akan terlihat setelah itu (lagi , atas ada di kanan). Konvensi umum adalah menambahkan komentar seperti itu ke sumber kata apa pun yang Anda tentukan, tepat setelah : namebit, dan ada juga konvensi yang sangat kuat tentang penamaan elemen stack untuk menunjukkan tipe mereka yang bahkan diikuti oleh standar .

Kebetulan, efek tumpukan yang ditampilkan adalah untuk nipkata tersebut. Anda harus dapat mengetahui apa yang dilakukannya hanya dari komentar.

Panjang 13

1 2 3 4 d+ d.

Seperti yang ditunjukkan sebelumnya, tipe nilai Forth adalah semua cara Anda menggunakannya - jika Anda memperlakukan nilai sebagai pointer, itu adalah pointer, dan jika nilai itu bukan pointer yang baik , itu kesalahan Anda untuk memperlakukannya sebagai satu. Namun, terlepas dari tipe apa yang Anda nilai, nilai itu akan selalu mengambil satu sel pada tumpukan data; pengecualiannya adalah sel ganda atau bilangan bulat presisi ganda . Ini adalah bilangan bulat yang diwakili oleh dua nilai pada stack, memungkinkan Anda untuk melakukan aritmatika dengan bit dua kali lebih banyak dari biasanya. Sel bit yang lebih signifikan atau lebih tinggi ditempatkan di atas yang kurang signifikan atau bit lebih rendah, sehingga 1 0merupakan representasi sel ganda 1, dan0 1adalah 2 ^ 32 atau 2 ^ 64, tergantung pada seberapa besar sel reguler Forth Anda. Secara alami, untuk memperlakukan nilai sel ganda seperti itu, kita perlu menggunakan kata-kata yang beroperasi secara eksplisit pada nilai sel ganda; ini umumnya hanya d(atau uduntuk yang tidak ditandatangani) diikuti dengan nama kata sel tunggal yang sesuai: d+sebagai tambahan, d<untuk perbandingan, d.untuk pencetakan, dll.


+1 untuk Keempat. Saya mulai mencari bahasa yang belum dikerjakan. Senang melihatnya di sini sudah.
mbomb007

2
Juga, jika Anda mendapatkan +1675, saya punya gambar ASCII yang bagus untuk ditampilkan. : D
mbomb007

31

Pyth

Untuk cuplikan lebih lanjut, saya akan memposting solusi untuk tantangan golf dan tautan ke masalahnya.

Durasi 17:

<ussC,cG\_GUQ*zQQ

Temukan nkarakter pertama dari urutan tak terbatas yang terbentuk dengan mengulangi string input selamanya, lalu mengisi garis bawahnya dengan urutan itu sendiri, lalu mengulanginya selamanya.

Isi kolom yang kosong

Panjang 14:

#QX=Qhf>FT.:Q2

Diberikan daftar elemen unik, urutkan daftar dengan menukar pasangan elemen tetangga, mencetak semua hasil antara.

Mengatur ulang satu set angka ke dalam urutan

Panjang 13:

?hu]+HG_UQYQY

Buat struktur sebagai berikut: [0, [1, [2, [3]]]].

Beranda di Daftar Jangkauan

Panjang 12:

uxyG*HQjvz2Z

Perkalian XOR.

Perkalian XOR

Panjang 11:

lfqSzST.:wz

Hitung berapa banyak substring dari kata pertama adalah anagram dari kata kedua.

Mendeteksi anagram dalam Parent String

Panjangnya 9:

fqJjQT_J2

Temukan basis terendah di mana inputnya adalah palindrome.

Palindrome Basis Terendah

Panjang 5:

!%lQ1

Periksa apakah input adalah kekuatan 2. Ambil basis log 2, ambil hasil mod 1, dan ambil logika tidak.

Periksa apakah bilangan bulat adalah kekuatan 2 tanpa menggunakan +, - operasi

Panjang 4:

sjQ2

Hitung bobot hamming dari input dengan menambahkan representasi basis 2 dari input.

Hitung jumlah yang dalam bilangan bulat 16 bit yang tidak ditandatangani

Panjang 3:

^G2

^ on sequence, int, memberikan produk kartesius dari argumen pertama dengan dirinya sendiri n kali, di mana n adalah argumen kedua.

Dalam hal ini, karena Gadalah alfabet ( abcdefghijklmnopqrstuvwxyz), ^G2berikan semua string 2 huruf, aahingga zz.

Panjang 2:

lT

l, sementara biasanya berfungsi sebagai len(), juga dapat digunakan sebagai basis log 2. Karena Tadalah variabel yang diinisialisasi 10, cetakan ini 3.3219280948873626, basis log 2 dari 10.

Panjang 1:

H

Hadalah kamus kosong (tabel hash) di Pyth, dan merupakan satu-satunya cara untuk mendapatkan kamus di Pyth, singkat menggunakan v(eval) atau $(Python literal).

Faktoid:

Pyth tidak memiliki konstruksi multi-karakter selain literal. Juga, Pyth mengkompilasi dasarnya satu-ke-satu ke dalam Python.


Apakah factoid Anda ditambahkan sebelum Anda memiliki perintah yang dimulai .?
Leaky Nun

@ LeakyNun Ya ..
isaacg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.