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