Dalam tantangan ini, pengguna akan bergiliran menyelesaikan tiga tugas pengkodean yang cukup sederhana dalam bahasa pemrograman yang dibiarkan semakin tua.
Jawaban pertama harus menggunakan bahasa pemrograman yang dibuat pada tahun 2015. Begitu ada setidaknya satu jawaban dari bahasa 2015, jawaban dapat menggunakan bahasa pemrograman yang dibuat pada tahun 2014. Demikian pula, jawaban yang menggunakan bahasa dari tahun 2013 tidak diperbolehkan sampai ada setidaknya satu jawaban 2014.
Secara umum, penggunaan bahasa pemrograman dari tahun Y tidak diperbolehkan sampai jawaban yang menggunakan bahasa dari tahun Y + 1 telah dikirimkan. Satu-satunya pengecualian adalah Y = 2015.
Menemukan Tahun Bahasa Anda
Untuk menjawab pertanyaan ini, Anda harus tahu tahun "bahasa pemrograman Anda" dibuat. Ini, tentu saja, adalah istilah subjektif; beberapa bahasa dikembangkan selama beberapa tahun, dan banyak bahasa masih ditingkatkan setiap tahun. Biarkan tahun suatu bahasa "dibuat" menjadi tahun pertama implementasi untuk bahasa itu muncul di masyarakat umum.
Sebagai contoh, Python "dibuat pada" 1991 , meskipun pengembangannya telah berlangsung sejak 1989, dan versi 1.0 tidak dirilis sampai 1994.
Jika tahun ini masih subyektif, gunakan akal sehat Anda untuk memilih tahun yang paling tepat. Jangan terjebak dalam sedikit perbedaan pendapat tentang pilihan tahun. Harap berikan tautan ke sumber yang menyebutkan kapan bahasa Anda dibuat.
Versi atau standar yang berbeda dari bahasa pemrograman (misalnya Python 1, 2, 3) dihitung sebagai bahasa yang sama dengan tahun awal yang sama.
Jadi, kecuali tahun bahasa Anda adalah tahun 2015, Anda hanya dapat mengirim jawaban Anda begitu jawaban telah dikirimkan yang tahun bahasanya adalah tahun tepat sebelum Anda.
Jika jawaban yang valid dengan tahun yang sama dengan Anda sudah ada, maka Anda dapat menjawab. Tidak masalah apakah bahasa Anda dikembangkan lebih awal atau lebih lambat pada tahun itu.
Tugas
Anda harus menyelesaikan Tugas 1 hingga 3. Tugas 0 bersifat opsional.
Tugas-tugas ini lebih atau kurang dipilih untuk sesuai dengan tiga aspek penting pemrograman: memberikan output (Tugas 1), pengulangan (Tugas 2), dan rekursi (Tugas 3).
Tugas 0 - Sejarah Bahasa (opsional)
Tulislah setidaknya satu paragraf yang menjelaskan sejarah bahasa pemrograman pilihan Anda: siapa yang mengembangkannya, mengapa, bagaimana, dll. Hal ini terutama didorong jika Anda secara pribadi ada di sekitar ketika bahasa tersebut muncul, dan mungkin bahkan berperan dalam pengembangannya. Jangan ragu untuk mengaitkan anekdot pribadi tentang pengaruh bahasa terhadap Anda atau pekerjaan Anda, atau hal-hal seperti itu.
Jika Anda terlalu muda untuk tahu banyak tentang sejarah bahasa Anda tanpa banyak penelitian, pertimbangkan untuk meninggalkan catatan untuk pengguna yang lebih tua yang mengatakan mereka dapat mengedit posting Anda dan menambahkan beberapa riwayat tangan pertama.
Tugas 1 - "Halo, Dunia!" Varian
Tulis program yang mencetak
[language name] was made in [year made]!
ke area output standar bahasa Anda (stdout untuk sebagian besar bahasa terbaru).
Misalnya, jika bahasanya adalah Python, hasilnya adalah:
Python was made in 1991!
Tugas 2 - ASCII Seni N
Tulis program yang memungkinkan pengguna memasukkan bilangan bulat ganjil (Anda dapat menganggap bahwa input selalu valid), dan mencetak huruf ASCII art N yang dibuat menggunakan karakter N
.
Jika inputnya 1, outputnya adalah:
N
Jika inputnya adalah 3, outputnya adalah:
N N
NNN
N N
Jika inputnya 5, outputnya adalah:
N N
NN N
N N N
N NN
N N
Jika inputnya 7, outputnya adalah:
N N
NN N
N N N
N N N
N N N
N NN
N N
Polanya berlanjut seperti ini. Output mungkin berisi spasi tambahan.
Tugas 3 - GCD
Tulis sebuah program yang memungkinkan pengguna memasukkan dua bilangan bulat positif (Anda mungkin menganggap input selalu valid), dan mencetak pembagi umum terbesar mereka . Ini didefinisikan sebagai bilangan bulat positif terbesar yang membagi kedua angka tanpa meninggalkan sisanya. Ini dapat dengan mudah dihitung menggunakan algoritma Euclidean .
Contoh:
8
, 12
→ 4
12
, 8
→ 4
3
, 30
→ 3
5689
, 2
→ 1
234
,876
→6
Anda dapat menggunakan fungsi bawaan tetapi coba cari tahu apakah itu ada di versi pertama bahasa Anda. Jika tidak, cobalah untuk tidak menggunakannya.
Aturan
- Anda dapat menjawab beberapa kali, tetapi setiap jawaban baru harus menggunakan bahasa yang dibuat setidaknya 5 tahun sebelum bahasa dalam jawaban terakhir Anda. Jadi, jika Anda menjawab dengan bahasa 2015, Anda tidak bisa menjawab lagi sampai bahasa 2010 diizinkan. Jika Anda mulai dengan jawaban 2010, Anda tidak dapat membuat 2015 menjawab jawaban kedua Anda karena 2015 bukan sebelum 2010.
- Jika memungkinkan, tulis kode Anda sehingga bisa digunakan di versi pertama bahasa Anda (atau versi setua mungkin). (Ini bukan persyaratan karena menemukan kompiler / penerjemah lama untuk beberapa bahasa mungkin sulit.)
- Jangan memposting bahasa yang telah diposkan kecuali jawaban yang diposkan memiliki kesalahan signifikan atau Anda memiliki cara yang sangat berbeda dalam menyelesaikan tugas.
- Golf kode Anda baik-baik saja tetapi tidak diperlukan.
- Baris baru yang tertinggal dalam output dari program apa pun tidak masalah.
- Untuk tugas 2 dan 3, semua nilai input di bawah maksimum yang wajar seperti 2 16 harus berfungsi (paling tidak 256).
- Bahasa Anda harus sudah ada sebelum pertanyaan ini diposting.
- Bahasa pemrograman yang sangat lama mungkin memiliki bentuk input dan output yang berbeda dari yang kita pikirkan saat ini. Ini baik Selesaikan tugas dengan kemampuan terbaik Anda dalam konteks bahasa Anda.
Mencetak gol
Skor kiriman Anda adalah:
upvotes - downvotes + (2015 - languageYear) / 2
Dengan demikian, 0,5 ditambahkan ke penghitungan suara untuk setiap tahun sebelum 2015, memberikan keuntungan untuk bahasa yang lebih tua. Pengajuan dengan skor tertinggi akan menang.
Daftar Jawaban
Cuplikan Stack di bawah ini mencantumkan semua jawaban yang valid sesuai dengan tahun bahasa mereka.
Anda harus memulai posting Anda dengan garis Penurunan harga ini untuk memastikannya terdaftar dengan benar:
#[year] - [language name]
Sebagai contoh:
#1991 - Python
Nama bahasa mungkin ada di tautan (itu akan menjadi tautan yang sama di daftar jawaban):
#1991 - [Python](https://www.python.org/)
Jawaban yang tidak mengikuti format ini, atau memiliki tahun yang belum diizinkan, atau berasal dari pengguna yang sudah dijawab dalam 5 tahun terakhir ditandai sebagai tidak valid.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>$(function(){function e(e,r){var a="https://api.stackexchange.com/2.2/questions/48476/answers?page="+e.toString()+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter=!YOKGPOBC5Yad160RQxGLP0r4rL";$.get(a,r)}function r(e){if(e.items.forEach(function(e){var r=e.link,a=e.owner.display_name,i=e.body.match(/<h1\b[^>]*>(\d{4}) - (.*?)<\/h1>/);if(i&&i.length>=3)var h=parseInt(i[1]),u=i[2];h&&u&&n>=h&&h>=t&&(!d.hasOwnProperty(e.owner.user_id)||d[e.owner.user_id]-h>=p)?(d[e.owner.user_id]=h,h==t&&--t,o.hasOwnProperty(h)||(o[h]=[]),o[h].push({language:u,user:a,link:r,score:e.score+(n-h)/2})):s.push(' <a href="'+r+'">'+a+"</a>")}),e.has_more)runQuery(++a,r);else{for(var i=n,h=[];o.hasOwnProperty(i);){for(var u=$("<tr>").append($("<td>").text(i.toString())),l=$("<td>"),c=$("<td>"),g=$("<td>"),f=0;f<o[i].length;f++){var v=o[i][f];l.append(v.language),c.append($("<a>").html(v.user).attr("href",v.link)),g.append(v.score),f+1<o[i].length&&(l.append("<br><br>"),c.append("<br><br>"),g.append("<br><br>"))}u.append(l).append(c).append(g),h.push(u),--i}$("#answers").find("tbody").append(h),s.length>0?$("#invalid").append(s):$("#invalid").remove()}}var a=1,n=2015,t=n-1,p=5,o={},s=[],d={};e(1,r)})</script><style>html *{font-family: Helvetica, Arial, sans-serif;}table{border: 4px solid #a4a; border-collapse: collapse;}th{background-color: #a4a; color: white; padding: 8px;}td{border: 1px solid #a4a; padding: 8px;}div{font-size: 75%;}</style><table id='answers'> <tr> <th>Year</th> <th>Language</th> <th>User (answer link)</th> <th>Score</th> </tr></table><div id='invalid'><br>Invalid Answers:</div>
sumber
Jawaban:
2013 - Dogescript
Naskah tertulis adalah bahasa yang dibuat pada 2013 oleh Zach Bruggeman. Ini tidak lebih dari pengganti sintaks untuk Javascript untuk membuatnya dibaca seperti monolog internal memetika Shiba Inus.
Halo, Doge
Seni ASCII
GCD
sumber
s[i]
sedikit juga!2015 - Retina
Retina adalah bahasa pemrograman berbasis regex, yang saya tulis untuk dapat bersaing dalam tantangan PPCG dengan jawaban hanya-regex, tanpa perlu memanggil regex dalam bahasa host. Retina lengkap-Turing. Untuk membuktikannya, saya telah menerapkan pemecah sistem 2-tag serta Aturan 110 . Itu ditulis dalam C #, karena itu mendukung baik rasa NET. (Secara default) dan rasa ECMAScript (melalui bendera).
Retina dapat beroperasi dalam berbagai mode, tetapi yang paling relevan untuk perhitungan (dan yang menyelesaikan Turing) adalah mode Ganti. Dalam mode Ganti Anda memberi Retina jumlah file sumber yang genap. Ini kemudian dipasangkan, yang pertama dari masing-masing pasangan menjadi regex, dan yang kedua sebagai pengganti. Ini kemudian dieksekusi secara berurutan, memanipulasi input langkah demi langkah. Regex juga dapat didahului oleh konfigurasi (dibatasi dengan
`
). Opsi paling penting (yang membuat Retina Turing-lengkap) adalah+
, yang membuat Retina menerapkan penggantian dalam satu lingkaran sampai hasilnya berhenti berubah. Dalam contoh berikut, saya juga menggunakan;
, yang menekan output pada tahap menengah.Di setiap kiriman berikut, setiap baris masuk dalam file sumber terpisah. (Atau, Anda dapat menggunakan
-s
opsi baru dan meletakkan semua baris ke dalam satu file.) File / baris kosong direpresentasikan sebagai<empty>
. File / baris yang mengandung satu ruang direpresentasikan sebagai<space>
.Penjelasannya cukup panjang, jadi saya memindahkannya ke akhir posting.
Program
"Halo Dunia!" Varian
ASCII Seni N
Ini mengasumsikan bahwa STDIN diakhiri dengan baris baru.
GCD
Ini mensyaratkan bahwa STDIN tidak diakhiri dengan baris baru.
Penjelasan
"Halo Dunia!" Varian
Ini cukup sepele. Tidak memerlukan input (yaitu string kosong), tidak cocok dengan apa pun dan menggantinya dengan
Retina was made in 2015!
. Satu juga dapat membuatnya bekerja untuk input sewenang-wenang, dengan mengganti pola dengan[\s\S]*
misalnya. Itu akan menghirup STDIN dan mengganti semuanya dengan output.ASCII Seni N
Ini memiliki banyak tahapan. Idenya adalah untuk mengubah input menjadi unary, membuat blok N x N
N
dan kemudian "mengukir" dua segitiga. Mari kita melewati setiap tahapan. Ingat bahwa;
hanya menekan output antara, tetapi+
menyebabkan penggantian diterapkan dalam satu lingkaran.Sederhana: tambahkan a
#
ke input. Ini akan digunakan sebagai penanda dalam konversi ke unary.Ini mengubah satu digit menjadi unary. Dibutuhkan digit yang sudah dikonversi
(\d*)
dan ulangi 10 kali. Dan kemudian mengambil digit berikutnya dan menambahkan jumlah digit yang sesuai. Nilai aktual dari digit tidak relevan pada tahap ini. Ketika#
mencapai akhir angka, regex tidak lagi cocok, dan konversi selesai. Sebagai contoh, nomor127
tersebut akan diproses sebagaidi mana baris terakhir berisi tepat 127 digit karakter.
Dua tahap sederhana yang menyingkirkan itu
#
dan kemudian mengkonversi semua digitN
. Berikut ini saya akan menggunakan input7
sebagai contoh. Jadi sekarang kita punyaTahap selanjutnya
mengganti masing
N
- masing dengan seluruh string (ingat bahwa itu berisi baris baru), dan juga menghapus baris baru itu sendiri. Karenanya, ini mengubah baris tunggal menjadi kotak persegi:Sekarang segitiga atas. Pertama, kita memulai sesuatu dengan mengubah N di sudut kanan bawah menjadi spasi:
Lookahead memastikan bahwa kami memodifikasi yang benar
N
. Ini memberiDan sekarang
adalah regex yang cocok dengan
N
yang di atas atau di sudut kiri atas karakter spasi, dan menggantinya dengan spasi. Karena penggantian itu diulangi, ini pada dasarnya adalah genangan banjir, yang mengubah oktan ke-3 dari ruang awal menjadi lebih banyak ruang:Dan akhirnya, kami mengulangi hal yang sama dengan segitiga bawah, tetapi kami menggunakan karakter yang berbeda, sehingga ruang yang sudah ada tidak menyebabkan isi banjir yang salah:
set benih:
Kemudian
mengisi banjir.
Dan akhirnya
Mengubahnya
S
menjadi spasi dan kita selesai:GCD
GCD di unary sebenarnya sangat sepele dengan regex. Sebagian besar dari ini terdiri dari konversi desimal ke unaris dan unary ke desimal. Ini bisa dilakukan lebih kompak, tetapi ini bukan kode golf, jadi ...
Tahap-tahap ini pada dasarnya sama dengan di atas, kecuali bahwa kedua nomor input dikonversi, dan hasilnya menggunakan
1
s bukannyaN
s (bukan itu penting). Jadi jika inputnya adalah18 24
, maka ini akan menghasilkanSekarang
adalah seluruh perhitungan GCD. Kami mencocokkan pembagi umum dengan menangkap sejumlah
1
s, dan kemudian menggunakan referensi kembali untuk memastikan bahwa kedua angka dapat ditulis dengan mengulangi string itu (dan tidak ada yang lain). Karena cara backtracking bekerja di mesin regex (yaitu yang.+
serakah), ini akan selalu menghasilkan yang terbaik pembagi umum secara otomatis. Karena pertandingan mencakup seluruh string, kami cukup menulis kembali grup penangkap pertama untuk mendapatkan GCD kami.Akhirnya, konversi unary ke desimal ...
Tambahkan penanda
#
, pembatas:
dan semua digit ke string. Ini perlu, karena Anda tidak dapat menghasilkan karakter baru secara kondisional dalam penggantian regex. Jika Anda ingin penggantian bersyarat, Anda perlu menarik karakter dari string itu sendiri, jadi kami menempatkannya di sana.Ini adalah kebalikan dari ekspansi unary sebelumnya. Kami menemukan kelipatan 10 terbesar yang cocok dengan string saat ini. Kemudian kita memilih digit berikutnya berdasarkan sisanya, dan membaginya dengan 10, sambil memindahkan marker melalui digit.
Dan terakhir hanya langkah pembersihan untuk menghilangkan marker, pembatas, dan digit helper.
sumber
2013 - Snap !
Jepret ! adalah bahasa berdasarkan Scratch , dibuat di Universitas Berkeley. Ini merupakan pemutakhiran untuk Scratch yang menampilkan data kelas satu dan blok khusus (fungsi). Seperti Scratch, ini bukan berbasis teks, melainkan dilakukan oleh "blok" visual yang saling berhubungan.
Jepret ! , yang ditulis dalam JavaScript, adalah penerus BYOB, yang ditulis dalam Squeak Smalltalk. Jepret ! beta dirilis untuk konsumsi publik pada Maret 2013 .
Jepret ! sebenarnya bukan bahasa esoterik. Ini digunakan sebagai bahasa pemrograman untuk Beauty and Joy of Computing (BJC) kursus CS CS di Berkeley dan lainnya.
Saya membantu dengan pengujian dan sebagainya.
Varian "Hello World"
Seni ASCII "N"
Ini menggunakan stdlib untuk beberapa blok.
Perulangan yang cukup mendasar di sini. Mengambil input. Kemudian kita tambahkan semuanya dan katakan (hasil untuk n = 5):
Saya mengambil kebebasan di sini untuk hanya menggunakan 2 spasi alih-alih 1, karena Snap! tidak mengatakan hal-hal di luar angkasa.
GCD
Algoritma Euclidean tidak terlalu cepat, tetapi berfungsi, dan cukup sederhana. (Maaf, saya membuat kesalahan ketik pada nama blokir. Sekarang saya menutup tab tanpa menyimpan. Ini harus tetap tinggal.)
Definisi fungsi ini kemudian akan menghasilkan blok ini:
sumber
2007 - LOLCODE
Sejarah Bahasa
LOLCODE dibuat pada 2007 oleh Adam Lindsay, seorang peneliti di Lancaster University. Sintaksisnya didasarkan pada meme lolcat yang dipopulerkan oleh Cheezburger, Inc.
"Halo Dunia!" Varian
ASCII Seni N
Nilai dibaca sebagai string (BENANG) dari stdin menggunakan
GIMMEH
. Mereka dapat dikonversi menjadi numerik (NUMBR) dengan mengalikannya dengan 1.Nilai dicetak ke stdout menggunakan
VISIBLE
. Secara default, baris baru ditambahkan, tetapi dapat ditekan dengan menambahkan tanda seru.GCD
SMOOSH
melakukan penggabungan string.sumber
IM IN YR toilet UPPIN YR butt
Nama variabel yang bagusx1
,x2
, dll1982 - PostScript
PostScript adalah bahasa untuk membuat grafik dan pencetakan vektor.
Adobe didirikan pada tahun 1982, dan produk pertama mereka adalah PostScript. Bahasa itu digunakan dalam printer: perintah ditafsirkan oleh printer untuk membuat gambar raster, yang kemudian dicetak ke halaman. Itu adalah komponen yang sangat umum dari printer laser hingga 1990-an. Tapi itu jelas cukup intensif CPU pada printer, dan ketika prosesor komputer menjadi lebih kuat, lebih masuk akal untuk melakukan rasterisasi pada komputer daripada printer. PostScript sebagian besar sudah hilang pada printer konsumen, meskipun masih ada pada banyak printer high-end.
Standar yang menggantikan PostScript adalah format yang sedikit dikenal yang disebut PDF.
PostScript telah keluar dari mode pada saat saya mulai pemrograman, tetapi saya belajar sedikit ketika saya masih di universitas sebagai cara lain untuk membuat dokumen untuk TeX. Itu sangat berbeda dengan bahasa pemrograman lain yang pernah saya gunakan (notasi terbalik, susun, cetak ke halaman, bukan konsol), tapi itu menyenangkan untuk menghapus bahasa lama ini untuk bersenang-senang.
Karena PostScript adalah bahasa cetak, tampaknya lebih tepat untuk menggunakannya untuk mencetak sesuatu kemudian mengirim output ke konsol.
Tugas 1
Beberapa baris pertama mengatur kanvas untuk menggambar. Kemudian
moveto
perintah memberi tahu PS untuk menggambar pada posisi tertentu, danshow
mencetak string ke halaman. Perhatikan bahwa tanda kurung menandai sebuah string dalam PostScript, bukan tanda kutip.Tugas 2
Saya menulis sebuah fungsi untuk menggambar "ASCII art" N, tetapi tidak ada cara bagi fungsi PostScript untuk mengambil argumen. Sebagai gantinya, Anda mendorong argumen Anda ke tumpukan, lalu mendapatkannya kembali. Itu adalah
/x exch def
intinya.Contoh: misalkan tumpukan itu
8 9 2
. Pertama kita dorong nama/x
ke tumpukan, jadi tumpukan itu8 9 2 /x
. Theexch
Operator swap dua nilai stack, jadi sekarang tumpukan8 9 /x 2
. Laludef
muncul dua nilai tumpukan teratas, dan tentukan/x
untuk memiliki nilai tersebut2
. Tumpukan sekarang8 9
.Ketika saya mulai menggunakan PostScript, saya menemukan ini sedikit membingungkan. Saya telah membaca tentang tumpukan sebagai konsep teoretis, tetapi ini adalah pertama kalinya saya menggunakannya dalam praktik.
Sisa dari fungsi ini adalah beberapa kode gambar: mulai dari sudut kanan bawah, mengisi baris sekaligus dari kiri-ke-kanan-ke-diagonal.
Tugas 3
Sekali lagi, saya menggunakan bentuk algoritma Euclid, tetapi saya lupa bahwa PostScript memiliki operator modulo bawaan, jadi saya harus menulis sendiri. Ini ternyata menjadi pengingat yang berguna tentang kendala pemrograman berbasis stack. Implementasi pertama saya
modulo
didasarkan pada rekursi:yang bagus sampai Anda mencoba menjalankan ini ketika
x
besar dany
kecil (mis. 5689 dan 2). Anda hanya dapat memiliki hingga 250 elemen pada tumpukan, dan saya meniup melebihi batas tumpukan. Ups. Saya harus kembali ke papan gambar untuk yang itu.Kode GCD itu sendiri cukup sederhana. Tapi sama seperti fungsi tidak bisa mengambil argumen, jadi mereka tidak memiliki nilai balik. Sebagai gantinya, Anda harus mendorong hasilnya ke tumpukan di mana orang lain dapat mematikannya nanti. Itulah yang
a
danb a gcd
baris: ketika mereka selesai mengevaluasi, mereka mendorong nilai ke tumpukan.Jika Anda memasukkan semua kode dalam dokumen dan mencetaknya, seperti inilah hasilnya:
sumber
2009 - > <>
Terinspirasi oleh Befunge,> <> (Fish) adalah bahasa 2D berbasis stack esoterik, yaitu aliran program bisa naik, turun, kiri atau kanan. Versi awal> <> menampilkan multithreading di mana
[
dan]
membuat dan mengakhiri utas, tetapi untuk alasan kesederhanaan petunjuk ini diubah untuk membuat dan menghapus tumpukan baru masing-masing.Penerjemah resmi saat ini untuk> <> dapat ditemukan di sini . Sayangnya, tautan ke interpreter lama di Esolang wiki rusak.
"Halo Dunia!" Varian
Perhatikan bagaimana string ditulis mundur -> <> secara teknis tidak memiliki string, dengan satu-satunya tipe data yang merupakan campuran aneh char, int dan float.
"
matikan string parsing, mendorong masing-masing karakter ke tumpukan sampai penutupan"
bertemu.Bagian kedua dari kode kemudian mendorong panjang stack
l
, memeriksa apakah itu nol?!
dan jika demikian program berakhir;
. Kalau tidak, penunjuk instruksi berlanjut, mengeluarkan bagian atas tumpukan dengano
sebelum mengeksekusibb+0.
, yang akan memindahkan penunjuk ke posisi(22, 0)
tepat sebeluml
, menciptakan satu lingkaran.ASCII Seni N
Dengan spasi untuk kejelasan. Anda dapat mencobanya di penerjemah online baru di sini dan melihat penunjuk instruksi berputar-putar - ingatlah untuk memasukkan nomor di kotak teks "Tumpukan Awal". Jika Anda menjalankan melalui juru bahasa Python, gunakan
-v
bendera untuk menginisialisasi tumpukan, misalnyaUntuk program ini, kami memasukkan input
n
ke register&
dan menekan 0, yang akan kami sebuti
"iterations". Sisa dari program ini adalah loop raksasa yang berlangsung seperti ini:Lalu kami mengulangi loop dari awal.
Panah
^>v<
mengubah arah aliran program dan cermin/\
mencerminkan arah aliran program.GCD
Berikut ini contoh dari apa yang terlihat seperti program golf>>. Sekali lagi, Anda dapat mencoba ini dalam juru bahasa online (masukkan dua nilai yang dipisahkan koma, dalam kotak "Tumpukan awal", misalnya
111, 87
) atau dengan menggunakan-v
bendera juru bahasa Python, misalnyaProgram ini menggunakan algoritma Euclidean. Inilah GIF yang saya siapkan sebelumnya:
Perhatikan bahwa> <> adalah toroidal, jadi ketika bagian kiri bawah
v
instruksi dijalankan, penunjuk instruksi akan turun, membungkus, dan muncul kembali di atas.Sunting: Dengan membuat kode sepenuhnya berjalan dari kanan ke kiri , @randomra berhasil mencukur tiga byte dengan
Kira saya tidak cukup golf :)
sumber
><>
adalah palindrom.2012 - Elemen
Ini adalah bahasa yang saya ciptakan pada awal 2012 untuk menjadi bahasa golf yang sederhana. Maksud saya, ada sedikit atau tidak ada kelebihan operator. Operator juga lebih sederhana dan lebih sedikit jumlahnya daripada kebanyakan bahasa golf modern.
Fitur yang paling menarik dari bahasa ini adalah struktur datanya. Ada dua tumpukan dan hash yang digunakan untuk menyimpan informasi.
M-stack adalah tumpukan utama, di mana aritmatika dan sebagian besar operasi lainnya berlangsung. Ketika data dimasukkan atau dicetak, ini adalah tempat ia diambil atau diambil.
C-stack adalah tumpukan kontrol. Di sinilah aritmatika boolean berlangsung. Nilai-nilai teratas dari c-stack digunakan oleh If and While loop sebagai kondisinya.
Hash adalah tempat variabel disimpan. Itu
;
dan~
menyimpan dan mengambil data dari hash, masing-masing.Elemen adalah bahasa yang diketik dengan sangat lemah. Ini menggunakan kemampuan Perl untuk secara bebas menafsirkan angka sebagai string dan sebaliknya.
Sementara saya melakukannya, saya mungkin juga menyertakan semua dokumentasi untuk bahasa tersebut. Anda dapat menemukan penerjemah asli 2012, yang ditulis dalam Perl, di sini . Pembaruan: Saya telah membuat versi yang lebih bermanfaat, yang dapat Anda temukan di sini .
Tugas 1 - Cetak Teks
Salah satu bagian yang lebih canggung dari bahasa ini adalah tidak adanya pembatas string, oleh karena itu diperlukan karakter pelarian dalam string ini. Itu
`
pada akhirnya mencetak string.Tugas 2 - ASCII Seni N
Di sini, Anda akan menyaksikan beberapa manipulasi tumpukan. Untuk membuat penjelasan sedikit lebih mudah diformat, saya akan mengganti baris baru dengan
L
dan spasi denganS
.Setelah melakukan beberapa golf ekstrim dari jawaban ini, saya menemukan solusi 39 byte, walaupun jauh lebih rumit.
Tugas 3 - GCD
Ini adalah metode berbasis tumpukan.
sumber
2012 - Julia
Sejarah Bahasa
Julia dikembangkan pada 2012 oleh Jeff Bezanson, Stefan Karpinski, dan Viral Shah sementara Jeff adalah seorang mahasiswa di Institut Teknologi Massachussets (MIT), disarankan oleh profesor Alan Edelman. Mereka termotivasi oleh keinginan untuk bahasa pemrograman yang bersifat open source, cepat, dan dinamis (di antara banyak hal lain) sambil mempertahankan kemudahan penggunaan dalam berbagai aplikasi. Produknya adalah Julia, pendekatan baru untuk komputasi ilmiah berkinerja tinggi.
"Halo Dunia!" Varian
Mencetak ke STDOUT di Julia cukup sederhana!
ASCII Seni N
Kode ini indentasi agar mudah dibaca, tetapi Julia tidak memberlakukan batasan pada spasi putih.
GCD
Hal terakhir yang tercantum dalam fungsi dikembalikan secara implisit.
sumber
1988 - Mathematica
Atau haruskah saya menyebutnya Bahasa Wolfram ?
Tugas 0
Pencipta Mathematica adalah Stephen Wolfram, Pendiri dan CEO Wolfram Research. Sebelum perkembangan Mathematica, dia adalah seorang ahli fisika. Ada sejumlah besar perhitungan aljabar dalam fisika, jadi dia menjadi pengguna Macsyma .
Wolfram mendapatkan PHD-nya pada tahun 1979, ketika dia berusia 20 tahun. Dia berpikir bahwa dia membutuhkan CAS yang lebih baik daripada Macsyma untuk melakukan fisika, jadi dia mulai menulis SMP ("Program Manipulasi Simbolik"). Versi pertama SMP dirilis pada tahun 1981. SMP adalah pendahulu dari Mathematica. Meskipun memiliki pengaruh yang mendalam pada Mathematica, tidak ada kode yang pernah digunakan untuk Mathematica.
Pada tahun 1986, Wolfram memutuskan untuk menulis "sistem perhitungan ultimat". Dia mulai menulis kode pada tahun 1986, dan mendirikan Wolfram Research pada tahun 1987. Akhirnya, Mathematica 1.0 dirilis pada 23 Juni 1988.
Saya tidak menemukan Mathematica 1.0. Faktanya, Mathematica 1.0 tidak memiliki versi Windows atau Linux. Tetapi saya menemukan Mathematica 2.0 di situs web Tiongkok. Itu masih bisa dijalankan di Windows XP.
Tugas 1
Atau sederhananya:
Tugas 2
Dalam Mathematica hari ini, kita dapat menulis:
Sama seperti Julia dan R , ini adalah solusi matriks. Dalam Mathematica, Anda dapat menentukan matriks jarang menggunakan pencocokan pola.
Namun,
SparseArray
diperkenalkan di Mathematica 5.0, jadi kami tidak dapat menggunakannya di Mathematica 1.0.Berikut ini solusi yang berfungsi di Mathematica 1.0:
Kami tidak dapat menulis
f[i_, 1 | i_ | n] = "N"
karenaAlternatives
diperkenalkan di Mathematica 2.0.Tugas 3
Kami hanya dapat menggunakan fungsi bawaan:
Atau kita dapat menggunakan definisi GCD:
Atau kita dapat menggunakan LCM , meskipun lebih umum LCM dihitung dari GCD:
Atau kita dapat menggunakan algoritma Euclidean dengan pencocokan pola:
Atau sebagai fungsi anonim:
Semua fungsi di atas diperkenalkan di Mathematica 1.0.
sumber
1999 - XSLT
The World Wide Web Consortium (W3C) dibuat XSLT untuk mengubah XML menjadi HTML, teks, dll Contoh berikut mengasumsikan masukan tertutup dalam
<input>..</input>
tag.Tugas 1
Yang ini sederhana. Cocok dengan
input
tag di tingkat atas dan menggantinya dengan output yang diinginkan.Tugas 2
Yang ini mendefinisikan 2 templat rekursif,
loop
danspaces
.loop
dengan parameteri
dann
akan menghasilkan output yang diinginkann
, mulai dari posisii
.spaces
dengan parametern
akan menghasilkann
spasi.Tugas 3
Masukan untuk ini harus dalam
<input><num>..</num><num>..</num></input>
tag.Yang ini hanyalah templat rekursif
gcd
yang menggunakan algoritma Euclidean.sumber
2014 - CJam
CJam dibuat oleh pengguna aditsu PPCG dan dirilis sekitar April 2014 .
"Halo Dunia!" Varian
CJam secara otomatis mencetak isi tumpukan di akhir program
ASCII Seni N
Penjelasan kode:
Mengambil tinggi / lebar N sebagai input melalui STDIN. Cobalah online di sini
GCD
Mengambil dua angka sebagai input melalui STDIN. Cobalah online di sini
sumber
ri_S*0'NtW'Nta1$*\,Sf*'Nf+..e>N*
di CJam modern.1990 - Haskell
Haskell adalah bahasa fungsional murni yang populer (atau harus saya katakan: paling populer ?). Itu menonjol dari arus utama dengan model evaluasi yang tidak biasa (secara default, semuanya malas atau, secara teknis, tidak ketat) dan oleh sistem tipe berbasis Hindley-Milner yang, bahkan sekarang, masih di antara yang paling kuat di luar sana.
Tugas 1
Tugas 2
Demo, cetak seluruh daftar tanpa batas (hingga pengguna batal, atau dunia berakhir ...)
Tentu saja, Anda dapat dengan mudah mencapai salah satu dari ini, dengan mengakses hanya satu elemen dari daftar tak terbatas:
Tugas 3
sumber
1972 - INTERCAL
Dan Anda pikir Fortran dan Cobol aneh. Ini gila!
Tugas 1
Saya tidak akan mencoba menjelaskan sistem input dan output INTERCAL; Bacalah ini dan berharap kamu tidak mati.
Tugas 2
Aduh, masya Allah.Saya butuh sedikit waktu untuk mencari tahu. Nomor labelnya berantakan dan karenanya mencerminkan hal itu. Saya tidak akan mencoba menjelaskan ini kecuali ada yang bertanya.
Tugas 3
Ini agak sederhana. Karena ... keanehan INTERCAL, Anda harus memasukkan angka seperti ini:
Misalnya, untuk mendapatkan GCD 42 dan 16, saya akan memasukkan:
Ini juga mencetak angka dalam angka Romawi ... karena itu INTERCAL untuk Anda!
sumber
PLEASE GIVE UP
. Saya sudah melakukannya .-.1967 - APL
Pada tahun 1957, di Universitas Harvard, Ken Iverson mulai mengembangkan notasi matematika untuk manipulasi array. Selama 1960-an, notasinya dikembangkan menjadi bahasa pemrograman di IBM. Implementasi parsial pertama dibuat pada tahun 1963, dan bahkan digunakan di sekolah menengah untuk mengajar siswa tentang fungsi transendental. Implementasi yang lengkap dan dapat digunakan harus menunggu hingga 1965. Selama dua tahun itu hanya digunakan secara internal oleh IBM. Pada tahun 1967, IBM merilis kepada publik juru bahasa APL yang dijalankan pada komputer IBM 1130, yang telah selesai pada tahun 1966. Anda dapat memahami betapa sulitnya memilih tahun untuk itu, namun, saya pikir itu seharusnya tahun 1967, karena ini adalah tahun pertama implementasi penuh tersedia untuk umum. Jika ada yang benar-benar tidak setuju, saya bisa mengubahnya.
Kode sumber untuk APL \ 360, sedang online , seperti halnya sebuah emulator. Inilah yang saya gunakan untuk menguji contoh-contoh ini. Berasal dari tahun 1967, dan bersama dengan APL \ 1130 (untuk IBM 1130 yang disebutkan di atas) ini lebih atau kurang asli. Seperti yang diharapkan, ini sangat primitif. Tidak memiliki dukungan untuk basa-basi seperti huruf kecil, setiap operator hanya bekerja dengan fungsi builtin, dan set fungsi builtin sangat jarang (khususnya,
∨
adalah hanyaor
, dan tidak tidak ganda sebagaigcd
). Deskripsi asli dan lengkap tersedia di sini , namun, saya perhatikan bahwa versi yang saya miliki bahkan tidak lengkap sehubungan dengan dokumen itu, kurang⍎
antara lain.Saya telah menyediakan program-program baik dalam format Unicode (sehingga Anda dapat membacanya), dan dalam pengkodean asli (sehingga Anda dapat memotong dan menempelkannya ke jendela APL emulator).
Luar biasanya, program-program ini berjalan dengan benar tanpa ada perubahan (kecuali untuk pengkodean) dalam versi modern Dyalog, NARS2000, dan GNU APL. Jadi saya kira saya sudah menemukan cara untuk menulis APL portabel: hanya berpura-pura 1967!
Tugas 1:
Unicode:
APL \ 360:
Tugas 2:
Unicode:
APL \ 360:
Tugas 3:
Saya telah memecahkan ini dengan cara rekursif standar. Secara teori, Anda bisa melakukan sesuatu yang pintar dan berorientasi pada array, seperti jawaban J; dalam praktiknya, bagaimanapun, yang memiliki penggunaan memori O (N) dan dengan cepat menguasai perangkat keras dan perangkat lunak era Flower-Power.
Unicode:
APL \ 360:
sumber
1996 - Ocaml
Menunggu lebih dari sehari untuk mengisi tahun 1996, jadi saya bisa mengisi Ruby. Nah kenapa tidak belajar OCaml kalau begitu, sepertinya mirip dengan haskell ...
Halo Dunia
ASCII
String yang bisa berubah!
GCD
Tidak
==
dan infixmod
, itu lucusumber
2005 - Pendahuluan
Prelude adalah bahasa yang sangat menyenangkan, yang kode sumbernya terdiri dari beberapa "suara" yang dieksekusi secara paralel dan yang saya sangat menikmati memecahkan masalah di . Ini dimaksudkan untuk menjadi representasi ASCII dari bahasa saudara Fugue , yang benar-benar mengambil file .midi sebagai kode sumbernya dan mengkodekan instruksi yang ditemukan dalam Prelude sebagai interval dalam melodi suara-suara.
Prelude cukup minimalis, namun Turing lengkap (asalkan Anda menggunakan setidaknya 2 suara). Seperti yang saya katakan, suara-suara (baris kode) dieksekusi secara bersamaan, kolom demi kolom. Setiap suara beroperasi pada tumpukannya sendiri, yang diinisialisasi ke angka nol tanpa batas. Prelude mendukung instruksi berikut:
Beberapa catatan tambahan:
^
di bagian atas salinan suara dari suara bawah (dan sebaliknya).?
dan!
dalam kolom yang sama dieksekusi dari atas ke bawah.?
dan!
membaca dan menulis karakter dengan kode karakter yang sesuai. Namun, juru bahasa Python juga memiliki saklar dalam kodenya untuk mencetak angka sendiri. Untuk tujuan pengujian saya sebenarnya menggunakan versi modifikasi yang juga dapat membaca angka, bukan karakter. Tetapi konsensus di sekitar sini adalah bahwa input / output numerik sebenarnya dapat diberikan sebagai nilai byte, maka modifikasi ini tidak diperlukan untuk membuat program yang valid berurusan dengan angka.(
dan)
tidak harus dengan suara yang sama. Suara yang digunakan untuk kondisi selalu yang(
muncul. Oleh karena itu, posisi vertikal)
sama sekali tidak relevan.(
dieksekusi hanya sekali sebelum loop dimulai, dan terlepas dari apakah loop dimasukkan. Demikian pula, setiap instruksi dalam kolom yang sama dengan a)
dieksekusi pada akhir setiap iterasi, terlepas dari apakah loop akan keluar setelah iterasi ini.Pertama-tama saya akan menunjukkan kepada Anda tiga program tanpa banyak komentar. Anda dapat menemukan penjelasan lengkap di bawah ini.
Program
"Halo Dunia!" Varian
Jika Anda menggunakan juru bahasa Python, pastikan itu
NUMERIC_OUTPUT = False
.ASCII Seni N
Untuk kemudahan penggunaan, program ini mendapat manfaat dari membaca input sebagai angka, tetapi output tidak boleh berupa angka. Jadi jika Anda menggunakan interpreter Python yang dimodifikasi, atur
GCD
Ini paling baik digunakan dengan semua input / output numerik yaitu
Penjelasan
"Halo Dunia!" Varian
Ini cukup mudah. Saya menggunakan 3 suara untuk menghasilkan kode karakter untuk semua karakter secara berurutan
Prelude was made in 2005!
. Saya mulai dengan komputasi8 + 9*8 = 80
, yang merupakan kode karakterP
:Setelah itu saya kebanyakan hanya menyalin kode karakter sebelumnya dan menambah atau mengurangi perbedaan ke yang berikutnya. Berikut adalah kode, tetapi masing-masing
!
diganti dengan karakter yang sedang dicetak (dan_
untuk spasi dan%
untuk digit):Final
55+!
mencetak baris baru, hanya karena lebih bagus.Sebagai catatan, jumlah suara cukup sewenang-wenang untuk tugas ini, tetapi 3 cukup nyaman karena jumlah terbesar di mana setiap suara dapat secara langsung mengakses satu sama lain suara.
ASCII Seni N
Dengan 5 suara, ini jelas merupakan salah satu program paling kompleks yang saya tulis sejauh ini. Suara-suara secara kasar memiliki tujuan sebagai berikut:
N-1
untuk digunakan di loop dalam.32
ruang cetak yang nyaman.78
untuk mencetak dengan mudahN
.Mari kita melalui bagian kode bagian demi bagian. Pertama, saya membuat
32
as-4 + 9*4
dan78
as6 + 9*8
:Sekarang saya sedang mencetak satu
N
(karena kita selalu membutuhkan satu) saat membaca inputN
dan menyimpanN-1
danN-2
dalam dua suara pertama:Selanjutnya, ada "loop" dikondisikan
N-1
. Pada akhir loop, suara kedua selalu dikurangi menjadi0
, dan loop keluar setelah iterasi pertama. Jadi intinya, ini sajaif(N > 1){...}
. Setelah loop kami mencetak satu baris baru. Untuk rekap, kami sekarang memiliki kerangka kerja berikut:Di dalam kondisi ini, kita
N-2
spasi pertama dan satuN
untuk menyelesaikan baris pertama, dan kita juga menyimpanN-1
suara pertama untuk digunakan di masa depan:Sekarang daging kode yang sebenarnya. Pertama, ada loop luar, yang mencetak
N-1
baris. Untuk setiap baris, pertama-tama kita mencetak baris baru, dan sebuahN
. Kemudian kita mengulangN-2
kali, mencetak spasi atauN
s (lebih lanjut tentang itu nanti). Dan akhirnya kami mencetak lagiN
:Akhirnya, bagian yang menyenangkan: mencetak setiap baris (dan mendapatkan posisi yang
N
benar). Sebenarnya tidak ada if / else di Prelude, jadi saya harus membuatnya sendiri menggunakan dua loop pada suara yang berbeda. Kondisi ini dapat dengan mudah diperoleh dengan mengurangi variabel loop dalam dan luar - kita dapatkan0
jika kita ingin mencetakN
dan sesuatu yang tidak nol jika kita ingin mencetak spasi.Gagasan dasar dari if / else di Prelude adalah menempatkan loop setelah nilai yang relevan - kode "jika" (atau bukan nol), dan segera keluar dengan menekan a
0
. Di suara lain, Anda menyimpan nilai yang tidak nol, dan loop lain setelah loop "jika". Selama loop "jika" Anda meletakkan nol di atas suara lain itu, untuk mencegah eksekusi "lain". Ada beberapa fleksibilitas dalam apakah Anda mendorong nilai nol di atas nilai bukan nol atau hanya membuang nilai bukan nol jika ada nol di bawahnya, tetapi ini adalah ide umum. Anda mungkin juga harus melakukan pembersihan setelah itu, jika Anda ingin tetap menggunakan suara yang relevan. Seperti apa kode ini:Dan itu dia!
GCD
Ini "hanya" implementasi berulang dari algoritma Euclidean. Tetapi modulo di Prelude agak mengganggu, sebagian besar karena Anda tidak dapat dengan mudah memeriksa apakah suatu angka positif atau negatif. Kode ini memanfaatkan implementasi signum yang saya tulis beberapa waktu lalu . Yaitu sebagian besar kode hanya mengubah angka menjadi
-1
,0
atau1
. Ini kemudian dapat dengan mudah diubah menjadi kondisi untuk angka positif atau negatif dengan menambahkan atau mengurangi1
.Jadi kita punya empat suara saat ini. Suara pertama hanya melacak
b
dan berisi kondisi terminasi utama (yaitu loop keluar saatb
menjadi0
). Suara kedua berisia
dan dengan bantuan suara tiga dan empat menghitunga % b
, sebelum menukar hasilnya dengan yang sebelumnyab
. Akhirnya,!
dicetaka
kapanb == 0
.Mari kita lihat bagian signum terlebih dahulu:
Nomor input
n
ditemukan pada suara pertama (suara kedua dalam program lengkap). Hasilnya akan berakhir di suara bawah. Dua suara lainnya diharapkan kosong (yaitu diisi dengan nol). Perhatikan bahwa, jikan == 0
, maka kedua loop dilewati dan suara bawah masih berisi0
, hanya apa yang kita inginkan.Jika
n
bukan nol, loop kecil pertama dimasukkan. Kami mendorong nol untuk segera keluar, menempatkan dua salinann
ke suara tengah dan1
ke suara bawah. Sekarang ide dasarnya adalah untuk menambah satu salinann
sementara mengurangi salinan lainnyan
hingga salah satu dari mereka mencapai nol. Saat melakukan hal itu, suara1
di bagian bawah membalik tandanya sepanjang waktu (yang mudah dilakukan dengan mengurangkannya dari0
bawahnya di tumpukan). Ini diatur sedemikian rupa sehingga ketika salah satu angka mencapai nol, suara bawah akan berisi tanda yang benar.Sekarang modulo diimplementasikan dengan mengurangi
b
daria
hingga hasilnya negatif. Ketika itu terjadi, kami menambahkan satub
lagi. Itu sedikit ini:Perhatikan konstruksi if / else di bagian bawah, yang mirip dengan yang saya gunakan untuk Tugas 2.
sumber
2007 - Gores
Menggaruk adalah bahasa yang dibuat oleh MIT untuk tujuan pendidikan. Saya sudah sangat terlibat dengannya selama 5 tahun; lebih lanjut tentang itu nanti.
Semua ini dapat dilihat di sini .
Saya sangat terburu-buru sekarang dan akan menjelaskan potongan nanti. Semoga mereka cukup jelas.
Tugas 1
Tugas 2
Tugas 3
sumber
1972 - C
Kita semua tahu tentang C, bukan? C dibuat di Bell Labs, bersama dengan Unix. Unix sebagian besar ditulis dalam C. Semua turunan modern Unix sebagian besar masih ditulis dalam sintaksis C. C telah mempengaruhi banyak, banyak bahasa pemrograman. Mungkin bahasa pemrograman tertua yang masih digunakan secara luas untuk pengembangan baru.
C sendiri adalah turunan dari B, yang saya harap akan berakhir di daftar ini juga. Tidak ada bahasa pemrograman 'A': B adalah varian dari BCPL, yang pada gilirannya adalah CPL yang dipreteli. Tidak satu pun dari bahasa ini yang sangat populer. Namun, BCPL adalah bahasa tempat program "Hello World" pertama kali ditulis. Fakta lain yang menarik adalah bahwa B memiliki keduanya
/* */
dan//
komentar, tetapi C menjatuhkan//
komentar. Mereka kemudian diperkenalkan kembali ke C dengan standar C99.Program C di sini diuji dengan kompiler Unix V5 C, dari tahun 1974. Ini adalah kompiler C tertua yang dapat saya temukan dan mulai bekerja, dan program ini tidak akan dikompilasi pada kompiler C modern. (Salah satu perubahan yang dibuat adalah bahwa operator mutasi seperti
+=
dulu ditulis=+
.)#include <
...>
belum ada. Perpustakaan standar juga tidak banyak. Saya harus menulis sendiriatoi
. Saya membaca beberapa kode sumber V5 untuk mencari tahu hal-hal mana yang diperbolehkan dan mana yang tidak. Versi yang saya gunakan adalah yang pertama untuk memasukkanstruct
s, tetapi karena saya tidak menggunakan itu, dan sintaks tampaknya tidak banyak berubah sampai V7 (seperti K&R C), ini mungkin bekerja dengan versi sebelumnya juga.Saya telah melakukan yang terbaik untuk menulis kode saya dengan gaya yang sama dengan menggunakan kode sumber V5. (Bukan berarti itu sangat konsisten.)
Lihat di sini untuk tautan ke Unix V5, sebuah emulator, dan instruksi untuk menjalankannya di komputer modern.
Tugas 1
Tugas 2
Tugas 3
sumber
cat > file.c
. (Akhiri dengan Ctrl-D, seperti biasa). Juga, C telah berubah kurang dari yang Anda kira: jika Anda menukar=*
dan=+
dalamatoi
fungsi untuk ekuivalen modern*=
dan+=
, GCC modern akan mengkompilasi mereka dengan baik dan mereka berjalan juga. Hampir tidak ada peringatan, bahkan.2009 - Idris
Idris adalah bahasa fungsional murni yang diketik secara dependen, yang menekankan bahwa pada kenyataannya praktis dapat digunakan untuk aplikasi dunia nyata, selain menawarkan kemungkinan bukti yang sangat ketat yang dapat dicapai dengan tipe dependen.
Tugas 1
Tugas 2
Yang ini bukan program tetapi hanya fungsi (lebih tepatnya, nilai dependen ), menghasilkan huruf N yang diinginkan sebagai array dua dimensi.
Tugas 3
Perhatikan bahwa saya harus memilih nama
gcd'
karena sepertigcd
yang sudah ditentukan dalam pendahuluan Idris.sumber
:
dan::
, dan berubah_
menjadiZ
.Z
sebenarnya adalah konstruktor dari0 : Nat
. Garis bawah digunakan di Idris sama seperti di Haskell.:)
2014 - Pyth
Karena kita memiliki CJam, kita mungkin juga memiliki Pyth untuk kelengkapan :)
Pyth adalah bahasa golf oleh @isaacg yang mengkompilasi ke Python. Ini penting untuk menjadi prosedural dan untuk menggunakan notasi awalan. Pyth pertama kali muncul sekitar Juni 2014 .
"Halo Dunia!" Varian
Perhatikan kurangnya kutipan penutup, yang merupakan opsional jika program Pyth berakhir dengan string.
ASCII Seni N
Cobalah online . Python yang setara adalah:
Atau diperluas (baris pertama dan ketiga tersirat):
GCD
Program ini menggunakan algoritma Euclidean, dan mengambil dua angka yang dipisahkan oleh baris baru. Cobalah online .
i.uQ
bahkan lebih pendek jika kita menggunakan builtin untuk GCD. Ini sama denganprint(gcd(*eval(input())))
(mengambil dua angka yang dipisahkan koma sebagai input).sumber
1964 - DASAR Dartmouth
BASIC adalah keluarga bahasa pemrograman tingkat tinggi tujuan umum yang filosofi desainnya menekankan kemudahan penggunaan. Pada tahun 1964, John G. Kemeny dan Thomas E. Kurtz merancang bahasa BASIC asli di Dartmouth College di New Hampshire. Mereka ingin memungkinkan siswa di bidang selain sains dan matematika untuk menggunakan komputer.
Saya melihat manual ini pada BASIC dari tahun 1964, dan emulator dari Sistem Berbagi Waktu Darthmouth ini dijalankan. Server masih menyala, tetapi sayangnya, mendaftarkan akun sepertinya tidak mungkin. Untuk saat ini, program-program ini secara teoritis akan berfungsi:
Tugas 1
Tugas 2
Mengeluarkan sesuatu seperti:
Perhatikan bagaimana input diketik sebagai bagian dari program (
70 DATA 5
); denganREAD
cara instruksi di atas mengambil data dari sana. Tidak ada penggabungan string, tetapi bagian 3.1 dari manual ini menjelaskan caranyaPRINT
hasil dituliskan ke "zona" yang ditabulasi pada output.Tugas 3
Algoritma Euclid versi lambat:
Keluaran:
sumber
2010 - WTFZOMFG
WTFZOMFG adalah bahasa esoterik berdasarkan Brainfuck. Itu dibuat oleh Jay Songdahl pada tahun 2010. "WTFZOMFG" adalah kependekan dari "What That Function? Zen Dioptimalkan File Gophers Berbahaya!" .
Berikut ini adalah kompiler untuk sistem * nix .
Tugas 1
Tugas 2
Penjelasan:
Maaf. Saya tidak pandai menulis penjelasan.
Tugas 3
Algoritma Euclidean. WTFZOMFG tidak memiliki perintah untuk mod, jadi saya harus menggunakan
d
(membagi),m
(mengalikan) dans
(mengurangi).sumber
2009 - Pergi
Go adalah bahasa pemrograman yang dikembangkan oleh Google. Pengembangan dimulai pada 2007, tetapi Go diumumkan pada November 2009.
Go adalah bahasa yang diketik secara statis yang dipengaruhi oleh C yang menekankan keringkasan, kesederhanaan, dan keamanan.
Tugas 1:
Baris pertama menyatakan paket kode. Bahkan contoh sederhana seperti mencetak satu baris harus menjadi bagian dari satu paket. Dan executable selalu dipanggil
main
.Tugas 2:
Go memiliki deklarasi variabel yang cukup ringkas (
i := 0
sama denganvar i int = 0
), dan kompiler menentukan jenisnya. Ini biasanya fitur yang lebih umum dalam bahasa dinamis. Menggunakan notasi singkat ini juga sangat mudah untuk menetapkan fungsi ke variabel (f := func(x int) int {/* Code */}
) dan membuat Penutupan.Tugas 3:
Di sini Anda dapat melihat
a, b = b, a%b
sintaks, yang sangat bagus. Saya tidak tahu nama persisnya, tetapi dalam Python itu disebut tuple unpacking. Dengan menggunakan cara yang sama Anda dapat mengembalikan beberapa nilai dari suatu fungsi (func f() (int, string) { return 42, "Hallo"}
).Hal lain yang terjadi dalam kode ini adalah loop. Untuk loop adalah satu-satunya loop di Go. Sementara loop atau do-while-loop tidak ada. Tetapi Anda dapat dengan mudah membuat yang setara untuk loop while
for condition {}
atau loop tak terbatasfor {}
.sumber
1991 - Python
Sejarah Bahasa
Pada akhir 1980-an, Guido van Rossum mulai menganggap Python sebagai hobi. Namanya berasal dari Monty Python Flying Circus, sebuah acara televisi Inggris di mana Rossum adalah penggemar. Implementasi Python pertama dimulai pada tahun 1989 dan dirilis pada tahun 1991. Ini telah melonjak dalam popularitas selama bertahun-tahun, menjadi bahasa pilihan bagi banyak kursus ilmu komputer pengantar.
"Halo Dunia!" Varian
Perhatikan tanda kurung di sekitar input
print
. Meskipun sintaks ini berfungsi dalam Python 2, biasanya dalam Python 2 Anda akan menghilangkan tanda kurung ini. Namun, mereka diperlukan dalam Python 3. Seperti yang disarankan oleh Zach Gates, tanda kurung digunakan di seluruh untuk memastikan bahwa kode yang disajikan di sini akan bekerja di berbagai versi.ASCII Seni N
Fungsi didefinisikan menggunakan
def
. Penggabungan string dilakukan menggunakan+
dan pengulangan string dengan*
.GCD
Perhatikan bahwa Python membutuhkan spasi kosong terstruktur.
sumber
1968 - Algol 68
Algol 68 didefinisikan oleh Kelompok Kerja IFIP 2.1 sebagai penerus Algol 60.
Ini adalah bahasa yang berorientasi ekspresi di mana segala sesuatu memiliki nilai. Ini juga ortogonal, di mana Anda dapat menggunakan konstruksi apa pun dengan cara apa pun. Ini berarti bahwa ekspresi dapat berada di RHS dan LHS dari suatu tugas, misalnya.
Semua struktur kontrol memiliki bentuk yang disingkat dan bentuk yang panjang menggunakan ekspresi. Ini juga memungkinkan definisi operator.
Sasaran bahasa dikutip sebagai:
Program-program ini telah diuji dengan juru bahasa Algol 68 Genie , yang merupakan implementasi lengkap dari bahasa tersebut.
Beberapa fitur yang mungkin berbeda oleh programmer modern, adalah pernyataan kosong tidak diizinkan. Anda tidak bisa hanya menambahkan di
;
mana saja. Anda harus menggunakanSKIP
pernyataan jika Anda ingin memiliki apa-apa secara eksplisit. Ini juga memungkinkan pengkodean program bersamaan sangat mudah. Algol 68 juga, terutama, menggunakan kata kunci mundur sebagai terminator, seperti esac , od , fi dll.Bahasa memiliki representasi yang digunakan untuk menulis kode yang menggunakan banyak font yang mewakili kata kunci dalam huruf tebal , dan pengidentifikasi dalam huruf miring , misalnya. Pada saat itu, dan mungkin masih, tidak ada kompiler yang mengimplementasikan fitur desain ini. Bahasa ini memungkinkan beberapa representasi konkret yang berbeda dari program menggunakan mode stropping . Ini memungkinkan program dipersiapkan menggunakan rangkaian karakter terbatas, seperti yang mungkin ditemukan di komputer pada 1960-an. Pertimbangkan fragmen program singkat, yang akan direpresentasikan sebagai:
Ini dapat disiapkan untuk kompiler dalam mode prime stropping sebagai:
Dalam mode dot stropping, ini akan menjadi:
Dalam mode case stropping ini akan menjadi:
Saya sangat menyukai bahasa ini karena saya mengerjakan salah satu implementasi kompiler, serta pemrograman di dalamnya secara eksklusif selama bertahun-tahun.
Tugas 1
Poin yang perlu diperhatikan di sini adalah tanda kurung ganda. Ini karena cetak adalah fungsi yang mengambil argumen tunggal yang merupakan array panjang variabel dari penyatuan semua jenis. Tanda kurung bagian dalam adalah konstruktor array. Beginilah cara polimorfisme ditangani dalam bahasa yang sangat diketik ini.
Dalam mode stropping case:
Tugas 2
Dalam mode stropping case:
Tugas 3
Dalam mode stropping case:
sumber
1962 - SNOBOL
The "StriNg Oriented and symBOlic Language". Pada awalnya tampaknya disebut Penafsir Simbolik Ekspresi, 'SEXI', yang kemudian harus diubah untuk mencegah kutu buku era 1960-an memerah ketika mengirimkan pekerjaan mereka. Kisah nyata.
Ini adalah salah satu bahasa pertama yang dapat menangani string dan pola secara asli. Memang, versi pertama SNOBOL memiliki string sebagai datatype -nya saja . Matematika kemudian dilakukan dengan parsing. Implementasi awal dilakukan pada IBM 7090. Tampaknya sudah lama berlalu, setidaknya, saya tidak bisa menemukannya. Apa yang saya temukan adalah makalah asli yang menggambarkannya serta juru bahasa SNOBOL3 di Jawa, yang dapat dijalankan pada komputer modern .
The SNOBOL pertama memiliki cukup banyak hanya pencocokan pola dan aritmatika dasar. SNOBOL 3 kemudian menambahkan fungsi dan mengubah I / O, tetapi sebaliknya tampaknya tetap kompatibel. SNOBOL 4 mengubah sintaksis, dan dari sana itu berkembang menjadi Icon , yang menjaga pencocokan pola tetapi hampir terlihat seperti bahasa pemrograman "normal" sebaliknya.
Program yang saya tulis hanya menggunakan fungsionalitas yang dijelaskan dalam kertas asli, jadi harus bekerja dengan SNOBOL asli dengan pengecualian I / O, yang saya lakukan dalam gaya SNOBOL3 sehingga penerjemah Java dapat menjalankannya. Dari makalah, tampaknya perbedaannya adalah bahwa SNOBOL1 menggunakan pencocokan pola dengan
SYS
variabel khusus , sedangkan SNOBOL3 menggunakan variabel input dan output:SYS .READ *DATA*
DATA = SYSPPT
SYS .PRINT 'A STRING' AND VARIABLES
SYSPOT = 'A STRING' AND VARIABLES
Membuat pergantian ini akan membuat Anda menjadi 'nyata' SNOBOL 1. Tentu saja, maka Anda tidak dapat menjalankannya.
Tugas 1
Tugas 2
Ini menunjukkan matematika, penanganan string dan kontrol aliran. SNOBOL3 memiliki fungsi yang berguna, seperti
EQ
untuk memeriksa kesetaraan; SNOBOL asli tidak, jadi saya belum menggunakannya.Tugas 3
Pertama, yang membosankan. Satu-satunya hal yang perlu diperhatikan adalah cek yang lebih kecil, yang menunjukkan dengan tepat bagaimana SNOBOL berorientasi string benar-benar:
(B - A) '-'
berarti "apakah hasil BA mengandung minus?". SNOBOL3 juga dapat melakukannyaLE(B,A)
, tetapi SNOBOL 1 tidak bisa (setidaknya makalah tidak menyebutkannya).Tentu saja, ketika Anda memiliki bahasa yang sepenuhnya berbasis string dan pencocokan pola, akan memalukan untuk tidak benar-benar menggunakan pencocokan dan penggantian pola. Jadi, inilah salah satu GCD berbasis unary, termasuk rutinitas untuk mengkonversi ke dan dari unary.
sumber
2012 - TypeScript
TypeScript adalah bahasa pemrograman open source gratis dan dikembangkan dan dikelola oleh Microsoft.
Tujuan utamanya adalah: Browser apa saja. Tuan rumah apa pun. OS apa saja. Sumber Terbuka. Album ini dirilis pada Oktober 2012
Halo TypeScript
Seni ASCII
GCD
coba online , dan screencast itu.
sumber
2011 - Dart
Dart adalah bahasa pemrograman Open Source yang dikembangkan oleh Google yang dikembangkan sebagai pengganti Javascript (walaupun dikompilasi ke javascript). Itu diresmikan oleh Google pada 2011 selama konferensi GOTO.
"Halo Dunia!" Varian:
ASCII Seni N:
Metode Bruteforce, berjalan pada 0 (n²), tetapi seharusnya tidak terlalu menjadi masalah kecuali Anda menggunakan angka raksasa.
GCD
Metode Euclid sederhana yang diporting dari Snap! contoh di atas.
sumber
2010 - Karat
Rust adalah tujuan umum, multi-paradigma, bahasa pemrograman yang disusun oleh Mozilla Research. Ini dirancang untuk menjadi "bahasa yang aman, konkuren, praktis", mendukung gaya fungsional murni, konkuren aktor, imperatif-prosedural, dan berorientasi objek. Wikipedia
Tugas 1
Tugas2
Penjelasan:
mengurus pencetakan hanya vertikal (kiri dan kanan
|
) dan diagonal (\
)Tugas 3
implementasi sederhana Euclidean_algorithm
sumber
2015 - Muffin MC
Muffin MC adalah bahasa makro Turing-lengkap, lucu (tapi serius), fungsional dan minimalis yang ditulis oleh Franck Porcher ( http://franckys.com ) pada pertengahan Februari 2015 karena kebutuhan sebagai alat (cepat) untuk memberdayakan suatu spreadsheet yang akan digunakan sebagai satu-satunya pengontrol front-end untuk menguji coba dan mengarahkan semua operasi terkait inventaris yang terkait dengan situs pedagang berbasis Prestashop untuk merek fesyen Tahiti baru: Mutiny Tahiti ( http://mutinytahiti.com - segera akan diluncurkan).
Muffin MC adalah akronim untuk MU mungil F unctional F lexible IN line M acro C ommand language.
Untuk memenuhi persyaratan kami, fitur inti Muffin MC telah dirancang dengan konstruksi semantik bawaan kelas 1 yang fleksibel dan efisien seperti iterator , evaluasi malas , multi-fungsi , produk string .
Muffin MC mengambil akarnya dalam pemrograman fungsional (pragmatis), FLisp dan Perl. Ini sepenuhnya mendukung rekursif (tanpa optimasi apa pun), diketik secara dinamis dan dibatasi secara dinamis (dangkal-mengikat). Ia menawarkan penggunanya satu struktur data saja, terlepas dari atom tipe-data dasar (atom, string, angka): daftar!
Semantik daftar MC Muffin (jenis) meminjam pada set daya semantik , yaitu:
Untuk berdamai dengan ini, hal-hal berikut dapat membantu:
Dengan demikian, mengakses elemen daftar kosong menghasilkan daftar kosong, dan bukan kesalahan! Memang, Muffin MC berusaha keras untuk melemparkan kesalahan sesedikit mungkin dengan memperluas semantik banyak operasi tradisional.
Tugas 1
#(...)
adalah perintah makro Muffin MC untuk menerapkan fungsi pada daftar argumen yang tidak ditampilkan, di sini fungsi bawaansay
, yang dipinjam dari Perl.#(say 1 2 3 ...)
secara fungsional identik denganmap {say $_} (1,2,3,...)
Tugas 2
Tentukan fungsi
ascii-art()
:Ascii-art()
Bentuk kerja terpendek (88 byte):=(var val...)
adalah perintah makro Muffin MC untuk mendefinisikan variabel, atau menugaskannya kembali.$(var)
adalah perintah makro Muffin MC untuk mengakses nilai variabel. Itu secara alami menerima formulir$(v1 v2 ...)
untuk mengakses banyak variabel sekaligus.=(* var1 val1 var2 val2 ...)
adalah perpanjangan dari perintah makro Muffin MC=(...)
untuk menangani penugasan paralel.Variabel
_1, _2
, ... dibatasi secara dinamis (mekanisme pengikatan dangkal) dan secara otomatis diatur untuk mengikat argumen fungsi. Dipinjam dari Perl5, variabel sistem#
(jumlah argumen) dan@
(daftar argumen) juga ditetapkan secara otomatis.Fungsi hanyalah variabel yang terikat pada sejumlah pernyataan Muffin MC .
Solusi menarik ini berasal dari menggabungkan dua fitur bawaan Muffin MC :
Perintah makro Muffin MC
I(...)
, untuk mendefinisikan siklus-iterator, yang kemudian digunakan dengan bentuk fungsional#(my-iterator want-number-of-values)
,Konstruk produk string Muffin MC , ekstensi dari interpolasi variabel alami, yang, diberikan string apa pun , di mana F i adalah string Muffin MC literal atau perintah makro Muffin MC (alias bentuk fungsional), akan menghasilkan sebanyak string diberikan oleh produk kardinal (F1) x kardinal (F2) x ....
"F1 F2 F3..."
Misalnya, diberikan variabel xa yang memegang 2 nilai, kata a dan b, dan variabel lain y yang memegang 3 nilai, mengatakan, 1 2 3, maka evaluasi string
"x=$(x) y=$(y))"
akan menghasilkan 6 nilai yang berbeda, yaitu, dalam urutan itu:Ini adalah salah satu fitur yang sangat diinginkan dari proyek MUTINY yang dirancang untuk Muffin MC .
Menjalankannya !
bagaimana cara kerjanya
Algoritma kami didasarkan pada yang berikut:
Diberi panggilan ke ascii-art (n), {n = 2p + 1 | p integer, p> = 0}, seni untuk menghasilkan terdiri dari n string n karakter, di antaranya, dua, yang paling kiri dan paling kanan, adalah tetap dan selalu sama: 'N'. Hal ini memungkinkan untuk mengurangi masalah dalam memproduksi hanya string tengah. Sebagai contoh, mengingat n = 5, kami ingin menghasilkan 5 string tengah berikut, masing-masing terbuat dari n-2 karakter (kami telah mengganti spasi dengan '_' demi visualisasi yang lebih baik):
String tengah semacam itu dapat dengan mudah diproduksi dengan bersepeda di atas urutan 4 elemen
('_' '_' '_' 'N')
dalam 5 grup 3; diberikan n, input fungsi, urutan tersebut dibuat dari n-2 karakter'_'
, diikuti oleh karakter'N'
. Bersepeda di atas urutan ini tidak membutuhkan apa pun selain menyisipkan urutan di dalam iterator bawaan Muffin MCI(sequence)
(sebuah iterator yang berputar selamanya atas urutan nilai awalnya).Kami kemudian hanya menghasilkan string tengah, panjang n-2, dengan meminta iterator kami untuk memberi kami nilai n-2 berikutnya (n - 2 karakter), yang digabungkan bersama untuk menghasilkan string tengah yang diharapkan.
String n tengah diproduksi dengan mengulangi n kali proses di atas, menggunakan peta untuk mengumpulkan hasil n (n string n-2 karakter).
Kami menggunakan kuat Muffin lain MC built-in konstruk, yaitu produk tali , untuk menghasilkan string akhir n:
"N#(map...)N"
.Dan itu dia!
Tugas 3
Tentukan fungsi
gcd()
:gcd()
's nyata bentuk terpendek (37 bytes - 2bytes mendapatkan berkat Rodolvertice)Menjalankannya !
hasil 9.
Itu dia.
Terima kasih atas permainan yang bagus, dan mungkin atas minat Anda. Bahasa ini tersedia untuk siapa saja yang ingin bermain, menggunakannya, atau bahkan memperluasnya. Tanyakan saja dan saya akan senang mengirimkannya.
Tepuk tangan
Franck
PS. Implementasi Muffin MC saat ini ada di Perl5. Kode sumbernya adalah sekitar 2000 baris Perl modern, termasuk komentar, dan dibundel dengan non-regresi test-suite, yang bagus untuk mempelajari langsung konstruksi dan semantik Muffin MC .
sumber