Golf İçin Dil Seçimi [kapalı]


28

Golf için doğru dili seçmek için bazı ipuçları nelerdir? Hangi faktörler seçilecek dili etkiler?

İşte bazı örnek problem tipleri:

  • Konsol veya dosya olarak G / Ç çözümü gerektiren sorunlar
  • Ayrıştırma gerektiren sorunlar
  • Çözümünüzü bir işlev tanımı olarak yazmanızı gerektiren sorunlar
  • Matematik problemleri
  • Asal sayılarla ilgili problem
  • Sayı bulmacalarını çözme
  • Sayısal yöntemlerin gerçekleştirilmesi
  • Dize işleme
  • Dizi işleme
  • Zor 2D dizi problemleri
  • Hesaplamalı geometri
  • özyineleme
  • 2D grafikler
  • 3B grafik
  • Ses
  • Ağ / web
  • Paralel işleme

Basitçe "Use GolfScript | J" gibi şeyler söylemeyin, çünkü siz onları seviyorsunuz.


Bazı problemler için bu tip sistemdir. Örneğin, 64 bitten büyük tam sayılarla uğraşmanız gerekirse, bunları pahalı kılan dillerden ziyade yerleşik olan dilleri (örn. Golfscript, Haskell) istersiniz (örneğin, Java).
Peter Taylor

Bunu "İpuçları" tipi sorular konusundaki politikamıza uygun olarak bir wiki yaptım.
dmckee

Belirli bir harfle başlayan bir dile ihtiyacınız varsa 99 şişe faydalıdır ...
Jesse Millikan

Bu iplik daha iyi bir kaynak yapmak için yardımcı olmak için ace, trimsty, algoritmshark ve hosch250 için Kudos. Lütfen gönderimleri devam ettirin! Her ikisi de çok fazla çaba sarf eden algoritmshark ve hosch250 arasındaki zorlu bir ödül çağrısıydı , fakat sonunda Herr Shark öncülük etmeye başını salladı.
Jonathan Van Matre

İstediğiniz dili seçin. Aynı zamanda diller içinde bir rekabet . Daha fazla dilde daha benzersiz, ilginç çözümler iyidir.
Mego

Yanıtlar:


-1

Neyin ihtiyaç duyduğuna bağlı olarak, C / C ++ hızlıdır, fakat işin çoğunu kendiniz kodlamanız gerekir. Python ve Ruby daha yavaştır, ancak çok fazla çalışmayı kısaltan yerleşik yöntemlerle kodlaması çok daha kolaydır ve çok büyük değerleri (RAM varsa) otomatik olarak işlerler. Haskell gibi işlevsel bir dil kullanmak, sorunu bu şekilde çerçevelemek için tamamen matematiksel işlevsel kullanım için mükemmeldir.


2
Öncelikle bir python kullanıcısı olarak Py'de karakter sayımında kullanım kolaylığınızı ödersiniz, ancak karakterleri kurtarabilen bazı gerçekten sahte numaralar vardır. Haskel ve Lisp, eğlenirken Python'dan daha uzun süre çalışma eğilimindedir.
arrdem

Bu muhtemelen kabul edilen cevap olmamalıdır. Yüksek ve düşük seviyeli diller hakkında yapılan açıklamada karakter sayımı ile ilgisi yoktur.
Samy Bencherif

Evet, 23 Şubat 2017'de düzenlenen soruya 2011 yılı cevabı vermek gerçekten adil. Belki de cevaplandıktan sonra soruları değiştirmeyi bırakmalı mıyız?
ewanm89

10

Üzerinde benim iki sent koyarak dizi programlama dilleri , J ve APL özellikle.

K / Kona, Q ve Nial da bu kategoriye giriyor, ancak genellikle aynı fayda ve eleştirilere sahipler. Takdirine kullanın. Aşağıdaki J örneklerini kullanacağım, çoğunlukla bunlar ASCII ve bu yüzden yazması kolay çünkü APL karakterlerinin tek bayt olarak sayıldığından hatırlayın, bu nedenle dil seçiminde problem olarak bunun golf seçiminde olmasına izin vermeyin.

  • Matematik problemleri
  • Sayı bulmacalarını çözme
  • Sayısal yöntemlerin gerçekleştirilmesi
  • Zor 2D dizi problemleri

Onlar yüksek düzeyde etrafında diziler atmak için bu iki çok iyi matematik ve veri işleme dilleri vardır ve döngü bir sürü yapılır örtülü örneğin her birine on ekleyin 3, 4 ve 5. (diyerek, 10 + 3 4 5) ya da her Özetle Bir dizinin satırı ( +/"1 arr- döngü içindedir "1).

  • Asal sayılarla ilgili problem

Özellikle asal sayı problemleriyle J, APL'nin bazı lehçelerinde olduğu gibi hızlı ve kısa yerleşik ilkellere sahiptir. (Düzenleme: Kısmi lehçeli ve tamamen farklı bir uygulama olan Nars2000'i düşünüyorum. APL'nin asal sayılar için yerleşik özelliği yoktur.) N-üssü ( p:), no. ( _1&p:), faktoring ( q:), GCD ve LCM ( +.ve *.) 'ye kadar olan primerlerin ve benzerlerinin orada bir sürü var. Bununla birlikte, pratikte soru çoğu zaman kendi temel uygulamalarınızı pişirmeniz gerektiğini belirtir, bu yüzden bunlar çok fazla kullanmazlar. İhtiyacınız olan temel malzemeleri elde etmenin hala zarif ve süslü yolları var, bu sadece biraz daha az kes ve yapıştır olur.

  • Dize işleme
  • Dizi işleme

Dizi ve dize işleme biraz karışık bir çantadır: APL / J'nin iyi olduğu ya da ilkel ya da ortak bir deyimi olan bir şeyse, neredeyse önemsizdir; sıralı ve çok paralelleştirilemez bir şeyse, kötü zaman geçirirsiniz. Aradaki her şey havada kalmış olsa da, genellikle olumlu cevap verirler.

  • Konsol veya dosya olarak G / Ç çözümü gerektiren sorunlar
  • Çözümünüzü bir işlev tanımı olarak yazmanızı gerektiren sorunlar

IO garip. APL tek karakterlik giriş ifadesini vardır, ama J ile bir dizi okumayı en az 8 harcamak zorunda: ".1!:1]1. Çıktı biraz daha az ayrıntılı, ancak pratikte hala boşa çıkan 6 ya da 7 karaktere bakıyorsunuz. Özellikle J, girişi IO ile karıştırmak yerine bir fonksiyona argüman olarak alabilirseniz, gerçekten çok hoşuna gider.

Uygulamada, J ve APL ile genellikle çözüm konsolda çağırdığınız bir fonksiyon olarak yazılır. APL ile, temel olarak sadece argümanlarınız için değişken isimleri girebilir ve üzerinde çalıştığınız ifadeyi kaşlı ayraçlar içine sarabilir ve bir gün arayabilirsiniz.

Fakat J ile, fonksiyonları açıkça tanımlamak için bir miktar ek yük vardır - 3 :'...'ve içerideki herhangi bir dizgeden kaçmanız gerekir - yani genellikle yapılan şey, taklit programlama adı verilen bir şeydir: fonksiyon seviyesini programlayarak, ilkelleri bir şekilde birleştirirsiniz. Haskell'inkinden farklı değil. Bu hem bir nimettir hem de bir lanet olabilir, çünkü bağımsız değişkenlerinize atıfta bulunmak için çok fazla karakter harcamak zorunda değilsiniz, ancak parantez içinde boğulmak ve başka türlü kısa ve zekice çözümünüzü hacklemeye çalışan onlarca karakter kaybetmek zorundasınız. çalışan bir şey.

  • Ayrıştırma gerektiren sorunlar
  • Hesaplamalı geometri

Bu özel problemleri golf oynamak konusunda deneyimim yok, ancak şunu söyleyeceğim: sonuçta dizi programlama dilleri aynı şekilde birçok veriyi bir araya getirip dönüştürmede çok iyidir. Problemi sayı karışmada bir alıştırmaya dönüştürebiliyorsanız, bir APL / J problemi yaratabilirsiniz, ter yok.

Bu, her şeyin bir APL / J sorunu olmadığını söyledi. Golfscript'in aksine, APL ve J diğer avantajlarıyla birlikte golf oynamak için iyi olmuşlardır;


Mükemmel katkı! Havuza ilk girdiğiniz için teşekkürler.
Jonathan Van Matre

4

Neden Perl henüz övülmedi? Neredeyse her biri için, özellikle ip ile ilgili eşyalar (regex) için mükemmel bir golf dili.

Burlesque sayı ile ilgili programlar için iyidir, Ruby ise basit metin işleme için mükemmeldir.

Aslında burada dillerin listesi ve golf puanları var .


Perl hakkında hiç bir şey bilmiyorum ama katılıyorum.
ckjbgames

2

İşi bitirmek için karanlık programlama dilleri kullanmayı seviyorum.

İşte listelediğiniz ayrıntılar için favorilerim:

Konsol veya dosya olarak G / Ç çözümü gerektiren sorunlar

Gibi diller TI-Temel de işin ama tercih Ruby yüzündenputs

Ayrıştırma gerektiren sorunlar

GolfScript size burada kesinlikle yardımcı olacaktır

Çözümünüzü bir işlev tanımı olarak yazmanızı gerektiren sorunlar

TI-84 Tablo - Y=örneğin Y=|X|X'in mutlak değerini döndüren fonksiyonlara izin verir

Matematik problemleri

TI-Basic - Bir hesap makinesi için yapılmış, bu yüzden matematik içerir;)

Asal sayılarla ilgili problem

Özel birşey yok; Mathematica muhtemelen iş için doğru araçtır

Sayı bulmacalarını çözme

TI-Basic otomatik olarak diziler arasında dolaşıyor

Sayısal yöntemlerin gerçekleştirilmesi

TI-Basic veya Mathematica

Dize işleme

Python - bazı harika string fonksiyonlarına sahiptir.

TI-Basic'in ne kadar iyi olduğunu düşünürseniz , karakter dizileri için kullanmayın ...

Dizi işleme

TI-Basic - otomatik olarak diziler arasında geçiş yapar ; örneğin, dizideki tüm değerleri arttırma -L1+1→L1

Ruby - aynı zamanda çok güçlü dizi özelliklerine sahiptir ve tabii ki !kodun sıkıştırılmasına yardımcı olacaktır.

Zor 2D dizi problemleri

Ruby veya Python burada en iyi şekilde çalışır, çünkü TI-Basic 2B dizileri desteklemez

Hesaplamalı geometri

TI-Basic geometrik özelliklere sahiptir ve Matematik ve Doğrusal Cebire kadar çoğu matematik için kullanılabilir


BONUS

Döngü

Ya Arduino veya Quomplex . Arduino dahili olarak bir void loop(){}ve Quomplex (parantez içinde bulunan sonsuz halkalar bulunmaktadır [])

Çizim / GUI

Game Maker Language , çok güçlü çizim özelliklerine sahiptir ve TI-Basic ayrıca grafik üzerinde çizim desteği nedeniyle genellikle kullanışlı bir araçtır.

Quines

Ya HQ9 + veya Quomplex çünkü HQ9 + sahiptir Qprogramın kaynak kodu ve çıkışa Quomplex sürece otomatik olarak kaynak kodu çıktısını olacaktır *(çıkış) belirtilen veya tanımlanmış herhangi bir çıktı üretiyor#


2

Eğer bir matematik problemini çözdüğümüz ve Mathematica'yı yoksa, denemek Sage . Python'u temel alır, bu nedenle Python'u zaten biliyorsanız, sözdizimini öğrenmek için fazla zamana ihtiyacınız yoktur.

Örnekler:

Ayrıca grafik çizme ve denklem çözme için kullanışlıdır (örneğin solve(), Sage işlevinde kullanabilirsiniz veya kurallar tarafından yasaklanmışsa, Newton Raphson işleminin kolay bir şekilde uygulanmasına izin verir, çünkü diff()sembolik farklılaşmayı gerçekleştirebilen bir işleve sahiptir). .

Ayrıca, bir Python2 programcısıysanız, Sage kullanmak uzun importifadeleri atlayarak hile yapmanıza izin verebilir . Örneğin, mathve syszaten varsayılan olarak alınır. (Python2 programınız tamsayı bölmesine bağlıysa, bunun işe yaramayabileceğini unutmayın.)


İyi bilgi! Katkınız için teşekkürler.
Jonathan Van Matre

1

Üç dil biliyorum - Java, C ++ ve Python 3. Bunların hiçbirini üst düzeyde bilmiyorum, ama bu onlarla deneyimim.

Java:

Java'yı bir daha golf oynamak için kullanmam. Sadece yazmak 80'den fazla karakter alır Hello World!. Ancak, güçlü yanları var:

Giriş, bir Scannernesnenin oluşturulmasını gerektirir . Tek bir karakter girmek zor. Girdiğiniz türlerin özelliklerini gerektirir. Döngü
nedeniyle ayrıştırma yeterince basit for. Gelişmiş fordöngü bunun için mükemmel.
Java yöntemleri destekler, ancak yöntem bildirimi oldukça uzundur.
Java matematikte ve diğer tüm yüksek seviyeli dillerde mükemmeldir.
Sorun, dizeleri değiştirmeyi gerektirdiğinde Java kullanımı zorlaşır. Mevcut bir dizgede değişiklik yapamazsınız.
Java'nın dizileri kullanımı kolaydır.
Java özyinelemede iyidir.
Java, dahili grafikler içerir. Kullanımı çok kolaydır.

C ++

C ++ çok güçlü bir dil, ancak 56 karakterde golf oynamaya çalışırken biraz uzun sürüyor Hello world!.

Giriş ve çıkış kolaydır. Hangi türleri girdiğinizi belirtmeniz gerekmez - bu otomatik olarak yapılır. Ancak, iostream kitaplığını eklemelisiniz.
Ayrıştırma çok kolaydır.
İşlev bildirimi basittir, ancak birçok önemli karakter yer. C ++ matematikte üstündür, fakat Java gibi PI veya E içermez.
C ++ 'ın dizeleri gerektiğinde kullanımı ve değiştirilmesi kolaydır.
Kullandığım vectors nerede yerine olası arrays, ancak her iki kullanım kolaydır.
C ++ özyinelemede iyidir.
C ++ yerleşik grafik içermez.

Python 3

Python 3, C ++ ve Java'ya benzer. Kesin olarak yazılmadığı için çok daha kısadır - başka bir deyişle, sadece değişkenlerin ne olduğunu tahmin eder.

Giriş kolaydır, ancak her şey dizge olarak girilir. Tüm girdileri istediğiniz değerlere el ile dönüştürmeniz gerekir.
Ayrıştırma ve döngü çok basittir.
Python işlevi bildirimleri oldukça basit ve kısa.
Python matematikte iyidir.
Python'un dizeleri kullanımı kolaydır.
Diziler kullanımı kolaydır.
Python özyinelemede iyidir.
Python dahili grafik içermez.


Sanırım gelişmiş for döngüsü ile bir loop for döngüsünden bahsediyorsunuz. C ++, C ++ 11'den beri bunu destekler ( en.cppreference.com/w/cpp/language/range-for ). Java aralık aralığı döngüsüne sözdizimsel olarak benzer ve yinelenebilir nesnenin sınıfının, belirtilen nesne için aşırı () ve end () veya begin (T) ve end (T) 'nin yüklenmesini gerektirir. Ayrıca C tarzı dizgiler ve yerleşik diziler için uygulanmıştır ve tüm standart kütüphane kapları için çalışır.
foobar

@foobar Evet, bundan bahsediyordum. Bilgi için teşekkürler, Java kullandığımdan beri bunu diledim.
Hosch250

Java artık 61 baytlık bir çözüme sahip, ancak amacınız hala geçerli.
MilkyWay90
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.