Memilih Bahasa untuk Golf [ditutup]

28

Apa saja tips untuk memilih bahasa yang tepat untuk golf? Faktor apa yang memengaruhi bahasa yang akan dipilih?

Berikut adalah beberapa contoh jenis masalah:

  • Masalah yang membutuhkan solusi I / O , baik konsol atau file
  • Masalah yang membutuhkan parsing
  • Masalah yang mengharuskan Anda untuk menulis solusi Anda sebagai definisi fungsi
  • Soal matematika
  • Masalah berurusan dengan bilangan prima
  • Memecahkan teka-teki angka
  • Melakukan metode numerik
  • Pemrosesan string
  • Pemrosesan array
  • Masalah array 2D yang rumit
  • Geometri komputasi
  • Rekursi
  • Grafik 2D
  • Grafik 3D
  • Audio
  • Jaringan / web
  • Proses paralel

Jangan hanya mengatakan hal-hal seperti "Gunakan GolfScript | J" karena Anda menyukainya.

Ming-Tang
sumber
Untuk beberapa masalah itu adalah sistem tipe. Misalnya jika Anda perlu berurusan dengan bilangan bulat yang lebih besar dari 64 bit, Anda ingin bahasa yang memiliki built in (misalnya Golfscript, Haskell) daripada bahasa yang membuatnya mahal (misalnya Jawa).
Peter Taylor
Saya membuat ini sebagai wiki sesuai dengan kebijakan kami tentang pertanyaan jenis "Tips".
dmckee
99 botol sangat membantu jika Anda memerlukan bahasa yang dimulai dengan huruf tertentu ...
Jesse Millikan
Kudos to ace, trimsty, algorithmshark dan hosch250 untuk membantu menjadikan utas ini sumber yang lebih baik. Harap tetap kiriman datang! Itu adalah panggilan karunia yang sulit antara algoritme hiu dan hosch250, yang keduanya memberikan banyak upaya terperinci, tetapi pada akhirnya Herr Shark mendapat anggukan untuk memimpin jalan.
Jonathan Van Matre
Pilih bahasa apa pun yang Anda inginkan. Ini juga kompetisi dalam bahasa. Lebih unik, solusi menarik dalam lebih banyak bahasa bagus.
Mego

Jawaban:

-1

Bergantung pada apa yang dibutuhkan seseorang, C / C ++ cepat, tetapi Anda harus mengkodekan lebih banyak pekerjaan sendiri. Python dan Ruby lebih lambat tetapi jauh lebih mudah untuk dikodekan dengan metode bawaan yang memperpendek banyak pekerjaan dan mereka secara otomatis menangani nilai yang jauh lebih besar (jika seseorang memiliki RAM). Menggunakan bahasa fungsional seperti Haskell sangat bagus untuk penggunaan fungsional matematika murni jika seseorang dapat membingkai masalah dengan cara itu.

ewanm89
sumber
2
Sebagai pengguna python utama, di Py Anda membayar kemudahan penggunaan Anda dalam jumlah karakter meskipun ada beberapa trik yang benar-benar gila yang dapat menyimpan karakter. Haskel dan Lisp, meski menyenangkan, cenderung berjalan lebih lama dari Python.
arrdem
Ini mungkin seharusnya bukan jawaban yang diterima. Deskripsi tentang bahasa tingkat tinggi vs rendah sebenarnya tidak ada hubungannya dengan jumlah karakter.
Samy Bencherif
Ya, benar-benar adil untuk memegang jawaban 2011 untuk pertanyaan yang diedit pada 23 Februari 2017. Mungkin kita harus berhenti mengubah pertanyaan setelah dijawab?
ewanm89
10

Menempatkan dua sen saya pada bahasa pemrograman array , khususnya J dan APL .

K / Kona, Q, dan Nial termasuk dalam kategori ini juga, tetapi mereka umumnya memiliki manfaat dan kritik yang sama. Gunakan kebijaksanaan. Saya akan menggunakan contoh J di bawah ini, sebagian besar karena ini adalah ASCII dan dengan demikian mudah diketik - ingat daripada karakter APL yang dihitung sebagai byte tunggal, jadi jangan biarkan itu menjadi masalah Anda dengan bahasa sebagai pilihan untuk bermain golf.

  • Soal matematika
  • Memecahkan teka-teki angka
  • Melakukan metode numerik
  • Masalah array 2D yang rumit

Keduanya adalah matematika yang sangat baik dan bahasa manipulasi data, karena mereka melemparkan array di sekitar tingkat tinggi, dan banyak perulangan dilakukan secara implisit , dengan mengatakan, misalnya tambahkan sepuluh masing-masing dari 3, 4, dan 5 ( 10 + 3 4 5) atau jumlah masing-masing deretan array ( +/"1 arr--perulangan berada di "1).

  • Masalah berurusan dengan bilangan prima

Dengan masalah bilangan prima khususnya, J memiliki primitif cepat dan pendek, seperti halnya beberapa dialek APL. (Sunting: Saya sedang memikirkan Nars2000, yang merupakan dialek bagian dan implementasi yang sama sekali berbeda. APL tidak memiliki builtin untuk bilangan prima.) N-th prime ( p:), no. dari bilangan prima hingga ( _1&p:), anjak ( q:), GCD dan LCM ( +.dan *.), dan seterusnya, ada banyak di sana. Namun, dalam praktiknya, pertanyaannya sering kali menentukan bahwa Anda harus memasak implementasi utama Anda sendiri, jadi ini tidak terlalu berguna. Masih ada cara rapi dan mewah untuk mendapatkan barang-barang utama yang Anda butuhkan, itu hanya menjadi sedikit kurang cut-and-paste.

  • Pemrosesan string
  • Pemrosesan array

Array dan pemrosesan string adalah sedikit campuran: jika itu adalah sesuatu yang baik untuk APL / J atau memiliki idiom primitif atau umum, hampir sepele; jika itu adalah sesuatu yang sangat berurutan dan tidak bisa diparalelkan, Anda akan memiliki waktu yang buruk. Apa pun di antaranya ada di udara, meskipun biasanya mereka akan merespons dengan baik.

  • Masalah yang membutuhkan solusi I / O, baik konsol atau file
  • Masalah yang mengharuskan Anda untuk menulis solusi Anda sebagai definisi fungsi

IO aneh. APL memiliki ekspresi masukan karakter tunggal, tetapi dengan J Anda harus menghabiskan setidaknya 8 untuk membaca di nomor: ".1!:1]1. Outputnya sedikit kurang verbose, tetapi Anda masih melihat 6 atau 7 karakter terbuang, dalam praktiknya. J khususnya benar-benar sangat menyukainya jika Anda dapat menerima input sebagai argumen untuk suatu fungsi, daripada harus mengacaukannya dengan IO itu sendiri.

Dalam praktiknya, dengan J dan APL, biasanya solusinya ditulis sebagai fungsi yang Anda panggil di konsol. Dengan APL, pada dasarnya Anda bisa memasukkan nama variabel untuk argumen Anda dan membungkus ekspresi yang Anda kerjakan dengan kurung kurawal dan menyebutnya sehari.

Tetapi dengan J, ada sedikit overhead untuk mendefinisikan fungsi secara eksplisit - 3 :'...', dan Anda harus menghindari string apa pun di dalam - jadi apa yang biasanya dilakukan adalah sesuatu yang disebut pemrograman diam-diam: Anda memprogram pada tingkat fungsi, menggabungkan primitif dengan cara tidak berbeda dengan Haskell. Ini bisa menjadi berkah sekaligus kutukan, karena Anda tidak harus menghabiskan banyak karakter untuk merujuk pada argumen Anda, tetapi mudah untuk tenggelam dalam tanda kurung dan akhirnya kehilangan puluhan karakter yang mencoba meretas solusi Anda yang pendek dan cerdas ke dalam sesuatu yang berhasil.

  • Masalah yang membutuhkan parsing
  • Geometri komputasi

Saya tidak memiliki pengalaman dalam bermain golf masalah-masalah khusus ini, tetapi saya akan mengatakan ini: pada akhirnya, bahasa pemrograman array sangat baik dalam memipis dan mengubah banyak data dengan cara yang sama. Jika Anda bisa mengubah masalah menjadi latihan dalam pengocokan angka, Anda bisa menjadikannya masalah APL / J, tanpa keringat.

Yang mengatakan, tidak semuanya masalah APL / J. Tidak seperti Golfscript, APL dan J kebetulan bagus untuk bermain golf, di samping manfaat lainnya;)

hiu
sumber
Kontribusi luar biasa! Terima kasih telah menjadi yang pertama ke kolam renang.
Jonathan Van Matre
4

Mengapa Perl belum dipuji? Ini adalah bahasa golf yang sangat baik, untuk hampir semua ini, terutama hal-hal terkait string (regex).

Burlesque baik untuk program yang berhubungan dengan angka, sedangkan Ruby sangat bagus untuk manipulasi teks yang lebih sederhana.

Sebenarnya ada daftar bahasa dan skor golf di sini .

cjfaure
sumber
Saya tidak tahu apa-apa tentang Perl, tapi saya setuju.
ckjbgames
2

Saya suka menggunakan bahasa pemrograman yang tidak jelas untuk (mencoba) menyelesaikan pekerjaan.

Berikut adalah favorit saya untuk detail yang Anda cantumkan:

Masalah yang membutuhkan solusi I / O, baik konsol atau file

Bahasa seperti TI-Basic berfungsi dengan baik, tapi saya lebih suka Ruby karenaputs

Masalah yang membutuhkan parsing

GolfScript pasti akan membantu Anda di sini

Masalah yang mengharuskan Anda untuk menulis solusi Anda sebagai definisi fungsi

Tabel TI-84 - memungkinkan fungsi seperti Y=misalnya Y=|X|mengembalikan nilai absolut X

Soal matematika

TI-Basic - dibuat untuk kalkulator, jadi termasuk matematika;)

Masalah berurusan dengan bilangan prima

Tidak ada yang spesial; Mathematica mungkin merupakan alat yang tepat untuk pekerjaan itu

Memecahkan teka-teki angka

TI-Basic karena secara otomatis loop melalui array

Melakukan metode numerik

TI-Basic atau Mathematica

Pemrosesan string

Python - memiliki beberapa fungsi string yang hebat.

Tidak peduli seberapa baik Anda berpikir TI-Basic , jangan gunakan untuk string ...

Pemrosesan array

TI-Basic - secara otomatis loop melalui array ; mis., tambah semua nilai dalam array -L1+1→L1

Ruby - juga memiliki fitur array yang sangat kuat, dan tentu saja !akan membantu kompres kode juga

Masalah array 2D yang rumit

Ruby atau Python berfungsi paling baik di sini, karena TI-Basic tidak mendukung array 2D

Geometri komputasi

TI-Basic memiliki fitur geometris dan dapat digunakan untuk sebagian besar matematika hingga Aljabar Kalkulus dan Linear


BONUS

Looping

Baik Arduino atau Quomplex . Arduino memiliki built-in void loop(){}dan Quomplex memiliki loop tak hingga yang terkandung oleh tanda kurung ( [])

Gambar / GUI

Game Maker Language memilikifitur menggambar yang sangat kuat, dan TI-Basic juga merupakan alat yang umumnya bermanfaat karena dukungan untuk menggambar pada grafik.

Quines

Baik HQ9 + atau Quomplex karena HQ9 + memiliki Quntuk meng - output kode sumber program dan Quomplex akan secara otomatis mencetak kode sumbernya kecuali *(output) ditentukan atau tidak menghasilkan output, didefinisikan dengan#

rev Timtech
sumber
2

Jika Anda memecahkan masalah matematika dan Anda tidak memiliki Mathematica, coba Sage . Ini didasarkan pada Python, jadi jika Anda sudah tahu Python Anda tidak perlu banyak waktu untuk mempelajari sintaksnya.

Contoh:

Ini juga berguna untuk plot grafik dan penyelesaian persamaan (misalnya Anda dapat menggunakan solve()fungsi dalam Sage, atau jika itu dilarang oleh aturan, ini memungkinkan implementasi yang mudah dari proses Newton Raphson karena memiliki diff()fungsi yang dapat melakukan diferensiasi simbolik) .

Selain itu, jika Anda seorang programmer Python2, menggunakan Sage memungkinkan Anda untuk menipu dengan melewatkan importpernyataan panjang . Misalnya, mathdan syssudah diimpor secara default. (Perhatikan bahwa ini mungkin tidak berfungsi jika program Python2 Anda bergantung pada pembagian integer.)

ace
sumber
Info bagus! Terima kasih telah berkontribusi.
Jonathan Van Matre
1

Saya tahu tiga bahasa - Java, C ++, dan Python 3. Saya tidak tahu ini pada tingkat tinggi, tapi ini adalah pengalaman saya dengan mereka.

Jawa:

Saya tidak akan pernah menggunakan Java untuk bermain golf lagi. Dibutuhkan lebih dari 80 karakter hanya untuk menulis Hello World!. Namun, ia memang memiliki kekuatan:

Input membutuhkan pembuatan Scannerobjek. Sulit untuk memasukkan satu karakter. Dibutuhkan spesifikasi jenis apa yang Anda masukkan.
Parsing cukup sederhana karena forloop. forLingkaran yang ditingkatkan sangat bagus untuk ini.
Java mendukung metode, tetapi deklarasi metode ini cukup panjang.
Java sangat bagus dalam matematika, serta semua bahasa tingkat tinggi lainnya.
Java sulit digunakan ketika masalah melibatkan pengubahan string. Anda tidak dapat membuat modifikasi pada string yang ada.
Array Java mudah digunakan.
Java bagus dalam rekursi.
Java mencakup grafis bawaan. Mereka sangat mudah digunakan.

C ++

C ++ adalah bahasa yang sangat kuat, tetapi agak panjang ketika mencoba bermain golf dengan 56 karakter Hello world!.

Input dan output mudah. Anda tidak perlu menentukan jenis apa yang Anda masukkan - yang dilakukan secara otomatis. Namun, Anda harus menyertakan perpustakaan iostream.
Parsing sangat mudah.
Deklarasi fungsi sederhana, tetapi memakan banyak karakter penting. C ++ unggul dalam matematika, tetapi tidak termasuk PI atau E, seperti halnya Java.
String C ++ mudah digunakan dan diubah sesuai kebutuhan.
Saya menggunakan vectors jika memungkinkan, bukan arrays, tetapi keduanya mudah digunakan.
C ++ bagus dalam rekursi.
C ++ tidak termasuk grafik bawaan.

Python 3

Python 3 mirip dengan C ++ dan Java. Itu jauh lebih pendek karena tidak diketik dengan kuat - dengan kata lain, itu hanya menebak apa variabelnya.

Input mudah, tetapi semuanya input sebagai string. Anda harus secara manual mengonversi semua input ke nilai apa pun yang Anda inginkan.
Parsing dan looping sangat sederhana.
Deklarasi fungsi python cukup sederhana dan pendek.
Python jago dalam matematika.
String Python mudah digunakan.
Array mudah digunakan.
Python bagus dalam rekursi.
Python tidak termasuk grafis bawaan.

hosch250
sumber
Saya kira dengan meningkatkan for-loop, Anda berbicara tentang rentang-untuk loop. C ++ mendukung ini sejak C ++ 11 ( en.cppreference.com/w/cpp/language/range-for ). Secara sintaksis mirip dengan Java for-range loop dan membutuhkan kelas objek iteratable untuk mengimplementasikan begin () dan end () atau begin (T) dan end (T) menjadi kelebihan beban untuk objek yang diberikan. Ini juga diimplementasikan untuk string C-style dan built-in array dan berfungsi untuk semua kontainer perpustakaan standar.
foobar
@foobar Ya, saya berbicara tentang itu. Terima kasih atas informasinya, saya sudah berharap untuk itu sejak saya mengambil Jawa.
Hosch250
Java sekarang memiliki solusi 61-byte, tetapi poin Anda masih berlaku.
MilkyWay90