Planuję napisać ulepszony GolfScript dla jeszcze krótszych programów, które mogą robić więcej rzeczy. To nie jest wyzwanie; jest to prośba o opinie i porady dotyczące tego, co powinienem zrobić. (patrz tagi)
Nie jestem pewien, czy powinna to być Wiki społeczności. Jeśli tak uważasz, po prostu oznacz moderatora, aby go przekonwertował :)
Ten język będzie bardzo podobny do GolfScript. Wciąż jest napisany w Ruby. Ma jednak kilka różnic:
- Użycie
`
jako ogranicznika łańcucha, ponieważ jest to rzadki znak, więc mniej ucieczki będzie potrzebne. (Inny znak może zastąpić swoją funkcję, np.#
(Więcej na ten temat później)).\`
uciec\\
przed ukośnikiem, uciec przed ukośnikiem i nie ma innych sekwencji ucieczki. Jeśli potrzebujesz nowej linii, po prostu przyklej prawdziwą nową literę do łańcucha. - Użycie Ruby'ego
Rational
do dowolnej zmiennoprzecinkowej precyzji, jedna z głównych wad GolfScript. - Możliwość konwersji typów na inne typy. Na przykład możesz przekonwertować blok na ciąg.
- Wyrażenia regularne. Prawdopodobnie stworzony z
"..."
. Operatorzy również zostaną dla nich przeciążeni. Na przykład"\W"~{`Invalid: non-word character`}{`OK`}if
. Wykona się automatycznie po wypchnięciu ze zmiennej, takiej jak bloki. - Obiekty File i Date, aby wykonać więcej rzeczy, które były niemożliwe w GolfScript. Nie będą miały literałów, ale będą miały funkcje inicjujące je, takie jak
`file.txt`fl
(nazwa funkcji tworzenia plików może ulec zmianie). - Może hashe, ale nie jestem tego pewien. Czy powinienem?
- Funkcje pomocnicze pozwalają zrobić jeszcze więcej. Na przykład w
`http://example.com`net
celu uzyskania dostępu do sieci (ponownienet
nazwa operatora może zostać zmieniona).rb
wykonać ciąg jako kod Ruby. Będzie ich o wiele więcej; sugestie mile widziane. - Brak komentarzy, więc
#
można to wykorzystać do czegoś innego. Jeśli chcesz komentarza,`comment here`;
będzie dobrze. (Może#
może zastąpić`
funkcję) - Zostanie całkowicie przepisany w taki sposób, że znacznie łatwiej będzie dodać funkcje. Zasadniczo kod będzie bardziej czytelny. (Czy widziałeś źródło GolfScript?
:/
) - Będzie na Githubie, aby można było nad nim wspólnie pracować. Zezwolę na licencję na MIT lub coś takiego.
- Brak ostatecznej nowej linii, więc oszukiwane quiny działają: P
Rozróżniam je, ponieważ uważam, że są to najbardziej drastyczne i pomocne zmiany (z wyjątkiem może dodania zmiennoprzecinkowego):
- Będzie miał wiele wbudowanych funkcji Ruby. Na przykład
shuffle
(który może być skróconysf
) (poprzednio miał 9 znaków ),tr
(poprzednio 14 znaków ),sample
(sm
poprzednio.,rand=
),flatten
(fl
poprzednio ???) itd. - Będzie muskularny, jak Rebmu. Na przykład teraz możesz to zrobić
~:a0<{0a-}aIF
(używając nazwy zmiennej literowej) zamiast~:$0<{0$-}$if
(nadpisując funkcję sortowania). (przykład stąd ). Zauważ, że w ten sposób wielkość liter nie jest rozróżniana, a liczby nie są dozwolone w nazwach zmiennych. Moim zdaniem jest to w porządku, ponieważ jest to język golfowy: P - Będzie miał debugowanie. Dodam możliwość dostarczenia flagi określającej ograniczniki tablicowe, ograniczniki elementów itp., Dane wyjściowe liczbowe (wymierne, zmiennoprzecinkowe lub int?), Krok po kroku wykonując instrukcje pojedynczo, tokenizując i wysyłając każdy token zamiast uruchamiania programu, itp.
Moje pytanie brzmi: co można poprawić? Jak myślisz, co powinienem dodać?
Jakieś inne pomysły na to, zanim zacznę go kodować?
code-golf
tips
golfscript
Klamka
źródło
źródło
Odpowiedzi:
Elastyczne we / wy
Golfscript nie może być obecnie używany do interaktywnych programów. Proponuję niektóre funkcje wyraźnej wejście zostać dodany (tj
readline
,getchar
i przyjaciół). Tłumacz powinien sprawdzić, czy program używa ich przed uruchomieniem.Jeśli program nie wywołuje żadnych funkcji wejściowych, interpreter powinien zachowywać się tak jak normalnie Golfscript.
Nie spodziewałbym się, że interpreter wykryje funkcje wejściowe w ewaluowanym kodzie generowanym w czasie wykonywania, ale jeśli w jakiś sposób może to zrobić, niech będzie.
źródło
Krótsze wbudowane
Aliasy jednoznakowe dla wszystkich wbudowanych poleceń, które ich nie mają. Przydałby mi się
base
o wiele więcej, gdyby tak byłoB
.źródło
b
jako nazwy zmiennej? Nadal; dobry pomysł; po prostu pamiętasz, aby nie używać tej nazwy, jeśli zamierzasz korzystać z tej funkcji, a jeśli nie używasz tej funkcji, nie ma to żadnego wpływu na ciebie.^
lub$
) jako nazw zmiennych. To nie pogarsza tego problemu. Poza tym zasugerowałem aliasy, aby umożliwić kompatybilność wsteczną, więc musiałbyś użyć dłuższej nazwy, jeśli przypisałeś coś innego krótszemu aliasowi.Z
dlazip
byłoby również bardzo przydatne.#include
i"#{IO.read'lib'}"~
jest za długi).mylang -Llibname somefile.ext
.Połączony mod div
Jest to nieco bardziej niszowych niż niektóre z propozycji, ale podczas pracy na liczbowo teoretyczna programów I często znajduję się chcąc operację, która wyskakuje dwie liczby całkowite
a
ib
ze stosu i popychaa/b
ia%b
. (Obecnie jest to1$1$/@@%
).źródło
dvm
w stylu DiV-Mod. Dzięki za wszystkie pomysły :-) +1Liczby
Zmień leksykon tak, aby wiodące 0 nie było częścią liczby:
_
Zamiast tego należy również wpisać liczby ujemne :źródło
0 100-
ujemnych 100. +1~
. Np. -1 to0~
. To sprawia, że niewielka liczba liczb jest dłuższa o jeden znak, ale usuwa umiarkowanie częstą potrzebę spacji po nim-
.{0\-}:~;
(~
neguje liczbę) i używaniunot
bitowego (tak jakand or xor
)?Dostęp do całego stosu
GolfScript jest językiem opartym na stosie, ale dostęp do wszystkich oprócz trzech najlepszych pozycji na stosie jest ograniczony
<integer>$
do skopiowania n-tego elementu. Przydałoby się mieć coś w rodzajuroll
polecenia PostScript, aby łatwiej było pracować z więcej niż trzema „aktywnymi” zmiennymi.Idealnie byłyby wersje z jednym argumentem i dwoma argumentami, ale jeśli wokół nie ma wystarczającej liczby nazw, wówczas argument ten powinien uzyskać preferencję dla znaku jednoznakowego.
Jeden argument wymaga tylko liczby przedmiotów do wyrzucenia. Np.
1 roll
Nic nie robi;2 roll
jest równoważne z\
;3 roll
jest równoważne z@
;4 roll
a dla wyższych liczb nie ma istniejącego odpowiednika; najbliższe, które jest możliwe, to coś w rodzaju(i to nawet nie obsługuje liczb całkowitych w pewnych pozycjach na stosie lub aktywnych
[
, i prawie na pewno również pęka w pętlach).Dwa argumenty również wymagają rzutu;
a b roll2
jest równoważne z{a roll}b*
.źródło
rotate
. Powinieneś edytować to w odpowiedzi CW.roll
po prostu obraca tablicę, prawda?CJam
Zaimplementowałem „ulepszony GolfScript” i nazywa się CJam - http://sf.net/p/cjam
Teraz w drugim wydaniu (wersja 0.6) ma już wiele, jeśli nie większość omawianych tutaj funkcji. Spróbuję je wymienić:
`
jako separatora ciągów - nie, ale używa ciągów cudzysłowów z minimalnym odstępem (\
tylko znaki ucieczki\
i"
)`http://example.com`net
-"example.com"g
#
użyte do czegoś innego,"comments like this";
mr
er
_,mr=
debugowanie - tylko ślady stosu i
ed
operator do pokazywania stosuelastyczne we / wy - tak, ale tylko wyraźne dane wejściowe
b
= podstawa,z
= zip-
- tak, ale nie z_
;1 2-3
->1 2 -3
;1 2m3
->-1 3
t
md
m*
et
ea
e<
,e>
z
(GolfScript maabs
, nie brakuje):+
,:*
c
(konwertuje na znak, a nie na ciąg){}/
:
tego zużywa to, co jest przechowywane - nie>=
,<=
- nie, użyj<!
,>!
1$1$
CJam ma o wiele więcej funkcji, sprawdź https://sourceforge.net/p/cjam/wiki/Operators/
źródło
Zmień leksykon
Lexer GolfScript traktuje identyfikator Ruby (wszystko, co pasuje do wyrażenia regularnego
[_a-zA-Z][_a-zA-Z0-9]*
) jako pojedynczy token. Jeśli zamiast tego jest traktowany[a-zA-Z]+
jako token, który uwolniłby się_
do wbudowania i pozwoliłby, aby po zmiennej alfa następowała dosłowna liczba całkowita bez oddzielania białych znaków.źródło
[a-z]+|[A-Z]+
do musowania, więc podkreślenie jest bezpłatne. Jest to jednak ciekawy i bardzo wyjątkowy pomysł! +1Aliasy Unicode
Komendy wieloznakowe mogą mieć aliasy Unicode. Pozwoliłoby to zaoszczędzić na wyniku, gdy wynik jest liczony w znakach, a nie w bajtach.
źródło
Rodzaj stabilny
$
Wbudowane na blokach powinien wykonać stabilne sortowania.źródło
Operator zestawu tablic
Jakieś wbudowane funkcje, które możemy udostępnić?
źródło
Identyfikatory jednoznakowe
To nie jest tak, że rozwiązanie do gry w golfa będzie miało zbyt wiele zmiennych. I oszczędziłoby to miejsca.
źródło
% jako wbudowane dla produktu
źródło
Wsparcie dla Regex
Brak obsługi wyrażeń regularnych zawsze wydawał mi się dziwny w języku przeznaczonym do gry w golfa. Byłoby wspaniale mieć
<string> <string> <string> y
(akatr
, używając do tego jednokierunkowego aliasu Perla)<string> <string> <string> s
(zastąpić)<string> <string> <block> s
(zamień na oddzwanianie)<string> <string> m
(mecz)źródło
Wbudowane dla bieżącej daty / godziny
W tej chwili bardzo dziwne jest uzyskiwanie daty / godziny za pomocą wersji Ruby.
źródło
Zmodyfikuj wbudowane |, i ^ w coś użytecznego na blokach
Np.
<array/string> <block> |
Może być użyty jako funkcja indeksuWszelkie pomysły na
<array/string> <block> &
lub<array/string> <block> ^
?źródło
array block =
teraz robi?"0<" {0<} =
.array block =
„wybierz według predykatu”,
.Sposób na zamianę symboli z powrotem w bloki kodu
Obecnie możemy powiązać bloki kodu z symbolami
:
, ale nie ma sposobu na odwrócenie procesu: wykonanie symbolu powiązanego z blokiem kodu po prostu wykonuje blok.Widzę kilka sposobów na wdrożenie tego:
dodaj nową składnię, np. w
#foo
celu wypchnięcia wartościfoo
do stosu, nawet jeśli jest to blok kodu, lubdodaj operator, aby rozwinąć każdy symbol w bloku kodu, tak aby (używając
_
jako nowego operatora), np .{2*}:dbl; {dbl dbl}_
wygenerować{2* 2*}
.Widzę zalety obu metod. Ten drugi może zastąpić pierwszy, kosztem dwóch dodatkowych znaków (
{foo}_
zamiast#foo
), ale widzę pewne potencjalne zastosowania poprzedniej składni, w których te dwa znaki byłyby wygórowane (np. Używaniearray #func %
zamiastarray {func} %
).Tymczasem poprzednia składnia mogłaby zostać użyta do zastąpienia drugiej, gdyby istniał wygodny sposób na iterację po tokenach w bloku kodu (który i tak mógłby być użyteczny samodzielnie).
W obu przypadkach proponuję, aby rozwinięcie symboli związanych z wbudowanymi funkcjami wbudowanymi (tj. Zaimplementowanymi w kodzie Ruby) zwróciło pewien rodzaj kodu pośredniczącego, który można by wywołać w celu uzyskania funkcjonalności wbudowanego, chociaż jest to niemożliwe lub po prostu mało prawdopodobne, aby zostać zastąpionym. Na przykład
#$
(lub{$}_
) może zwrócić np.{builtin_dollar}
Gdziebuiltin_dollar
zawierałoby rzeczywistą implementację$
wbudowanego (i#builtin_dollar
lub{builtin_dollar}_
powinien po prostu zwrócić{builtin_dollar}
).Umożliwiłoby to ponowne zdefiniowanie wbudowanych elementów bez utraty dostępu do ich funkcjonalności (patrz moja wcześniejsza sugestia ), tak że gdybym, powiedzmy, z jakiegoś powodu chciałem zamienić znaczenie
$
i@
, mógłbym po prostu zrobić#$ #@ :$; :@;
(lub{$}_ {@}_ :$; :@;
).źródło
_
powinien zrobić operator, jeśli blok kodu zawiera przypisania zmiennych. Oczywistą rzeczą byłoby pozostawienie:symbol
nietkniętych tokenów i rozwinięcie czegokolwiek innego, ale spowodowałoby to uszkodzenie_
dowolnego kodu przy użyciu zmiennych lokalnych. Dzięki czemu nie złamać taki kod może być niepraktycznie skomplikowane, choć.[[1] [2] [3]] _ -> [1 2 3]
.2:A;{1:A;A}_
?{1:A;2}
(lub, mówiąc technicznie,{1:A builtin_semicolon 2}
jeśli uwzględniono wbudowaną funkcję rozszerzenia). Jeśli uwzględniono jakąś funkcję „wykluczania zmiennych lokalnych”, może to być uzasadnione{1:A;A}
.{builtin_1 :A builtin_semicolon 2}
.Zmienne ustawienie wstępne z argumentami wiersza poleceń
Niestety nie ma nieprzypisanego char, ale może możemy tego użyć
A
?źródło
_
jest dostępny. Być może to? W każdym razie tak, golfscript potrzebuje sposobu na pobranie argumentów linii cmd +1Rodzime funkcje Ruby, które powinienem zaimplementować
To jest Wiki Wiki; edytuj i dodawaj funkcje, które Twoim zdaniem powinienem wdrożyć!
Format: „
nativeFunctionName
(nameInMyLanguage
)”shuffle
(sf
)tr
(tr
)sample
(sm
)źródło
Weź również funkcje z APL i HQ9 +!
źródło
Wyraźne oddzielenie wbudowanych
np. stolice: wbudowane; dzięki czemu B dla bazy jest wykonalne
źródło
{-}:+
.Zmienne lokalne / zamknięcia
Jedną z rzeczy, których tak naprawdę brakuje w GolfScript, jest możliwość tymczasowej zmiany wartości symbolu .
W szczególności obecnie nie ma możliwości tymczasowego zastąpienia znaczenia „prymitywnego” wbudowanego: gdy raz, powiedzmy, redefiniujesz
$
, już nigdy nie będziesz sortować niczego w tym programie. (Cóż, przynajmniej bez napisania własnej implementacji sortowania). Byłoby naprawdę miło móc powiedzieć na przykład, że w tym bloku kodu$
oznacza coś innego, ale nadal ma normalne znaczenie w innym miejscu.W związku z powyższym dobrze byłoby powiązać symbole w bloku kodu z ich bieżącą wartością . Pewnie, mogę pisać, mówić
{$-1%}:rsort
i być w stanie używaćrsort
do sortowania i odwracania tablicy, ale działa to tylko tak długo, jak długo definicja$
(lub-1
lub%
) się nie zmienia, ponieważ mojarsort
funkcja wciąż wywołuje symbol globalny$
. Byłoby miło móc powiedzieć „zróbmyrsort
to, co$-1%
obecnie się dzieje, nawet jeśli te symbole zostaną później ponownie zdefiniowane”.W szczególności standardowa biblioteka może korzystać z tego rodzaju wiązania. To trochę zaskakujące, gdy zdajemy sobie sprawę, że, powiedzmy, zmiana
n
zmienia zachowanieputs
lub że redefiniowanie!
całkowicie popsułoxor
. (Z drugiej strony należy tutaj zachować ostrożność, ponieważ w szczególności możliwość zmiany zachowaniaputs
okazuje się być jedynym sposobem na uniknięcie drukowania ostatecznego nowego wiersza w obecnej wersji GS.)Edycja: Możliwość przekształcenia symboli z powrotem w bloki kodu miałaby długą drogę do wdrożenia tej funkcji. W szczególności
{foo}_
składnia sugerowana w tej odpowiedzi skutecznie wykonałaby jeden poziom wiązania statycznego poprzez rozwinięcie wszystkich symboli w bloku kodu. Połącz to z kombinatorem punktowym do głębokiego wiązania statycznego, a Bob jest twoim wujem ...źródło
rsort
to, co$-1%
obecnie robi, nawet jeśli te symbole zostaną później ponownie zdefiniowane” Więc Emmental?Więcej wbudowanych funkcji
Spraw, aby wszystkie jednoliterowe zmienne az i AZ pełniły jakąś ogólną, przydatną funkcję. Niektóre wbudowane, których brakuje:
{+}*
kiedy możeszS
? Masz tutaj 52 funkcje do pracy!x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)
teraz. Musiałby być,@-A@@-A+
jeśliA
jest wbudowaną wartością bezwzględną. Przyznaję, że pojawił się tylko w związku z moim najnowszym postem, ale zawsze myślałem, że to dobry sposób na rozszerzenie gry w golfa: zapisz co przydatne byłoby posiadanie, gromadzenie i dodawanie ich jako wbudowanych funkcji.chr
).{}/
):
tego zużywa to, co jest przechowywane. To by się nie przydało, aby utknąć w identyfikatorach.>=
,<=
1{\}{|}if
do czegoś podobnego1?\?|if
1$
,2$
,3$
,4$
,5$
\.@.@\
źródło
Byłoby miło, gdyby wartość zapisana lub obliczona w ostatnim wierszu funkcji została automatycznie zwrócona
źródło