Jelly to milczący , zorientowany na golfa język programowania autorstwa naszego własnego Dennisa . Coraz częściej pojawia się w odpowiedziach, pokonując inne języki golfa, takie jak Pyth i CJam, zarówno za pomocą własnej strony kodowej, jak i potężnego systemu łańcuchowego do zwięzłego wyrażania programów.
Zbierzmy przydatne wskazówki dotyczące gry w golfa w Galaretce. (Jak zawsze, jedna wskazówka na odpowiedź, proszę!)
Odpowiedzi:
Kompresja ciągów
Wypróbuj online!
Wygląda na skompresowany ciąg znaków
“...»
, w którym kropki są fragmentem danych zakodowanych w podstawie 250. Algorytm dekompresyjny jest nieco skomplikowany: fragment jest interpretowany jako liczba całkowita o „mieszanej podstawie”, zdivmod
odłamywaniem różnych części tej liczby całkowitej i budowaniem z nich łańcucha.Stworzyłem mały interfejs Python 3 do kompresji ciągów galaretki:
Użyj kompresora w następujący sposób.
Compress
jest konstruktorem ciągów:.string(s)
wstawi nieprzetworzone, drukowalne znaki ASCII do łańcucha.(Każdy znak kosztuje około 0,827 skompresowanych bajtów).
.dictionary(w)
wyszukuje ciąg znaków we wbudowanych słownikach Jelly. Możesz rozpocząć ciąg od pojedynczej spacji, jeśli chcesz. Jeśli będzie to musiało odbiegać od normalnego zachowania polegającego na dodawaniu ciągów znaków lub odwracać wielkie litery w słowniku, odpowiednio doda flagi.(Kosztuje około 1,997 bajtów w przypadku krótkich słów, 2,433 bajtów w przypadku długich słów; jeśli są flagi, dodaj 0.199 bajtów.)
źródło
Więzy
(Jest to swego rodzaju kontynuacja programowania ukrytego .)
Jak Jelly ocenia łańcuch? Jak wyjaśniono wcześniej, należy wziąć pod uwagę trzy przypadki: czy łańcuch ten nazwano niladycznie , monadycznie , czy dyadycznie .
1. Łańcuchy niladowe
Są to najłatwiejsze z tej grupy. Aby ocenić łańcuch niladowy rozpoczynający się od nilada, na przykład
α f g h
, oceń łańcuch monadycznyf g h
na tym niladzieα
. (Zastrzeżenia: jeśli cały łańcuch jest pusty, zamiast tego zwracane jest 0. Jeśliα
nie jest to nilad,α=0
zamiast tego użyj use .)Na przykład
4½
jest po prostu½
oceniane na4
, co jest2
.2. Łańcuchy monadyczne
Łańcuchy monadyczne są rozkładane od lewej do prawej, dopóki nie pozostaną żadne linki do rozważenia. Przekazano nam również trochę argumentów
ω
. Na dwa pytania należy odpowiedzieć:Jaka jest początkowa wartość tej oceny od lewej do prawej?
Jeśli nasz łańcuch zaczyna się od nilada
α
, a po nim następuje zero lub więcej monad (jak½
), pary dyad-nilad (jak+2
) i pary nilad-dyad (jak4*
): zaczynamy od ocenyα
, a następnie rozważamy resztę łańcucha .W przeciwnym razie zaczniemy od argumentu przekazanego do tego łańcucha
ω
i rozważymy cały łańcuch.Jak schodzimy z łańcucha?
Nazwijmy
V
bieżącą wartość - początkowo jest to wartość opisana powyżej, ale dostaje aktualizację w miarę przechodzenia przez łańcuch - i oznacza+
,×
,÷
.Następnie dopasowywane są następujące wzory, od góry do dołu:
3. Łańcuchy dyadyczne
Są to w zasadzie łańcuchy monadyczne, ale tym razem istnieją dwa argumenty:
λ
(lewy) iρ
(prawy).Jaka jest wartość początkowa?
Jeśli łańcuch zaczyna się od trzech podobnych diad
+ × %
, zaczynamy odλ+ρ
i rozważmy łańcuch× % ...
dalej.W przeciwnym razie zaczniemy od
λ
i rozważymy cały łańcuch.Jak schodzimy z łańcucha?
Tym razem wzory są
źródło
Wartości liczbowe w specjalnych przypadkach
Oto kilka specjalnych przypadków dla parsera liczbowego Jelly:
-
ocenia na-1
.
ocenia na0.5
ȷ
ocenia na1000
(ȷ
służy do zapisu naukowego, np.2ȷ6
jest2000000
)ı
ewaluuje do1j
(ı
jest dla liczb zespolonych, np.2ı3
jest2+3j
)Warto również zauważyć, że coś takiego
4ı
jest w rzeczywistości4+1j
, a nie4
.Możesz je mieszać i dopasowywać, np .:
-.
jest-0.5
i-ȷ
jest-1000
-ı
jest-1+1j
,ı-
jest-1j
i-ı-
jest-1-1j
.ȷ
jest500.0
.ı
jest0.5+1j
,ı.
jest0.5j
i.ı.
jest0.5+0.5j
ȷı
jest1000+1j
,ıȷ
jest1000j
iȷıȷ
jest1000+1000j
Zauważ, że
ȷ-
tak0.1
, ale to nie oszczędza żadnych bajtów.1
. Są też następujące rzeczy, które można już wykonać w odpowiedniej liczbie bajtów za pomocą wbudowanej zmiennej dla 10 (⁵
), ale mogą być przydatne w rzadkim przypadku, gdy wbudowane jest niedostępne lub oszczędzić na konieczności używania¤
:ȷ.
jestsqrt(10) ~ 3.162277
,.ȷ.
jestsqrt(10)/2 ~ 1.5811
iȷ-.
jest1/sqrt(10) ~ 0.31162
źródło
Zoptymalizowany kompresor strunowy
Wypróbuj online!
Post Lynn szczegółowo opisuje, czym dokładnie są skompresowane ciągi, wraz z posiadaniem kompresora, który wytworzy te skompresowane ciągi. Jednakże, podczas gdy majstrować wokół z programu w galarecie, znalazłem to męczące musiał połączyć
.dictionary
i.string
wraz z poprawnymi docelowych pomieszczeń i tak dalej, i tak dalej, w celu osiągnięcia możliwie najkrótszy łańcuch.Dlatego postanowiłem utworzyć rozszerzenie skryptu Lynn, które pobierałoby dane od użytkowników i znajdowało najkrótszy sposób, aby można go było skompresować bez konieczności wykonywania jakiejkolwiek pracy. Skrypt jest dość długi, dlatego dodałem łącze TIO, a nie sam kod.
Sposób działania programu polega na kompresji za pomocą 3 różnych metod i określeniu, który jest najkrótszy:
Metoda 1 po prostu koduje każdy bajt wejścia na raz, co zwykle daje najdłuższy wynik w porównaniu z innymi. Nawet gdy dane wejściowe są bardzo krótkie, nadal udaje im się stworzyć dość długie alternatywy. Na przykład najkrótsza droga, którą
test
można skompresować“¡ḌY»
, to metoda ta zwraca“¡⁷ƑKʂ»
(2 bajty dłużej). Zasadniczo działa to tylko wtedy, gdy łańcuch ma mniej niż 4 znakiDruga metoda dzieli ciąg na słowa i znaki interpunkcyjne, ponieważ są one dodawane do kompresora na różne sposoby. Słowa, które są częścią słownika, są dodawane za pomocą
.dictionary
metody kodu Lynn, która kompresuje je bardziej, niż gdyby były dodawane po prostu przez punkty kodowe. Jednak interpunkcja musi być dodana przez punkt kodowy, ponieważ niestety nie są one częścią słownika.Interpunkcja obejmuje spacje, w których wchodzi metoda numer 3, ale najpierw i ocena metody 2: porównajmy metodę pierwszą i drugą kompresującą ciąg znaków
Hello, World!
(zawiera słowa, interpunkcję i spacje, więc jest idealna). Kompresja znak po znaku powoduje końcowy ciąg“ŒCdẉa÷¹ṂȤƓ(Ẋ)»
(15 bajtów), który, jak się okazuje, jest dłuższy niż łatwiejszy sposób na wyjście Hello, World !:“Hello, World!
. Teraz spójrzmy na metodę drugą. Daje to skompresowany ciąg znaków,“Ọƥ⁷Ƭė3⁶»
który waży 9 bajtów, co stanowi wielką poprawę w stosunku do starego. Jednak najkrótsze Witaj, świecie! program w galarecie ma 8 bajtów , więc coś można poprawićOto metoda 3, dzięki której jest jeszcze krótsza. Zgodnie z oczekiwaniami wyjście dla Hello, World jest oczywiście
“3ḅaė;œ»
najkrótszym możliwym programem. Co robi metoda 3, a metoda 2 nie? Metoda 3 łączy pojedyncze przestrzenie w wiodące, dla których dekompresor Jelly ma flagę. W kodzie zarówno dla kompresora, jak i dekompresora można zobaczyć kod podobnyif flag_space: word = ' ' + word
, pokazujący, że spacje wiodące są a) obsługiwane i b) oszczędzania bajtów. Dlatego rozdzielacz ciągów z metody drugiej jest dostosowywany tak, że same spacje są łączone w ciąg bezpośrednio po nim, aby utworzyć ciągi wiodące. Oznacza to, żeHello, World!
jest analizowany jako["Hello", ",", " World", "!"]
, który po skompresowaniu ma tylko 6 bajtów (8, jeśli zawiera separatory). Jest to prawie zawsze najkrótsza metoda kompresji, z wyjątkiem dodanego „rozszerzenia”,Jest to większość programu, ale jest jeszcze kilka opcji, które pomagają jeszcze bardziej kompresować dane.
--debug
, który zamiast po prostu pokazywać najkrótszy skompresowany ciąg, pokazuje wszystkie 3 wraz z kopią „To jest najkrótszy”Bez słów
Rozpocząłem pracę nad kompresorem Lynna po tym , jak zobaczyłem ten komunikat, zrobiłem sobie z niego frustrację i denerwowałem się tym, że nie mogłem znaleźć najkrótszego sposobu na skompresowanie go (to 29 lub 32 bajty dla rekordu). Jednak podczas testowania moich ulepszeń odkryłem, że takich słów
knowns
nie ma w słowniku Jelly. Dlatego postanowiłem znaleźć sposób na skompresowanie tych „nie-słów” w najkrótszym możliwym kodzie Jelly.Utworzyłem funkcję (
trim
), która dzieli ciąg jako punkt, w którym co najmniej jedna z jego części to słowa. Na przykładknowns
zostałby podzielony na,["known", "s"]
a program dodałby pierwsze słowo za pomocą słownika add (.dictionary
), a drugą część słowa za pomocą.string
wywołania. Ale to wciąż pozostawia dwa przypadki krawędzi: ciągi, które nie zawierają w sobie słów (takich jakajdl
) i nie-słowa, które mają słowa na końcu, takie jakabctest
, które nie zostałyby podzielone przeztrim
funkcję.Ponieważ nie ma sposobu na znalezienie słów w ciągu, w którym nie ma słów, najprostszym i najkrótszym sposobem ich obsługi jest dodanie ich znak po znaku za pomocą
.string
wywołania. Zostanieajdl
dodany przez.string('ajdl')
. Natomiast słowa, które kończą się rozpoznanymi słowami, zasadniczo trymują, ale odwrotnie, i nakładają.dictionary
i.string
odwrotnie do trymera do przodu.Jak się okazuje, przycinanie łańcucha, zarówno od początku, jak i od końca, jest oczywiście krótsze niż dodawanie każdego znaku do kompresora, jak pokazano na wejściu
abctest this string
, co daje wynik debugowaniaRóżnica między optymalną mocą wyjściową (która używa trymera) a tą, która tego nie robi, to aż 4 duże bajty. Wreszcie, zdarzają się sytuacje, w których sam łańcuch jest krótszy niż jakakolwiek skompresowana wersja, w której teraz uwzględniono.
Oczywiście wiele zasług to Lynn za stworzenie oryginalnej sprężarki
źródło
Możesz użyć indeksu górnego trzy do dziewięciu (
³⁴⁵⁶⁷⁸⁹
), aby zagrać w niektóre używane wartości, ale zależy to od liczby argumentów wiersza poleceń, aw przypadku linków - od argumentów linków.³
zwraca 100 i działa tylko wtedy, gdy nie ma danych wejściowych.⁴
zwraca 16 i działa tylko, jeśli istnieje co najwyżej jedno wejście.⁵
zwraca 10 i działa tylko wtedy, gdy są najwyżej dwa wejścia.⁶
zwraca spację, jeśli są co najwyżej trzy wejścia.⁷
zwraca nowy wiersz, jeśli są maksymalnie cztery wejścia.Jeśli masz pięć wejść, nie masz szczęścia.
Niedawno nowa wersja języka obniżyła wartość
³
do 100 i wprowadziła nowe atomy, które zwracają wartości lub (dla linków) ich argumenty.⁸
zwraca pustą listę wszędzie oprócz łączy, do których przekazano lewy argument.⁹
zwraca 256 wszędzie, z wyjątkiem łączy, do których przekazano odpowiedni argument.Jeśli masz link i masz do niego argumenty z obu stron, nie masz szczęścia.
źródło
Błędy w nadużyciach
Podziękowania należą się Adnanowi za skorzystanie z tego pierwszego w Napisz program do uelastycznienia łańcuchów .
Galaretka ma pewnego dnia uzyskać arytmetykę postaci, ale dopóki tak się nie stanie, możemy skorzystać z faktu, że Python przeciąża większość operatorów arytmetycznych i że Jelly nie sprawdza typu.
Na przykład
nie powinien teraz robić nic przydatnego, ale ponieważ
Ḥ
(unhalve) jest zaimplementowane jakoi atomy arytmetyczne wektoryzują na głębokości 0 (tzn. działają na liczbach lub znakach), powyższy kod Jelly daje
Uważaj, aby to tworzyło rzeczywiste ciągi w języku Python (typ galaretki nie powinien mieć), więc nie będzie to przydatne we wszystkich sytuacjach.
Podobnie,
+/
może być użyteczne do łączenia łańcuchów, z tymi samymi zastrzeżeniami.źródło
S
nigdy nie może być przydatne do łączenia łańcuchów, spróbuje je dodać0
.+/
działa jednak.+/
.Optymalny kompresor strunowy
Niedawno zapytałem Erika Outgolfera o dodanie zoptymalizowanego kompresora łańcuchów do strony referencji JHT , ale powiedzieli, że
Postanowiłem więc wdrożyć optymalną sprężarkę strunową.
Proste podejście, ale gwarantuje znalezienie najmniejszej możliwej wartości (a tym samym liczby bajtów)
Weź dane wejściowe
(dosłowny znak nowej linii) można wprowadzić jako nową linię.
stdin
, dane wyjściowe dostdout
. Podobnie jak oryginalny kompresor,¶
lubPróba uruchomienia go z dużą ilością znaków interpunkcyjnych (na przykład danych wejściowych
¶-----¶
) spowoduje wyświetlenie nieskompresowanego ciągu.Oczywiście wiele zasług to Lynn za stworzenie oryginalnej sprężarki .
źródło
Programowanie ukryte
Galaretka jest milczącym językiem programowania. Oznacza to, że definiujesz linki (funkcje) poprzez komponowanie istniejących linków w łańcuch , bez wyraźnego mówienia o zaangażowanych argumentach. Sposób, w jaki argumenty „przepływają” przez tę kompozycję, jest określony przez wzorzec, w którym ułożone są linki. Przykład tego zostanie podany wkrótce, ale najpierw musimy wprowadzić kilka pojęć.
Arity łącza jest bardzo istotne pojęcia. Wszystkie atomy - wbudowane, podobne
+
i½
- mają ustalone arie. Linki są podzielone na trzy kategorie, w zależności od ich pochodzenia:Więc jaki jest sens linków, które definiujemy podczas pisania programu? Domyślnie są one różne - to znaczy od dzwoniącego zależy, ile argumentów użyć, a w przypadku zależy, ile argumentów głównego łącza zależy to od liczby argumentów przekazanych przez program.
Na przykład
+½
jest łańcuchem+
(dodawania) i½
(pierwiastka kwadratowego). Ponieważ odpowiednie aromaty elementów tego łańcucha to 2 i 1, nazywamy go łańcuchem 2,1 . Interpretator ma określone zasady rozkładania łańcuchów, w zależności od ich arsenałów: reguły te dyktują, że biorąc pod uwagę dane wejściowen
, ten nowy link obliczan + sqrt(n)
. (Możesz odczytać+½
jako „... plus pierwiastek kwadratowy”. )Zatem programowanie w stylu galaretki jest w zasadzie sztuką dobrego uczenia się tych zasad i tworzenia sprytnych łańcuchów, które wykonują zadanie, milcząco .
źródło
replace(str, old, new)
).string (operator) (list)
, gdzie(list)
jest lista binarnaold, new
. To miałoby sens, ponieważ galaretka ma wbudowanegopair
operatora. W ramach tego schematu byłyby to jednak dwa bajty dla operatora.½
czy pierwiastek kwadratowy? Dlaczego nie jest½
... pół? Dlaczego nie√
pierwiastek kwadratowy? :(H
jest już w połowie, oczywiście: PStruktura programu
Każda linia w programie Jelly jest definicją łącza . Linki są w zasadzie funkcjami. Dolna linia reprezentuje „
main
”: to link jest oceniany za pomocą argumentów przekazanych w wierszu poleceń.Wszystkie linki oprócz ostatniego są zatem definicjami funkcji: możesz się do nich odwoływać za pomocą aktorów . Na przykład
ç
jest „linkiem powyżej tego, jako operatora binarnego (diada)” . Rozważ ten przykładowy program , który oblicza kwadrat sumy swoich argumentów:To jest trochę jak pseudokod:
źródło
Łącza wielołańcuchowe
Pamiętasz, jak napisałem, że definiujesz link, tworząc łańcuch innych linków? Nie mówiłem całej prawdy: w rzeczywistości jest to proces dwuwarstwowy. Łącze to łańcuch łańcuchów i domyślnie łańcuch zewnętrzny ma po prostu długość jednostkową.
Rozważ ten program:
To uzupełnienie plus połowa . Pobiera wartość wejściową
n
i oblicza(1-n)+(n/2)
. Nie zbyt ekscytujące, wiem. Ale struktura jest naprawdę taka:Link, który napisaliśmy, jest w rzeczywistości łańcuchem zawierającym pojedynczy łańcuch.
Załóżmy, że
(1-n)+(1-n)(n/2)
zamiast tego chcemy obliczyć . Łańcuch dynamiczny+×
działałby: według reguł łączenia obliczaλ+(λ×ρ)
, co wygląda bardzo podobnie do tego, czego potrzebujemy. Jednak zwykłe zastąpienie+
przez+×
w naszym programie nie zadziała:C+×H
jest to 1,2,2,1-łańcuchowy - uzupełnienie, następnie dodanie (argument), a następnie pomnożenie przez połowę - obliczenia((1-n)+n)×(n/2)
.Chcemy, aby Galaretka traktowała
+×
jako jednostkę i tworzyła łańcuch 1,2,1 z podłańcuchówC
,+×
orazH
. Łącza wielołańcuchowe pozwalają nam to zrobić! Aby je skonstruować, używamy separatorów łańcuchaøµð
: na powyższym obrazku wprowadziliby nowy niebieski prostokąt, odpowiednio o arity 0, 1 i 2. W naszym przypadku możemy pogrupować łańcuchy tak, jak chcemy, piszącCð+×µH
:Nie ma sposobu, aby zagnieździć te rzeczy jeszcze bardziej. Zamiast tego musisz zdefiniować wiele łączy.
źródło
Jeśli TMTOWTDI, wybierz ten, który pasuje do twojego łańcucha.
Jedną z zalet milczącego języka jest to, że zwykle można uciec bez używania zmiennych odniesień. Działa to jednak tylko wtedy, gdy linki w twoim łańcuchu mają odpowiednie aranżacje.
Na przykład prosty sposób pobrania sumy wszystkich tablic w tablicy 2D to
który mapuje atom sumy na wszystkie elementy tablicy.
Teraz powiedz, że masz monadyczny łańcuch składający się z atomu
który mapuje każdy x tablicy 2D na x x . Na przykład dla A = [[1, 2], [3, 1], [2, 3]] wywołanie łańcucha dałoby [[1, 4], [27, 1], [4, 27]] .
Teraz chcemy wziąć sumę każdej pary. Niestety,
nie działa, ponieważ
*
nie działa już jak hak (użycie samego A jako poprawnego argumentu), ale jako rozwidlenie , co oznacza, że najpierwS€
stosuje się do A , a wynikiem jest poprawny argument*
.Naprawienie tego jest dość łatwe:
Oba dają pożądany wynik:
*¹
jest rozwidleniem, w którym¹
znajduje się funkcja tożsamości, i*⁸
jest na szczycie , gdzie⁸
jest odwołanie do lewego argumentu łańcucha ( A ).Istnieje jednak sposób na zaoszczędzenie bajtu! Atop
ḅ1
(konwertuj z unarnego na całkowity) również oblicza sumę każdej tablicy w A A , ale w przeciwieństwie doS€
,ḅ
jest diademem łącza.Łańcuch
zwraca [5, 28, 31] (zgodnie z życzeniem); ponieważ
ḅ
jest dyadyczny,*
haczyki zamiast rozwidleniaźródło
ḅ1
”?Kompresja liczb całkowitych
Kompresja ciągów jest przydatna podczas tworzenia tekstu w języku angielskim, ale jeśli potrzebujesz kompresować dane innego rodzaju, jest to dość nieskuteczne. W związku z tym przez większość czasu chcesz przechowywać dużą stałą w swoim programie, najlepiej przechowywać ją jako liczbę całkowitą.
Teraz, gdy Jelly ma swoją własną stronę kodową jako stałą, algorytm kompresji liczb całkowitych jest najprościej wyrażony w samej Galaretce:
Wypróbuj online!
(Powyższy program zawiera również zaznaczenie pokazujące wartość, którą dekompresuje liczba całkowita.)
Oprócz zwykłego użycia liczby całkowitej jako liczby całkowitej, możesz także użyć go do utworzenia ciągu poprzez wykonanie na nim konwersji bazowej, a następnie indeksowanie w alfabet znaków.
ṃ
Atom zautomatyzować ten proces, i jest dość użyteczny, ponieważ może to opisują cały proces rozprężania (inne niż alfabetu są dekompresowane w) w jednym bajcie.źródło
Użyj produktów zewnętrznych, aby utworzyć przydatne macierze liczb całkowitych
Oto lista, którą stworzyłem w tym poście z nieco ładniejszym formatowaniem tabeli HTML.
Produkt zewnętrzny
þ
można szybko przymocować do diada i powoduje, że diada działa na każdą parę elementów w swoich argumentach po lewej i prawej stronie. To jest skrót od€Ð€
. Na przykład, gdybyśmy mieli kod[1,2]+€Ð€[0,10]
, moglibyśmy go skrócić[1,2]+þ[0,10]
i obaj by się poddali[[1,2],[11,12]]
. Odniosę się do diada zþ
zastosowanym (np+þ
) Jako diady produktu zewnętrznego.Gdy liczba całkowita jest jednym z argumentów diady produktu zewnętrznego, Jelly najpierw przyjmuje zakres tej liczby, a następnie wykorzystuje wynik jako argument. Wiedząc o tym, powyższy przykład można dodatkowo skrócić
2+þ[0,10]
. Dotyczy to zarówno lewego, jak i prawego argumentu zewnętrznej diady produktowej.Niektóre diady produktu zewnętrznego, gdy działają monadycznie na liczbę całkowitą, dają pewne matryce liczb całkowitych, które mogą być przydatne w grze w golfa (zwłaszcza wyzwania w sztuce ASCII), ale skonstruowanie ich zajęłoby wiele bajtów. Na przykład
=þ
po zastosowaniu do liczby całkowitejn
dajen×n
macierz tożsamości. Wypróbuj=þ
online!Poniżej znajduje się tabela diad i rodzaj matryc, które dają, gdy zamieniane są w diady produktu zewnętrznego i działają monadycznie na liczbę całkowitą. Diady wymienione w tym samym rzędzie dają te same matryce. Istnieje dyads nie zostały uwzględnione w tabeli jak
&
,|
,%
,w
,ẇ
iḍ
że również produkować całkowitą macierzy, ale ich wzory nie są tak proste i będzie prawdopodobnie mniej przydatny w sytuacjach. Wypróbujwþ
online!źródło
Lista poleceń i literałów
Jeśli spróbujesz użyć wielu poleceń listy bez wektoryzacji na literale
n
lub liście literałówz
, polecenie listy najpierw skonwertuje się na jakąś listę, a następnie wykona polecenie na tej liście.Te polecenia pojawiają się przy użyciu wywołań
iterable
funkcji w jelly.py .Oto kilka niekompletnych list tego, co zrobią te polecenia listy.
Zawija się w listę
Najprostszy powrót z
iterable
aby zawinąć argument na listę i zwrócić ten, który ma zostać przetworzony przez funkcję. Dzieje się tak, jeśli argument nie jest już listą, jest łańcuchem, aiterable
argumenty nie wymagają innych metod.Konwertuj na bazę 10
Funkcje tutaj wywołują
iterable
konwersję na liczbę na listę jej cyfrD
, a następnie uruchamiają te cyfry.Konwertuj na listę z zakresem
Funkcje tutaj konwertują liczbę na zakres
R = [1 ... n]
, a następnie działają w tym zakresie.źródło
Czasami warto czytać ze standardowego wejścia, gdy są dokładnie dwa wejścia
Galaretka jest zoptymalizowana do pobierania danych wejściowych z argumentów wiersza poleceń. Jednak jest również zoptymalizowany do pisania monad, a nie diad; z diadami istnieje tyle możliwych znaczeń dla każdego wbudowanego, że często trzeba wydawać postacie, aby ujednoznacznić, podczas gdy z diadami jest zwykle wiele sposobów na wypowiedzenie tego samego.
Jako takie, jeśli używasz jednego z dwóch wejść tylko raz, a problem jest taki, że nie mogą być łatwo odczytane z niejawnie
⁴
(tj albo trzeba sprawić, że⁴
wyraźne, albo wydać na charakter}
,@
lub tym podobne) , rozważ odczytanie go ze standardowego wejściaƓ
zamiast umieszczania go w wierszu poleceń; pozwala to precyzyjnie umieścić dane wejściowe dokładnie tam, gdzie są potrzebne, poprzez umieszczenieƓ
danych wejściowych, zapewniając jednocześnie, że wszelkie inne dane wejściowe będą pobierane z innych danych wejściowych. To kosztuje bajt i oszczędza bajt, a w zależności od problemu może zaoszczędzić drugi bajt, dając więcej możliwości zmiany kolejności kodu.źródło
Istnieje kilka nieoczywistych sposobów sprawdzania właściwości argumentu za pomocą
Ƒ
. Poniżej kilka. Wyszedłem na zewnątrz mnóstwo zastosowań tego szybkiego (npAƑ
,ŒuƑ
,3Ƒ
), ponieważ są one już najprostsze sposoby osiągania ich zachowanie.Edytuj to, aby dodać więcej interesujących skrzynek.
źródło
Możesz wypróbować edytor online Jelly Balls zaprojektowany do łatwego budowania kodu w języku Jelly .
Funkcje obejmują:
Spróbuj: https://jellyballs.github.io
źródło