Wybór języków do gry w golfa [zamknięte]

28

Jakie są wskazówki dotyczące wyboru odpowiedniego języka do gry w golfa? Jakie czynniki wpływają na wybrany język?

Oto kilka przykładowych typów problemów:

  • Problemy wymagające rozwiązania We / Wy , konsoli lub pliku
  • Problemy wymagające analizy
  • Problemy wymagające napisania rozwiązania jako definicji funkcji
  • Problemy matematyczne
  • Problem z liczbami pierwszymi
  • Rozwiązywanie zagadek liczbowych
  • Wykonywanie metod numerycznych
  • Przetwarzanie łańcucha
  • Przetwarzanie tablic
  • Trudne problemy z tablicą 2D
  • Geometria obliczeniowa
  • Rekurencja
  • Grafika 2D
  • Grafika 3D
  • Audio
  • Sieć / sieć
  • Równoległe przetwarzanie

Nie mów po prostu takich rzeczy jak „Użyj GolfScript | J”, ponieważ je lubisz.

Ming-Tang
źródło
W przypadku niektórych problemów jest to system typów. Np. Jeśli chcesz poradzić sobie z liczbami całkowitymi większymi niż 64 bity, potrzebujesz języków, które mają wbudowane (np. Golfscript, Haskell), a nie języków, które czynią je drogimi (np. Java).
Peter Taylor,
Zrobiłem to wiki zgodnie z naszą polityką dotyczącą pytań typu „Porady”.
dmckee,
99 butelek jest pomocne, jeśli potrzebujesz języka zaczynającego się od konkretnej litery ...
Jesse Millikan
Uznanie dla asa, trymowania, algorytmu i hosch250 za pomoc w uczynieniu tego wątku lepszym zasobem. Nadal przesyłaj zgłoszenia! To była trudna walka o nagrodę między algorytmem rekina a hosch250, który obaj dali dużo szczegółowego wysiłku, ale w końcu Herr Shark skinął głową na prowadzenie.
Jonathan Van Matre
Wybierz dowolny język. To także konkurs w ramach języków. Bardziej unikalne, interesujące rozwiązania w większej liczbie języków są dobre.
Mego

Odpowiedzi:

-1

W zależności od tego, czego potrzebujesz, C / C ++ jest szybki, ale sam musisz napisać więcej pracy. Python i Ruby są wolniejsze, ale łatwiej je kodować dzięki wbudowanym metodom, które skracają dużo pracy i automatycznie obsługują nieskończenie duże wartości (jeśli jedna ma pamięć RAM). Używanie funkcjonalnego języka, takiego jak Haskell, doskonale nadaje się do czysto matematycznego wykorzystania funkcjonalnego, jeśli można w ten sposób sformułować problem.

ewanm89
źródło
2
Jako użytkownik przede wszystkim pytona, w Py płacisz za łatwość użycia w liczeniu postaci, chociaż istnieją naprawdę hacke sztuczki, które mogą uratować postacie. Haskel i Lisp, chociaż dobrze się bawią, mają tendencję do działania nawet dłużej niż Python.
arrdem
To prawdopodobnie nie powinna być zaakceptowana odpowiedź. Opis języków wysokiego i niskiego poziomu w rzeczywistości nie ma nic wspólnego z liczbą znaków.
Samy Bencherif
Tak, to jest uczciwe posiadanie odpowiedzi z 2011 r. Na pytanie zredagowane 23 lutego 2017 r. Może powinniśmy przestać zmieniać pytania po udzieleniu odpowiedzi?
ewanm89,
10

Umieszczając moje dwa centy na tablicach języków programowania , w szczególności J i APL .

K / Kona, Q i Nial również należą do tej kategorii, ale generalnie mają te same zalety i krytykę. Użyj dyskrecji. Użyję poniższych przykładów J, głównie dlatego, że są to ASCII, a zatem łatwe do wpisania - pamiętaj, że znaki APL liczą się jako pojedyncze bajty, więc nie pozwól, aby to był twój problem z językiem jako wyborem do gry w golfa.

  • Problemy matematyczne
  • Rozwiązywanie zagadek liczbowych
  • Wykonywanie metod numerycznych
  • Trudne problemy z tablicą 2D

Te dwa są bardzo dobrymi językami matematyki i manipulacji danymi, ponieważ podrzucają tablice wokół wysokiego poziomu, a wiele zapętleń wykonuje się domyślnie , mówiąc np. Dodaj dziesięć do każdego z 3, 4 i 5 ( 10 + 3 4 5) lub zsumuj każdy wiersz tablicy ( +/"1 arr- pętla znajduje się w "1).

  • Problem z liczbami pierwszymi

W szczególności problemy z liczbą pierwszą, J ma szybkie i krótkie wbudowane operacje podstawowe, podobnie jak niektóre dialekty APL. (Edycja: Myślę o Nars2000, który jest częściowo dialektem, a częściowo zupełnie inną implementacją. APL nie ma wbudowanej liczby pierwszych). N-ta liczba pierwsza ( p:), nie. liczb pierwszych do ( _1&p:), faktoringu ( q:), GCD i LCM ( +.i *.) itd., jest ich wiele. Jednak w praktyce pytanie często określa, że ​​musisz przygotować własne główne implementacje, aby nie były zbyt przydatne. Nadal istnieją fajne i wymyślne sposoby na zdobycie najlepszych rzeczy, których potrzebujesz, po prostu staje się trochę mniej wycinany i wklejany.

  • Przetwarzanie łańcucha
  • Przetwarzanie tablic

Przetwarzanie tablic i ciągów jest trochę mieszaną torbą: jeśli jest to coś, w czym APL / J jest dobry lub ma prymitywny lub wspólny idiom, jest to prawie banalne; jeśli jest to coś, co jest bardzo sekwencyjne i niezbyt równoległe, będziesz miał zły czas. Wszystko pomiędzy jest w powietrzu, choć zwykle zareagują pozytywnie.

  • Problemy wymagające rozwiązania We / Wy, konsoli lub pliku
  • Problemy wymagające napisania rozwiązania jako definicji funkcji

IO jest dziwne. APL ma wyrażenia wejściowego pojedynczego znaku, ale z J trzeba wydać co najmniej 8 do czytać w liczbie: ".1!:1]1. Dane wyjściowe są nieco mniej szczegółowe, ale w praktyce nadal widzisz zmarnowane 6 lub 7 znaków. W szczególności J bardzo ją lubi, jeśli możesz wprowadzić dane wejściowe jako argumenty funkcji, zamiast musieć manipulować samym IO.

W praktyce, w przypadku J i APL, rozwiązanie jest zwykle zapisywane jako funkcja, którą wywołujesz na konsoli. Dzięki APL możesz w zasadzie po prostu wstawić nazwy zmiennych dla swoich argumentów, owinąć wyrażenie, z którym pracujesz, w nawiasy klamrowe i nazwać to dniem.

Ale w przypadku J jest pewne narzuty związane z jawnym definiowaniem funkcji 3 :'...'- i musisz uciec od wszelkich ciągów znaków wewnątrz - więc zwykle wykonuje się coś, co nazywa się programowaniem ukrytym: programujesz na poziomie funkcji, łącząc w pewien sposób prymitywy podobnie jak Haskell. Może to być zarówno błogosławieństwo, jak i przekleństwo, ponieważ nie musisz wydawać tylu postaci odwołujących się do swoich argumentów, ale łatwo utopić się w nawiasach i w rezultacie stracić dziesiątki postaci próbujących włamać się do twojego skądinąd krótkiego i sprytnego rozwiązania w coś, co działa.

  • Problemy wymagające analizy
  • Geometria obliczeniowa

Nie mam doświadczenia w grze w te problemy, ale powiem to: w końcu języki programowania macierzy są bardzo dobre w pipowaniu i transformowaniu dużej ilości danych w ten sam sposób. Jeśli potrafisz przekształcić problem w ćwiczenie polegające na tasowaniu liczb, możesz uczynić go problemem APL / J, bez potu.

To powiedziawszy, nie wszystko jest problemem APL / J. W przeciwieństwie do Golfscript, APL i J po prostu świetnie nadają się do gry w golfa, obok innych korzyści;)

3 obrotów
źródło
Doskonały wkład! Dziękujemy za bycie pierwszym w basenie.
Jonathan Van Matre
4

Dlaczego nie pochwalono jeszcze Perla? Jest to doskonały język golfowy, dla prawie każdego z nich, szczególnie dla rzeczy związanych ze strunami (regex).

Burleska jest dobra dla programów związanych z liczbami, a Ruby jest świetny do prostszej manipulacji tekstem.

Jest rzeczywiście lista języków i ocenę golfa nad tutaj .

cjfaure
źródło
Nie wiem, co mam na myśli o Perlu, ale zgadzam się.
ckjbgames
2

Lubię używać niejasnych języków programowania, aby (próbować) wykonać zadanie.

Oto moje ulubione szczegóły, które wymieniłeś:

Problemy wymagające rozwiązania We / Wy, konsoli lub pliku

Języki takie jak TI-Basic działają dobrze, ale wolę Ruby z tego powoduputs

Problemy wymagające analizy

GolfScript z pewnością Ci pomoże

Problemy wymagające napisania rozwiązania jako definicji funkcji

Tabela TI-84 - zezwala na funkcje, Y=np. Y=|X|Zwraca wartość bezwzględną X

Problemy matematyczne

TI-Basic - stworzony dla kalkulatora, więc zawiera matematykę;)

Problem z liczbami pierwszymi

Nic specjalnego; Mathematica jest prawdopodobnie właściwym narzędziem do pracy

Rozwiązywanie zagadek liczbowych

TI-Basic, ponieważ automatycznie przechodzi przez tablice

Wykonywanie metod numerycznych

TI-Basic lub Mathematica

Przetwarzanie łańcucha

Python - ma kilka świetnych funkcji łańcuchowych.

Bez względu na to, jak dobrze Twoim zdaniem TI-Basic jest, nie używaj go do ciągów ...

Przetwarzanie tablic

TI-Basic - automatycznie zapętla tablice ; np. zwiększ wszystkie wartości w tablicy -L1+1→L1

Ruby - ma również bardzo potężne funkcje tablicowe i oczywiście !pomoże również skompresować kod

Trudne problemy z tablicą 2D

Ruby lub Python działają tutaj najlepiej, ponieważ TI-Basic nie obsługuje tablic 2D

Geometria obliczeniowa

TI-Basic ma cechy geometryczne i może być używany do większości matematyki, aż do rachunku różniczkowego i algebry liniowej


PREMIA

Pętla

Albo Arduino, albo Quomplex . Arduino ma wbudowane, void loop(){}a Quomplex ma nieskończone pętle zawarte w nawiasach ( [])

Rysunek / GUI

Game Maker Language ma bardzo rozbudowane funkcje rysowania, a TI-Basic jest również ogólnie przydatnym narzędziem ze względu na obsługę rysowania na wykresie.

Quines

Albo HQ9 + lub Quomplex, ponieważ HQ9 + ma Qwyprowadzać kod źródłowy programu, a Quomplex automatycznie wydrukuje swój kod źródłowy, chyba że określono *(wyjście) lub nie generuje żadnego wyniku, zdefiniowanego za pomocą#

Timtech
źródło
2

Jeśli rozwiązujesz problem matematyczny i nie masz Mathematica, wypróbuj Sage . Opiera się na Pythonie, więc jeśli znasz już Pythona, nie potrzebujesz dużo czasu, aby nauczyć się jego składni.

Przykłady:

Jest także przydatny do kreślenia wykresów i rozwiązywania równań (np. Możesz użyć solve()funkcji w Sage, lub jeśli jest to zabronione przez reguły, pozwala na łatwą implementację procesu Newtona Raphsona, ponieważ ma diff()funkcję, która może wykonywać różnicowanie symboliczne) .

Poza tym, jeśli jesteś programistą w Python2, użycie Sage może pozwolić ci oszukiwać, pomijając długie importinstrukcje. Na przykład mathi syssą już domyślnie importowane. (Pamiętaj, że może to nie działać, jeśli Twój program Python2 zależy od podziału na liczby całkowite).

asa
źródło
Dobra informacja! Dziękuję za pomoc.
Jonathan Van Matre
1

Znam trzy języki - Java, C ++ i Python 3. Nie znam żadnego z nich na wysokim poziomie, ale takie jest moje doświadczenie z nimi.

Jawa:

Nigdy więcej nie użyję Javy do gry w golfa. Pisanie zajmuje ponad 80 znaków Hello World!. Ma jednak swoje zalety:

Wejście wymaga utworzenia Scannerobiektu. Trudno jest wprowadzić pojedynczy znak. Wymaga specyfikacji wprowadzanych typów.
Analiza jest dość prosta ze względu na forpętlę. Ulepszona forpętla jest do tego doskonała.
Java obsługuje metody, ale deklaracja metody jest dość długa.
Java jest doskonała z matematyki, a także ze wszystkich innych języków wysokiego poziomu.
Java jest trudna w użyciu, gdy problem obejmuje modyfikację ciągów. Nie można modyfikować istniejącego ciągu.
Macierze Java są proste w użyciu.
Java jest dobra w rekurencji.
Java zawiera wbudowaną grafikę. Są bardzo łatwe w użyciu.

C ++

C ++ jest bardzo silnym językiem, ale jest dość długi, gdy próbuje grać w golfa na 56 znaków Hello world!.

Wejście i wyjście są łatwe. Nie musisz określać wprowadzanych typów - odbywa się to automatycznie. Musisz jednak dołączyć bibliotekę iostream.
Analiza jest bardzo łatwa.
Deklaracja funkcji jest prosta, ale zjada wiele ważnych znaków. C ++ przoduje w matematyce, ale nie zawiera PI ani E, tak jak Java.
Łańcuchy C ++ są łatwe w użyciu i zmieniają się w razie potrzeby.
Używam vectors tam, gdzie to możliwe zamiast arrays, ale oba są łatwe w użyciu.
C ++ jest dobry w rekurencji.
C ++ nie zawiera wbudowanej grafiki.

Python 3

Python 3 jest podobny do C ++ i Java. Jest o wiele krótszy, ponieważ nie jest mocno wpisany - innymi słowy, zgaduje tylko, jakie są zmienne.

Wejście jest łatwe, ale wszystko jest wprowadzane jako ciągi. Musisz ręcznie przekonwertować wszystkie dane wejściowe na dowolne wartości.
Parsowanie i zapętlanie jest bardzo proste.
Deklaracje funkcji Pythona są dość proste i krótkie.
Python jest dobry z matematyki.
Ciągi Pythona są proste w użyciu.
Tablice są proste w użyciu.
Python jest dobry w rekurencji.
Python nie zawiera wbudowanej grafiki.

hosch250
źródło
Wydaje mi się, że dzięki ulepszonej pętli for, mówisz o pętli zasięgu. C ++ obsługuje to od wersji C ++ 11 ( en.cppreference.com/w/cpp/language/range-for ). Jest składniowo podobny do pętli zasięgu dla języka Java i wymaga, aby klasa obiektu iterowalnego zaimplementowała funkcje begin () i end () lub begin (T) i end (T) dla danego obiektu. Jest również zaimplementowany dla ciągów w stylu C i wbudowanych tablic i działa dla wszystkich standardowych kontenerów bibliotecznych.
foobar
@foobar Tak, mówiłem o tym. Dzięki za informacje, marzyłem o tym odkąd zacząłem używać Javy.
Hosch250,
Java ma teraz 61-bajtowe rozwiązanie, ale twoja kwestia nadal jest ważna.
MilkyWay90